diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -554,6 +554,145 @@ static bool TransportIndustryGoods(TileI return moved_cargo; } +static void AnimateSugarSieve(TileIndex tile) +{ + byte m = GetAnimationFrame(tile) + 1; + + if (_settings_client.sound.ambient) { + switch (m & 7) { + case 2: SndPlayTileFx(SND_2D_SUGAR_MINE_1, tile); break; + case 6: SndPlayTileFx(SND_29_SUGAR_MINE_2, tile); break; + } + } + + if (m >= 96) { + m = 0; + DeleteAnimatedTile(tile); + } + SetAnimationFrame(tile, m); + + MarkTileDirtyByTile(tile); +} + +static void AnimateToffeeQuarry(TileIndex tile) +{ + byte m = GetAnimationFrame(tile); + + if (_industry_anim_offs_toffee[m] == 0xFF && _settings_client.sound.ambient) { + SndPlayTileFx(SND_30_TOFFEE_QUARRY, tile); + } + + if (++m >= 70) { + m = 0; + DeleteAnimatedTile(tile); + } + SetAnimationFrame(tile, m); + + MarkTileDirtyByTile(tile); +} + +static void AnimateBubbleCatcher(TileIndex tile) +{ + byte m = GetAnimationFrame(tile); + + if (++m >= 40) { + m = 0; + DeleteAnimatedTile(tile); + } + SetAnimationFrame(tile, m); + + MarkTileDirtyByTile(tile); +} + +static void AnimatePowerPlantSparks(TileIndex tile) +{ + byte m = GetAnimationFrame(tile); + if (m == 6) { + SetAnimationFrame(tile, 0); + DeleteAnimatedTile(tile); + } else { + SetAnimationFrame(tile, m + 1); + MarkTileDirtyByTile(tile); + } +} + +static void AnimateToyFactory(TileIndex tile) +{ + byte m = GetAnimationFrame(tile) + 1; + + switch (m) { + case 1: if (_settings_client.sound.ambient) SndPlayTileFx(SND_2C_TOY_FACTORY_1, tile); break; + case 23: if (_settings_client.sound.ambient) SndPlayTileFx(SND_2B_TOY_FACTORY_2, tile); break; + case 28: if (_settings_client.sound.ambient) SndPlayTileFx(SND_2A_TOY_FACTORY_3, tile); break; + default: + if (m >= 50) { + int n = GetIndustryAnimationLoop(tile) + 1; + m = 0; + if (n >= 8) { + n = 0; + DeleteAnimatedTile(tile); + } + SetIndustryAnimationLoop(tile, n); + } + } + + SetAnimationFrame(tile, m); + MarkTileDirtyByTile(tile); +} + +static void AnimatePlasticFountain(TileIndex tile, IndustryGfx gfx) +{ + gfx = (gfx < GFX_PLASTIC_FOUNTAIN_ANIMATED_8) ? gfx + 1 : GFX_PLASTIC_FOUNTAIN_ANIMATED_1; + SetIndustryGfx(tile, gfx); + MarkTileDirtyByTile(tile); +} + +static void AnimateOilWell(TileIndex tile, IndustryGfx gfx) +{ + bool b = Chance16(1, 7); + byte m = GetAnimationFrame(tile) + 1; + if (m == 4 && (m = 0, ++gfx) == GFX_OILWELL_ANIMATED_3 + 1 && (gfx = GFX_OILWELL_ANIMATED_1, b)) { + SetIndustryGfx(tile, GFX_OILWELL_NOT_ANIMATED); + SetIndustryConstructionStage(tile, 3); + DeleteAnimatedTile(tile); + } else { + SetAnimationFrame(tile, m); + SetIndustryGfx(tile, gfx); + MarkTileDirtyByTile(tile); + } +} + +static void AnimateMineTower(TileIndex tile) +{ + int state = _tick_counter & 0x7FF; + + if ((state -= 0x400) < 0) return; + + if (state < 0x1A0) { + if (state < 0x20 || state >= 0x180) { + byte m = GetAnimationFrame(tile); + if (!(m & 0x40)) { + SetAnimationFrame(tile, m | 0x40); + if (_settings_client.sound.ambient) SndPlayTileFx(SND_0B_MINE, tile); + } + if (state & 7) return; + } else { + if (state & 3) return; + } + byte m = (GetAnimationFrame(tile) + 1) | 0x40; + if (m > 0xC2) m = 0xC0; + SetAnimationFrame(tile, m); + MarkTileDirtyByTile(tile); + } else if (state >= 0x200 && state < 0x3A0) { + int i = (state < 0x220 || state >= 0x380) ? 7 : 3; + if (state & i) return; + + byte m = (GetAnimationFrame(tile) & 0xBF) - 1; + if (m < 0x80) m = 0x82; + SetAnimationFrame(tile, m); + MarkTileDirtyByTile(tile); + } +} static void AnimateTile_Industry(TileIndex tile) { @@ -566,159 +705,43 @@ static void AnimateTile_Industry(TileInd switch (gfx) { case GFX_SUGAR_MINE_SIEVE: - if ((_tick_counter & 1) == 0) { - byte m = GetAnimationFrame(tile) + 1; - - if (_settings_client.sound.ambient) { - switch (m & 7) { - case 2: SndPlayTileFx(SND_2D_SUGAR_MINE_1, tile); break; - case 6: SndPlayTileFx(SND_29_SUGAR_MINE_2, tile); break; - } - } - - if (m >= 96) { - m = 0; - DeleteAnimatedTile(tile); - } - SetAnimationFrame(tile, m); - - MarkTileDirtyByTile(tile); - } + if ((_tick_counter & 1) == 0) AnimateSugarSieve(tile); break; case GFX_TOFFEE_QUARY: - if ((_tick_counter & 3) == 0) { - byte m = GetAnimationFrame(tile); - - if (_industry_anim_offs_toffee[m] == 0xFF && _settings_client.sound.ambient) { - SndPlayTileFx(SND_30_TOFFEE_QUARRY, tile); - } - - if (++m >= 70) { - m = 0; - DeleteAnimatedTile(tile); - } - SetAnimationFrame(tile, m); - - MarkTileDirtyByTile(tile); - } + if ((_tick_counter & 3) == 0) AnimateToffeeQuarry(tile); break; case GFX_BUBBLE_CATCHER: - if ((_tick_counter & 1) == 0) { - byte m = GetAnimationFrame(tile); - - if (++m >= 40) { - m = 0; - DeleteAnimatedTile(tile); - } - SetAnimationFrame(tile, m); - - MarkTileDirtyByTile(tile); - } + if ((_tick_counter & 1) == 0) AnimateBubbleCatcher(tile); break; - /* Sparks on a coal plant */ case GFX_POWERPLANT_SPARKS: - if ((_tick_counter & 3) == 0) { - byte m = GetAnimationFrame(tile); - if (m == 6) { - SetAnimationFrame(tile, 0); - DeleteAnimatedTile(tile); - } else { - SetAnimationFrame(tile, m + 1); - MarkTileDirtyByTile(tile); - } - } + if ((_tick_counter & 3) == 0) AnimatePowerPlantSparks(tile); break; case GFX_TOY_FACTORY: - if ((_tick_counter & 1) == 0) { - byte m = GetAnimationFrame(tile) + 1; - - switch (m) { - case 1: if (_settings_client.sound.ambient) SndPlayTileFx(SND_2C_TOY_FACTORY_1, tile); break; - case 23: if (_settings_client.sound.ambient) SndPlayTileFx(SND_2B_TOY_FACTORY_2, tile); break; - case 28: if (_settings_client.sound.ambient) SndPlayTileFx(SND_2A_TOY_FACTORY_3, tile); break; - default: - if (m >= 50) { - int n = GetIndustryAnimationLoop(tile) + 1; - m = 0; - if (n >= 8) { - n = 0; - DeleteAnimatedTile(tile); - } - SetIndustryAnimationLoop(tile, n); - } - } - - SetAnimationFrame(tile, m); - MarkTileDirtyByTile(tile); - } + if ((_tick_counter & 1) == 0) AnimateToyFactory(tile); break; case GFX_PLASTIC_FOUNTAIN_ANIMATED_1: case GFX_PLASTIC_FOUNTAIN_ANIMATED_2: case GFX_PLASTIC_FOUNTAIN_ANIMATED_3: case GFX_PLASTIC_FOUNTAIN_ANIMATED_4: case GFX_PLASTIC_FOUNTAIN_ANIMATED_5: case GFX_PLASTIC_FOUNTAIN_ANIMATED_6: case GFX_PLASTIC_FOUNTAIN_ANIMATED_7: case GFX_PLASTIC_FOUNTAIN_ANIMATED_8: - if ((_tick_counter & 3) == 0) { - gfx = (gfx < 155) ? gfx + 1 : 148; - SetIndustryGfx(tile, gfx); - MarkTileDirtyByTile(tile); - } + if ((_tick_counter & 3) == 0) AnimatePlasticFountain(tile, gfx); break; case GFX_OILWELL_ANIMATED_1: case GFX_OILWELL_ANIMATED_2: case GFX_OILWELL_ANIMATED_3: - if ((_tick_counter & 7) == 0) { - bool b = Chance16(1, 7); - byte m = GetAnimationFrame(tile) + 1; - if (m == 4 && (m = 0, ++gfx) == GFX_OILWELL_ANIMATED_3 + 1 && (gfx = GFX_OILWELL_ANIMATED_1, b)) { - SetIndustryGfx(tile, GFX_OILWELL_NOT_ANIMATED); - SetIndustryConstructionStage(tile, 3); - DeleteAnimatedTile(tile); - } else { - SetAnimationFrame(tile, m); - SetIndustryGfx(tile, gfx); - MarkTileDirtyByTile(tile); - } - } + if ((_tick_counter & 7) == 0) AnimateOilWell(tile, gfx); break; case GFX_COAL_MINE_TOWER_ANIMATED: case GFX_COPPER_MINE_TOWER_ANIMATED: - case GFX_GOLD_MINE_TOWER_ANIMATED: { - int state = _tick_counter & 0x7FF; - - if ((state -= 0x400) < 0) return; - - if (state < 0x1A0) { - if (state < 0x20 || state >= 0x180) { - byte m = GetAnimationFrame(tile); - if (!(m & 0x40)) { - SetAnimationFrame(tile, m | 0x40); - if (_settings_client.sound.ambient) SndPlayTileFx(SND_0B_MINE, tile); - } - if (state & 7) return; - } else { - if (state & 3) return; - } - byte m = (GetAnimationFrame(tile) + 1) | 0x40; - if (m > 0xC2) m = 0xC0; - SetAnimationFrame(tile, m); - MarkTileDirtyByTile(tile); - } else if (state >= 0x200 && state < 0x3A0) { - int i = (state < 0x220 || state >= 0x380) ? 7 : 3; - if (state & i) return; - - byte m = (GetAnimationFrame(tile) & 0xBF) - 1; - if (m < 0x80) m = 0x82; - SetAnimationFrame(tile, m); - MarkTileDirtyByTile(tile); - } - break; - } + case GFX_GOLD_MINE_TOWER_ANIMATED: + AnimateMineTower(tile); + break; } } diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -3091,83 +3091,89 @@ static Foundation GetFoundation_Station( return FlatteningFoundation(tileh); } +static void FillTileDescRoadStop(TileIndex tile, TileDesc *td) +{ + RoadType road_rt = GetRoadTypeRoad(tile); + RoadType tram_rt = GetRoadTypeTram(tile); + Owner road_owner = INVALID_OWNER; + Owner tram_owner = INVALID_OWNER; + if (road_rt != INVALID_ROADTYPE) { + const RoadTypeInfo *rti = GetRoadTypeInfo(road_rt); + td->roadtype = rti->strings.name; + td->road_speed = rti->max_speed / 2; + road_owner = GetRoadOwner(tile, RTT_ROAD); + } + + if (tram_rt != INVALID_ROADTYPE) { + const RoadTypeInfo *rti = GetRoadTypeInfo(tram_rt); + td->tramtype = rti->strings.name; + td->tram_speed = rti->max_speed / 2; + tram_owner = GetRoadOwner(tile, RTT_TRAM); + } + + if (IsDriveThroughStopTile(tile)) { + /* Is there a mix of owners? */ + if ((tram_owner != INVALID_OWNER && tram_owner != td->owner[0]) || + (road_owner != INVALID_OWNER && road_owner != td->owner[0])) { + uint i = 1; + if (road_owner != INVALID_OWNER) { + td->owner_type[i] = STR_LAND_AREA_INFORMATION_ROAD_OWNER; + td->owner[i] = road_owner; + i++; + } + if (tram_owner != INVALID_OWNER) { + td->owner_type[i] = STR_LAND_AREA_INFORMATION_TRAM_OWNER; + td->owner[i] = tram_owner; + } + } + } +} + +void FillTileDescRailStation(TileIndex tile, TileDesc *td) +{ + const StationSpec *spec = GetStationSpec(tile); + + if (spec != nullptr) { + td->station_class = StationClass::Get(spec->cls_id)->name; + td->station_name = spec->name; + + if (spec->grf_prop.grffile != nullptr) { + const GRFConfig *gc = GetGRFConfig(spec->grf_prop.grffile->grfid); + td->grf = gc->GetName(); + } + } + + const RailtypeInfo *rti = GetRailTypeInfo(GetRailType(tile)); + td->rail_speed = rti->max_speed; + td->railtype = rti->strings.name; +} + +void FillTileDescAirport(TileIndex tile, TileDesc *td) +{ + const AirportSpec *as = Station::GetByTile(tile)->airport.GetSpec(); + td->airport_class = AirportClass::Get(as->cls_id)->name; + td->airport_name = as->name; + + const AirportTileSpec *ats = AirportTileSpec::GetByTile(tile); + td->airport_tile_name = ats->name; + + if (as->grf_prop.grffile != nullptr) { + const GRFConfig *gc = GetGRFConfig(as->grf_prop.grffile->grfid); + td->grf = gc->GetName(); + } else if (ats->grf_prop.grffile != nullptr) { + const GRFConfig *gc = GetGRFConfig(ats->grf_prop.grffile->grfid); + td->grf = gc->GetName(); + } +} + static void GetTileDesc_Station(TileIndex tile, TileDesc *td) { td->owner[0] = GetTileOwner(tile); - - if (IsRoadStopTile(tile)) { - RoadType road_rt = GetRoadTypeRoad(tile); - RoadType tram_rt = GetRoadTypeTram(tile); - Owner road_owner = INVALID_OWNER; - Owner tram_owner = INVALID_OWNER; - if (road_rt != INVALID_ROADTYPE) { - const RoadTypeInfo *rti = GetRoadTypeInfo(road_rt); - td->roadtype = rti->strings.name; - td->road_speed = rti->max_speed / 2; - road_owner = GetRoadOwner(tile, RTT_ROAD); - } - - if (tram_rt != INVALID_ROADTYPE) { - const RoadTypeInfo *rti = GetRoadTypeInfo(tram_rt); - td->tramtype = rti->strings.name; - td->tram_speed = rti->max_speed / 2; - tram_owner = GetRoadOwner(tile, RTT_TRAM); - } - - if (IsDriveThroughStopTile(tile)) { - /* Is there a mix of owners? */ - if ((tram_owner != INVALID_OWNER && tram_owner != td->owner[0]) || - (road_owner != INVALID_OWNER && road_owner != td->owner[0])) { - uint i = 1; - if (road_owner != INVALID_OWNER) { - td->owner_type[i] = STR_LAND_AREA_INFORMATION_ROAD_OWNER; - td->owner[i] = road_owner; - i++; - } - if (tram_owner != INVALID_OWNER) { - td->owner_type[i] = STR_LAND_AREA_INFORMATION_TRAM_OWNER; - td->owner[i] = tram_owner; - } - } - } - } - td->build_date = BaseStation::GetByTile(tile)->build_date; - if (HasStationTileRail(tile)) { - const StationSpec *spec = GetStationSpec(tile); - - if (spec != nullptr) { - td->station_class = StationClass::Get(spec->cls_id)->name; - td->station_name = spec->name; - - if (spec->grf_prop.grffile != nullptr) { - const GRFConfig *gc = GetGRFConfig(spec->grf_prop.grffile->grfid); - td->grf = gc->GetName(); - } - } - - const RailtypeInfo *rti = GetRailTypeInfo(GetRailType(tile)); - td->rail_speed = rti->max_speed; - td->railtype = rti->strings.name; - } - - if (IsAirport(tile)) { - const AirportSpec *as = Station::GetByTile(tile)->airport.GetSpec(); - td->airport_class = AirportClass::Get(as->cls_id)->name; - td->airport_name = as->name; - - const AirportTileSpec *ats = AirportTileSpec::GetByTile(tile); - td->airport_tile_name = ats->name; - - if (as->grf_prop.grffile != nullptr) { - const GRFConfig *gc = GetGRFConfig(as->grf_prop.grffile->grfid); - td->grf = gc->GetName(); - } else if (ats->grf_prop.grffile != nullptr) { - const GRFConfig *gc = GetGRFConfig(ats->grf_prop.grffile->grfid); - td->grf = gc->GetName(); - } - } + if (IsRoadStop(tile)) FillTileDescRoadStop(tile, td); + if (HasStationRail(tile)) FillTileDescRailStation(tile, td); + if (IsAirport(tile)) FillTileDescAirport(tile, td); StringID str; switch (GetStationType(tile)) {