static void SetDisasterVehiclePos(DisasterVehicle *v, int x, int y, byte z) { v->x_pos = x; v->y_pos = y; v->z_pos = z; v->tile = TileVirtXY(x, y); DisasterVehicleUpdateImage(v); VehicleMove(v, true); DisasterVehicle *u = v->Next(); if (u != NULL) { int safe_x = Clamp(x, 0, MapMaxX() * TILE_SIZE); int safe_y = Clamp(y - 1, 0, MapMaxY() * TILE_SIZE); u->x_pos = x; u->y_pos = y - 1 - (max(z - GetSlopeZ(safe_x, safe_y), 0U) >> 3); safe_y = Clamp(u->y_pos, 0, MapMaxY() * TILE_SIZE); u->z_pos = GetSlopeZ(safe_x, safe_y); u->direction = v->direction; DisasterVehicleUpdateImage(u); VehicleMove(u, true); if ((u = u->Next()) != NULL) { u->x_pos = x; u->y_pos = y; u->z_pos = z + 5; VehicleMove(u, true); } }
/** * Initialize a disaster vehicle. These vehicles are of type VEH_DISASTER, are unclickable * and owned by nobody */ static void InitializeDisasterVehicle(DisasterVehicle *v, int x, int y, int z, Direction direction, byte subtype) { v->x_pos = x; v->y_pos = y; v->z_pos = z; v->tile = TileVirtXY(x, y); v->direction = direction; v->subtype = subtype; v->UpdateDeltaXY(INVALID_DIR); v->owner = OWNER_NONE; v->vehstatus = VS_UNCLICKABLE; v->image_override = 0; v->current_order.Free(); DisasterVehicleUpdateImage(v); VehicleUpdatePositionAndViewport(v); }