mirror of https://github.com/OpenTTD/OpenTTD
Change: Adapt commands for buying and replacing ships in extended depots.
parent
3364b1965b
commit
275c141bf4
|
@ -20,6 +20,7 @@
|
||||||
#include "core/random_func.hpp"
|
#include "core/random_func.hpp"
|
||||||
#include "vehiclelist.h"
|
#include "vehiclelist.h"
|
||||||
#include "road.h"
|
#include "road.h"
|
||||||
|
#include "ship.h"
|
||||||
#include "ai/ai.hpp"
|
#include "ai/ai.hpp"
|
||||||
#include "news_func.h"
|
#include "news_func.h"
|
||||||
#include "strings_func.h"
|
#include "strings_func.h"
|
||||||
|
@ -515,6 +516,25 @@ struct ReplaceChainItem {
|
||||||
Vehicle *GetVehicle() const { return new_veh == nullptr ? old_veh : new_veh; }
|
Vehicle *GetVehicle() const { return new_veh == nullptr ? old_veh : new_veh; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When replacing a ship in an extended depot, copy the direction as well.
|
||||||
|
* @param old_ship The ship being replaced.
|
||||||
|
* @param new_ship The new ship that will replace the old one.
|
||||||
|
*/
|
||||||
|
void CopyShipStatusInExtendedDepot(const Ship *old_ship, Ship *new_ship)
|
||||||
|
{
|
||||||
|
assert(IsExtendedDepotTile(old_ship->tile));
|
||||||
|
assert(old_ship->tile == new_ship->tile);
|
||||||
|
|
||||||
|
new_ship->x_pos = old_ship->x_pos;
|
||||||
|
new_ship->y_pos = old_ship->y_pos;
|
||||||
|
new_ship->z_pos = old_ship->z_pos;
|
||||||
|
new_ship->state = old_ship->state;
|
||||||
|
new_ship->direction = old_ship->direction;
|
||||||
|
new_ship->rotation = old_ship->rotation;
|
||||||
|
new_ship->GetImage(new_ship->direction, EIT_ON_MAP, &new_ship->sprite_cache.sprite_seq);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Replace a whole vehicle chain
|
* Replace a whole vehicle chain
|
||||||
* @param chain vehicle chain to let autoreplace/renew operator on
|
* @param chain vehicle chain to let autoreplace/renew operator on
|
||||||
|
@ -712,6 +732,11 @@ static CommandCost ReplaceChain(Vehicle **chain, DoCommandFlag flags, bool wagon
|
||||||
cost.AddCost(CopyHeadSpecificThings(old_head, new_head, flags));
|
cost.AddCost(CopyHeadSpecificThings(old_head, new_head, flags));
|
||||||
|
|
||||||
if (cost.Succeeded()) {
|
if (cost.Succeeded()) {
|
||||||
|
/* Copy position and direction for ships in extended depots. */
|
||||||
|
if (old_head->type == VEH_SHIP && IsExtendedDepotTile(old_head->tile)) {
|
||||||
|
CopyShipStatusInExtendedDepot(Ship::From(old_head), Ship::From(new_head));
|
||||||
|
}
|
||||||
|
|
||||||
/* The new vehicle is constructed, now take over cargo */
|
/* The new vehicle is constructed, now take over cargo */
|
||||||
if ((flags & DC_EXEC) != 0) {
|
if ((flags & DC_EXEC) != 0) {
|
||||||
TransferCargo(old_head, new_head, true);
|
TransferCargo(old_head, new_head, true);
|
||||||
|
|
|
@ -5341,6 +5341,7 @@ STR_ERROR_TOO_MANY_VEHICLES_IN_GAME :{WHITE}Too many
|
||||||
STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Can't change servicing interval...
|
STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Can't change servicing interval...
|
||||||
|
|
||||||
STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... vehicle is destroyed
|
STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... vehicle is destroyed
|
||||||
|
STR_ERROR_NO_FREE_DEPOT :{WHITE}... there is no free depot
|
||||||
|
|
||||||
STR_ERROR_CAN_T_CLONE_VEHICLE_LIST :{WHITE}... not all vehicles are identical
|
STR_ERROR_CAN_T_CLONE_VEHICLE_LIST :{WHITE}... not all vehicles are identical
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include "industry.h"
|
#include "industry.h"
|
||||||
#include "industry_map.h"
|
#include "industry_map.h"
|
||||||
#include "ship_cmd.h"
|
#include "ship_cmd.h"
|
||||||
|
#include "command_func.h"
|
||||||
|
|
||||||
#include "table/strings.h"
|
#include "table/strings.h"
|
||||||
|
|
||||||
|
@ -957,10 +958,22 @@ void Ship::SetDestTile(TileIndex tile)
|
||||||
*/
|
*/
|
||||||
CommandCost CmdBuildShip(DoCommandFlag flags, TileIndex tile, const Engine *e, Vehicle **ret)
|
CommandCost CmdBuildShip(DoCommandFlag flags, TileIndex tile, const Engine *e, Vehicle **ret)
|
||||||
{
|
{
|
||||||
tile = GetShipDepotNorthTile(tile);
|
assert(IsShipDepotTile(tile));
|
||||||
|
if (!(flags & DC_AUTOREPLACE)) {
|
||||||
|
std::vector<TileIndex> *depot_tiles = &(Depot::GetByTile(tile)->depot_tiles);
|
||||||
|
tile = INVALID_TILE;
|
||||||
|
for (std::vector<TileIndex>::iterator it = depot_tiles->begin(); it != depot_tiles->end(); ++it) {
|
||||||
|
if (CheckPlaceShipOnDepot(*it)) {
|
||||||
|
tile = *it;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (tile == INVALID_TILE) return_cmd_error(STR_ERROR_NO_FREE_DEPOT);
|
||||||
|
}
|
||||||
|
|
||||||
if (flags & DC_EXEC) {
|
if (flags & DC_EXEC) {
|
||||||
int x;
|
bool is_extended_depot = IsExtendedDepot(tile);
|
||||||
int y;
|
TileIndexDiffC offset = TileIndexDiffCByDiagDir(ReverseDiagDir(GetShipDepotDirection(tile)));
|
||||||
|
|
||||||
const ShipVehicleInfo *svi = &e->u.ship;
|
const ShipVehicleInfo *svi = &e->u.ship;
|
||||||
|
|
||||||
|
@ -969,14 +982,22 @@ CommandCost CmdBuildShip(DoCommandFlag flags, TileIndex tile, const Engine *e, V
|
||||||
|
|
||||||
v->owner = _current_company;
|
v->owner = _current_company;
|
||||||
v->tile = tile;
|
v->tile = tile;
|
||||||
x = TileX(tile) * TILE_SIZE + TILE_SIZE / 2;
|
v->x_pos = TileX(tile) * TILE_SIZE + TILE_SIZE / 2 + offset.x * (TILE_SIZE / 2 - 1);
|
||||||
y = TileY(tile) * TILE_SIZE + TILE_SIZE / 2;
|
v->y_pos = TileY(tile) * TILE_SIZE + TILE_SIZE / 2 + offset.y * (TILE_SIZE / 2 - 1);
|
||||||
v->x_pos = x;
|
v->z_pos = GetSlopePixelZ(v->x_pos, v->y_pos);
|
||||||
v->y_pos = y;
|
v->state = TRACK_BIT_DEPOT;
|
||||||
v->z_pos = GetSlopePixelZ(x, y);
|
|
||||||
|
|
||||||
|
if (is_extended_depot) {
|
||||||
|
v->state |= AxisToTrackBits(GetShipDepotAxis(tile));
|
||||||
|
v->direction = AxisToDirection(GetShipDepotAxis(v->tile));
|
||||||
|
SetDepotReservation(v->tile, DEPOT_RESERVATION_FULL_STOPPED_VEH);
|
||||||
|
} else {
|
||||||
|
v->vehstatus |= VS_HIDDEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
v->rotation = v->direction;
|
||||||
v->UpdateDeltaXY();
|
v->UpdateDeltaXY();
|
||||||
v->vehstatus = VS_HIDDEN | VS_STOPPED | VS_DEFPAL;
|
v->vehstatus |= VS_STOPPED | VS_DEFPAL;
|
||||||
|
|
||||||
v->spritenum = svi->image_index;
|
v->spritenum = svi->image_index;
|
||||||
v->cargo_type = e->GetDefaultCargoType();
|
v->cargo_type = e->GetDefaultCargoType();
|
||||||
|
@ -992,8 +1013,6 @@ CommandCost CmdBuildShip(DoCommandFlag flags, TileIndex tile, const Engine *e, V
|
||||||
v->reliability_spd_dec = e->reliability_spd_dec;
|
v->reliability_spd_dec = e->reliability_spd_dec;
|
||||||
v->max_age = e->GetLifeLengthInDays();
|
v->max_age = e->GetLifeLengthInDays();
|
||||||
|
|
||||||
v->state = TRACK_BIT_DEPOT;
|
|
||||||
|
|
||||||
v->SetServiceInterval(Company::Get(_current_company)->settings.vehicle.servint_ships);
|
v->SetServiceInterval(Company::Get(_current_company)->settings.vehicle.servint_ships);
|
||||||
v->date_of_last_service = TimerGameEconomy::date;
|
v->date_of_last_service = TimerGameEconomy::date;
|
||||||
v->date_of_last_service_newgrf = TimerGameCalendar::date;
|
v->date_of_last_service_newgrf = TimerGameCalendar::date;
|
||||||
|
@ -1014,6 +1033,8 @@ CommandCost CmdBuildShip(DoCommandFlag flags, TileIndex tile, const Engine *e, V
|
||||||
v->InvalidateNewGRFCacheOfChain();
|
v->InvalidateNewGRFCacheOfChain();
|
||||||
|
|
||||||
v->UpdatePosition();
|
v->UpdatePosition();
|
||||||
|
|
||||||
|
if (is_extended_depot) v->MarkDirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
return CommandCost();
|
return CommandCost();
|
||||||
|
|
Loading…
Reference in New Issue