diff options
-rw-r--r-- | src/ai/api/ai_order.cpp | 5 | ||||
-rw-r--r-- | src/order_cmd.cpp | 36 | ||||
-rw-r--r-- | src/order_gui.cpp | 28 | ||||
-rw-r--r-- | src/saveload/afterload.cpp | 8 | ||||
-rw-r--r-- | src/ship_cmd.cpp | 3 | ||||
-rw-r--r-- | src/vehicle_gui.cpp | 4 |
6 files changed, 68 insertions, 16 deletions
diff --git a/src/ai/api/ai_order.cpp b/src/ai/api/ai_order.cpp index 1378b9ea9..7cd791562 100644 --- a/src/ai/api/ai_order.cpp +++ b/src/ai/api/ai_order.cpp @@ -26,6 +26,7 @@ static OrderType GetOrderTypeByTile(TileIndex t) default: break; case MP_STATION: if (IsHangar(t)) return OT_GOTO_DEPOT; + if (IsBuoy(t)) return OT_GOTO_WAYPOINT; return OT_GOTO_STATION; break; case MP_WATER: if (::IsShipDepot(t)) return OT_GOTO_DEPOT; break; @@ -201,7 +202,7 @@ static const Order *ResolveOrder(VehicleID vehicle_id, AIOrder::OrderPosition or } return INVALID_TILE; } - case OT_GOTO_WAYPOINT: return ::Waypoint::Get(order->GetDestination())->xy; + case OT_GOTO_WAYPOINT: return v->type == VEH_TRAIN ? ::Waypoint::Get(order->GetDestination())->xy : ::Station::Get(order->GetDestination())->xy; default: return INVALID_TILE; } } @@ -358,7 +359,7 @@ static const Order *ResolveOrder(VehicleID vehicle_id, AIOrder::OrderPosition or break; case OT_GOTO_WAYPOINT: - order.MakeGoToWaypoint(::GetWaypointIndex(destination)); + order.MakeGoToWaypoint(::Vehicle::Get(vehicle_id)->type == VEH_TRAIN ? ::GetWaypointIndex(destination) : ::GetStationIndex(destination)); break; default: diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index 120846922..7bb16f2bd 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -411,6 +411,7 @@ static TileIndex GetOrderLocation(const Order& o) { switch (o.GetType()) { default: NOT_REACHED(); + case OT_GOTO_WAYPOINT: // This function is only called for ships, thus waypoints are buoys which are stations. case OT_GOTO_STATION: return Station::Get(o.GetDestination())->xy; case OT_GOTO_DEPOT: return Depot::Get(o.GetDestination())->xy; } @@ -418,6 +419,8 @@ static TileIndex GetOrderLocation(const Order& o) static uint GetOrderDistance(const Order *prev, const Order *cur, const Vehicle *v, int conditional_depth = 0) { + assert(v->type == VEH_SHIP); + if (cur->IsType(OT_CONDITIONAL)) { if (conditional_depth > v->GetNumOrders()) return 0; @@ -539,10 +542,19 @@ CommandCost CmdInsertOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 } case OT_GOTO_WAYPOINT: { - if (v->type != VEH_TRAIN) return CMD_ERROR; + switch (v->type) { + default: return CMD_ERROR; - const Waypoint *wp = Waypoint::GetIfValid(new_order.GetDestination()); - if (wp == NULL || !CheckOwnership(wp->owner)) return CMD_ERROR; + case VEH_TRAIN: { + const Waypoint *wp = Waypoint::GetIfValid(new_order.GetDestination()); + if (wp == NULL || !CheckOwnership(wp->owner)) return CMD_ERROR; + } break; + + case VEH_SHIP: { + const Station *st = Station::GetIfValid(new_order.GetDestination()); + if (st == NULL || (!CheckOwnership(st->owner) && st->owner != OWNER_NONE)) return CMD_ERROR; + } break; + } /* Order flags can be any of the following for waypoints: * [non-stop] @@ -597,7 +609,15 @@ CommandCost CmdInsertOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 * finds the last order in the list. */ const Order *o; FOR_VEHICLE_ORDERS(v, o) { - if (o->IsType(OT_GOTO_STATION) || o->IsType(OT_GOTO_DEPOT)) prev = o; + switch (o->GetType()) { + case OT_GOTO_STATION: + case OT_GOTO_DEPOT: + case OT_GOTO_WAYPOINT: + prev = o; + break; + + default: break; + } if (++n == sel_ord && prev != NULL) break; } if (prev != NULL) { @@ -877,7 +897,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 Order *order = v->GetOrder(sel_ord); switch (order->GetType()) { case OT_GOTO_STATION: - if (mof == MOF_COND_VARIABLE || mof == MOF_COND_COMPARATOR || mof == MOF_DEPOT_ACTION || mof == MOF_COND_VALUE || Station::Get(order->GetDestination())->IsBuoy()) return CMD_ERROR; + if (mof == MOF_COND_VARIABLE || mof == MOF_COND_COMPARATOR || mof == MOF_DEPOT_ACTION || mof == MOF_COND_VALUE) return CMD_ERROR; break; case OT_GOTO_DEPOT: @@ -1664,7 +1684,11 @@ bool UpdateOrderDest(Vehicle *v, const Order *order, int conditional_depth) break; case OT_GOTO_WAYPOINT: - v->dest_tile = Waypoint::Get(order->GetDestination())->xy; + if (v->type == VEH_TRAIN) { + v->dest_tile = Waypoint::Get(order->GetDestination())->xy; + } else { + v->dest_tile = Station::Get(order->GetDestination())->xy; + } break; case OT_CONDITIONAL: { diff --git a/src/order_gui.cpp b/src/order_gui.cpp index 33e11099c..8a9d01340 100644 --- a/src/order_gui.cpp +++ b/src/order_gui.cpp @@ -253,8 +253,15 @@ void DrawOrderString(const Vehicle *v, const Order *order, int order_index, int break; case OT_GOTO_WAYPOINT: - SetDParam(1, (order->GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS) ? STR_GO_NON_STOP_TO_WAYPOINT : STR_GO_TO_WAYPOINT); - SetDParam(2, order->GetDestination()); + if (v->type == VEH_TRAIN) { + SetDParam(1, (order->GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS) ? STR_GO_NON_STOP_TO_WAYPOINT : STR_GO_TO_WAYPOINT); + SetDParam(2, order->GetDestination()); + } else { + SetDParam(1, STR_GO_TO_STATION); + SetDParam(2, STR_ORDER_GO_VIA); + SetDParam(3, order->GetDestination()); + SetDParam(4, STR_EMPTY); + } break; case OT_CONDITIONAL: @@ -350,6 +357,11 @@ static Order GetOrderCmdFromTile(const Vehicle *v, TileIndex tile) return order; } + if (IsBuoyTile(tile) && v->type == VEH_SHIP) { + order.MakeGoToWaypoint(GetStationIndex(tile)); + return order; + } + if (IsTileType(tile, MP_STATION)) { StationID st_index = GetStationIndex(tile); const Station *st = Station::Get(st_index); @@ -857,8 +869,16 @@ public: TileIndex xy = INVALID_TILE; switch (ord->GetType()) { - case OT_GOTO_STATION: xy = Station::Get(ord->GetDestination())->xy ; break; - case OT_GOTO_WAYPOINT: xy = Waypoint::Get(ord->GetDestination())->xy; break; + case OT_GOTO_WAYPOINT: + if (this->vehicle->type == VEH_TRAIN) { + xy = Waypoint::Get(ord->GetDestination())->xy; + break; + } + /* FALL THROUGH */ + case OT_GOTO_STATION: + xy = Station::Get(ord->GetDestination())->xy; + break; + case OT_GOTO_DEPOT: if ((ord->GetDepotActionType() & ODATFB_NEAREST_DEPOT) != 0) break; xy = (this->vehicle->type == VEH_AIRCRAFT) ? Station::Get(ord->GetDestination())->xy : Depot::Get(ord->GetDestination())->xy; diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index c529a77ae..407972f7b 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -1944,6 +1944,14 @@ bool AfterLoadGame() } s->cargo_type = CT_INVALID; } + + Order *o; + FOR_ALL_ORDERS(o) { + /* Buoys are now go to waypoint orders */ + if (!o->IsType(OT_GOTO_STATION) || !Station::Get(o->GetDestination())->IsBuoy()) continue; + + o->MakeGoToWaypoint(o->GetDestination()); + } } AfterLoadLabelMaps(); diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp index 1f04cf3d0..86586ddfe 100644 --- a/src/ship_cmd.cpp +++ b/src/ship_cmd.cpp @@ -626,8 +626,7 @@ static void ShipController(Ship *v) InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH); } else if (v->dest_tile != 0) { /* We have a target, let's see if we reached it... */ - if (v->current_order.IsType(OT_GOTO_STATION) && - Station::Get(v->current_order.GetDestination())->IsBuoy() && + if (v->current_order.IsType(OT_GOTO_WAYPOINT) && DistanceManhattan(v->dest_tile, gp.new_tile) <= 3) { /* We got within 3 tiles of our target buoy, so let's skip to our * next order */ diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index e4b9fa684..17b225b38 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -1991,9 +1991,9 @@ struct VehicleViewWindow : Window { break; case OT_GOTO_WAYPOINT: { - assert(v->type == VEH_TRAIN); + assert(v->type == VEH_TRAIN || v->type == VEH_SHIP); SetDParam(0, v->current_order.GetDestination()); - str = STR_HEADING_FOR_WAYPOINT + _settings_client.gui.vehicle_speed; + str = (v->type == VEH_TRAIN ? STR_HEADING_FOR_WAYPOINT : STR_HEADING_FOR_STATION) + _settings_client.gui.vehicle_speed; SetDParam(1, v->GetDisplaySpeed()); break; } |