src/order_gui.cpp
branchcpp_gui
changeset 6298 c30fe89622df
parent 6268 4b5241e5dd10
child 6303 84c215fc8eb8
equal deleted inserted replaced
6297:4bf29d14edba 6298:c30fe89622df
    96 		/* delete */
    96 		/* delete */
    97 		w->SetWidgetDisabledState(ORDER_WIDGET_DELETE,
    97 		w->SetWidgetDisabledState(ORDER_WIDGET_DELETE,
    98 				(uint)v->num_orders + ((shared_orders || v->num_orders != 0) ? 1 : 0) <= (uint)WP(w, order_d).sel);
    98 				(uint)v->num_orders + ((shared_orders || v->num_orders != 0) ? 1 : 0) <= (uint)WP(w, order_d).sel);
    99 
    99 
   100 		/* non-stop only for trains */
   100 		/* non-stop only for trains */
   101 		w->SetWidgetDisabledState(ORDER_WIDGET_NON_STOP,  v->type != VEH_Train || order == NULL);
   101 		w->SetWidgetDisabledState(ORDER_WIDGET_NON_STOP,  v->type != VEH_TRAIN || order == NULL);
   102 		w->SetWidgetDisabledState(ORDER_WIDGET_FULL_LOAD, order == NULL); // full load
   102 		w->SetWidgetDisabledState(ORDER_WIDGET_FULL_LOAD, order == NULL); // full load
   103 		w->SetWidgetDisabledState(ORDER_WIDGET_UNLOAD,    order == NULL); // unload
   103 		w->SetWidgetDisabledState(ORDER_WIDGET_UNLOAD,    order == NULL); // unload
   104 		w->SetWidgetDisabledState(ORDER_WIDGET_TRANSFER,  order == NULL); // transfer
   104 		w->SetWidgetDisabledState(ORDER_WIDGET_TRANSFER,  order == NULL); // transfer
   105 		/* Disable list of vehicles with the same shared orders if there is no list */
   105 		/* Disable list of vehicles with the same shared orders if there is no list */
   106 		w->SetWidgetDisabledState(ORDER_WIDGET_SHARED_ORDER_LIST, !shared_orders || v->orders == NULL);
   106 		w->SetWidgetDisabledState(ORDER_WIDGET_SHARED_ORDER_LIST, !shared_orders || v->orders == NULL);
   160 					break;
   160 					break;
   161 
   161 
   162 				case OT_GOTO_DEPOT: {
   162 				case OT_GOTO_DEPOT: {
   163 					StringID s = STR_NULL;
   163 					StringID s = STR_NULL;
   164 
   164 
   165 					if (v->type == VEH_Aircraft) {
   165 					if (v->type == VEH_AIRCRAFT) {
   166 						s = STR_GO_TO_AIRPORT_HANGAR;
   166 						s = STR_GO_TO_AIRPORT_HANGAR;
   167 						SetDParam(2, order->dest);
   167 						SetDParam(2, order->dest);
   168 					} else {
   168 					} else {
   169 						SetDParam(2, GetDepot(order->dest)->town_index);
   169 						SetDParam(2, GetDepot(order->dest)->town_index);
   170 
   170 
   171 						switch (v->type) {
   171 						switch (v->type) {
   172 							case VEH_Train: s = (order->flags & OF_NON_STOP) ? STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT : STR_GO_TO_TRAIN_DEPOT; break;
   172 							case VEH_TRAIN: s = (order->flags & OF_NON_STOP) ? STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT : STR_GO_TO_TRAIN_DEPOT; break;
   173 							case VEH_Road:  s = STR_9038_GO_TO_ROADVEH_DEPOT; break;
   173 							case VEH_ROAD:  s = STR_9038_GO_TO_ROADVEH_DEPOT; break;
   174 							case VEH_Ship:  s = STR_GO_TO_SHIP_DEPOT; break;
   174 							case VEH_SHIP:  s = STR_GO_TO_SHIP_DEPOT; break;
   175 							default: break;
   175 							default: break;
   176 						}
   176 						}
   177 					}
   177 					}
   178 
   178 
   179 					if (order->flags & OF_FULL_LOAD) s++; /* service at */
   179 					if (order->flags & OF_FULL_LOAD) s++; /* service at */
   229 
   229 
   230 	// check depot first
   230 	// check depot first
   231 	if (_patches.gotodepot) {
   231 	if (_patches.gotodepot) {
   232 		switch (GetTileType(tile)) {
   232 		switch (GetTileType(tile)) {
   233 		case MP_RAILWAY:
   233 		case MP_RAILWAY:
   234 			if (v->type == VEH_Train && IsTileOwner(tile, _local_player)) {
   234 			if (v->type == VEH_TRAIN && IsTileOwner(tile, _local_player)) {
   235 				if (IsRailDepot(tile)) {
   235 				if (IsRailDepot(tile)) {
   236 					order.type = OT_GOTO_DEPOT;
   236 					order.type = OT_GOTO_DEPOT;
   237 					order.flags = OF_PART_OF_ORDERS;
   237 					order.flags = OF_PART_OF_ORDERS;
   238 					order.dest = GetDepotByTile(tile)->index;
   238 					order.dest = GetDepotByTile(tile)->index;
   239 					return order;
   239 					return order;
   240 				}
   240 				}
   241 			}
   241 			}
   242 			break;
   242 			break;
   243 
   243 
   244 		case MP_STREET:
   244 		case MP_STREET:
   245 			if (GetRoadTileType(tile) == ROAD_TILE_DEPOT && v->type == VEH_Road && IsTileOwner(tile, _local_player)) {
   245 			if (GetRoadTileType(tile) == ROAD_TILE_DEPOT && v->type == VEH_ROAD && IsTileOwner(tile, _local_player)) {
   246 				order.type = OT_GOTO_DEPOT;
   246 				order.type = OT_GOTO_DEPOT;
   247 				order.flags = OF_PART_OF_ORDERS;
   247 				order.flags = OF_PART_OF_ORDERS;
   248 				order.dest = GetDepotByTile(tile)->index;
   248 				order.dest = GetDepotByTile(tile)->index;
   249 				return order;
   249 				return order;
   250 			}
   250 			}
   251 			break;
   251 			break;
   252 
   252 
   253 		case MP_STATION:
   253 		case MP_STATION:
   254 			if (v->type != VEH_Aircraft) break;
   254 			if (v->type != VEH_AIRCRAFT) break;
   255 			if (IsHangar(tile) && IsTileOwner(tile, _local_player)) {
   255 			if (IsHangar(tile) && IsTileOwner(tile, _local_player)) {
   256 				order.type = OT_GOTO_DEPOT;
   256 				order.type = OT_GOTO_DEPOT;
   257 				order.flags = OF_PART_OF_ORDERS;
   257 				order.flags = OF_PART_OF_ORDERS;
   258 				order.dest = GetStationIndex(tile);
   258 				order.dest = GetStationIndex(tile);
   259 				return order;
   259 				return order;
   260 			}
   260 			}
   261 			break;
   261 			break;
   262 
   262 
   263 		case MP_WATER:
   263 		case MP_WATER:
   264 			if (v->type != VEH_Ship) break;
   264 			if (v->type != VEH_SHIP) break;
   265 			if (IsTileDepotType(tile, TRANSPORT_WATER) &&
   265 			if (IsTileDepotType(tile, TRANSPORT_WATER) &&
   266 					IsTileOwner(tile, _local_player)) {
   266 					IsTileOwner(tile, _local_player)) {
   267 				TileIndex tile2 = GetOtherShipDepotTile(tile);
   267 				TileIndex tile2 = GetOtherShipDepotTile(tile);
   268 
   268 
   269 				order.type = OT_GOTO_DEPOT;
   269 				order.type = OT_GOTO_DEPOT;
   277 		}
   277 		}
   278 	}
   278 	}
   279 
   279 
   280 	// check waypoint
   280 	// check waypoint
   281 	if (IsTileType(tile, MP_RAILWAY) &&
   281 	if (IsTileType(tile, MP_RAILWAY) &&
   282 			v->type == VEH_Train &&
   282 			v->type == VEH_TRAIN &&
   283 			IsTileOwner(tile, _local_player) &&
   283 			IsTileOwner(tile, _local_player) &&
   284 			IsRailWaypoint(tile)) {
   284 			IsRailWaypoint(tile)) {
   285 		order.type = OT_GOTO_WAYPOINT;
   285 		order.type = OT_GOTO_WAYPOINT;
   286 		order.flags = 0;
   286 		order.flags = 0;
   287 		order.dest = GetWaypointByTile(tile)->index;
   287 		order.dest = GetWaypointByTile(tile)->index;
   292 		StationID st_index = GetStationIndex(tile);
   292 		StationID st_index = GetStationIndex(tile);
   293 		const Station *st = GetStation(st_index);
   293 		const Station *st = GetStation(st_index);
   294 
   294 
   295 		if (st->owner == _current_player || st->owner == OWNER_NONE) {
   295 		if (st->owner == _current_player || st->owner == OWNER_NONE) {
   296 			byte facil;
   296 			byte facil;
   297 			(facil=FACIL_DOCK, v->type == VEH_Ship) ||
   297 			(facil=FACIL_DOCK, v->type == VEH_SHIP) ||
   298 			(facil=FACIL_TRAIN, v->type == VEH_Train) ||
   298 			(facil=FACIL_TRAIN, v->type == VEH_TRAIN) ||
   299 			(facil=FACIL_AIRPORT, v->type == VEH_Aircraft) ||
   299 			(facil=FACIL_AIRPORT, v->type == VEH_AIRCRAFT) ||
   300 			(facil=FACIL_BUS_STOP, v->type == VEH_Road && v->cargo_type == CT_PASSENGERS) ||
   300 			(facil=FACIL_BUS_STOP, v->type == VEH_ROAD && v->cargo_type == CT_PASSENGERS) ||
   301 			(facil=FACIL_TRUCK_STOP, 1);
   301 			(facil=FACIL_TRUCK_STOP, 1);
   302 			if (st->facilities & facil) {
   302 			if (st->facilities & facil) {
   303 				order.type = OT_GOTO_STATION;
   303 				order.type = OT_GOTO_STATION;
   304 				order.flags = 0;
   304 				order.flags = 0;
   305 				order.dest = st_index;
   305 				order.dest = st_index;
   307 			}
   307 			}
   308 		}
   308 		}
   309 	}
   309 	}
   310 
   310 
   311 	// not found
   311 	// not found
   312 	order.type = OT_NOTHING;
   312 	order.Free();
   313 	order.flags = 0;
       
   314 	order.dest = INVALID_STATION;
   313 	order.dest = INVALID_STATION;
   315 	return order;
   314 	return order;
   316 }
   315 }
   317 
   316 
   318 static bool HandleOrderVehClick(const Vehicle *v, const Vehicle *u, BaseWindow *w)
   317 static bool HandleOrderVehClick(const Vehicle *v, const Vehicle *u, BaseWindow *w)
   319 {
   318 {
   320 	if (u->type != v->type) return false;
   319 	if (u->type != v->type) return false;
   321 
   320 
   322 	if (u->type == VEH_Train && !IsFrontEngine(u)) {
   321 	if (u->type == VEH_TRAIN && !IsFrontEngine(u)) {
   323 		u = GetFirstVehicleInChain(u);
   322 		u = GetFirstVehicleInChain(u);
   324 		if (!IsFrontEngine(u)) return false;
   323 		if (!IsFrontEngine(u)) return false;
   325 	}
   324 	}
   326 
   325 
   327 	// v is vehicle getting orders. Only copy/clone orders if vehicle doesn't have any orders yet
   326 	// v is vehicle getting orders. Only copy/clone orders if vehicle doesn't have any orders yet
   345 	// check if we're clicking on a vehicle first.. clone orders in that case.
   344 	// check if we're clicking on a vehicle first.. clone orders in that case.
   346 	u = CheckMouseOverVehicle();
   345 	u = CheckMouseOverVehicle();
   347 	if (u != NULL && HandleOrderVehClick(v, u, w)) return;
   346 	if (u != NULL && HandleOrderVehClick(v, u, w)) return;
   348 
   347 
   349 	cmd = GetOrderCmdFromTile(v, tile);
   348 	cmd = GetOrderCmdFromTile(v, tile);
   350 	if (cmd.type == OT_NOTHING) return;
   349 	if (!cmd.IsValid()) return;
   351 
   350 
   352 	if (DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), PackOrder(&cmd), NULL, CMD_INSERT_ORDER | CMD_MSG(STR_8833_CAN_T_INSERT_NEW_ORDER))) {
   351 	if (DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), PackOrder(&cmd), NULL, CMD_INSERT_ORDER | CMD_MSG(STR_8833_CAN_T_INSERT_NEW_ORDER))) {
   353 		if (WP(w,order_d).sel != -1) WP(w,order_d).sel++;
   352 		if (WP(w,order_d).sel != -1) WP(w,order_d).sel++;
   354 		ResetObjectToPlace();
   353 		ResetObjectToPlace();
   355 	}
   354 	}
   463 				const Order *ord = GetVehicleOrder(v, sel);
   462 				const Order *ord = GetVehicleOrder(v, sel);
   464 				TileIndex xy;
   463 				TileIndex xy;
   465 
   464 
   466 				switch (ord->type) {
   465 				switch (ord->type) {
   467 					case OT_GOTO_STATION:  xy = GetStation(ord->dest)->xy ; break;
   466 					case OT_GOTO_STATION:  xy = GetStation(ord->dest)->xy ; break;
   468 					case OT_GOTO_DEPOT:    xy = (v->type == VEH_Aircraft) ?  GetStation(ord->dest)->xy : GetDepot(ord->dest)->xy;    break;
   467 					case OT_GOTO_DEPOT:    xy = (v->type == VEH_AIRCRAFT) ?  GetStation(ord->dest)->xy : GetDepot(ord->dest)->xy;    break;
   469 					case OT_GOTO_WAYPOINT: xy = GetWaypoint(ord->dest)->xy; break;
   468 					case OT_GOTO_WAYPOINT: xy = GetWaypoint(ord->dest)->xy; break;
   470 					default:               xy = 0; break;
   469 					default:               xy = 0; break;
   471 				}
   470 				}
   472 
   471 
   473 				if (xy != 0) ScrollMainWindowToTile(xy);
   472 				if (xy != 0) ScrollMainWindowToTile(xy);
   675 	DeleteWindowById(WC_VEHICLE_DETAILS, veh);
   674 	DeleteWindowById(WC_VEHICLE_DETAILS, veh);
   676 
   675 
   677 	if (v->owner != _local_player) {
   676 	if (v->owner != _local_player) {
   678 		w = BaseWindow::AllocateFront(&_other_orders_desc, veh);
   677 		w = BaseWindow::AllocateFront(&_other_orders_desc, veh);
   679 	} else {
   678 	} else {
   680 		w = BaseWindow::AllocateFront((v->type == VEH_Train) ? &_orders_train_desc : &_orders_desc, veh);
   679 		w = BaseWindow::AllocateFront((v->type == VEH_TRAIN) ? &_orders_train_desc : &_orders_desc, veh);
   681 	}
   680 	}
   682 
   681 
   683 	if (w != NULL) {
   682 	if (w != NULL) {
   684 		w->caption_color = v->owner;
   683 		w->caption_color = v->owner;
   685 		w->vscroll.cap = 6;
   684 		w->vscroll.cap = 6;