src/roadveh_cmd.cpp
changeset 6585 7da94b26498a
parent 6574 e1d1a12faaf7
child 6589 addf4b6946d0
equal deleted inserted replaced
6584:85b9e0da5754 6585:7da94b26498a
   126 	int32 cost;
   126 	int32 cost;
   127 	Vehicle *v;
   127 	Vehicle *v;
   128 	UnitID unit_num;
   128 	UnitID unit_num;
   129 	Engine *e;
   129 	Engine *e;
   130 
   130 
   131 	if (!IsEngineBuildable(p1, VEH_Road, _current_player)) return_cmd_error(STR_ENGINE_NOT_BUILDABLE);
   131 	if (!IsEngineBuildable(p1, VEH_ROAD, _current_player)) return_cmd_error(STR_ENGINE_NOT_BUILDABLE);
   132 
   132 
   133 	SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
   133 	SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
   134 
   134 
   135 	cost = EstimateRoadVehCost(p1);
   135 	cost = EstimateRoadVehCost(p1);
   136 	if (flags & DC_QUERY_COST) return cost;
   136 	if (flags & DC_QUERY_COST) return cost;
   142 
   142 
   143 	v = AllocateVehicle();
   143 	v = AllocateVehicle();
   144 	if (v == NULL) return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
   144 	if (v == NULL) return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
   145 
   145 
   146 	/* find the first free roadveh id */
   146 	/* find the first free roadveh id */
   147 	unit_num = HASBIT(p2, 0) ? 0 : GetFreeUnitNumber(VEH_Road);
   147 	unit_num = HASBIT(p2, 0) ? 0 : GetFreeUnitNumber(VEH_ROAD);
   148 	if (unit_num > _patches.max_roadveh)
   148 	if (unit_num > _patches.max_roadveh)
   149 		return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
   149 		return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
   150 
   150 
   151 	if (flags & DC_EXEC) {
   151 	if (flags & DC_EXEC) {
   152 		int x;
   152 		int x;
   198 		v->service_interval = _patches.servint_roadveh;
   198 		v->service_interval = _patches.servint_roadveh;
   199 
   199 
   200 		v->date_of_last_service = _date;
   200 		v->date_of_last_service = _date;
   201 		v->build_year = _cur_year;
   201 		v->build_year = _cur_year;
   202 
   202 
   203 		v->type = VEH_Road;
   203 		v->type = VEH_ROAD;
   204 		v->cur_image = 0xC15;
   204 		v->cur_image = 0xC15;
   205 		v->random_bits = VehicleRandomBits();
   205 		v->random_bits = VehicleRandomBits();
   206 
   206 
   207 		v->vehicle_flags = 0;
   207 		v->vehicle_flags = 0;
   208 		if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SETBIT(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE);
   208 		if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SETBIT(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE);
   211 
   211 
   212 		InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
   212 		InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
   213 		RebuildVehicleLists();
   213 		RebuildVehicleLists();
   214 		InvalidateWindow(WC_COMPANY, v->owner);
   214 		InvalidateWindow(WC_COMPANY, v->owner);
   215 		if (IsLocalPlayer())
   215 		if (IsLocalPlayer())
   216 			InvalidateAutoreplaceWindow(VEH_Road); // updates the replace Road window
   216 			InvalidateAutoreplaceWindow(VEH_ROAD); // updates the replace Road window
   217 
   217 
   218 		GetPlayer(_current_player)->num_engines[p1]++;
   218 		GetPlayer(_current_player)->num_engines[p1]++;
   219 	}
   219 	}
   220 
   220 
   221 	return cost;
   221 	return cost;
   233 
   233 
   234 	if (!IsValidVehicleID(p1)) return CMD_ERROR;
   234 	if (!IsValidVehicleID(p1)) return CMD_ERROR;
   235 
   235 
   236 	v = GetVehicle(p1);
   236 	v = GetVehicle(p1);
   237 
   237 
   238 	if (v->type != VEH_Road || !CheckOwnership(v->owner)) return CMD_ERROR;
   238 	if (v->type != VEH_ROAD || !CheckOwnership(v->owner)) return CMD_ERROR;
   239 
   239 
   240 	/* Check if this road veh can be started/stopped. The callback will fail or
   240 	/* Check if this road veh can be started/stopped. The callback will fail or
   241 	 * return 0xFF if it can. */
   241 	 * return 0xFF if it can. */
   242 	callback = GetVehicleCallback(CBID_VEHICLE_START_STOP_CHECK, 0, 0, v->engine_type, v);
   242 	callback = GetVehicleCallback(CBID_VEHICLE_START_STOP_CHECK, 0, 0, v->engine_type, v);
   243 	if (callback != CALLBACK_FAILED && callback != 0xFF) {
   243 	if (callback != CALLBACK_FAILED && callback != 0xFF) {
   283 
   283 
   284 	if (!IsValidVehicleID(p1)) return CMD_ERROR;
   284 	if (!IsValidVehicleID(p1)) return CMD_ERROR;
   285 
   285 
   286 	v = GetVehicle(p1);
   286 	v = GetVehicle(p1);
   287 
   287 
   288 	if (v->type != VEH_Road || !CheckOwnership(v->owner)) return CMD_ERROR;
   288 	if (v->type != VEH_ROAD || !CheckOwnership(v->owner)) return CMD_ERROR;
   289 
   289 
   290 	SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
   290 	SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
   291 
   291 
   292 	if (!IsRoadVehInDepotStopped(v)) {
   292 	if (!IsRoadVehInDepotStopped(v)) {
   293 		return_cmd_error(STR_9013_MUST_BE_STOPPED_INSIDE);
   293 		return_cmd_error(STR_9013_MUST_BE_STOPPED_INSIDE);
   382 	const Depot *dep;
   382 	const Depot *dep;
   383 
   383 
   384 	if (p2 & DEPOT_MASS_SEND) {
   384 	if (p2 & DEPOT_MASS_SEND) {
   385 		/* Mass goto depot requested */
   385 		/* Mass goto depot requested */
   386 		if (!ValidVLWFlags(p2 & VLW_MASK)) return CMD_ERROR;
   386 		if (!ValidVLWFlags(p2 & VLW_MASK)) return CMD_ERROR;
   387 		return SendAllVehiclesToDepot(VEH_Road, flags, p2 & DEPOT_SERVICE, _current_player, (p2 & VLW_MASK), p1);
   387 		return SendAllVehiclesToDepot(VEH_ROAD, flags, p2 & DEPOT_SERVICE, _current_player, (p2 & VLW_MASK), p1);
   388 	}
   388 	}
   389 
   389 
   390 	if (!IsValidVehicleID(p1)) return CMD_ERROR;
   390 	if (!IsValidVehicleID(p1)) return CMD_ERROR;
   391 
   391 
   392 	v = GetVehicle(p1);
   392 	v = GetVehicle(p1);
   393 
   393 
   394 	if (v->type != VEH_Road || !CheckOwnership(v->owner)) return CMD_ERROR;
   394 	if (v->type != VEH_ROAD || !CheckOwnership(v->owner)) return CMD_ERROR;
   395 
   395 
   396 	if (v->vehstatus & VS_CRASHED) return CMD_ERROR;
   396 	if (v->vehstatus & VS_CRASHED) return CMD_ERROR;
   397 
   397 
   398 	if (IsRoadVehInDepot(v)) return CMD_ERROR;
   398 	if (IsRoadVehInDepot(v)) return CMD_ERROR;
   399 
   399 
   452 
   452 
   453 	if (!IsValidVehicleID(p1)) return CMD_ERROR;
   453 	if (!IsValidVehicleID(p1)) return CMD_ERROR;
   454 
   454 
   455 	v = GetVehicle(p1);
   455 	v = GetVehicle(p1);
   456 
   456 
   457 	if (v->type != VEH_Road || !CheckOwnership(v->owner)) return CMD_ERROR;
   457 	if (v->type != VEH_ROAD || !CheckOwnership(v->owner)) return CMD_ERROR;
   458 
   458 
   459 	if (v->vehstatus & VS_STOPPED ||
   459 	if (v->vehstatus & VS_STOPPED ||
   460 			v->u.road.crashed_ctr != 0 ||
   460 			v->u.road.crashed_ctr != 0 ||
   461 			v->breakdown_ctr != 0 ||
   461 			v->breakdown_ctr != 0 ||
   462 			v->u.road.overtaking != 0 ||
   462 			v->u.road.overtaking != 0 ||
   575 static void* EnumCheckRoadVehCrashTrain(Vehicle* v, void* data)
   575 static void* EnumCheckRoadVehCrashTrain(Vehicle* v, void* data)
   576 {
   576 {
   577 	const Vehicle* u = (Vehicle*)data;
   577 	const Vehicle* u = (Vehicle*)data;
   578 
   578 
   579 	return
   579 	return
   580 		v->type == VEH_Train &&
   580 		v->type == VEH_TRAIN &&
   581 		myabs(v->z_pos - u->z_pos) <= 6 &&
   581 		myabs(v->z_pos - u->z_pos) <= 6 &&
   582 		myabs(v->x_pos - u->x_pos) <= 4 &&
   582 		myabs(v->x_pos - u->x_pos) <= 4 &&
   583 		myabs(v->y_pos - u->y_pos) <= 4 ?
   583 		myabs(v->y_pos - u->y_pos) <= 4 ?
   584 			v : NULL;
   584 			v : NULL;
   585 }
   585 }
   802 	short x_diff = v->x_pos - rvf->x;
   802 	short x_diff = v->x_pos - rvf->x;
   803 	short y_diff = v->y_pos - rvf->y;
   803 	short y_diff = v->y_pos - rvf->y;
   804 
   804 
   805 	return
   805 	return
   806 		rvf->veh != v &&
   806 		rvf->veh != v &&
   807 		v->type == VEH_Road &&
   807 		v->type == VEH_ROAD &&
   808 		!IsRoadVehInDepot(v) &&
   808 		!IsRoadVehInDepot(v) &&
   809 		myabs(v->z_pos - rvf->veh->z_pos) < 6 &&
   809 		myabs(v->z_pos - rvf->veh->z_pos) < 6 &&
   810 		v->direction == rvf->dir &&
   810 		v->direction == rvf->dir &&
   811 		(dist_x[v->direction] >= 0 || (x_diff > dist_x[v->direction] && x_diff <= 0)) &&
   811 		(dist_x[v->direction] >= 0 || (x_diff > dist_x[v->direction] && x_diff <= 0)) &&
   812 		(dist_x[v->direction] <= 0 || (x_diff < dist_x[v->direction] && x_diff >= 0)) &&
   812 		(dist_x[v->direction] <= 0 || (x_diff < dist_x[v->direction] && x_diff >= 0)) &&
   943 static void* EnumFindVehToOvertake(Vehicle* v, void* data)
   943 static void* EnumFindVehToOvertake(Vehicle* v, void* data)
   944 {
   944 {
   945 	const OvertakeData* od = (OvertakeData*)data;
   945 	const OvertakeData* od = (OvertakeData*)data;
   946 
   946 
   947 	return
   947 	return
   948 		v->tile == od->tile && v->type == VEH_Road && v != od->u && v != od->v ?
   948 		v->tile == od->tile && v->type == VEH_ROAD && v != od->u && v != od->v ?
   949 			v : NULL;
   949 			v : NULL;
   950 }
   950 }
   951 
   951 
   952 static bool FindRoadVehToOvertake(OvertakeData *od)
   952 static bool FindRoadVehToOvertake(OvertakeData *od)
   953 {
   953 {
  1827 void RoadVehiclesYearlyLoop()
  1827 void RoadVehiclesYearlyLoop()
  1828 {
  1828 {
  1829 	Vehicle *v;
  1829 	Vehicle *v;
  1830 
  1830 
  1831 	FOR_ALL_VEHICLES(v) {
  1831 	FOR_ALL_VEHICLES(v) {
  1832 		if (v->type == VEH_Road) {
  1832 		if (v->type == VEH_ROAD) {
  1833 			v->profit_last_year = v->profit_this_year;
  1833 			v->profit_last_year = v->profit_this_year;
  1834 			v->profit_this_year = 0;
  1834 			v->profit_this_year = 0;
  1835 			InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
  1835 			InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
  1836 		}
  1836 		}
  1837 	}
  1837 	}
  1854 
  1854 
  1855 	if (!IsValidVehicleID(p1)) return CMD_ERROR;
  1855 	if (!IsValidVehicleID(p1)) return CMD_ERROR;
  1856 
  1856 
  1857 	v = GetVehicle(p1);
  1857 	v = GetVehicle(p1);
  1858 
  1858 
  1859 	if (v->type != VEH_Road || !CheckOwnership(v->owner)) return CMD_ERROR;
  1859 	if (v->type != VEH_ROAD || !CheckOwnership(v->owner)) return CMD_ERROR;
  1860 	if (!IsRoadVehInDepotStopped(v)) return_cmd_error(STR_9013_MUST_BE_STOPPED_INSIDE);
  1860 	if (!IsRoadVehInDepotStopped(v)) return_cmd_error(STR_9013_MUST_BE_STOPPED_INSIDE);
  1861 
  1861 
  1862 	if (new_cid > NUM_CARGO || !CanRefitTo(v->engine_type, new_cid)) return CMD_ERROR;
  1862 	if (new_cid > NUM_CARGO || !CanRefitTo(v->engine_type, new_cid)) return CMD_ERROR;
  1863 
  1863 
  1864 	SET_EXPENSES_TYPE(EXPENSES_ROADVEH_RUN);
  1864 	SET_EXPENSES_TYPE(EXPENSES_ROADVEH_RUN);