src/roadveh_cmd.cpp
branchnoai
changeset 9631 8a2d1c2ceb88
parent 9629 66dde6412125
child 9641 855e32c08c9b
equal deleted inserted replaced
9630:550db5cefcc2 9631:8a2d1c2ceb88
    83 /** Converts the exit direction of a depot to trackdir the vehicle is going to drive to */
    83 /** Converts the exit direction of a depot to trackdir the vehicle is going to drive to */
    84 static const Trackdir _roadveh_depot_exit_trackdir[DIAGDIR_END] = {
    84 static const Trackdir _roadveh_depot_exit_trackdir[DIAGDIR_END] = {
    85 	TRACKDIR_X_NE, TRACKDIR_Y_SE, TRACKDIR_X_SW, TRACKDIR_Y_NW
    85 	TRACKDIR_X_NE, TRACKDIR_Y_SE, TRACKDIR_X_SW, TRACKDIR_Y_NW
    86 };
    86 };
    87 
    87 
    88 int GetRoadVehImage(const Vehicle* v, Direction direction)
    88 int RoadVehicle::GetImage(Direction direction) const
    89 {
    89 {
    90 	int img = v->spritenum;
    90 	int img = this->spritenum;
    91 	int image;
    91 	int image;
    92 
    92 
    93 	if (is_custom_sprite(img)) {
    93 	if (is_custom_sprite(img)) {
    94 		image = GetCustomVehicleSprite(v, (Direction)(direction + 4 * IS_CUSTOM_SECONDHEAD_SPRITE(img)));
    94 		image = GetCustomVehicleSprite(this, (Direction)(direction + 4 * IS_CUSTOM_SECONDHEAD_SPRITE(img)));
    95 		if (image != 0) return image;
    95 		if (image != 0) return image;
    96 		img = orig_road_vehicle_info[v->engine_type - ROAD_ENGINES_INDEX].image_index;
    96 		img = orig_road_vehicle_info[this->engine_type - ROAD_ENGINES_INDEX].image_index;
    97 	}
    97 	}
    98 
    98 
    99 	image = direction + _roadveh_images[img];
    99 	image = direction + _roadveh_images[img];
   100 	if (v->cargo.Count() >= v->cargo_cap / 2U) image += _roadveh_full_adder[img];
   100 	if (this->cargo.Count() >= this->cargo_cap / 2U) image += _roadveh_full_adder[img];
   101 	return image;
   101 	return image;
   102 }
   102 }
   103 
   103 
   104 void DrawRoadVehEngine(int x, int y, EngineID engine, SpriteID pal)
   104 void DrawRoadVehEngine(int x, int y, EngineID engine, SpriteID pal)
   105 {
   105 {
   267 
   267 
   268 		InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
   268 		InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
   269 		RebuildVehicleLists();
   269 		RebuildVehicleLists();
   270 		InvalidateWindow(WC_COMPANY, v->owner);
   270 		InvalidateWindow(WC_COMPANY, v->owner);
   271 		if (IsLocalPlayer())
   271 		if (IsLocalPlayer())
   272 			InvalidateAutoreplaceWindow(VEH_ROAD); // updates the replace Road window
   272 			InvalidateAutoreplaceWindow(VEH_ROAD, v->group_id); // updates the replace Road window
   273 
   273 
   274 		GetPlayer(_current_player)->num_engines[p1]++;
   274 		GetPlayer(_current_player)->num_engines[p1]++;
   275 	}
   275 	}
   276 
   276 
   277 	return CommandCost(cost);
   277 	return CommandCost(cost);
   553 }
   553 }
   554 
   554 
   555 
   555 
   556 void RoadVehicle::MarkDirty()
   556 void RoadVehicle::MarkDirty()
   557 {
   557 {
   558 	this->cur_image = GetRoadVehImage(this, this->direction);
   558 	this->cur_image = this->GetImage(this->direction);
   559 	MarkAllViewportsDirty(this->left_coord, this->top_coord, this->right_coord + 1, this->bottom_coord + 1);
   559 	MarkAllViewportsDirty(this->left_coord, this->top_coord, this->right_coord + 1, this->bottom_coord + 1);
   560 }
   560 }
   561 
   561 
   562 void RoadVehicle::UpdateDeltaXY(Direction direction)
   562 void RoadVehicle::UpdateDeltaXY(Direction direction)
   563 {
   563 {
   639 		uint32 r = Random();
   639 		uint32 r = Random();
   640 
   640 
   641 		v->direction = ChangeDir(v->direction, delta[r & 3]);
   641 		v->direction = ChangeDir(v->direction, delta[r & 3]);
   642 		BeginVehicleMove(v);
   642 		BeginVehicleMove(v);
   643 		v->UpdateDeltaXY(v->direction);
   643 		v->UpdateDeltaXY(v->direction);
   644 		v->cur_image = GetRoadVehImage(v, v->direction);
   644 		v->cur_image = v->GetImage(v->direction);
   645 		SetRoadVehPosition(v, v->x_pos, v->y_pos);
   645 		SetRoadVehPosition(v, v->x_pos, v->y_pos);
   646 	} while ((v = v->next) != NULL);
   646 	} while ((v = v->next) != NULL);
   647 }
   647 }
   648 
   648 
   649 static void RoadVehIsCrashed(Vehicle *v)
   649 static void RoadVehIsCrashed(Vehicle *v)
  1364 
  1364 
  1365 	v->vehstatus &= ~VS_HIDDEN;
  1365 	v->vehstatus &= ~VS_HIDDEN;
  1366 	v->u.road.state = tdir;
  1366 	v->u.road.state = tdir;
  1367 	v->u.road.frame = RVC_DEPOT_START_FRAME;
  1367 	v->u.road.frame = RVC_DEPOT_START_FRAME;
  1368 
  1368 
  1369 	v->cur_image = GetRoadVehImage(v, v->direction);
  1369 	v->cur_image = v->GetImage(v->direction);
  1370 	v->UpdateDeltaXY(v->direction);
  1370 	v->UpdateDeltaXY(v->direction);
  1371 	SetRoadVehPosition(v,x,y);
  1371 	SetRoadVehPosition(v,x,y);
  1372 
  1372 
  1373 	InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
  1373 	InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
  1374 
  1374 
  1457 			return false;
  1457 			return false;
  1458 		}
  1458 		}
  1459 
  1459 
  1460 		if ((IsTunnelTile(gp.new_tile) || IsBridgeTile(gp.new_tile)) && HASBIT(VehicleEnterTile(v, gp.new_tile, gp.x, gp.y), VETS_ENTERED_WORMHOLE)) {
  1460 		if ((IsTunnelTile(gp.new_tile) || IsBridgeTile(gp.new_tile)) && HASBIT(VehicleEnterTile(v, gp.new_tile, gp.x, gp.y), VETS_ENTERED_WORMHOLE)) {
  1461 			/* Vehicle has just entered a bridge or tunnel */
  1461 			/* Vehicle has just entered a bridge or tunnel */
  1462 			v->cur_image = GetRoadVehImage(v, v->direction);
  1462 			v->cur_image = v->GetImage(v->direction);
  1463 			v->UpdateDeltaXY(v->direction);
  1463 			v->UpdateDeltaXY(v->direction);
  1464 			SetRoadVehPosition(v,gp.x,gp.y);
  1464 			SetRoadVehPosition(v,gp.x,gp.y);
  1465 			return true;
  1465 			return true;
  1466 		}
  1466 		}
  1467 
  1467 
  1572 		if (newdir != v->direction) {
  1572 		if (newdir != v->direction) {
  1573 			v->direction = newdir;
  1573 			v->direction = newdir;
  1574 			v->cur_speed -= v->cur_speed >> 2;
  1574 			v->cur_speed -= v->cur_speed >> 2;
  1575 		}
  1575 		}
  1576 
  1576 
  1577 		v->cur_image = GetRoadVehImage(v, newdir);
  1577 		v->cur_image = v->GetImage(newdir);
  1578 		v->UpdateDeltaXY(v->direction);
  1578 		v->UpdateDeltaXY(v->direction);
  1579 		RoadZPosAffectSpeed(v, SetRoadVehPosition(v, x, y));
  1579 		RoadZPosAffectSpeed(v, SetRoadVehPosition(v, x, y));
  1580 		return true;
  1580 		return true;
  1581 	}
  1581 	}
  1582 
  1582 
  1612 		if (newdir != v->direction) {
  1612 		if (newdir != v->direction) {
  1613 			v->direction = newdir;
  1613 			v->direction = newdir;
  1614 			v->cur_speed -= v->cur_speed >> 2;
  1614 			v->cur_speed -= v->cur_speed >> 2;
  1615 		}
  1615 		}
  1616 
  1616 
  1617 		v->cur_image = GetRoadVehImage(v, newdir);
  1617 		v->cur_image = v->GetImage(newdir);
  1618 		v->UpdateDeltaXY(v->direction);
  1618 		v->UpdateDeltaXY(v->direction);
  1619 		RoadZPosAffectSpeed(v, SetRoadVehPosition(v, x, y));
  1619 		RoadZPosAffectSpeed(v, SetRoadVehPosition(v, x, y));
  1620 		return true;
  1620 		return true;
  1621 	}
  1621 	}
  1622 
  1622 
  1654 	if (new_dir != old_dir) {
  1654 	if (new_dir != old_dir) {
  1655 		v->direction = new_dir;
  1655 		v->direction = new_dir;
  1656 		v->cur_speed -= (v->cur_speed >> 2);
  1656 		v->cur_speed -= (v->cur_speed >> 2);
  1657 		if (old_dir != v->u.road.state) {
  1657 		if (old_dir != v->u.road.state) {
  1658 			/* The vehicle is in a road stop */
  1658 			/* The vehicle is in a road stop */
  1659 			v->cur_image = GetRoadVehImage(v, new_dir);
  1659 			v->cur_image = v->GetImage(new_dir);
  1660 			v->UpdateDeltaXY(v->direction);
  1660 			v->UpdateDeltaXY(v->direction);
  1661 			SetRoadVehPosition(v, v->x_pos, v->y_pos);
  1661 			SetRoadVehPosition(v, v->x_pos, v->y_pos);
  1662 			/* Note, return here means that the frame counter is not incremented
  1662 			/* Note, return here means that the frame counter is not incremented
  1663 			 * for vehicles changing direction in a road stop. This causes frames to
  1663 			 * for vehicles changing direction in a road stop. This causes frames to
  1664 			 * be repeated. (XXX) Is this intended? */
  1664 			 * be repeated. (XXX) Is this intended? */
  1774 
  1774 
  1775 	/* Move to next frame unless vehicle arrived at a stop position
  1775 	/* Move to next frame unless vehicle arrived at a stop position
  1776 	 * in a depot or entered a tunnel/bridge */
  1776 	 * in a depot or entered a tunnel/bridge */
  1777 	if (!HASBIT(r, VETS_ENTERED_WORMHOLE)) v->u.road.frame++;
  1777 	if (!HASBIT(r, VETS_ENTERED_WORMHOLE)) v->u.road.frame++;
  1778 
  1778 
  1779 	v->cur_image = GetRoadVehImage(v, v->direction);
  1779 	v->cur_image = v->GetImage(v->direction);
  1780 	v->UpdateDeltaXY(v->direction);
  1780 	v->UpdateDeltaXY(v->direction);
  1781 	RoadZPosAffectSpeed(v, SetRoadVehPosition(v, x, y));
  1781 	RoadZPosAffectSpeed(v, SetRoadVehPosition(v, x, y));
  1782 	return true;
  1782 	return true;
  1783 }
  1783 }
  1784 
  1784 
  1827 {
  1827 {
  1828 	if (_age_cargo_skip_counter != 0) return;
  1828 	if (_age_cargo_skip_counter != 0) return;
  1829 	v->cargo.AgeCargo();
  1829 	v->cargo.AgeCargo();
  1830 }
  1830 }
  1831 
  1831 
  1832 void RoadVeh_Tick(Vehicle *v)
  1832 void RoadVehicle::Tick()
  1833 {
  1833 {
  1834 	AgeRoadVehCargo(v);
  1834 	AgeRoadVehCargo(this);
  1835 
  1835 
  1836 	if (IsRoadVehFront(v)) RoadVehController(v);
  1836 	if (IsRoadVehFront(this)) RoadVehController(this);
  1837 }
  1837 }
  1838 
  1838 
  1839 static void CheckIfRoadVehNeedsService(Vehicle *v)
  1839 static void CheckIfRoadVehNeedsService(Vehicle *v)
  1840 {
  1840 {
  1841 	const Depot* depot;
  1841 	const Depot* depot;