# HG changeset patch # User rubidium # Date 1186178982 0 # Node ID e729875795142ca19818ef7158686b6e904adbcf # Parent 31fcaa5375a187ace434a5edd8621f91cad41b7e (svn r10775) [NoAI] -Sync: with trunk r10535:r10774. diff -r 31fcaa5375a1 -r e72987579514 bin/ai/regression/regression.nut --- a/bin/ai/regression/regression.nut Fri Aug 03 19:16:36 2007 +0000 +++ b/bin/ai/regression/regression.nut Fri Aug 03 22:09:42 2007 +0000 @@ -395,26 +395,26 @@ print(""); print("--Order--"); - print(" GetNumberOfOrders(): " + order.GetNumberOfOrders(1024)); - print(" GetOrderDestination(): " + order.GetOrderDestination(1024, 1)); + print(" GetNumberOfOrders(): " + order.GetNumberOfOrders(11)); + print(" GetOrderDestination(): " + order.GetOrderDestination(11, 1)); print(" AreOrderFlagsValid(): " + order.AreOrderFlagsValid(33416, AIOrder.AIOF_TRANSFER)); - print(" IsValidVehicleOrder(): " + order.IsValidVehicleOrder(1024, 1)); - print(" GetOrderFlags(): " + order.GetOrderFlags(1024, 1)); - print(" AppendOrder(): " + order.AppendOrder(1024, 33416, AIOrder.AIOF_TRANSFER)); - print(" InsertOrder(): " + order.InsertOrder(1024, 0, 33416, AIOrder.AIOF_TRANSFER)); - print(" GetNumberOfOrders(): " + order.GetNumberOfOrders(1024)); - print(" IsValidVehicleOrder(): " + order.IsValidVehicleOrder(1024, 1)); - print(" RemoveOrder(): " + order.RemoveOrder(1024, 0)); - print(" ChangeOrder(): " + order.ChangeOrder(1024, 0, AIOrder.AIOF_FULL_LOAD)); - print(" GetOrderDestination(): " + order.GetOrderDestination(1024, 0)); - print(" CopyOrders(): " + order.CopyOrders(1025, 1)); - print(" CopyOrders(): " + order.CopyOrders(1025, 1024)); - print(" ShareOrders(): " + order.ShareOrders(1025, 1)); - print(" ShareOrders(): " + order.ShareOrders(1025, 1024)); - print(" UnshareOrders(): " + order.UnshareOrders(1025)); - print(" AppendOrder(): " + order.AppendOrder(1024, 33421, AIOrder.AIOF_NONE)); + print(" IsValidVehicleOrder(): " + order.IsValidVehicleOrder(11, 1)); + print(" GetOrderFlags(): " + order.GetOrderFlags(11, 1)); + print(" AppendOrder(): " + order.AppendOrder(11, 33416, AIOrder.AIOF_TRANSFER)); + print(" InsertOrder(): " + order.InsertOrder(11, 0, 33416, AIOrder.AIOF_TRANSFER)); + print(" GetNumberOfOrders(): " + order.GetNumberOfOrders(11)); + print(" IsValidVehicleOrder(): " + order.IsValidVehicleOrder(11, 1)); + print(" RemoveOrder(): " + order.RemoveOrder(11, 0)); + print(" ChangeOrder(): " + order.ChangeOrder(11, 0, AIOrder.AIOF_FULL_LOAD)); + print(" GetOrderDestination(): " + order.GetOrderDestination(11, 0)); + print(" CopyOrders(): " + order.CopyOrders(11, 1)); + print(" CopyOrders(): " + order.CopyOrders(12, 11)); + print(" ShareOrders(): " + order.ShareOrders(12, 1)); + print(" ShareOrders(): " + order.ShareOrders(12, 11)); + print(" UnshareOrders(): " + order.UnshareOrders(12)); + print(" AppendOrder(): " + order.AppendOrder(11, 33421, AIOrder.AIOF_NONE)); - local list = AIVehicleStationList(1024); + local list = AIVehicleStationList(11); print(""); print("--VehicleStationList--"); @@ -756,7 +756,7 @@ print(" Valid Engines: " + j); print(" IsValidVehicle(-1): " + vehicle.IsValidVehicle(-1)); print(" IsValidVehicle(0): " + vehicle.IsValidVehicle(0)); - print(" IsValidVehicle(1024): " + vehicle.IsValidVehicle(1024)); + print(" IsValidVehicle(11): " + vehicle.IsValidVehicle(11)); print(" ISValidVehicle(9999): " + vehicle.IsValidVehicle(9999)); for (local i = -1; i < 15; i++) { @@ -786,15 +786,15 @@ { local transaction = AITransactionMode(); print(" BuildVehicle(): " + vehicle.BuildVehicle(33417, 153)); - print(" IsValidVehicle(1024): " + vehicle.IsValidVehicle(1024)); + print(" IsValidVehicle(11): " + vehicle.IsValidVehicle(11)); print(" --Transaction--"); print(" GetCosts(): " + transaction.GetCosts()); print(" Execute(): " + transaction.Execute()); - print(" IsValidVehicle(1024): " + vehicle.IsValidVehicle(1024)); + print(" IsValidVehicle(11): " + vehicle.IsValidVehicle(11)); } - print(" CloneVehicle(): " + vehicle.CloneVehicle(33417, 1024, true)); + print(" CloneVehicle(): " + vehicle.CloneVehicle(33417, 11, true)); local bank_after = company.GetBankBalance(AICompany.MY_COMPANY); @@ -805,9 +805,9 @@ bank = company.GetBankBalance(AICompany.MY_COMPANY); - print(" SellVehicle(1025): " + vehicle.SellVehicle(1025)); - print(" StartStopVehicle(): " + vehicle.StartStopVehicle(1024)); - print(" SendVehicleToDepot(): " + vehicle.SendVehicleToDepot(1024)); + print(" SellVehicle(12): " + vehicle.SellVehicle(12)); + print(" StartStopVehicle(): " + vehicle.StartStopVehicle(11)); + print(" SendVehicleToDepot(): " + vehicle.SendVehicleToDepot(11)); bank_after = company.GetBankBalance(AICompany.MY_COMPANY); @@ -815,25 +815,25 @@ print(" GetCosts(): " + accounting.GetCosts()); print(" Should be: " + (bank - bank_after)); - print(" CloneVehicle(): " + vehicle.CloneVehicle(33417, 1024, true)); + print(" CloneVehicle(): " + vehicle.CloneVehicle(33417, 11, true)); print(" --VehicleData--"); - print(" GetLocation(): " + vehicle.GetLocation(1024)); - print(" GetEngineType(): " + vehicle.GetEngineType(1024)); - print(" GetUnitNumber(): " + vehicle.GetUnitNumber(1024)); - print(" GetAge(): " + vehicle.GetAge(1024)); - print(" GetMaxAge(): " + vehicle.GetMaxAge(1024)); - print(" GetAgeLeft(): " + vehicle.GetAgeLeft(1024)); - print(" GetProfitThisYear(): " + vehicle.GetProfitThisYear(1024)); - print(" GetProfitLastYear(): " + vehicle.GetProfitLastYear(1024)); - print(" GetVehicleType(): " + vehicle.GetVehicleType(1024)); + print(" GetLocation(): " + vehicle.GetLocation(11)); + print(" GetEngineType(): " + vehicle.GetEngineType(11)); + print(" GetUnitNumber(): " + vehicle.GetUnitNumber(11)); + print(" GetAge(): " + vehicle.GetAge(11)); + print(" GetMaxAge(): " + vehicle.GetMaxAge(11)); + print(" GetAgeLeft(): " + vehicle.GetAgeLeft(11)); + print(" GetProfitThisYear(): " + vehicle.GetProfitThisYear(11)); + print(" GetProfitLastYear(): " + vehicle.GetProfitLastYear(11)); + print(" GetVehicleType(): " + vehicle.GetVehicleType(11)); print(" BuildVehicle(): " + vehicle.BuildVehicle(32119, 219)); - print(" IsValidVehicle(1026): " + vehicle.IsValidVehicle(1026)); - print(" IsValidVehicle(1027): " + vehicle.IsValidVehicle(1027)); + print(" IsValidVehicle(13): " + vehicle.IsValidVehicle(13)); + print(" IsValidVehicle(14): " + vehicle.IsValidVehicle(14)); print(" BuildVehicle(): " + vehicle.BuildVehicle(28479, 204)); - print(" IsValidVehicle(1028): " + vehicle.IsValidVehicle(1028)); + print(" IsValidVehicle(15): " + vehicle.IsValidVehicle(15)); local list = AIVehicleList(); diff -r 31fcaa5375a1 -r e72987579514 bin/ai/regression/regression.txt --- a/bin/ai/regression/regression.txt Fri Aug 03 19:16:36 2007 +0000 +++ b/bin/ai/regression/regression.txt Fri Aug 03 22:09:42 2007 +0000 @@ -2186,7 +2186,7 @@ Valid Engines: 256 IsValidVehicle(-1): false IsValidVehicle(0): false - IsValidVehicle(1024): false + IsValidVehicle(11): false ISValidVehicle(9999): false FindBestRoadVehicle Cargo -1 Cost 0: 65535 @@ -2429,86 +2429,86 @@ Reliability 50: 65535 Reliability 100: 65535 BuildVehicle(): 0 - IsValidVehicle(1024): false + IsValidVehicle(11): false --Transaction-- GetCosts(): 5945 Execute(): true - IsValidVehicle(1024): true - CloneVehicle(): 1025 + IsValidVehicle(11): true + CloneVehicle(): 12 --Accounting-- GetCosts(): 11890 Should be: 11890 ResetCosts(): (null : 0x00000000) - SellVehicle(1025): true + SellVehicle(12): true StartStopVehicle(): true SendVehicleToDepot(): true --Accounting-- GetCosts(): -5945 Should be: -5945 - CloneVehicle(): 1025 + CloneVehicle(): 12 --VehicleData-- GetLocation(): 33417 GetEngineType(): 153 GetUnitNumber(): 1 - GetAge(): 1 + GetAge(): 0 GetMaxAge(): 5490 - GetAgeLeft(): 5489 + GetAgeLeft(): 5490 GetProfitThisYear(): 0 GetProfitLastYear(): 0 GetVehicleType(): 1 - BuildVehicle(): 1026 - IsValidVehicle(1026): true - IsValidVehicle(1027): false - BuildVehicle(): 1028 - IsValidVehicle(1028): true + BuildVehicle(): 13 + IsValidVehicle(13): true + IsValidVehicle(14): false + BuildVehicle(): 15 + IsValidVehicle(15): true --VehicleList-- Count(): 4 Location ListDump: - 1025 => 33417 - 1024 => 33417 - 1026 => 32119 - 1028 => 28479 + 12 => 33417 + 11 => 33417 + 13 => 32119 + 15 => 28479 EngineType ListDump: - 1026 => 219 - 1028 => 204 - 1025 => 153 - 1024 => 153 + 13 => 219 + 15 => 204 + 12 => 153 + 11 => 153 UnitNumber ListDump: - 1025 => 2 - 1028 => 1 - 1026 => 1 - 1024 => 1 + 12 => 2 + 15 => 1 + 13 => 1 + 11 => 1 Age ListDump: - 1024 => 1 - 1028 => 0 - 1026 => 0 - 1025 => 0 + 11 => 1 + 15 => 0 + 13 => 0 + 12 => 0 MaxAge ListDump: - 1028 => 10980 - 1026 => 10980 - 1025 => 5490 - 1024 => 5490 + 15 => 10980 + 13 => 10980 + 12 => 5490 + 11 => 5490 AgeLeft ListDump: - 1028 => 10980 - 1026 => 10980 - 1025 => 5490 - 1024 => 5489 + 15 => 10980 + 13 => 10980 + 12 => 5490 + 11 => 5489 ProfitThisYear ListDump: - 1028 => 0 - 1026 => 0 - 1025 => 0 - 1024 => 0 + 15 => 0 + 13 => 0 + 12 => 0 + 11 => -1 ProfitLastYear ListDump: - 1028 => 0 - 1026 => 0 - 1025 => 0 - 1024 => 0 + 15 => 0 + 13 => 0 + 12 => 0 + 11 => 0 VehicleType ListDump: - 1026 => 3 - 1028 => 2 - 1025 => 1 - 1024 => 1 + 13 => 3 + 15 => 2 + 12 => 1 + 11 => 1 --Order-- GetNumberOfOrders(): 0 @@ -2554,4 +2554,4 @@ --StationVehicleList-- Count(): 1 Location ListDump: - 1024 => 33417 + 11 => 33417 diff -r 31fcaa5375a1 -r e72987579514 config.lib --- a/config.lib Fri Aug 03 19:16:36 2007 +0000 +++ b/config.lib Fri Aug 03 22:09:42 2007 +0000 @@ -62,7 +62,7 @@ with_psp_config="1" with_threads="1" - save_params_array="build host cc_build cc_host cxx_build cxx_host windres strip awk lipo os cpu_type revision endian config_log prefix_dir binary_dir data_dir icon_dir personal_dir install_dir enable_install enable_debug enable_profiling enable_dedicated enable_network enable_static enable_translator enable_assert enable_strip with_distcc with_osx_sysroot enable_universal enable_osx_g5 enable_unicode with_application_bundle with_sdl with_cocoa with_zlib with_png with_makedepend with_direct_music with_sort with_iconv with_midi with_midi_arg with_libtimidity with_freetype with_fontconfig with_psp_config with_threads CC CXX CFLAGS LDFLAGS" + save_params_array="build host cc_build cc_host cxx_build cxx_host windres strip awk lipo os cpu_type revision endian config_log prefix_dir binary_dir data_dir icon_dir personal_dir install_dir enable_debug enable_profiling enable_dedicated enable_network enable_static enable_translator enable_assert enable_strip with_distcc with_osx_sysroot enable_universal enable_osx_g5 enable_unicode with_application_bundle with_sdl with_cocoa with_zlib with_png with_makedepend with_direct_music with_sort with_iconv with_midi with_midi_arg with_libtimidity with_freetype with_fontconfig with_psp_config with_threads CC CXX CFLAGS LDFLAGS" } detect_params() { diff -r 31fcaa5375a1 -r e72987579514 src/ai/ai_threads.cpp --- a/src/ai/ai_threads.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/ai/ai_threads.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -309,7 +309,7 @@ DEBUG(ai, 3, "-AIThread_MT(%d) from thr %u", this->fiber_id, ThreadObject::CurrentId()); bool wait_ok = this->thr->IsCurrent() ? true : this->thr->WaitForStop(); assert(wait_ok); - this->evt_go.Release(); + this->evt_go.Detach(); } /** diff -r 31fcaa5375a1 -r e72987579514 src/ai/api/ai_order.cpp --- a/src/ai/api/ai_order.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/ai/api/ai_order.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -29,7 +29,7 @@ default: break; case MP_STATION: return OT_GOTO_STATION; break; case MP_WATER: if (::IsShipDepot(t)) return OT_GOTO_DEPOT; break; - case MP_STREET: if (::GetRoadTileType(t) == ROAD_TILE_DEPOT) return OT_GOTO_DEPOT; break; + case MP_ROAD: if (::GetRoadTileType(t) == ROAD_TILE_DEPOT) return OT_GOTO_DEPOT; break; case MP_RAILWAY: switch (::GetRailTileType(t)) { case RAIL_TILE_DEPOT: return OT_GOTO_DEPOT; diff -r 31fcaa5375a1 -r e72987579514 src/ai/api/ai_road.cpp --- a/src/ai/api/ai_road.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/ai/api/ai_road.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -12,7 +12,7 @@ /* Outside of the map */ if (tile >= ::MapSize()) return false; - return (::IsTileType(tile, MP_STREET) && ::GetRoadTileType(tile) != ROAD_TILE_DEPOT) || + return (::IsTileType(tile, MP_ROAD) && ::GetRoadTileType(tile) != ROAD_TILE_DEPOT) || this->IsDriveThroughRoadStationTile(tile); } @@ -21,7 +21,7 @@ /* Outside of the map */ if (tile >= ::MapSize()) return false; - return ::IsTileType(tile, MP_STREET) && ::GetRoadTileType(tile) == ROAD_TILE_DEPOT; + return ::IsTileType(tile, MP_ROAD) && ::GetRoadTileType(tile) == ROAD_TILE_DEPOT; } bool AIRoad::IsRoadStationTile(TileIndex tile) @@ -64,10 +64,10 @@ int32 neighbour = 0; - if (::IsTileType(tile + ::TileDiffXY(-1, 0), MP_STREET) && ::GetRoadTileType(tile + ::TileDiffXY(-1, 0)) != ROAD_TILE_DEPOT) neighbour++; - if (::IsTileType(tile + ::TileDiffXY( 1, 0), MP_STREET) && ::GetRoadTileType(tile + ::TileDiffXY( 1, 0)) != ROAD_TILE_DEPOT) neighbour++; - if (::IsTileType(tile + ::TileDiffXY( 0,-1), MP_STREET) && ::GetRoadTileType(tile + ::TileDiffXY( 0,-1)) != ROAD_TILE_DEPOT) neighbour++; - if (::IsTileType(tile + ::TileDiffXY( 0, 1), MP_STREET) && ::GetRoadTileType(tile + ::TileDiffXY( 0, 1)) != ROAD_TILE_DEPOT) neighbour++; + if (::IsTileType(tile + ::TileDiffXY(-1, 0), MP_ROAD) && ::GetRoadTileType(tile + ::TileDiffXY(-1, 0)) != ROAD_TILE_DEPOT) neighbour++; + if (::IsTileType(tile + ::TileDiffXY( 1, 0), MP_ROAD) && ::GetRoadTileType(tile + ::TileDiffXY( 1, 0)) != ROAD_TILE_DEPOT) neighbour++; + if (::IsTileType(tile + ::TileDiffXY( 0,-1), MP_ROAD) && ::GetRoadTileType(tile + ::TileDiffXY( 0,-1)) != ROAD_TILE_DEPOT) neighbour++; + if (::IsTileType(tile + ::TileDiffXY( 0, 1), MP_ROAD) && ::GetRoadTileType(tile + ::TileDiffXY( 0, 1)) != ROAD_TILE_DEPOT) neighbour++; return neighbour; } @@ -168,7 +168,7 @@ if (tile >= ::MapSize()) return false; /* Not a road depot tile */ - if (!IsTileType(tile, MP_STREET) || GetRoadTileType(tile) != ROAD_TILE_DEPOT) return false; + if (!IsTileType(tile, MP_ROAD) || GetRoadTileType(tile) != ROAD_TILE_DEPOT) return false; return this->DoCommand(tile, 0, 0, CMD_LANDSCAPE_CLEAR); } diff -r 31fcaa5375a1 -r e72987579514 src/ai/api/ai_tilelist_valuator.cpp --- a/src/ai/api/ai_tilelist_valuator.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/ai/api/ai_tilelist_valuator.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -38,7 +38,7 @@ int32 AITileListRoadTile::Valuate(int32 tile) const { - return ::IsTileType(tile, MP_STREET) && ::GetRoadTileType(tile) != ROAD_TILE_DEPOT; + return ::IsTileType(tile, MP_ROAD) && ::GetRoadTileType(tile) != ROAD_TILE_DEPOT; } int32 AITileListCargoAcceptance::Valuate(int32 tile) const diff -r 31fcaa5375a1 -r e72987579514 src/aircraft.h --- a/src/aircraft.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/aircraft.h Fri Aug 03 22:09:42 2007 +0000 @@ -35,7 +35,7 @@ * @param v vehicle to check * @return true if in hangar */ -static inline bool IsAircraftInHangar(const Vehicle* v) +static inline bool IsAircraftInHangar(const Vehicle *v) { assert(v->type == VEH_AIRCRAFT); return v->vehstatus & VS_HIDDEN && IsHangarTile(v->tile); @@ -45,7 +45,7 @@ * @param v vehicle to check * @return true if in hangar and stopped */ -static inline bool IsAircraftInHangarStopped(const Vehicle* v) +static inline bool IsAircraftInHangarStopped(const Vehicle *v) { return IsAircraftInHangar(v) && v->vehstatus & VS_STOPPED; } diff -r 31fcaa5375a1 -r e72987579514 src/aircraft_cmd.cpp --- a/src/aircraft_cmd.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/aircraft_cmd.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -288,7 +288,7 @@ /* Allocate 2 or 3 vehicle structs, depending on type * vl[0] = aircraft, vl[1] = shadow, [vl[2] = rotor] */ Vehicle *vl[3]; - if (!AllocateVehicles(vl, avi->subtype & AIR_CTOL ? 2 : 3)) { + if (!Vehicle::AllocateList(vl, avi->subtype & AIR_CTOL ? 2 : 3)) { return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME); } diff -r 31fcaa5375a1 -r e72987579514 src/aircraft_gui.cpp --- a/src/aircraft_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/aircraft_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -216,7 +216,7 @@ }; static const WindowDesc _aircraft_details_desc = { - WDP_AUTO, WDP_AUTO, 390, 126, + WDP_AUTO, WDP_AUTO, 390, 126, 390, 126, WC_VEHICLE_DETAILS, WC_VEHICLE_VIEW, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _aircraft_details_widgets, @@ -380,7 +380,7 @@ static const WindowDesc _aircraft_view_desc = { - WDP_AUTO, WDP_AUTO, 250, 116, + WDP_AUTO, WDP_AUTO, 250, 116, 250, 116, WC_VEHICLE_VIEW, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE, _aircraft_view_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/airport_gui.cpp --- a/src/airport_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/airport_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -125,7 +125,7 @@ static const WindowDesc _air_toolbar_desc = { - WDP_ALIGN_TBR, 22, 64, 36, + WDP_ALIGN_TBR, 22, 64, 36, 64, 36, WC_BUILD_TOOLBAR, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON, _air_toolbar_widgets, @@ -249,7 +249,7 @@ }; static const WindowDesc _build_airport_desc = { - WDP_AUTO, WDP_AUTO, 148, 240, + WDP_AUTO, WDP_AUTO, 148, 240, 148, 240, WC_BUILD_STATION, WC_BUILD_TOOLBAR, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _build_airport_picker_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/articulated_vehicles.cpp --- a/src/articulated_vehicles.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/articulated_vehicles.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -42,7 +42,7 @@ /* Attempt to use pre-allocated vehicles until they run out. This can happen * if the callback returns different values depending on the cargo type. */ u->next = vl[i]; - if (u->next == NULL) u->next = AllocateVehicle(); + if (u->next == NULL) u->next = new InvalidVehicle(); if (u->next == NULL) return; u = u->next; diff -r 31fcaa5375a1 -r e72987579514 src/autoreplace_gui.cpp --- a/src/autoreplace_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/autoreplace_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -467,7 +467,7 @@ }; static const WindowDesc _replace_rail_vehicle_desc = { - WDP_AUTO, WDP_AUTO, 456, 252, + WDP_AUTO, WDP_AUTO, 456, 252, 456, 252, WC_REPLACE_VEHICLE, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE, _replace_rail_vehicle_widgets, @@ -475,7 +475,7 @@ }; static const WindowDesc _replace_road_vehicle_desc = { - WDP_AUTO, WDP_AUTO, 456, 230, + WDP_AUTO, WDP_AUTO, 456, 230, 456, 230, WC_REPLACE_VEHICLE, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE, _replace_road_vehicle_widgets, @@ -483,7 +483,7 @@ }; static const WindowDesc _replace_ship_aircraft_vehicle_desc = { - WDP_AUTO, WDP_AUTO, 456, 214, + WDP_AUTO, WDP_AUTO, 456, 214, 456, 214, WC_REPLACE_VEHICLE, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE, _replace_ship_aircraft_vehicle_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/bmp.cpp --- a/src/bmp.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/bmp.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -9,7 +9,8 @@ #include "macros.h" #include "helpers.hpp" -void BmpInitializeBuffer(BmpBuffer *buffer, FILE *file) { +void BmpInitializeBuffer(BmpBuffer *buffer, FILE *file) +{ buffer->pos = -1; buffer->file = file; buffer->read = 0; diff -r 31fcaa5375a1 -r e72987579514 src/bridge.h --- a/src/bridge.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/bridge.h Fri Aug 03 22:09:42 2007 +0000 @@ -27,7 +27,7 @@ extern const Bridge orig_bridge[MAX_BRIDGES]; extern Bridge _bridge[MAX_BRIDGES]; -uint GetBridgeFoundation(Slope tileh, Axis axis); +Foundation GetBridgeFoundation(Slope tileh, Axis axis); static inline const Bridge *GetBridge(uint i) { @@ -35,6 +35,6 @@ return &_bridge[i]; } -void DrawBridgeMiddle(const TileInfo* ti); +void DrawBridgeMiddle(const TileInfo *ti); #endif /* BRIDGE_H */ diff -r 31fcaa5375a1 -r e72987579514 src/bridge_gui.cpp --- a/src/bridge_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/bridge_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -86,7 +86,7 @@ }; static const WindowDesc _build_bridge_desc = { - WDP_AUTO, WDP_AUTO, 200, 102, + WDP_AUTO, WDP_AUTO, 200, 102, 200, 102, WC_BUILD_BRIDGE, WC_BUILD_TOOLBAR, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _build_bridge_widgets, @@ -103,7 +103,7 @@ }; static const WindowDesc _build_road_bridge_desc = { - WDP_AUTO, WDP_AUTO, 200, 102, + WDP_AUTO, WDP_AUTO, 200, 102, 200, 102, WC_BUILD_BRIDGE, WC_BUILD_TOOLBAR, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _build_road_bridge_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/bridge_map.cpp --- a/src/bridge_map.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/bridge_map.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -44,11 +44,11 @@ { uint h; Slope tileh = GetTileSlope(t, &h); - uint f = GetBridgeFoundation(tileh, DiagDirToAxis(GetBridgeRampDirection(t))); + Foundation f = GetBridgeFoundation(tileh, DiagDirToAxis(GetBridgeRampDirection(t))); /* one height level extra if the ramp is on a flat foundation */ return h + TILE_HEIGHT + - (IS_INT_INSIDE(f, 1, 15) ? TILE_HEIGHT : 0) + + (IsLeveledFoundation(f) ? TILE_HEIGHT : 0) + (IsSteepSlope(tileh) ? TILE_HEIGHT : 0); } diff -r 31fcaa5375a1 -r e72987579514 src/bridge_map.h --- a/src/bridge_map.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/bridge_map.h Fri Aug 03 22:09:42 2007 +0000 @@ -46,7 +46,7 @@ return IsTileType(t, MP_CLEAR) || IsTileType(t, MP_RAILWAY) || - IsTileType(t, MP_STREET) || + IsTileType(t, MP_ROAD) || IsTileType(t, MP_WATER) || IsTileType(t, MP_TUNNELBRIDGE) || IsTileType(t, MP_UNMOVABLE); diff -r 31fcaa5375a1 -r e72987579514 src/build_vehicle_gui.cpp --- a/src/build_vehicle_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/build_vehicle_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -53,13 +53,13 @@ { WWT_PUSHTXTBTN, RESIZE_NONE, 14, 0, 80, 14, 25, STR_SORT_BY, STR_SORT_ORDER_TIP}, { WWT_PANEL, RESIZE_RIGHT, 14, 81, 227, 14, 25, 0x0, STR_SORT_CRITERIA_TIP}, { WWT_TEXTBTN, RESIZE_LR, 14, 228, 239, 14, 25, STR_0225, STR_SORT_CRITERIA_TIP}, - { WWT_MATRIX, RESIZE_RB, 14, 0, 227, 26, 121, 0x0, STR_NULL }, - { WWT_SCROLLBAR, RESIZE_LRB, 14, 228, 239, 26, 121, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST }, - { WWT_PANEL, RESIZE_RTB, 14, 0, 239, 122, 243, 0x0, STR_NULL }, + { WWT_MATRIX, RESIZE_RB, 14, 0, 227, 26, 39, 0x101, STR_NULL }, + { WWT_SCROLLBAR, RESIZE_LRB, 14, 228, 239, 26, 39, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST }, + { WWT_PANEL, RESIZE_RTB, 14, 0, 239, 40, 161, 0x0, STR_NULL }, - { WWT_PUSHTXTBTN, RESIZE_TB, 14, 0, 114, 244, 255, 0x0, STR_NULL }, - { WWT_PUSHTXTBTN, RESIZE_RTB, 14, 115, 227, 244, 255, 0x0, STR_NULL }, - { WWT_RESIZEBOX, RESIZE_LRTB, 14, 228, 239, 244, 255, 0x0, STR_RESIZE_BUTTON }, + { WWT_PUSHTXTBTN, RESIZE_TB, 14, 0, 114, 162, 173, 0x0, STR_NULL }, + { WWT_PUSHTXTBTN, RESIZE_RTB, 14, 115, 227, 162, 173, 0x0, STR_NULL }, + { WWT_RESIZEBOX, RESIZE_LRTB, 14, 228, 239, 162, 173, 0x0, STR_RESIZE_BUTTON }, { WIDGETS_END}, }; @@ -979,6 +979,19 @@ buildvehicle_d *bv = &WP(w, buildvehicle_d); switch (e->event) { + case WE_CREATE: { + bv->vehicle_type = *(VehicleType*)e->we.create.data; + int vlh = GetVehicleListHeight(bv->vehicle_type); + + ResizeWindow(w, 0, vlh - 14); + w->resize.step_height = vlh; + w->vscroll.cap = 1; + w->widget[BUILD_VEHICLE_WIDGET_LIST].data = 0x101; + + w->resize.width = w->width; + w->resize.height = w->height; + } break; + case WE_INVALIDATE_DATA: bv->regenerate_list = true; SetWindowDirty(w); @@ -1044,7 +1057,7 @@ } static const WindowDesc _build_vehicle_desc = { - WDP_AUTO, WDP_AUTO, 240, 256, + WDP_AUTO, WDP_AUTO, 240, 174, 240, 256, WC_BUILD_VEHICLE, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE, _build_vehicle_widgets, @@ -1065,20 +1078,16 @@ DeleteWindowById(WC_BUILD_VEHICLE, num); - w = AllocateWindowDescFront(&_build_vehicle_desc, num); + w = AllocateWindowDescFront(&_build_vehicle_desc, num, &type); if (w == NULL) return; w->caption_color = (tile != 0) ? GetTileOwner(tile) : _local_player; - w->resize.step_height = GetVehicleListHeight(type); - w->vscroll.cap = w->resize.step_height == 24 ? 4 : 8; - w->widget[BUILD_VEHICLE_WIDGET_LIST].data = (w->vscroll.cap << 8) + 1; bv = &WP(w, buildvehicle_d); EngList_Create(&bv->eng_list); bv->sel_engine = INVALID_ENGINE; - bv->vehicle_type = type; bv->regenerate_list = false; bv->sort_criteria = _last_sort_criteria[type]; @@ -1088,11 +1097,9 @@ default: NOT_REACHED(); case VEH_TRAIN: WP(w, buildvehicle_d).filter.railtype = (tile == 0) ? RAILTYPE_END : GetRailType(tile); - ResizeWindow(w, 0, 16); break; case VEH_ROAD: WP(w, buildvehicle_d).filter.roadtypes = (tile == 0) ? ROADTYPES_ALL : GetRoadTypes(tile); - ResizeWindow(w, 0, 16); case VEH_SHIP: break; case VEH_AIRCRAFT: @@ -1103,9 +1110,6 @@ SetupWindowStrings(w, type); ResizeButtons(w, BUILD_VEHICLE_WIDGET_BUILD, BUILD_VEHICLE_WIDGET_RENAME); - w->resize.width = w->width; - w->resize.height = w->height; - GenerateBuildList(w); // generate the list, since we need it in the next line /* Select the first engine in the list as default when opening the window */ if (EngList_Count(&bv->eng_list) > 0) bv->sel_engine = bv->eng_list[0]; diff -r 31fcaa5375a1 -r e72987579514 src/cargopacket.cpp --- a/src/cargopacket.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/cargopacket.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -8,36 +8,14 @@ #include "cargopacket.h" #include "saveload.h" -/** Cache for speeding up lookups in AllocateRaw */ -static uint _first_free_cargo_packet_index; - -/** - * Called if a new block is added to the station-pool - */ -static void CargoPacketPoolNewBlock(uint cpart_item) -{ - /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. - * TODO - This is just a temporary stage, this will be removed. */ - for (CargoPacket *cp = GetCargoPacket(cpart_item); cp != NULL; cp = (cp->index + 1U < GetCargoPacketPoolSize()) ? GetCargoPacket(cp->index + 1U) : NULL) cp->index = cpart_item++; -} - -static void CargoPacketPoolCleanBlock(uint cpart_item, uint end_item) -{ - for (uint i = cpart_item; i <= end_item; i++) { - CargoPacket *cp = GetCargoPacket(i); - if (cp->IsValid()) cp->~CargoPacket(); - } -} - /* Initialize the cargopacket-pool */ -DEFINE_OLD_POOL(CargoPacket, CargoPacket, CargoPacketPoolNewBlock, CargoPacketPoolCleanBlock) +DEFINE_OLD_POOL_GENERIC(CargoPacket, CargoPacket) void InitializeCargoPackets() { - _first_free_cargo_packet_index = 0; /* Clean the cargo packet pool and create 1 block in it */ - CleanPool(&_CargoPacket_pool); - AddBlockToPool(&_CargoPacket_pool); + _CargoPacket_pool.CleanPool(); + _CargoPacket_pool.AddBlockToPool(); /* Check whether our &cargolist == &cargolist.packets "hack" works */ CargoList::AssertOnWrongPacketOffset(); @@ -59,7 +37,6 @@ CargoPacket::~CargoPacket() { - if (this->index < _first_free_cargo_packet_index) _first_free_cargo_packet_index = this->index; this->count = 0; } @@ -68,52 +45,6 @@ return this->source_xy == cp->source_xy && this->days_in_transit == cp->days_in_transit && this->paid_for == cp->paid_for; } -void *CargoPacket::operator new(size_t size) -{ - CargoPacket *cp = AllocateRaw(); - return cp; -} - -void *CargoPacket::operator new(size_t size, CargoPacket::ID cp_idx) -{ - if (!AddBlockIfNeeded(&_CargoPacket_pool, cp_idx)) - error("CargoPackets: failed loading savegame: too many cargo packets"); - - CargoPacket *cp = GetCargoPacket(cp_idx); - return cp; -} - -void CargoPacket::operator delete(void *p) -{ -} - -void CargoPacket::operator delete(void *p, CargoPacket::ID cp_idx) -{ -} - -/*static*/ CargoPacket *CargoPacket::AllocateRaw() -{ - CargoPacket *cp = NULL; - - /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. - * TODO - This is just a temporary stage, this will be removed. */ - for (cp = GetCargoPacket(_first_free_cargo_packet_index); cp != NULL; cp = (cp->index + 1U < GetCargoPacketPoolSize()) ? GetCargoPacket(cp->index + 1U) : NULL) { - if (!cp->IsValid()) { - CargoPacket::ID index = cp->index; - - memset(cp, 0, sizeof(CargoPacket)); - cp->index = index; - _first_free_cargo_packet_index = cp->index; - return cp; - } - } - - /* Check if we can add a block to the pool */ - if (AddBlockToPool(&_CargoPacket_pool)) return AllocateRaw(); - - error("CargoPackets: too many cargo packets"); -} - static const SaveLoad _cargopacket_desc[] = { SLE_VAR(CargoPacket, source, SLE_UINT16), SLE_VAR(CargoPacket, source_xy, SLE_UINT32), @@ -141,11 +72,7 @@ int index; while ((index = SlIterateArray()) != -1) { - if (!AddBlockIfNeeded(&_CargoPacket_pool, index)) { - error("CargoPackets: failed loading savegame: too many cargo packets"); - } - - CargoPacket *cp = GetCargoPacket(index); + CargoPacket *cp = new (index) CargoPacket(); SlObject(cp, _cargopacket_desc); } } diff -r 31fcaa5375a1 -r e72987579514 src/cargopacket.h --- a/src/cargopacket.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/cargopacket.h Fri Aug 03 22:09:42 2007 +0000 @@ -7,14 +7,17 @@ #include +typedef uint32 CargoPacketID; +struct CargoPacket; + +/** We want to use a pool */ +DECLARE_OLD_POOL(CargoPacket, CargoPacket, 10, 1000) + + /** * Container for cargo from the same location and time */ -struct CargoPacket { - typedef uint32 ID; ///< Type for cargopacket identifiers - - ID index; ///< The unique index of this packet - +struct CargoPacket : PoolItem { StationID source; ///< The station where the cargo came from first TileIndex source_xy; ///< The origin of the cargo (first station in feeder chain) TileIndex loaded_at_xy; ///< Location where this cargo has been loaded into the vehicle @@ -33,7 +36,7 @@ CargoPacket(StationID source = INVALID_STATION, uint16 count = 0); /** Destroy the packet */ - ~CargoPacket(); + virtual ~CargoPacket(); /** @@ -49,27 +52,8 @@ * @return true if and only if days_in_transit and source_xy are equal */ bool SameSource(CargoPacket *cp); - - - /* normal new/delete operators. Used when building/removing station */ - void* operator new (size_t size); - void operator delete(void *p); - - /* new/delete operators accepting station index. Used when loading station from savegame. */ - void* operator new (size_t size, CargoPacket::ID cp_idx); - void operator delete(void *p, CargoPacket::ID cp_idx); - -private: - /** - * Allocate the raw memory for this cargo packet - * @return the allocated memory - */ - static CargoPacket *AllocateRaw(); }; -/** We want to use a pool */ -DECLARE_OLD_POOL(CargoPacket, CargoPacket, 10, 1000) - /** * Iterate over all _valid_ cargo packets from the given start * @param cp the variable used as "iterator" diff -r 31fcaa5375a1 -r e72987579514 src/clear_cmd.cpp --- a/src/clear_cmd.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/clear_cmd.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -179,7 +179,7 @@ _error_message = STR_1004_TOO_HIGH; - if (height > 15) return false; + if (height > MAX_TILE_HEIGHT) return false; nh = TerraformGetHeightOfTile(ts, tile); if (nh < 0 || height == nh) return false; @@ -573,9 +573,9 @@ return z + GetPartialZ(x & 0xF, y & 0xF, tileh); } -static Slope GetSlopeTileh_Clear(TileIndex tile, Slope tileh) +static Foundation GetFoundation_Clear(TileIndex tile, Slope tileh) { - return tileh; + return FOUNDATION_NONE; } static void GetAcceptedCargo_Clear(TileIndex tile, AcceptedCargo ac) @@ -758,7 +758,7 @@ SetClearGroundDensity(tile, CLEAR_ROCKS, 3); do { if (--j == 0) goto get_out; - tile_new = tile + TileOffsByDiagDir(GB(Random(), 0, 2)); + tile_new = tile + TileOffsByDiagDir((DiagDirection)GB(Random(), 0, 2)); } while (!IsTileType(tile_new, MP_CLEAR) || IsClearGround(tile_new, CLEAR_DESERT)); tile = tile_new; } @@ -819,5 +819,5 @@ ChangeTileOwner_Clear, ///< change_tile_owner_clear NULL, ///< get_produced_cargo_proc NULL, ///< vehicle_enter_tile_proc - GetSlopeTileh_Clear, ///< get_slope_tileh_proc + GetFoundation_Clear, ///< get_foundation_proc }; diff -r 31fcaa5375a1 -r e72987579514 src/command.h --- a/src/command.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/command.h Fri Aug 03 22:09:42 2007 +0000 @@ -194,9 +194,9 @@ static inline bool CmdFailed(CommandCost cost) { return cost.Failed(); } static inline bool CmdSucceeded(CommandCost cost) { return cost.Succeeded(); } -static const CommandCost CMD_ERROR = CommandCost((StringID)INVALID_STRING_ID); +static const CommandCost CMD_ERROR = CommandCost(INVALID_STRING_ID); -#define return_cmd_error(errcode) do { return CommandCost((StringID)(errcode)); } while (0) +#define return_cmd_error(errcode) do { return CommandCost(errcode); } while (0) /* command.cpp */ typedef void CommandCallback(bool success, TileIndex tile, uint32 p1, uint32 p2); diff -r 31fcaa5375a1 -r e72987579514 src/console.cpp --- a/src/console.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/console.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -200,7 +200,7 @@ }; static const WindowDesc _iconsole_window_desc = { - 0, 0, 2, 2, + 0, 0, 2, 2, 2, 2, WC_CONSOLE, WC_NONE, WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _iconsole_window_widgets, @@ -463,7 +463,7 @@ /** * Change a string into its number representation. Supports * decimal and hexadecimal numbers as well as 'on'/'off' 'true'/'false' - * @param *value the variable a successfull conversion will be put in + * @param *value the variable a successful conversion will be put in * @param *arg the string to be converted * @return Return true on success or false on failure */ @@ -517,7 +517,7 @@ * there is a function associated with that and if so, execute it * @param hooks IConsoleHooks structure that will be checked * @param type type of hook, trigger that needs to be activated - * @return true on a successfull execution of the hook command or if there + * @return true on a successful execution of the hook command or if there * is no hook/trigger present at all. False otherwise */ static bool IConsoleHookHandle(const IConsoleHooks *hooks, IConsoleHookTypes type) diff -r 31fcaa5375a1 -r e72987579514 src/console_cmds.cpp --- a/src/console_cmds.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/console_cmds.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -1079,6 +1079,8 @@ return true; } + if (_game_mode == GM_NORMAL && _patches.autosave_on_exit) DoExitSave(); + _exit_game = true; return true; } diff -r 31fcaa5375a1 -r e72987579514 src/date.cpp --- a/src/date.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/date.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -220,7 +220,7 @@ for (i = daytick; i < total; i += DAY_TICKS) { Vehicle *v = GetVehicle(i); - if (IsValidVehicle(v)) _on_new_vehicle_day_proc[v->type](v); + if (v->IsValid()) _on_new_vehicle_day_proc[v->type](v); } } diff -r 31fcaa5375a1 -r e72987579514 src/depot.cpp --- a/src/depot.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/depot.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -14,21 +14,7 @@ #include "saveload.h" #include "order.h" - -/** - * Called if a new block is added to the depot-pool - */ -static void DepotPoolNewBlock(uint start_item) -{ - Depot *d; - - /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. - * TODO - This is just a temporary stage, this will be removed. */ - for (d = GetDepot(start_item); d != NULL; d = (d->index + 1U < GetDepotPoolSize()) ? GetDepot(d->index + 1U) : NULL) d->index = start_item++; -} - -DEFINE_OLD_POOL(Depot, Depot, DepotPoolNewBlock, NULL) - +DEFINE_OLD_POOL_GENERIC(Depot, Depot) /** * Gets a depot from a tile @@ -47,50 +33,22 @@ } /** - * Allocate a new depot - */ -Depot *AllocateDepot() -{ - Depot *d; - - /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. - * TODO - This is just a temporary stage, this will be removed. */ - for (d = GetDepot(0); d != NULL; d = (d->index + 1U < GetDepotPoolSize()) ? GetDepot(d->index + 1U) : NULL) { - if (!IsValidDepot(d)) { - DepotID index = d->index; - - memset(d, 0, sizeof(Depot)); - d->index = index; - - return d; - } - } - - /* Check if we can add a block to the pool */ - if (AddBlockToPool(&_Depot_pool)) return AllocateDepot(); - - return NULL; -} - -/** * Clean up a depot */ -void DestroyDepot(Depot *depot) +Depot::~Depot() { - /* Clear the tile */ - DoClearSquare(depot->xy); - /* Clear the depot from all order-lists */ - RemoveOrderFromAllVehicles(OT_GOTO_DEPOT, depot->index); + RemoveOrderFromAllVehicles(OT_GOTO_DEPOT, this->index); /* Delete the depot-window */ - DeleteWindowById(WC_VEHICLE_DEPOT, depot->xy); + DeleteWindowById(WC_VEHICLE_DEPOT, this->xy); + this->xy = 0; } void InitializeDepots() { - CleanPool(&_Depot_pool); - AddBlockToPool(&_Depot_pool); + _Depot_pool.CleanPool(); + _Depot_pool.AddBlockToPool(); } @@ -116,12 +74,7 @@ int index; while ((index = SlIterateArray()) != -1) { - Depot *depot; - - if (!AddBlockIfNeeded(&_Depot_pool, index)) - error("Depots: failed loading savegame: too many depots"); - - depot = GetDepot(index); + Depot *depot = new (index) Depot(); SlObject(depot, _depot_desc); } } diff -r 31fcaa5375a1 -r e72987579514 src/depot.h --- a/src/depot.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/depot.h Fri Aug 03 22:09:42 2007 +0000 @@ -13,38 +13,27 @@ #include "rail_map.h" #include "water_map.h" -struct Depot { - TileIndex xy; - TownID town_index; - DepotID index; -}; - +struct Depot; DECLARE_OLD_POOL(Depot, Depot, 3, 8000) -/** - * Check if a depot really exists. - */ -static inline bool IsValidDepot(const Depot *depot) -{ - return depot != NULL && depot->xy != 0; -} +struct Depot : PoolItem { + TileIndex xy; + TownID town_index; -static inline bool IsValidDepotID(uint index) -{ - return index < GetDepotPoolSize() && IsValidDepot(GetDepot(index)); -} + Depot(TileIndex xy = 0) : xy(xy) {} + ~Depot(); -void DestroyDepot(Depot *depot); + bool IsValid() const { return this->xy != 0; } +}; -static inline void DeleteDepot(Depot *depot) +static inline bool IsValidDepotID(DepotID index) { - DestroyDepot(depot); - depot->xy = 0; + return index < GetDepotPoolSize() && GetDepot(index)->IsValid(); } void ShowDepotWindow(TileIndex tile, VehicleType type); -#define FOR_ALL_DEPOTS_FROM(d, start) for (d = GetDepot(start); d != NULL; d = (d->index + 1U < GetDepotPoolSize()) ? GetDepot(d->index + 1U) : NULL) if (IsValidDepot(d)) +#define FOR_ALL_DEPOTS_FROM(d, start) for (d = GetDepot(start); d != NULL; d = (d->index + 1U < GetDepotPoolSize()) ? GetDepot(d->index + 1U) : NULL) if (d->IsValid()) #define FOR_ALL_DEPOTS(d) FOR_ALL_DEPOTS_FROM(d, 0) #define MIN_SERVINT_PERCENT 5 @@ -74,7 +63,7 @@ return IsTileType(tile, MP_RAILWAY) && GetRailTileType(tile) == RAIL_TILE_DEPOT; case TRANSPORT_ROAD: - return IsTileType(tile, MP_STREET) && GetRoadTileType(tile) == ROAD_TILE_DEPOT; + return IsTileType(tile, MP_ROAD) && GetRoadTileType(tile) == ROAD_TILE_DEPOT; case TRANSPORT_WATER: return IsTileType(tile, MP_WATER) && GetWaterTileType(tile) == WATER_TILE_DEPOT; @@ -108,7 +97,6 @@ Depot *GetDepotByTile(TileIndex tile); void InitializeDepots(); -Depot *AllocateDepot(); void DeleteDepotHighlightOfVehicle(const Vehicle *v); diff -r 31fcaa5375a1 -r e72987579514 src/depot_gui.cpp --- a/src/depot_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/depot_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -97,7 +97,7 @@ static void DepotWndProc(Window *w, WindowEvent *e); static const WindowDesc _train_depot_desc = { - WDP_AUTO, WDP_AUTO, 36, 27, + WDP_AUTO, WDP_AUTO, 36, 27, 36, 27, WC_VEHICLE_DEPOT, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE, _depot_widgets, @@ -105,7 +105,7 @@ }; static const WindowDesc _road_depot_desc = { - WDP_AUTO, WDP_AUTO, 36, 27, + WDP_AUTO, WDP_AUTO, 36, 27, 36, 27, WC_VEHICLE_DEPOT, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE, _depot_widgets, @@ -113,7 +113,7 @@ }; static const WindowDesc _ship_depot_desc = { - WDP_AUTO, WDP_AUTO, 36, 27, + WDP_AUTO, WDP_AUTO, 36, 27, 36, 27, WC_VEHICLE_DEPOT, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE, _depot_widgets, @@ -121,7 +121,7 @@ }; static const WindowDesc _aircraft_depot_desc = { - WDP_AUTO, WDP_AUTO, 36, 27, + WDP_AUTO, WDP_AUTO, 36, 27, 36, 27, WC_VEHICLE_DEPOT, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE, _depot_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/direction.h --- a/src/direction.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/direction.h Fri Aug 03 22:09:42 2007 +0000 @@ -7,66 +7,128 @@ #include "helpers.hpp" -/* Direction as commonly used in v->direction, 8 way. */ +/** + * Defines the 8 directions on the map. + * + * This enum defines 8 possible directions which are used for + * the vehicles in the game. The directions are aligned straight + * to the viewport, not to the map. So north points to the top of + * your viewport and not rotated by 45 degrees left or right to get + * a "north" used in you games. + */ enum Direction { - DIR_BEGIN = 0, - DIR_N = 0, - DIR_NE = 1, ///< Northeast, upper right on your monitor - DIR_E = 2, - DIR_SE = 3, - DIR_S = 4, - DIR_SW = 5, - DIR_W = 6, - DIR_NW = 7, - DIR_END, - INVALID_DIR = 0xFF, + DIR_BEGIN = 0, ///< Used to iterate + DIR_N = 0, ///< North + DIR_NE = 1, ///< Northeast + DIR_E = 2, ///< East + DIR_SE = 3, ///< Southeast + DIR_S = 4, ///< South + DIR_SW = 5, ///< Southwest + DIR_W = 6, ///< West + DIR_NW = 7, ///< Northwest + DIR_END, ///< Used to iterate + INVALID_DIR = 0xFF, ///< Flag for an invalid direction }; /** Define basic enum properties */ template <> struct EnumPropsT : MakeEnumPropsT {}; typedef TinyEnumT DirectionByte; //typedefing-enumification of Direction +/** + * Return the reverse of a direction + * + * @param d The direction to get the reverse from + * @return The reverse Direction + */ static inline Direction ReverseDir(Direction d) { return (Direction)(4 ^ d); } +/** + * Enumeration for the difference between two directions. + * + * This enumeration is used to mark differences between + * two directions. If you get one direction you can align + * a second direction in 8 different ways. This enumeration + * only contains 6 of these 8 differences, but the remaining + * two can be calculated by adding to differences together. + * This also means you can add two differences together and + * get the difference you really want to get. The difference + * of 45 degrees left + the difference of 45 degrees right results in the + * difference of 0 degrees. + * + * @note To get this mentioned addition of direction you must use + * modulo DIR_END or use the #ChangeDirDiff(DirDiff, DirDiff) function. + * @see ChangeDirDiff(DirDiff, DirDiff) + */ enum DirDiff { - DIRDIFF_SAME = 0, - DIRDIFF_45RIGHT = 1, - DIRDIFF_90RIGHT = 2, - DIRDIFF_REVERSE = 4, - DIRDIFF_90LEFT = 6, - DIRDIFF_45LEFT = 7 + DIRDIFF_SAME = 0, ///< Both directions faces to the same direction + DIRDIFF_45RIGHT = 1, ///< Angle of 45 degrees right + DIRDIFF_90RIGHT = 2, ///< Angle of 90 degrees right + DIRDIFF_REVERSE = 4, ///< One direction is the opposit of the other one + DIRDIFF_90LEFT = 6, ///< Angle of 90 degrees left + DIRDIFF_45LEFT = 7 ///< Angle of 45 degrees left }; +/** + * Calculate the difference between to directions + * + * @param d0 The first direction as the base + * @param d1 The second direction as the offset from the base + * @return The difference how the second directions drifts of the first one. + */ static inline DirDiff DirDifference(Direction d0, Direction d1) { return (DirDiff)((d0 + 8 - d1) % 8); } +/** + * Applies two differences together + * + * This function adds two differences together and return the resulting + * difference. So adding two DIRDIFF_REVERSE together results in the + * DIRDIFF_SAME difference. + * + * @param d The first difference + * @param delta The second difference to add on + * @return The resulting difference + */ static inline DirDiff ChangeDirDiff(DirDiff d, DirDiff delta) { return (DirDiff)((d + delta) % 8); } - +/** + * Change a direction by a given difference + * + * This functions returns a new direction of the given direction + * which is rotated by the given difference. + * + * @param d The direction to get a new direction from + * @param delta The offset/drift applied to the direction + * @return The new direction + */ static inline Direction ChangeDir(Direction d, DirDiff delta) { return (Direction)((d + delta) % 8); } -/* Direction commonly used as the direction of entering and leaving tiles, 4-way */ +/** + * Enumeration for diagonal directions. + * + * This enumeration is used for the 4 direction of the tile-edges. + */ enum DiagDirection { - DIAGDIR_BEGIN = 0, - DIAGDIR_NE = 0, ///< Northeast, upper right on your monitor - DIAGDIR_SE = 1, - DIAGDIR_SW = 2, - DIAGDIR_NW = 3, - DIAGDIR_END, - INVALID_DIAGDIR = 0xFF, + DIAGDIR_BEGIN = 0, ///< Used for iterations + DIAGDIR_NE = 0, ///< Northeast, upper right on your monitor + DIAGDIR_SE = 1, ///< Southeast + DIAGDIR_SW = 2, ///< Southwest + DIAGDIR_NW = 3, ///< Northwest + DIAGDIR_END, ///< Used for iterations + INVALID_DIAGDIR = 0xFF, ///< Flag for an invalid DiagDirection }; DECLARE_POSTFIX_INCREMENT(DiagDirection); @@ -75,60 +137,135 @@ template <> struct EnumPropsT : MakeEnumPropsT {}; typedef TinyEnumT DiagDirectionByte; //typedefing-enumification of DiagDirection +/** + * Returns the reverse direction of the given DiagDirection + * + * @param d The DiagDirection to get the reverse from + * @return The reverse direction + */ static inline DiagDirection ReverseDiagDir(DiagDirection d) { return (DiagDirection)(2 ^ d); } - +/** + * Enumeration for the difference between to DiagDirection. + * + * As the DiagDirection only contains 4 possible directions the + * difference between two of these directions can only be in 4 ways. + * As the DirDiff enumeration the values can be added together and + * you will get the resulting difference (use modulo DIAGDIR_END). + * + * @see DirDiff + */ enum DiagDirDiff { - DIAGDIRDIFF_SAME = 0, - DIAGDIRDIFF_90RIGHT = 1, - DIAGDIRDIFF_REVERSE = 2, - DIAGDIRDIFF_90LEFT = 3 + DIAGDIRDIFF_SAME = 0, ///< Same directions + DIAGDIRDIFF_90RIGHT = 1, ///< 90 degrees right + DIAGDIRDIFF_REVERSE = 2, ///< Reverse directions + DIAGDIRDIFF_90LEFT = 3 ///< 90 degrees left }; +/** + * Applies a difference on a DiagDirection + * + * This function applies a difference on a DiagDirection and returns + * the new DiagDirection. + * + * @param d The DiagDirection + * @param delta The difference to applie on + * @return The new direction which was calculated + */ static inline DiagDirection ChangeDiagDir(DiagDirection d, DiagDirDiff delta) { return (DiagDirection)((d + delta) % 4); } - +/** + * Convert a Direction to a DiagDirection. + * + * This function can be used to convert the 8-way Direction to + * the 4-way DiagDirection. If the direction cannot be mapped its + * "rounded clockwise". So DIR_N becomes DIAGDIR_NE. + * + * @param dir The direction to convert + * @return The resulting DiagDirection, maybe "rounded clockwise". + */ static inline DiagDirection DirToDiagDir(Direction dir) { return (DiagDirection)(dir >> 1); } - +/** + * Convert a DiagDirection to a Direction. + * + * This function can be used to convert the 4-way DiagDirection + * to the 8-way Direction. As 4-way are less than 8-way not all + * possible directions can be calculated. + * + * @param dir The direction to convert + * @return The resulting Direction + */ static inline Direction DiagDirToDir(DiagDirection dir) { return (Direction)(dir * 2 + 1); } -/* the 2 axis */ +/** + * Enumeration for the two axis X and Y + * + * This enumeration represente the two axis X and Y in the game. + * The X axis is the one which goes align the north-west edge + * (and south-east edge). The Y axis must be so the one which goes + * align the north-east edge (and south-west) edge. + */ enum Axis { - AXIS_X = 0, - AXIS_Y = 1, - AXIS_END + AXIS_X = 0, ///< The X axis + AXIS_Y = 1, ///< The y axis + AXIS_END ///< Used for iterations }; +/** + * Select the other axis as provided. + * + * This is basically the not-operator for the axis. + * + * @param a The given axis + * @return The other axis + */ static inline Axis OtherAxis(Axis a) { return (Axis)(a ^ 1); } +/** + * Convert a DiagDirection to the axis. + * + * This function returns the axis which belongs to the given + * DiagDirection. The axis X belongs to the DiagDirection + * north-east and south-west. + * + * @param d The DiagDirection + * @return The axis which belongs to the direction + */ static inline Axis DiagDirToAxis(DiagDirection d) { return (Axis)(d & 1); } -/* +/** * Converts an Axis to a DiagDirection - * Points always in the positive direction, i.e. S[EW] + * + * This function returns the DiagDirection which + * belongs to the axis. As 2 directions are mapped to an axis + * this function returns the one which points to south, + * either south-west (on X axis) or south-east (on Y axis) + * + * @param a The axis + * @return The direction pointed to south */ static inline DiagDirection AxisToDiagDir(Axis a) { @@ -146,17 +283,34 @@ return (DiagDirection)(xy * 3 ^ ns * 2); } - +/** + * Checks if an interger value is a valid DiagDirection + * + * @param d The value to check + * @return True if the value belongs to a DiagDirection, else false + */ static inline bool IsValidDiagDirection(DiagDirection d) { return d < DIAGDIR_END; } +/** + * Checks if an integer value is a valid Direction + * + * @param d The value to check + * @return True if the value belongs to a Direction, else false + */ static inline bool IsValidDirection(Direction d) { return d < DIR_END; } +/** + * Checks if an integer value is a valid Axis + * + * @param d The value to check + * @return True if the value belongs to an Axis, else false + */ static inline bool IsValidAxis(Axis d) { return d < AXIS_END; diff -r 31fcaa5375a1 -r e72987579514 src/disaster_cmd.cpp --- a/src/disaster_cmd.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/disaster_cmd.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -121,7 +121,6 @@ * and owned by nobody */ static void InitializeDisasterVehicle(Vehicle *v, int x, int y, byte z, Direction direction, byte subtype) { - v = new (v) DisasterVehicle(); v->x_pos = x; v->y_pos = y; v->z_pos = z; @@ -600,16 +599,16 @@ v->tile, 0); - u = ForceAllocateSpecialVehicle(); + u = new DisasterVehicle(); if (u == NULL) { DeleteDisasterVeh(v); return; } InitializeDisasterVehicle(u, -6 * TILE_SIZE, v->y_pos, 135, DIR_SW, ST_Big_Ufo_Destroyer); - u->u.disaster.unk2 = v->index; + u->u.disaster.big_ufo_destroyer_target = v->index; - w = ForceAllocateSpecialVehicle(); + w = new DisasterVehicle(); if (w == NULL) return; u->next = w; @@ -667,7 +666,7 @@ } if (v->current_order.dest == 0) { - u = GetVehicle(v->u.disaster.unk2); + u = GetVehicle(v->u.disaster.big_ufo_destroyer_target); if (delta(v->x_pos, u->x_pos) > TILE_SIZE) return; v->current_order.dest = 1; @@ -706,7 +705,7 @@ VehiclePositionChanged(v); BeginVehicleMove(v); EndVehicleMove(v); - DeleteVehicle(v); + delete v; return; } @@ -760,7 +759,7 @@ * otherwise crashes on a random tile */ static void Disaster_Zeppeliner_Init() { - Vehicle *v = ForceAllocateSpecialVehicle(), *u; + Vehicle *v = new DisasterVehicle(), *u; Station *st; int x; @@ -781,7 +780,7 @@ InitializeDisasterVehicle(v, x, 0, 135, DIR_SE, ST_Zeppeliner); /* Allocate shadow too? */ - u = ForceAllocateSpecialVehicle(); + u = new DisasterVehicle(); if (u != NULL) { v->next = u; InitializeDisasterVehicle(u, x, 0, 0, DIR_SE, ST_Zeppeliner_Shadow); @@ -794,7 +793,7 @@ * until it locates a road vehicle which it targets and then destroys */ static void Disaster_Small_Ufo_Init() { - Vehicle *v = ForceAllocateSpecialVehicle(), *u; + Vehicle *v = new DisasterVehicle(), *u; int x; if (v == NULL) return; @@ -806,7 +805,7 @@ v->age = 0; /* Allocate shadow too? */ - u = ForceAllocateSpecialVehicle(); + u = new DisasterVehicle(); if (u != NULL) { v->next = u; InitializeDisasterVehicle(u, x, 0, 0, DIR_SE, ST_Small_Ufo_Shadow); @@ -833,7 +832,7 @@ if (found == NULL) return; - v = ForceAllocateSpecialVehicle(); + v = new DisasterVehicle(); if (v == NULL) return; /* Start from the bottom (south side) of the map */ @@ -842,7 +841,7 @@ InitializeDisasterVehicle(v, x, y, 135, DIR_NE, ST_Airplane); - u = ForceAllocateSpecialVehicle(); + u = new DisasterVehicle(); if (u != NULL) { v->next = u; InitializeDisasterVehicle(u, x, y, 0, DIR_SE, ST_Airplane_Shadow); @@ -869,7 +868,7 @@ if (found == NULL) return; - v = ForceAllocateSpecialVehicle(); + v = new DisasterVehicle(); if (v == NULL) return; x = -16 * TILE_SIZE; @@ -877,13 +876,13 @@ InitializeDisasterVehicle(v, x, y, 135, DIR_SW, ST_Helicopter); - u = ForceAllocateSpecialVehicle(); + u = new DisasterVehicle(); if (u != NULL) { v->next = u; InitializeDisasterVehicle(u, x, y, 0, DIR_SW, ST_Helicopter_Shadow); u->vehstatus |= VS_SHADOW; - w = ForceAllocateSpecialVehicle(); + w = new DisasterVehicle(); if (w != NULL) { u->next = w; InitializeDisasterVehicle(w, x, y, 140, DIR_SW, ST_Helicopter_Rotors); @@ -896,7 +895,7 @@ * down by a combat airplane, destroying the surroundings */ static void Disaster_Big_Ufo_Init() { - Vehicle *v = ForceAllocateSpecialVehicle(), *u; + Vehicle *v = new DisasterVehicle(), *u; int x, y; if (v == NULL) return; @@ -909,7 +908,7 @@ v->age = 0; /* Allocate shadow too? */ - u = ForceAllocateSpecialVehicle(); + u = new DisasterVehicle(); if (u != NULL) { v->next = u; InitializeDisasterVehicle(u, x, y, 0, DIR_NW, ST_Big_Ufo_Shadow); @@ -921,7 +920,7 @@ /* Curious submarine #1, just floats around */ static void Disaster_Small_Submarine_Init() { - Vehicle *v = ForceAllocateSpecialVehicle(); + Vehicle *v = new DisasterVehicle(); int x, y; Direction dir; uint32 r; @@ -946,7 +945,7 @@ /* Curious submarine #2, just floats around */ static void Disaster_Big_Submarine_Init() { - Vehicle *v = ForceAllocateSpecialVehicle(); + Vehicle *v = new DisasterVehicle(); int x, y; Direction dir; uint32 r; @@ -986,7 +985,7 @@ { TileIndex tile = i->xy; - TileIndexDiff step = TileOffsByDiagDir(GB(Random(), 0, 2)); + TileIndexDiff step = TileOffsByDiagDir((DiagDirection)GB(Random(), 0, 2)); uint n; for (n = 0; n < 30; n++) { diff -r 31fcaa5375a1 -r e72987579514 src/dock_gui.cpp --- a/src/dock_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/dock_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -217,7 +217,7 @@ }; static const WindowDesc _build_docks_toolbar_desc = { - WDP_ALIGN_TBR, 22, 136, 36, + WDP_ALIGN_TBR, 22, 136, 36, 136, 36, WC_BUILD_TOOLBAR, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON, _build_docks_toolb_widgets, @@ -293,7 +293,7 @@ }; static const WindowDesc _build_dock_station_desc = { - WDP_AUTO, WDP_AUTO, 148, 75, + WDP_AUTO, WDP_AUTO, 148, 75, 148, 75, WC_BUILD_STATION, WC_BUILD_TOOLBAR, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _build_dock_station_widgets, @@ -362,7 +362,7 @@ }; static const WindowDesc _build_docks_depot_desc = { - WDP_AUTO, WDP_AUTO, 204, 86, + WDP_AUTO, WDP_AUTO, 204, 86, 204, 86, WC_BUILD_DEPOT, WC_BUILD_TOOLBAR, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _build_docks_depot_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/driver.h --- a/src/driver.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/driver.h Fri Aug 03 22:09:42 2007 +0000 @@ -11,8 +11,8 @@ #include #include -bool GetDriverParamBool(const char* const* parm, const char* name); -int GetDriverParamInt(const char* const* parm, const char* name, int def); +bool GetDriverParamBool(const char * const *parm, const char *name); +int GetDriverParamInt(const char * const *parm, const char *name, int def); class Driver { public: diff -r 31fcaa5375a1 -r e72987579514 src/dummy_land.cpp --- a/src/dummy_land.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/dummy_land.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -21,9 +21,9 @@ return 0; } -static Slope GetSlopeTileh_Dummy(TileIndex tile, Slope tileh) +static Foundation GetFoundation_Dummy(TileIndex tile, Slope tileh) { - return SLOPE_FLAT; + return FOUNDATION_NONE; } static CommandCost ClearTile_Dummy(TileIndex tile, byte flags) @@ -81,5 +81,5 @@ ChangeTileOwner_Dummy, /* change_tile_owner_clear */ NULL, /* get_produced_cargo_proc */ NULL, /* vehicle_enter_tile_proc */ - GetSlopeTileh_Dummy, /* get_slope_tileh_proc */ + GetFoundation_Dummy, /* get_foundation_proc */ }; diff -r 31fcaa5375a1 -r e72987579514 src/economy.cpp --- a/src/economy.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/economy.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -355,14 +355,14 @@ Vehicle *u = v; do { Vehicle *next = GetNextVehicle(u); - DeleteVehicle(u); + delete u; u = next; } while (u != NULL); } break; case VEH_ROAD: case VEH_SHIP: - DeleteVehicle(v); + delete v; break; case VEH_AIRCRAFT: @@ -1167,7 +1167,6 @@ Money GetTransportedGoodsIncome(uint num_pieces, uint dist, byte transit_days, CargoID cargo_type) { const CargoSpec *cs = GetCargo(cargo_type); - byte f; /* Use callback to calculate cargo profit, if available */ if (HASBIT(cs->callback_mask, CBM_CARGO_PROFIT_CALC)) { @@ -1186,28 +1185,39 @@ } } - /* zero the distance if it's the bank and very short transport. */ - if (_opt.landscape == LT_TEMPERATE && cs->label == 'VALU' && dist < 10) - dist = 0; - - f = 255; - if (transit_days > cs->transit_days[0]) { - transit_days -= cs->transit_days[0]; - f -= transit_days; + /* zero the distance (thus income) if it's the bank and very short transport. */ + if (_opt.landscape == LT_TEMPERATE && cs->label == 'VALU' && dist < 10) return 0; - if (transit_days > cs->transit_days[1]) { - transit_days -= cs->transit_days[1]; - if (f < transit_days) { - f = 0; - } else { - f -= transit_days; - } - } + static const int MIN_TIME_FACTOR = 31; + static const int MAX_TIME_FACTOR = 255; + + const int days1 = cs->transit_days[0]; + const int days2 = cs->transit_days[1]; + const int days_over_days1 = transit_days - days1; + + /* + * The time factor is calculated based on the time it took + * (transit_days) compared two cargo-depending values. The + * range is divided into three parts: + * + * - constant for fast transits + * - linear decreasing with time with a slope of -1 for medium transports + * - linear decreasing with time with a slope of -2 for slow transports + * + */ + int time_factor; + if (days_over_days1 <= 0) { + time_factor = MAX_TIME_FACTOR; + } else if (days_over_days1 <= days2) { + time_factor = MAX_TIME_FACTOR - days_over_days1; + } else { + time_factor = MAX_TIME_FACTOR - 2 * days_over_days1 + days2; } - if (f < 31) f = 31; - return BIGMULSS(dist * f * num_pieces, _cargo_payment_rates[cargo_type], 21); + if (time_factor < MIN_TIME_FACTOR) time_factor = MIN_TIME_FACTOR; + + return BIGMULSS(dist * time_factor * num_pieces, _cargo_payment_rates[cargo_type], 21); } static void DeliverGoodsToIndustry(TileIndex xy, CargoID cargo_type, int num_pieces) diff -r 31fcaa5375a1 -r e72987579514 src/economy.h --- a/src/economy.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/economy.h Fri Aug 03 22:09:42 2007 +0000 @@ -61,7 +61,7 @@ int UpdateCompanyRatingAndValue(Player *p, bool update); VARDEF Subsidy _subsidies[MAX_PLAYERS]; -Pair SetupSubsidyDecodeParam(const Subsidy* s, bool mode); +Pair SetupSubsidyDecodeParam(const Subsidy *s, bool mode); void DeleteSubsidyWithTown(TownID index); void DeleteSubsidyWithIndustry(IndustryID index); void DeleteSubsidyWithStation(StationID index); diff -r 31fcaa5375a1 -r e72987579514 src/elrail.cpp --- a/src/elrail.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/elrail.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -102,7 +102,7 @@ return AxisToTrackBits(DiagDirToAxis(GetBridgeRampDirection(t))); } - case MP_STREET: + case MP_ROAD: if (GetRoadTileType(t) != ROAD_TILE_CROSSING) return TRACK_BIT_NONE; if (GetRailType(t) != RAILTYPE_ELECTRIC) return TRACK_BIT_NONE; return GetCrossingRailBits(t); @@ -176,7 +176,7 @@ for (i = DIAGDIR_NE; i < DIAGDIR_END; i++) { TileIndex neighbour = ti->tile + TileOffsByDiagDir(i); - uint foundation = 0; + Foundation foundation = FOUNDATION_NONE; int k; /* Here's one of the main headaches. GetTileSlope does not correct for possibly @@ -225,9 +225,7 @@ foundation = GetBridgeFoundation(tileh[TS_NEIGHBOUR], DiagDirToAxis(GetBridgeRampDirection(neighbour))); } - if (foundation != 0) { - tileh[TS_NEIGHBOUR] = foundation < 15 ? SLOPE_FLAT : _inclined_tileh[foundation - 15]; - } + ApplyFoundationToSlope(foundation, &tileh[TS_NEIGHBOUR]); AdjustTileh(neighbour, &tileh[TS_NEIGHBOUR]); @@ -270,15 +268,9 @@ continue; /* No neighbour, go looking for a better position */ } - SpriteID img = pylons_normal[temp]; - SpriteID pal = PAL_NONE; - if (HASBIT(_transparent_opt, TO_BUILDINGS)) { - SETBIT(img, PALETTE_MODIFIER_TRANSPARENT); - pal = PALETTE_TO_TRANSPARENT; - } - - AddSortableSpriteToDraw(img, pal, x, y, 1, 1, 10, - GetSlopeZ(ti->x + x_pcp_offsets[i], ti->y + y_pcp_offsets[i])); + AddSortableSpriteToDraw(pylons_normal[temp], PAL_NONE, x, y, 1, 1, 10, + GetSlopeZ(ti->x + x_pcp_offsets[i], ti->y + y_pcp_offsets[i]), + HASBIT(_transparent_opt, TO_BUILDINGS)); break; /* We already have drawn a pylon, bail out */ } } @@ -315,15 +307,9 @@ assert(!IsSteepSlope(tileh[TS_HOME])); sss = &CatenarySpriteData[Wires[tileh_selector][t][PCPconfig]]; - SpriteID img = sss->image; - SpriteID pal = PAL_NONE; - if (HASBIT(_transparent_opt, TO_BUILDINGS)) { - SETBIT(img, PALETTE_MODIFIER_TRANSPARENT); - pal = PALETTE_TO_TRANSPARENT; - } - - AddSortableSpriteToDraw(img, pal, ti->x + sss->x_offset, ti->y + sss->y_offset, - sss->x_size, sss->y_size, sss->z_size, GetSlopeZ(ti->x + min(sss->x_offset, TILE_SIZE - 1), ti->y + min(sss->y_offset, TILE_SIZE - 1)) + sss->z_offset); + AddSortableSpriteToDraw(sss->image, PAL_NONE, ti->x + sss->x_offset, ti->y + sss->y_offset, + sss->x_size, sss->y_size, sss->z_size, GetSlopeZ(ti->x + min(sss->x_offset, TILE_SIZE - 1), ti->y + min(sss->y_offset, TILE_SIZE - 1)) + sss->z_offset, + HASBIT(_transparent_opt, TO_BUILDINGS)); } } } @@ -354,41 +340,27 @@ height = GetBridgeHeight(end); - SpriteID img = sss->image; - SpriteID pal = PAL_NONE; - if (HASBIT(_transparent_opt, TO_BUILDINGS)) { - SETBIT(img, PALETTE_MODIFIER_TRANSPARENT); - pal = PALETTE_TO_TRANSPARENT; - } - - AddSortableSpriteToDraw(img, pal, ti->x + sss->x_offset, ti->y + sss->y_offset, - sss->x_size, sss->y_size, sss->z_size, height + sss->z_offset + AddSortableSpriteToDraw(sss->image, PAL_NONE, ti->x + sss->x_offset, ti->y + sss->y_offset, + sss->x_size, sss->y_size, sss->z_size, height + sss->z_offset, + HASBIT(_transparent_opt, TO_BUILDINGS) ); /* Finished with wires, draw pylons */ /* every other tile needs a pylon on the northern end */ if (num % 2) { if (axis == AXIS_X) { - img = pylons_bridge[0 + HASBIT(tlg, 0)]; - if (HASBIT(_transparent_opt, TO_BUILDINGS)) SETBIT(img, PALETTE_MODIFIER_TRANSPARENT); - AddSortableSpriteToDraw(img, pal, ti->x, ti->y + 4 + 8 * HASBIT(tlg, 0), 1, 1, 10, height); + AddSortableSpriteToDraw(pylons_bridge[0 + HASBIT(tlg, 0)], PAL_NONE, ti->x, ti->y + 4 + 8 * HASBIT(tlg, 0), 1, 1, 10, height, HASBIT(_transparent_opt, TO_BUILDINGS)); } else { - img = pylons_bridge[2 + HASBIT(tlg, 1)]; - if (HASBIT(_transparent_opt, TO_BUILDINGS)) SETBIT(img, PALETTE_MODIFIER_TRANSPARENT); - AddSortableSpriteToDraw(img, pal, ti->x + 4 + 8 * HASBIT(tlg, 1), ti->y, 1, 1, 10, height); + AddSortableSpriteToDraw(pylons_bridge[2 + HASBIT(tlg, 1)], PAL_NONE, ti->x + 4 + 8 * HASBIT(tlg, 1), ti->y, 1, 1, 10, height, HASBIT(_transparent_opt, TO_BUILDINGS)); } } /* need a pylon on the southern end of the bridge */ if (DistanceMax(ti->tile, start) == length) { if (axis == AXIS_X) { - img = pylons_bridge[0 + HASBIT(tlg, 0)]; - if (HASBIT(_transparent_opt, TO_BUILDINGS)) SETBIT(img, PALETTE_MODIFIER_TRANSPARENT); - AddSortableSpriteToDraw(img, pal, ti->x + 16, ti->y + 4 + 8 * HASBIT(tlg, 0), 1, 1, 10, height); + AddSortableSpriteToDraw(pylons_bridge[0 + HASBIT(tlg, 0)], PAL_NONE, ti->x + 16, ti->y + 4 + 8 * HASBIT(tlg, 0), 1, 1, 10, height, HASBIT(_transparent_opt, TO_BUILDINGS)); } else { - img = pylons_bridge[2 + HASBIT(tlg, 1)]; - if (HASBIT(_transparent_opt, TO_BUILDINGS)) SETBIT(img, PALETTE_MODIFIER_TRANSPARENT); - AddSortableSpriteToDraw(img, pal, ti->x + 4 + 8 * HASBIT(tlg, 1), ti->y + 16, 1, 1, 10, height); + AddSortableSpriteToDraw(pylons_bridge[2 + HASBIT(tlg, 1)], PAL_NONE, ti->x + 4 + 8 * HASBIT(tlg, 1), ti->y + 16, 1, 1, 10, height, HASBIT(_transparent_opt, TO_BUILDINGS)); } } } @@ -410,24 +382,18 @@ if (IsRailDepot(ti->tile)) { const SortableSpriteStruct *sss = &CatenarySpriteData_Depot[GetRailDepotDirection(ti->tile)]; - SpriteID img = sss->image; - SpriteID pal = PAL_NONE; - if (HASBIT(_transparent_opt, TO_BUILDINGS)) { - SETBIT(img, PALETTE_MODIFIER_TRANSPARENT); - pal = PALETTE_TO_TRANSPARENT; - } - AddSortableSpriteToDraw( - img, pal, ti->x + sss->x_offset, ti->y + sss->y_offset, + sss->image, PAL_NONE, ti->x + sss->x_offset, ti->y + sss->y_offset, sss->x_size, sss->y_size, sss->z_size, - GetTileMaxZ(ti->tile) + sss->z_offset + GetTileMaxZ(ti->tile) + sss->z_offset, + HASBIT(_transparent_opt, TO_BUILDINGS) ); return; } break; case MP_TUNNELBRIDGE: - case MP_STREET: + case MP_ROAD: case MP_STATION: break; diff -r 31fcaa5375a1 -r e72987579514 src/endian_check.cpp --- a/src/endian_check.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/endian_check.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -12,45 +12,41 @@ #include #include -/** Main call of the endian_check program +/** + * Main call of the endian_check program * @param argc argument count * @param argv arguments themselves - * @return exit code */ -int main (int argc, char *argv[]) { - unsigned char EndianTest[2] = { 1, 0 }; + * @return exit code + */ +int main (int argc, char *argv[]) +{ + unsigned char endian_test[2] = { 1, 0 }; int force_BE = 0, force_LE = 0, force_PREPROCESSOR = 0; - if (argc > 1 && strcmp(argv[1], "BE") == 0) - force_BE = 1; - if (argc > 1 && strcmp(argv[1], "LE") == 0) - force_LE = 1; - if (argc > 1 && strcmp(argv[1], "PREPROCESSOR") == 0) - force_PREPROCESSOR = 1; + if (argc > 1 && strcmp(argv[1], "BE") == 0) force_BE = 1; + if (argc > 1 && strcmp(argv[1], "LE") == 0) force_LE = 1; + if (argc > 1 && strcmp(argv[1], "PREPROCESSOR") == 0) force_PREPROCESSOR = 1; printf("#ifndef ENDIAN_H\n#define ENDIAN_H\n"); if (force_LE == 1) { printf("#define TTD_LITTLE_ENDIAN\n"); + } else if (force_BE == 1) { + printf("#define TTD_BIG_ENDIAN\n"); + } else if (force_PREPROCESSOR == 1) { + /* Support for universal binaries on OSX + * Universal binaries supports both PPC and x86 + * If a compiler for OSX gets this setting, it will always pick the correct endian and no test is needed + */ + printf("#ifdef __BIG_ENDIAN__\n"); + printf("#define TTD_BIG_ENDIAN\n"); + printf("#else\n"); + printf("#define TTD_LITTLE_ENDIAN\n"); + printf("#endif\n"); + } else if (*(short*)endian_test == 1 ) { + printf("#define TTD_LITTLE_ENDIAN\n"); } else { - if (force_BE == 1) { - printf("#define TTD_BIG_ENDIAN\n"); - } else { - if (force_PREPROCESSOR == 1) { - /** adding support for universal binaries on OSX - * Universal binaries supports both PPC and x86 - * If a compiler for OSX gets this setting, it will always pick the correct endian and no test is needed */ - printf("#ifdef __BIG_ENDIAN__\n"); - printf("#define TTD_BIG_ENDIAN\n"); - printf("#else\n"); - printf("#define TTD_LITTLE_ENDIAN\n"); - printf("#endif\n"); - } else { - if ( *(short *) EndianTest == 1 ) - printf("#define TTD_LITTLE_ENDIAN\n"); - else - printf("#define TTD_BIG_ENDIAN\n"); - } - } + printf("#define TTD_BIG_ENDIAN\n"); } printf("#endif\n"); diff -r 31fcaa5375a1 -r e72987579514 src/engine.cpp --- a/src/engine.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/engine.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -23,6 +23,7 @@ #include "group.h" #include "string.h" #include "strings.h" +#include "misc/autoptr.hpp" EngineInfo _engine_info[TOTAL_NUM_ENGINES]; RailVehicleInfo _rail_vehicle_info[NUM_TRAIN_ENGINES]; @@ -479,43 +480,7 @@ * Engine Replacement stuff ************************************************************************/ -static void EngineRenewPoolNewBlock(uint start_item); - -DEFINE_OLD_POOL(EngineRenew, EngineRenew, EngineRenewPoolNewBlock, NULL) - -static void EngineRenewPoolNewBlock(uint start_item) -{ - EngineRenew *er; - - /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. - * TODO - This is just a temporary stage, this will be removed. */ - for (er = GetEngineRenew(start_item); er != NULL; er = (er->index + 1U < GetEngineRenewPoolSize()) ? GetEngineRenew(er->index + 1U) : NULL) { - er->index = start_item++; - er->from = INVALID_ENGINE; - } -} - - -static EngineRenew *AllocateEngineRenew() -{ - EngineRenew *er; - - /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. - * TODO - This is just a temporary stage, this will be removed. */ - for (er = GetEngineRenew(0); er != NULL; er = (er->index + 1U < GetEngineRenewPoolSize()) ? GetEngineRenew(er->index + 1U) : NULL) { - if (IsValidEngineRenew(er)) continue; - - er->to = INVALID_ENGINE; - er->next = NULL; - er->group_id = ALL_GROUP; - return er; - } - - /* Check if we can add a block to the pool */ - if (AddBlockToPool(&_EngineRenew_pool)) return AllocateEngineRenew(); - - return NULL; -} +DEFINE_OLD_POOL_GENERIC(EngineRenew, EngineRenew) /** * Retrieves the EngineRenew that specifies the replacement of the given @@ -536,9 +501,9 @@ EngineRenew *er = (EngineRenew *)(*erl); EngineRenew *next; - while (er) { + while (er != NULL) { next = er->next; - DeleteEngineRenew(er); + delete er; er = next; } *erl = NULL; // Empty list @@ -561,17 +526,19 @@ return CommandCost(); } - er = AllocateEngineRenew(); + er = new EngineRenew(old_engine, new_engine); if (er == NULL) return CMD_ERROR; + AutoPtrT er_auto_delete = er; + if (flags & DC_EXEC) { - er->from = old_engine; - er->to = new_engine; er->group_id = group; /* Insert before the first element */ er->next = (EngineRenew *)(*erl); *erl = (EngineRenewList)er; + + er_auto_delete.Detach(); } return CommandCost(); @@ -593,7 +560,7 @@ /* Cut this element out */ prev->next = er->next; } - DeleteEngineRenew(er); + delete er; } return CommandCost(); } @@ -628,12 +595,7 @@ int index; while ((index = SlIterateArray()) != -1) { - EngineRenew *er; - - if (!AddBlockIfNeeded(&_EngineRenew_pool, index)) - error("EngineRenews: failed loading savegame: too many EngineRenews"); - - er = GetEngineRenew(index); + EngineRenew *er = new (index) EngineRenew(); SlObject(er, _engine_renew_desc); /* Advanced vehicle lists, ungrouped vehicles got added */ @@ -704,6 +666,6 @@ void InitializeEngines() { /* Clean the engine renew pool and create 1 block in it */ - CleanPool(&_EngineRenew_pool); - AddBlockToPool(&_EngineRenew_pool); + _EngineRenew_pool.CleanPool(); + _EngineRenew_pool.AddBlockToPool(); } diff -r 31fcaa5375a1 -r e72987579514 src/engine.h --- a/src/engine.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/engine.h Fri Aug 03 22:09:42 2007 +0000 @@ -45,7 +45,7 @@ // kind of visual effect to generate for a vehicle (default, steam, diesel, electric). // Same goes for the callback result, which atm is only used to check if a wagon is powered. byte shorten_factor; ///< length on main map for this type is 8 - shorten_factor - byte tractive_effort; ///< Tractive effort coefficient + byte tractive_effort; ///< Tractive effort coefficient byte user_def_data; ///< Property 0x25: "User-defined bit mask" Used only for (very few) NewGRF vehicles }; @@ -262,19 +262,7 @@ * Engine Replacement stuff ************************************************************************/ -/** - * Struct to store engine replacements. DO NOT USE outside of engine.c. Is - * placed here so the only exception to this rule, the saveload code, can use - * it. - */ -struct EngineRenew { - EngineRenewID index; - EngineID from; - EngineID to; - EngineRenew *next; - GroupID group_id; -}; - +struct EngineRenew; /** * Memory pool for engine renew elements. DO NOT USE outside of engine.c. Is * placed here so the only exception to this rule, the saveload code, can use @@ -283,19 +271,23 @@ DECLARE_OLD_POOL(EngineRenew, EngineRenew, 3, 8000) /** - * Check if a EngineRenew really exists. + * Struct to store engine replacements. DO NOT USE outside of engine.c. Is + * placed here so the only exception to this rule, the saveload code, can use + * it. */ -static inline bool IsValidEngineRenew(const EngineRenew *er) -{ - return er->from != INVALID_ENGINE; -} +struct EngineRenew : PoolItem { + EngineID from; + EngineID to; + EngineRenew *next; + GroupID group_id; -static inline void DeleteEngineRenew(EngineRenew *er) -{ - er->from = INVALID_ENGINE; -} + EngineRenew(EngineID from = INVALID_ENGINE, EngineID to = INVALID_ENGINE) : from(from), to(to), next(NULL) {} + ~EngineRenew() { this->from = INVALID_ENGINE; } -#define FOR_ALL_ENGINE_RENEWS_FROM(er, start) for (er = GetEngineRenew(start); er != NULL; er = (er->index + 1U < GetEngineRenewPoolSize()) ? GetEngineRenew(er->index + 1U) : NULL) if (er->from != INVALID_ENGINE) if (IsValidEngineRenew(er)) + bool IsValid() const { return this->from != INVALID_ENGINE; } +}; + +#define FOR_ALL_ENGINE_RENEWS_FROM(er, start) for (er = GetEngineRenew(start); er != NULL; er = (er->index + 1U < GetEngineRenewPoolSize()) ? GetEngineRenew(er->index + 1U) : NULL) if (er->IsValid()) #define FOR_ALL_ENGINE_RENEWS(er) FOR_ALL_ENGINE_RENEWS_FROM(er, 0) @@ -309,7 +301,7 @@ * @param erl The renewlist for a given player. * @return The new renewlist for the player. */ -void RemoveAllEngineReplacement(EngineRenewList* erl); +void RemoveAllEngineReplacement(EngineRenewList *erl); /** * Retrieve the engine replacement in a given renewlist for an original engine type. @@ -328,7 +320,7 @@ * @param flags The calling command flags. * @return 0 on success, CMD_ERROR on failure. */ -CommandCost AddEngineReplacement(EngineRenewList* erl, EngineID old_engine, EngineID new_engine, GroupID group, uint32 flags); +CommandCost AddEngineReplacement(EngineRenewList *erl, EngineID old_engine, EngineID new_engine, GroupID group, uint32 flags); /** * Remove an engine replacement from a given renewlist. @@ -337,7 +329,7 @@ * @param flags The calling command flags. * @return 0 on success, CMD_ERROR on failure. */ -CommandCost RemoveEngineReplacement(EngineRenewList* erl, EngineID engine, GroupID group, uint32 flags); +CommandCost RemoveEngineReplacement(EngineRenewList *erl, EngineID engine, GroupID group, uint32 flags); /** When an engine is made buildable or is removed from being buildable, add/remove it from the build/autoreplace lists * @param type The type of engine diff -r 31fcaa5375a1 -r e72987579514 src/engine_gui.cpp --- a/src/engine_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/engine_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -104,7 +104,7 @@ } static const WindowDesc _engine_preview_desc = { - WDP_CENTER, WDP_CENTER, 300, 192, + WDP_CENTER, WDP_CENTER, 300, 192, 300, 192, WC_ENGINE_PREVIEW, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _engine_preview_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/fileio.cpp --- a/src/fileio.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/fileio.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -66,8 +66,8 @@ { /* Do we still have the file open, or should we reopen it? */ if (_fio.handles[slot] == NULL) { - DEBUG(misc, 6, "Restoring file '%s' in slot '%d' from disk", _fio.filename[slot], slot); - FioOpenFile(slot, _fio.filename[slot]); + DEBUG(misc, 6, "Restoring file '%s' in slot '%d' from disk", _fio.filenames[slot], slot); + FioOpenFile(slot, _fio.filenames[slot]); } _fio.usage_count[slot]++; } @@ -165,7 +165,7 @@ } } assert(slot != -1); - DEBUG(misc, 6, "Closing filehandler '%s' in slot '%d' because of fd-limit", _fio.filename[slot], slot); + DEBUG(misc, 6, "Closing filehandler '%s' in slot '%d' because of fd-limit", _fio.filenames[slot], slot); FioCloseFile(slot); } } diff -r 31fcaa5375a1 -r e72987579514 src/functions.h --- a/src/functions.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/functions.h Fri Aug 03 22:09:42 2007 +0000 @@ -96,7 +96,7 @@ /* misc.cpp */ bool IsCustomName(StringID id); void DeleteName(StringID id); -char *GetName(char *buff, StringID id, const char* last); +char *GetName(char *buff, StringID id, const char *last); #define AllocateName(name, skip) RealAllocateName(name, skip, false) StringID RealAllocateName(const char *name, byte skip, bool check_double); @@ -117,7 +117,7 @@ void ResetObjectToPlace(); -bool ScrollWindowTo(int x, int y, Window * w, bool instant = false); +bool ScrollWindowTo(int x, int y, Window *w, bool instant = false); bool ScrollMainWindowToTile(TileIndex tile, bool instant = false); bool ScrollMainWindowTo(int x, int y, bool instant = false); diff -r 31fcaa5375a1 -r e72987579514 src/genworld_gui.cpp --- a/src/genworld_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/genworld_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -255,7 +255,7 @@ SetWindowWidgetDisabledState(w, GLAND_START_DATE_DOWN, _patches_newgame.starting_year <= MIN_YEAR); SetWindowWidgetDisabledState(w, GLAND_START_DATE_UP, _patches_newgame.starting_year >= MAX_YEAR); SetWindowWidgetDisabledState(w, GLAND_SNOW_LEVEL_DOWN, _patches_newgame.snow_line_height <= 2 || _opt_newgame.landscape != LT_ARCTIC); - SetWindowWidgetDisabledState(w, GLAND_SNOW_LEVEL_UP, _patches_newgame.snow_line_height >= 13 || _opt_newgame.landscape != LT_ARCTIC); + SetWindowWidgetDisabledState(w, GLAND_SNOW_LEVEL_UP, _patches_newgame.snow_line_height >= MAX_SNOWLINE_HEIGHT || _opt_newgame.landscape != LT_ARCTIC); SetWindowWidgetLoweredState(w, GLAND_TEMPERATE, _opt_newgame.landscape == LT_TEMPERATE); SetWindowWidgetLoweredState(w, GLAND_ARCTIC, _opt_newgame.landscape == LT_ARCTIC); @@ -402,7 +402,7 @@ HandleButtonClick(w, e->we.click.widget); SetWindowDirty(w); - _patches_newgame.snow_line_height = clamp(_patches_newgame.snow_line_height + e->we.click.widget - GLAND_SNOW_LEVEL_TEXT, 2, 13); + _patches_newgame.snow_line_height = clamp(_patches_newgame.snow_line_height + e->we.click.widget - GLAND_SNOW_LEVEL_TEXT, 2, MAX_SNOWLINE_HEIGHT); } _left_button_clicked = false; break; @@ -498,7 +498,7 @@ break; case GLAND_SNOW_LEVEL_TEXT: InvalidateWidget(w, GLAND_SNOW_LEVEL_TEXT); - _patches_newgame.snow_line_height = clamp(value, 2, 13); + _patches_newgame.snow_line_height = clamp(value, 2, MAX_SNOWLINE_HEIGHT); break; } @@ -510,7 +510,7 @@ } static const WindowDesc _generate_landscape_desc = { - WDP_CENTER, WDP_CENTER, 338, 268, + WDP_CENTER, WDP_CENTER, 338, 268, 338, 268, WC_GENERATE_LANDSCAPE, WC_NONE, WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _generate_landscape_widgets, @@ -518,7 +518,7 @@ }; static const WindowDesc _heightmap_load_desc = { - WDP_CENTER, WDP_CENTER, 338, 236, + WDP_CENTER, WDP_CENTER, 338, 236, 338, 236, WC_GENERATE_LANDSCAPE, WC_NONE, WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_STD_BTN | WDF_UNCLICK_BUTTONS, _heightmap_load_widgets, @@ -611,7 +611,7 @@ SetWindowWidgetDisabledState(w, CSCEN_START_DATE_DOWN, _patches_newgame.starting_year <= MIN_YEAR); SetWindowWidgetDisabledState(w, CSCEN_START_DATE_UP, _patches_newgame.starting_year >= MAX_YEAR); SetWindowWidgetDisabledState(w, CSCEN_FLAT_LAND_HEIGHT_DOWN, _patches_newgame.se_flat_world_height <= 0); - SetWindowWidgetDisabledState(w, CSCEN_FLAT_LAND_HEIGHT_UP, _patches_newgame.se_flat_world_height >= 15); + SetWindowWidgetDisabledState(w, CSCEN_FLAT_LAND_HEIGHT_UP, _patches_newgame.se_flat_world_height >= MAX_TILE_HEIGHT); SetWindowWidgetLoweredState(w, CSCEN_TEMPERATE, _opt_newgame.landscape == LT_TEMPERATE); SetWindowWidgetLoweredState(w, CSCEN_ARCTIC, _opt_newgame.landscape == LT_ARCTIC); @@ -672,7 +672,7 @@ HandleButtonClick(w, e->we.click.widget); SetWindowDirty(w); - _patches_newgame.se_flat_world_height = clamp(_patches_newgame.se_flat_world_height + e->we.click.widget - CSCEN_FLAT_LAND_HEIGHT_TEXT, 0, 15); + _patches_newgame.se_flat_world_height = clamp(_patches_newgame.se_flat_world_height + e->we.click.widget - CSCEN_FLAT_LAND_HEIGHT_TEXT, 0, MAX_TILE_HEIGHT); } _left_button_clicked = false; break; @@ -703,7 +703,7 @@ break; case CSCEN_FLAT_LAND_HEIGHT_TEXT: InvalidateWidget(w, CSCEN_FLAT_LAND_HEIGHT_TEXT); - _patches_newgame.se_flat_world_height = clamp(value, 0, 15); + _patches_newgame.se_flat_world_height = clamp(value, 0, MAX_TILE_HEIGHT); break; } @@ -743,7 +743,7 @@ }; static const WindowDesc _create_scenario_desc = { - WDP_CENTER, WDP_CENTER, 338, 170, + WDP_CENTER, WDP_CENTER, 338, 170, 338, 170, WC_GENERATE_LANDSCAPE, WC_NONE, WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_STD_BTN | WDF_UNCLICK_BUTTONS, _create_scenario_widgets, @@ -823,7 +823,7 @@ } static const WindowDesc _show_terrain_progress_desc = { - WDP_CENTER, WDP_CENTER, 181, 97, + WDP_CENTER, WDP_CENTER, 181, 97, 181, 97, WC_GENERATE_PROGRESS_WINDOW, WC_NONE, WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _show_terrain_progress_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/gfx.cpp --- a/src/gfx.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/gfx.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -662,7 +662,7 @@ DoPaletteAnimations(); _pal_first_dirty = 0; - _pal_count_dirty = 255; + _pal_count_dirty = 256; } #define EXTR(p, q) (((uint16)(_palette_animation_counter * (p)) * (q)) >> 16) @@ -1147,11 +1147,9 @@ SwitchAnimatedCursor(); } -bool ChangeResInGame(int w, int h) +bool ChangeResInGame(int width, int height) { - return - (_screen.width == w && _screen.height == h) || - _video_driver->ChangeResolution(w, h); + return (_screen.width == width && _screen.height == height) || _video_driver->ChangeResolution(width, height); } void ToggleFullScreen(bool fs) diff -r 31fcaa5375a1 -r e72987579514 src/gfx.h --- a/src/gfx.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/gfx.h Fri Aug 03 22:09:42 2007 +0000 @@ -71,7 +71,7 @@ WKC_F11 = 43, WKC_F12 = 44, - /* backquote is the key left of "1" + /* Backquote is the key left of "1" * we only store this key here, no matter what character is really mapped to it * on a particular keyboard. (US keyboard: ` and ~ ; German keyboard: ^ and °) */ WKC_BACKQUOTE = 45, @@ -80,6 +80,21 @@ /* 0-9 are mapped to 48-57 * A-Z are mapped to 65-90 * a-z are mapped to 97-122 */ + + /* Other keys, corresponding to their ascii values */ + WKC_SLASH = 47, ///< / Forward slash + WKC_SEMICOLON = 59, ///< ; Semicolon + WKC_EQUALS = 61, ///< = Equals + WKC_L_BRACKET = 91, ///< [ Left square bracket + WKC_BACKSLASH = 92, ///< \ Backslash + WKC_R_BRACKET = 93, ///< ] Right square bracket + + /* Other keys of which their ascii value is already taken + * - use unused ascii value not present on keyboard directly */ + WKC_SINGLEQUOTE = 58, ///< ' Single quote + WKC_COMMA = 60, ///< , Comma + WKC_PERIOD = 62, ///< . Period + WKC_MINUS = 95, ///< - Minus }; enum GameModes { @@ -95,7 +110,7 @@ typedef int32 CursorID; struct Point { - int x,y; + int x, y; }; struct Rect { diff -r 31fcaa5375a1 -r e72987579514 src/graph_gui.cpp --- a/src/graph_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/graph_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -309,7 +309,7 @@ }; static const WindowDesc _graph_legend_desc = { - WDP_AUTO, WDP_AUTO, 250, 114, + WDP_AUTO, WDP_AUTO, 250, 114, 250, 114, WC_GRAPH_LEGEND, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _graph_legend_widgets, @@ -407,7 +407,7 @@ }; static const WindowDesc _operating_profit_desc = { - WDP_AUTO, WDP_AUTO, 576, 174, + WDP_AUTO, WDP_AUTO, 576, 174, 576, 174, WC_OPERATING_PROFIT, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _operating_profit_widgets, @@ -476,7 +476,7 @@ }; static const WindowDesc _income_graph_desc = { - WDP_AUTO, WDP_AUTO, 576, 142, + WDP_AUTO, WDP_AUTO, 576, 142, 576, 142, WC_INCOME_GRAPH, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _income_graph_widgets, @@ -543,7 +543,7 @@ }; static const WindowDesc _delivered_cargo_graph_desc = { - WDP_AUTO, WDP_AUTO, 576, 142, + WDP_AUTO, WDP_AUTO, 576, 142, 576, 142, WC_DELIVERED_CARGO, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _delivered_cargo_graph_widgets, @@ -612,7 +612,7 @@ }; static const WindowDesc _performance_history_desc = { - WDP_AUTO, WDP_AUTO, 576, 238, + WDP_AUTO, WDP_AUTO, 576, 238, 576, 238, WC_PERFORMANCE_HISTORY, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _performance_history_widgets, @@ -679,7 +679,7 @@ }; static const WindowDesc _company_value_graph_desc = { - WDP_AUTO, WDP_AUTO, 576, 238, + WDP_AUTO, WDP_AUTO, 576, 238, 576, 238, WC_COMPANY_VALUE, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _company_value_graph_widgets, @@ -776,7 +776,7 @@ }; static const WindowDesc _cargo_payment_rates_desc = { - WDP_AUTO, WDP_AUTO, 568, 46, + WDP_AUTO, WDP_AUTO, 568, 46, 568, 46, WC_PAYMENT_RATES, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _cargo_payment_rates_widgets, @@ -898,7 +898,7 @@ }; static const WindowDesc _company_league_desc = { - WDP_AUTO, WDP_AUTO, 400, 97, + WDP_AUTO, WDP_AUTO, 400, 97, 400, 97, WC_COMPANY_LEAGUE, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON, _company_league_widgets, @@ -1137,7 +1137,7 @@ }; static const WindowDesc _performance_rating_detail_desc = { - WDP_AUTO, WDP_AUTO, 299, 228, + WDP_AUTO, WDP_AUTO, 299, 228, 299, 228, WC_PERFORMANCE_DETAIL, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _performance_rating_detail_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/group.h --- a/src/group.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/group.h Fri Aug 03 22:09:42 2007 +0000 @@ -13,40 +13,31 @@ INVALID_GROUP = 0xFFFF, }; -struct Group { +struct Group; +DECLARE_OLD_POOL(Group, Group, 5, 2047) + +struct Group : PoolItem { StringID string_id; ///< Group Name uint16 num_vehicle; ///< Number of vehicles wich belong to the group PlayerID owner; ///< Group Owner - GroupID index; ///< Array index VehicleTypeByte vehicle_type; ///< Vehicle type of the group bool replace_protection; ///< If set to true, the global autoreplace have no effect on the group uint16 num_engines[TOTAL_NUM_ENGINES]; ///< Caches the number of engines of each type the player owns (no need to save this) + + Group(StringID str = STR_NULL); + virtual ~Group(); + + void QuickFree(); + + bool IsValid() const; }; -DECLARE_OLD_POOL(Group, Group, 5, 2047) - - -static inline bool IsValidGroup(const Group *g) -{ - return g->string_id != STR_NULL; -} - -static inline void DestroyGroup(Group *g) -{ - DeleteName(g->string_id); -} - -static inline void DeleteGroup(Group *g) -{ - DestroyGroup(g); - g->string_id = STR_NULL; -} static inline bool IsValidGroupID(GroupID index) { - return index < GetGroupPoolSize() && IsValidGroup(GetGroup(index)); + return index < GetGroupPoolSize() && GetGroup(index)->IsValid(); } static inline bool IsDefaultGroupID(GroupID index) @@ -64,7 +55,7 @@ return id_g == ALL_GROUP; } -#define FOR_ALL_GROUPS_FROM(g, start) for (g = GetGroup(start); g != NULL; g = (g->index + 1U < GetGroupPoolSize()) ? GetGroup(g->index + 1) : NULL) if (IsValidGroup(g)) +#define FOR_ALL_GROUPS_FROM(g, start) for (g = GetGroup(start); g != NULL; g = (g->index + 1U < GetGroupPoolSize()) ? GetGroup(g->index + 1) : NULL) if (g->IsValid()) #define FOR_ALL_GROUPS(g) FOR_ALL_GROUPS_FROM(g, 0) /** diff -r 31fcaa5375a1 -r e72987579514 src/group_cmd.cpp --- a/src/group_cmd.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/group_cmd.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -19,6 +19,7 @@ #include "window.h" #include "vehicle_gui.h" #include "strings.h" +#include "misc/autoptr.hpp" /** * Update the num engines of a groupID. Decrease the old one and increase the new one @@ -39,41 +40,34 @@ } -/** - * Called if a new block is added to the group-pool - */ -static void GroupPoolNewBlock(uint start_item) +DEFINE_OLD_POOL_GENERIC(Group, Group) + + +Group::Group(StringID str) { - /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. - * TODO - This is just a temporary stage, this will be removed. */ - for (Group *g = GetGroup(start_item); g != NULL; g = (g->index + 1U < GetGroupPoolSize()) ? GetGroup(g->index + 1) : NULL) g->index = start_item++; + this->string_id = str; } -DEFINE_OLD_POOL(Group, Group, GroupPoolNewBlock, NULL) - -static Group *AllocateGroup(void) +Group::~Group() { - /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. - * TODO - This is just a temporary stage, this will be removed. */ - for (Group *g = GetGroup(0); g != NULL; g = (g->index + 1U < GetGroupPoolSize()) ? GetGroup(g->index + 1) : NULL) { - if (!IsValidGroup(g)) { - const GroupID index = g->index; + this->QuickFree(); + this->string_id = STR_NULL; +} - memset(g, 0, sizeof(*g)); - g->index = index; +void Group::QuickFree() +{ + DeleteName(this->string_id); +} - return g; - } - } - - /* Check if we can add a block to the pool */ - return (AddBlockToPool(&_Group_pool)) ? AllocateGroup() : NULL; +bool Group::IsValid() const +{ + return this->string_id != STR_NULL; } void InitializeGroup(void) { - CleanPool(&_Group_pool); - AddBlockToPool(&_Group_pool); + _Group_pool.CleanPool(); + _Group_pool.AddBlockToPool(); } @@ -100,16 +94,21 @@ VehicleType vt = (VehicleType)p1; if (!IsPlayerBuildableVehicleType(vt)) return CMD_ERROR; - Group *g = AllocateGroup(); + AutoPtrT g_auto_delete; + + Group *g = new Group(STR_EMPTY); if (g == NULL) return CMD_ERROR; + g_auto_delete = g; + if (flags & DC_EXEC) { g->owner = _current_player; - g->string_id = STR_EMPTY; g->replace_protection = false; g->vehicle_type = vt; InvalidateWindowData(GetWCForVT(vt), (vt << 11) | VLW_GROUP_LIST | _current_player); + + g_auto_delete.Detach(); } return CommandCost(); @@ -153,7 +152,7 @@ /* Delete the Replace Vehicle Windows */ DeleteWindowById(WC_REPLACE_VEHICLE, g->vehicle_type); - DeleteGroup(g); + delete g; InvalidateWindowData(GetWCForVT(vt), (vt << 11) | VLW_GROUP_LIST | _current_player); } @@ -359,7 +358,7 @@ */ void RemoveVehicleFromGroup(const Vehicle *v) { - if (!IsValidVehicle(v) || !(v->HasFront() && v->IsPrimaryVehicle())) return; + if (!v->IsValid() || !(v->HasFront() && v->IsPrimaryVehicle())) return; if (!IsDefaultGroupID(v->group_id)) DecreaseGroupNumVehicle(v->group_id); } @@ -375,7 +374,7 @@ { if (!IsValidGroupID(new_g) && !IsDefaultGroupID(new_g)) return; - assert(IsValidVehicle(v) && v->type == VEH_TRAIN && IsFrontEngine(v)); + assert(v->IsValid() && v->type == VEH_TRAIN && IsFrontEngine(v)); for (Vehicle *u = v; u != NULL; u = u->next) { if (IsEngineCountable(u)) UpdateNumEngineGroup(u->engine_type, u->group_id, new_g); @@ -397,7 +396,7 @@ */ void UpdateTrainGroupID(Vehicle *v) { - assert(IsValidVehicle(v) && v->type == VEH_TRAIN && (IsFrontEngine(v) || IsFreeWagon(v))); + assert(v->IsValid() && v->type == VEH_TRAIN && (IsFrontEngine(v) || IsFreeWagon(v))); GroupID new_g = IsFrontEngine(v) ? v->group_id : (GroupID)DEFAULT_GROUP; for (Vehicle *u = v; u != NULL; u = u->next) { @@ -416,7 +415,7 @@ Group *g; FOR_ALL_GROUPS(g) { - if (p->index == g->owner) DeleteGroup(g); + if (p->index == g->owner) delete g; } } @@ -447,11 +446,7 @@ int index; while ((index = SlIterateArray()) != -1) { - if (!AddBlockIfNeeded(&_Group_pool, index)) { - error("Groups: failed loading savegame: too many groups"); - } - - Group *g = GetGroup(index); + Group *g = new (index) Group(); SlObject(g, _group_desc); } } diff -r 31fcaa5375a1 -r e72987579514 src/group_gui.cpp --- a/src/group_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/group_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -139,32 +139,32 @@ static const Widget _group_widgets[] = { { WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, -{ WWT_CAPTION, RESIZE_RIGHT, 14, 11, 513, 0, 13, 0x0, STR_018C_WINDOW_TITLE_DRAG_THIS}, -{ WWT_STICKYBOX, RESIZE_LR, 14, 514, 525, 0, 13, 0x0, STR_STICKY_BUTTON}, +{ WWT_CAPTION, RESIZE_RIGHT, 14, 11, 447, 0, 13, 0x0, STR_018C_WINDOW_TITLE_DRAG_THIS}, +{ WWT_STICKYBOX, RESIZE_LR, 14, 448, 459, 0, 13, 0x0, STR_STICKY_BUTTON}, { WWT_PANEL, RESIZE_NONE, 14, 0, 200, 14, 25, 0x0, STR_NULL}, { WWT_PANEL, RESIZE_NONE, 14, 0, 200, 26, 38, 0x0, STR_NULL}, { WWT_PANEL, RESIZE_NONE, 14, 0, 200, 39, 52, 0x0, STR_NULL}, -{ WWT_MATRIX, RESIZE_BOTTOM, 14, 0, 188, 52, 220, 0x701, STR_GROUPS_CLICK_ON_GROUP_FOR_TIP}, -{ WWT_SCROLLBAR, RESIZE_BOTTOM, 14, 189, 200, 26, 220, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, +{ WWT_MATRIX, RESIZE_BOTTOM, 14, 0, 188, 52, 168, 0x701, STR_GROUPS_CLICK_ON_GROUP_FOR_TIP}, +{ WWT_SCROLLBAR, RESIZE_BOTTOM, 14, 189, 200, 26, 168, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, { WWT_PUSHTXTBTN, RESIZE_NONE, 14, 201, 281, 14, 25, STR_SORT_BY, STR_SORT_ORDER_TIP}, { WWT_PANEL, RESIZE_NONE, 14, 282, 435, 14, 25, 0x0, STR_SORT_CRITERIA_TIP}, { WWT_TEXTBTN, RESIZE_NONE, 14, 436, 447, 14, 25, STR_0225, STR_SORT_CRITERIA_TIP}, -{ WWT_PANEL, RESIZE_RIGHT, 14, 448, 525, 14, 25, 0x0, STR_NULL}, -{ WWT_MATRIX, RESIZE_RB, 14, 201, 513, 26, 233, 0x701, STR_NULL}, -{ WWT_SCROLL2BAR, RESIZE_LRB, 14, 514, 525, 26, 233, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, -{ WWT_PUSHIMGBTN, RESIZE_TB, 14, 0, 23, 221, 245, 0x0, STR_GROUP_CREATE_TIP}, -{ WWT_PUSHIMGBTN, RESIZE_TB, 14, 24, 47, 221, 245, 0x0, STR_GROUP_DELETE_TIP}, -{ WWT_PUSHIMGBTN, RESIZE_TB, 14, 48, 71, 221, 245, 0x0, STR_GROUP_RENAME_TIP}, -{ WWT_PANEL, RESIZE_TB, 14, 72, 164, 221, 245, 0x0, STR_NULL}, -{ WWT_PUSHIMGBTN, RESIZE_TB, 14, 165, 188, 221, 245, 0x0, STR_GROUP_REPLACE_PROTECTION_TIP}, -{ WWT_PANEL, RESIZE_TB, 14, 189, 200, 221, 245, 0x0, STR_NULL}, -{ WWT_PUSHTXTBTN, RESIZE_TB, 14, 201, 306, 234, 245, 0x0, STR_AVAILABLE_ENGINES_TIP}, -{ WWT_TEXTBTN, RESIZE_TB, 14, 307, 411, 234, 245, STR_MANAGE_LIST, STR_MANAGE_LIST_TIP}, -{ WWT_TEXTBTN, RESIZE_TB, 14, 412, 423, 234, 245, STR_0225, STR_MANAGE_LIST_TIP}, -{ WWT_PUSHIMGBTN, RESIZE_TB, 14, 424, 435, 234, 245, SPR_FLAG_VEH_STOPPED, STR_MASS_STOP_LIST_TIP}, -{ WWT_PUSHIMGBTN, RESIZE_TB, 14, 436, 447, 234, 245, SPR_FLAG_VEH_RUNNING, STR_MASS_START_LIST_TIP}, -{ WWT_PANEL, RESIZE_RTB, 14, 448, 513, 234, 245, 0x0, STR_NULL}, -{ WWT_RESIZEBOX, RESIZE_LRTB, 14, 514, 525, 234, 245, 0x0, STR_RESIZE_BUTTON}, +{ WWT_PANEL, RESIZE_RIGHT, 14, 448, 459, 14, 25, 0x0, STR_NULL}, +{ WWT_MATRIX, RESIZE_RB, 14, 201, 447, 26, 181, 0x701, STR_NULL}, +{ WWT_SCROLL2BAR, RESIZE_LRB, 14, 448, 459, 26, 181, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, +{ WWT_PUSHIMGBTN, RESIZE_TB, 14, 0, 23, 169, 193, 0x0, STR_GROUP_CREATE_TIP}, +{ WWT_PUSHIMGBTN, RESIZE_TB, 14, 24, 47, 169, 193, 0x0, STR_GROUP_DELETE_TIP}, +{ WWT_PUSHIMGBTN, RESIZE_TB, 14, 48, 71, 169, 193, 0x0, STR_GROUP_RENAME_TIP}, +{ WWT_PANEL, RESIZE_TB, 14, 72, 164, 169, 193, 0x0, STR_NULL}, +{ WWT_PUSHIMGBTN, RESIZE_TB, 14, 165, 188, 169, 193, 0x0, STR_GROUP_REPLACE_PROTECTION_TIP}, +{ WWT_PANEL, RESIZE_TB, 14, 189, 200, 169, 193, 0x0, STR_NULL}, +{ WWT_PUSHTXTBTN, RESIZE_TB, 14, 201, 306, 182, 193, 0x0, STR_AVAILABLE_ENGINES_TIP}, +{ WWT_TEXTBTN, RESIZE_TB, 14, 307, 411, 182, 193, STR_MANAGE_LIST, STR_MANAGE_LIST_TIP}, +{ WWT_TEXTBTN, RESIZE_TB, 14, 412, 423, 182, 193, STR_0225, STR_MANAGE_LIST_TIP}, +{ WWT_PUSHIMGBTN, RESIZE_TB, 14, 424, 435, 182, 193, SPR_FLAG_VEH_STOPPED, STR_MASS_STOP_LIST_TIP}, +{ WWT_PUSHIMGBTN, RESIZE_TB, 14, 436, 447, 182, 193, SPR_FLAG_VEH_RUNNING, STR_MASS_START_LIST_TIP}, +{ WWT_PANEL, RESIZE_RTB, 14, 448, 447, 182, 193, 0x0, STR_NULL}, +{ WWT_RESIZEBOX, RESIZE_LRTB, 14, 448, 459, 182, 193, 0x0, STR_RESIZE_BUTTON}, { WIDGETS_END}, }; @@ -176,15 +176,15 @@ grouplist_d *gl = &WP(w, groupveh_d).gl; w->caption_color = owner; - w->hscroll.cap = 10 * 29; + w->hscroll.cap = 224; w->resize.step_width = 1; switch (gv->vehicle_type) { default: NOT_REACHED(); case VEH_TRAIN: case VEH_ROAD: - w->vscroll.cap = 13; - w->vscroll2.cap = 8; + w->vscroll.cap = 9; + w->vscroll2.cap = 6; w->resize.step_height = PLY_WND_PRC__SIZE_OF_ROW_SMALL; break; case VEH_SHIP: @@ -557,7 +557,7 @@ gv->vehicle_sel = v->index; - if (IsValidVehicle(v)) { + if (v->IsValid()) { SetObjectToPlaceWnd(v->GetImage(DIR_W), GetVehiclePalette(v), 4, w); } @@ -771,7 +771,7 @@ static const WindowDesc _group_desc = { - WDP_AUTO, WDP_AUTO, 526, 246, + WDP_AUTO, WDP_AUTO, 460, 194, 526, 246, WC_TRAINS_LIST, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE, _group_widgets, @@ -796,23 +796,4 @@ if (w == NULL) return; w->window_class = wc; - - switch (vehicle_type) { - default: NOT_REACHED(); - case VEH_ROAD: - ResizeWindow(w, -66, 0); - /* FALL THROUGH */ - case VEH_TRAIN: - w->resize.height = w->height - (PLY_WND_PRC__SIZE_OF_ROW_SMALL * 4); // Minimum of 4 vehicles - break; - - case VEH_SHIP: - case VEH_AIRCRAFT: - ResizeWindow(w, -66, -52); - w->resize.height = w->height; // Minimum of 4 vehicles - break; - } - - /* Set the minimum window size to the current window size */ - w->resize.width = w->width; } diff -r 31fcaa5375a1 -r e72987579514 src/industry.h --- a/src/industry.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/industry.h Fri Aug 03 22:09:42 2007 +0000 @@ -20,6 +20,7 @@ INVALID_INDUSTRYTYPE = NUM_INDUSTRYTYPES, ///< one above amount is considered invalid NUM_INDUSTRYTILES = NEW_INDUSTRYTILEOFFSET, ///< total number of industry tiles, new and old INVALID_INDUSTRYTILE = NUM_INDUSTRYTILES, ///< one above amount is considered invalid + INDUSTRY_COMPLETED = 3, ///< final stage of industry construction. }; enum { @@ -85,10 +86,13 @@ DECLARE_ENUM_AS_BIT_SET(IndustyBehaviour); +struct Industry; +DECLARE_OLD_POOL(Industry, Industry, 3, 8000) + /** * Defines the internal data of a functionnal industry */ -struct Industry { +struct Industry : PoolItem { TileIndex xy; ///< coordinates of the primary tile the industry is built one byte width; byte height; @@ -104,18 +108,21 @@ uint16 last_month_transported[2]; ///< total units transported per cargo in the last full month uint16 counter; ///< used for animation and/or production (if available cargo) - IndustryType type; ///< type of industry. see IT_COAL_MINE and others + IndustryType type; ///< type of industry. OwnerByte owner; ///< owner of the industry. Which SHOULD always be (imho) OWNER_NONE byte random_color; ///< randomized colour of the industry, for display purpose Year last_prod_year; ///< last year of production byte was_cargo_delivered; ///< flag that indicate this has been the closest industry chosen for cargo delivery by a station. see DeliverGoodsToIndustry - IndustryID index; ///< index of the industry in the pool of industries - OwnerByte founder; ///< Founder of the industry Date construction_date; ///< Date of the construction of the industry uint8 construction_type; ///< Way the industry was constructed (@see IndustryConstructionType) Date last_cargo_accepted_at; ///< Last day cargo was accepted by this industry + + Industry(TileIndex tile = 0) : xy(tile) {} + ~Industry(); + + bool IsValid() const { return this->xy != 0; } }; struct IndustryTileTable { @@ -204,7 +211,7 @@ /* industry_cmd.cpp*/ const IndustrySpec *GetIndustrySpec(IndustryType thistype); ///< Array of industries data -const IndustryTileSpec *GetIndustryTileSpec(IndustryGfx gfx); ///< Array of industry tiles data +const IndustryTileSpec *GetIndustryTileSpec(IndustryGfx gfx, bool full_check = true); ///< Array of industry tiles data void ResetIndustries(); void PlantRandomFarmField(const Industry *i); @@ -215,18 +222,6 @@ /* smallmap_gui.cpp */ void BuildIndustriesLegend(); -DECLARE_OLD_POOL(Industry, Industry, 3, 8000) - -/** - * Check if an Industry really exists. - * @param industry to check - * @return true if position is a valid one - */ -static inline bool IsValidIndustry(const Industry *industry) -{ - return industry->xy != 0; -} - /** * Check if an Industry exists whithin the pool of industries * @param index of the desired industry @@ -234,7 +229,7 @@ */ static inline bool IsValidIndustryID(IndustryID index) { - return index < GetIndustryPoolSize() && IsValidIndustry(GetIndustry(index)); + return index < GetIndustryPoolSize() && GetIndustry(index)->IsValid(); } @@ -317,60 +312,12 @@ return GetIndustry(index); } -void DestroyIndustry(Industry *i); - -static inline void DeleteIndustry(Industry *i) -{ - DestroyIndustry(i); - i->xy = 0; -} - -#define FOR_ALL_INDUSTRIES_FROM(i, start) for (i = GetIndustry(start); i != NULL; i = (i->index + 1U < GetIndustryPoolSize()) ? GetIndustry(i->index + 1U) : NULL) if (IsValidIndustry(i)) +#define FOR_ALL_INDUSTRIES_FROM(i, start) for (i = GetIndustry(start); i != NULL; i = (i->index + 1U < GetIndustryPoolSize()) ? GetIndustry(i->index + 1U) : NULL) if (i->IsValid()) #define FOR_ALL_INDUSTRIES(i) FOR_ALL_INDUSTRIES_FROM(i, 0) extern const Industry **_industry_sort; extern bool _industry_sort_dirty; -enum { - IT_COAL_MINE = 0, - IT_POWER_STATION = 1, - IT_SAWMILL = 2, - IT_FOREST = 3, - IT_OIL_REFINERY = 4, - IT_OIL_RIG = 5, - IT_FACTORY = 6, - IT_PRINTING_WORKS = 7, - IT_STEEL_MILL = 8, - IT_FARM = 9, - IT_COPPER_MINE = 10, - IT_OIL_WELL = 11, - IT_BANK_TEMP = 12, - IT_FOOD_PROCESS = 13, - IT_PAPER_MILL = 14, - IT_GOLD_MINE = 15, - IT_BANK_TROPIC_ARCTIC = 16, - IT_DIAMOND_MINE = 17, - IT_IRON_MINE = 18, - IT_FRUIT_PLANTATION = 19, - IT_RUBBER_PLANTATION = 20, - IT_WATER_SUPPLY = 21, - IT_WATER_TOWER = 22, - IT_FACTORY_2 = 23, - IT_FARM_2 = 24, - IT_LUMBER_MILL = 25, - IT_COTTON_CANDY = 26, - IT_CANDY_FACTORY = 27, - IT_BATTERY_FARM = 28, - IT_COLA_WELLS = 29, - IT_TOY_SHOP = 30, - IT_TOY_FACTORY = 31, - IT_PLASTIC_FOUNTAINS = 32, - IT_FIZZY_DRINK_FACTORY = 33, - IT_BUBBLE_GENERATOR = 34, - IT_TOFFEE_QUARRY = 35, - IT_SUGAR_MINE = 36, - IT_END, - IT_INVALID = 255, -}; +static const uint8 IT_INVALID = 255; #endif /* INDUSTRY_H */ diff -r 31fcaa5375a1 -r e72987579514 src/industry_cmd.cpp --- a/src/industry_cmd.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/industry_cmd.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -31,9 +31,11 @@ #include "water_map.h" #include "tree_map.h" #include "cargotype.h" +#include "newgrf_commons.h" #include "newgrf_industries.h" #include "newgrf_industrytiles.h" #include "newgrf_callbacks.h" +#include "misc/autoptr.hpp" void ShowIndustryViewWindow(int industry); void BuildOilRig(TileIndex tile); @@ -74,19 +76,7 @@ _industry_specs[type].appear_creation[_opt.landscape] = 0; } -/** - * Called if a new block is added to the industry-pool - */ -static void IndustryPoolNewBlock(uint start_item) -{ - Industry *i; - - /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. - * TODO - This is just a temporary stage, this will be removed. */ - for (i = GetIndustry(start_item); i != NULL; i = (i->index + 1U < GetIndustryPoolSize()) ? GetIndustry(i->index + 1U) : NULL) i->index = start_item++; -} - -DEFINE_OLD_POOL(Industry, Industry, IndustryPoolNewBlock, NULL) +DEFINE_OLD_POOL_GENERIC(Industry, Industry) /** * Retrieve the type for this industry. Although it is accessed by a tile, @@ -101,7 +91,7 @@ assert(IsTileType(tile, MP_INDUSTRY)); const Industry *ind = GetIndustryByTile(tile); - return IsValidIndustry(ind) ? ind->type : (IndustryType)IT_INVALID; + return ind->IsValid() ? ind->type : (IndustryType)IT_INVALID; } /** @@ -123,44 +113,58 @@ * This will ensure at once : proper access and * not allowing modifications of it. * @param gfx of industrytile (which is the index in _industry_tile_specs) + * @param full_check (default to true) verify if an override is available. + * If so, use it instead of the gfx provided. * @pre gfx < INVALID_INDUSTRYTILE * @return a pointer to the corresponding industrytile spec **/ -const IndustryTileSpec *GetIndustryTileSpec(IndustryGfx gfx) +const IndustryTileSpec *GetIndustryTileSpec(IndustryGfx gfx, bool full_check) { assert(gfx < INVALID_INDUSTRYTILE); - return &_industry_tile_specs[gfx]; + const IndustryTileSpec *its = &_industry_tile_specs[gfx]; + if (full_check && its->grf_prop.override != INVALID_INDUSTRYTILE) { + its = &_industry_tile_specs[its->grf_prop.override]; + } + return its; } -void DestroyIndustry(Industry *i) +Industry::~Industry() { - BEGIN_TILE_LOOP(tile_cur, i->width, i->height, i->xy); + /* Industry can also be destroyed when not fully initialized. + * This means that we do not have to clear tiles either. */ + if (this->width == 0) { + this->xy = 0; + return; + } + + BEGIN_TILE_LOOP(tile_cur, this->width, this->height, this->xy); if (IsTileType(tile_cur, MP_INDUSTRY)) { - if (GetIndustryIndex(tile_cur) == i->index) { + if (GetIndustryIndex(tile_cur) == this->index) { DoClearSquare(tile_cur); } } else if (IsTileType(tile_cur, MP_STATION) && IsOilRig(tile_cur)) { DeleteOilRig(tile_cur); } - END_TILE_LOOP(tile_cur, i->width, i->height, i->xy); + END_TILE_LOOP(tile_cur, this->width, this->height, this->xy); - if (GetIndustrySpec(i->type)->behaviour & INDUSTRYBEH_PLANT_FIELDS) { + if (GetIndustrySpec(this->type)->behaviour & INDUSTRYBEH_PLANT_FIELDS) { /* Remove the farmland and convert it to regular tiles over time. */ - BEGIN_TILE_LOOP(tile_cur, 42, 42, i->xy - TileDiffXY(21, 21)) { + BEGIN_TILE_LOOP(tile_cur, 42, 42, this->xy - TileDiffXY(21, 21)) { tile_cur = TILE_MASK(tile_cur); if (IsTileType(tile_cur, MP_CLEAR) && IsClearGround(tile_cur, CLEAR_FIELDS) && - GetIndustryIndexOfField(tile_cur) == i->index) { + GetIndustryIndexOfField(tile_cur) == this->index) { SetIndustryIndexOfField(tile_cur, INVALID_INDUSTRY); } - } END_TILE_LOOP(tile_cur, 42, 42, i->xy - TileDiff(21, 21)) + } END_TILE_LOOP(tile_cur, 42, 42, this->xy - TileDiff(21, 21)) } _industry_sort_dirty = true; - DecIndustryTypeCount(i->type); + DecIndustryTypeCount(this->type); - DeleteSubsidyWithIndustry(i->index); - DeleteWindowById(WC_INDUSTRY_VIEW, i->index); + DeleteSubsidyWithIndustry(this->index); + DeleteWindowById(WC_INDUSTRY_VIEW, this->index); InvalidateWindow(WC_INDUSTRY_DIRECTORY, 0); + this->xy = 0; } static void IndustryDrawSugarMine(const TileInfo *ti) @@ -254,7 +258,6 @@ Industry *ind = GetIndustryByTile(ti->tile); const IndustryTileSpec *indts = GetIndustryTileSpec(gfx); const DrawBuildingsTileStruct *dits; - byte z; SpriteID image; SpriteID pal; @@ -276,7 +279,7 @@ } dits = &_industry_draw_tile_data[gfx << 2 | (indts->anim_state ? - GetIndustryAnimationState(ti->tile) & 3 : + GetIndustryAnimationState(ti->tile) & INDUSTRY_COMPLETED : GetIndustryConstructionStage(ti->tile))]; image = dits->ground.sprite; @@ -286,34 +289,23 @@ pal = dits->ground.pal; } - z = ti->z; - /* Add bricks below the industry? */ - if (ti->tileh != SLOPE_FLAT) { - DrawFoundation(ti, ti->tileh); - z += TILE_HEIGHT; - } + /* DrawFoundation() modifes ti->z and ti->tileh */ + if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, FOUNDATION_LEVELED); DrawGroundSprite(image, pal); /* Add industry on top of the ground? */ image = dits->building.sprite; if (image != 0) { - if (HASBIT(_transparent_opt, TO_INDUSTRIES)) { - SETBIT(image, PALETTE_MODIFIER_TRANSPARENT); - pal = PALETTE_TO_TRANSPARENT; - } else if (HASBIT(image, PALETTE_MODIFIER_COLOR) && dits->building.pal == PAL_NONE) { - pal = GENERAL_SPRITE_COLOR(ind->random_color); - } else { - pal = dits->building.pal; - } - - AddSortableSpriteToDraw(image, pal, + AddSortableSpriteToDraw(image, + (HASBIT(image, PALETTE_MODIFIER_COLOR) && dits->building.pal == PAL_NONE) ? GENERAL_SPRITE_COLOR(ind->random_color) : dits->building.pal, ti->x + dits->subtile_x, ti->y + dits->subtile_y, dits->width + 1, dits->height + 1, dits->dz, - z); + ti->z, + HASBIT(_transparent_opt, TO_INDUSTRIES)); if (HASBIT(_transparent_opt, TO_INDUSTRIES)) return; } @@ -329,9 +321,9 @@ return GetTileMaxZ(tile); } -static Slope GetSlopeTileh_Industry(TileIndex tile, Slope tileh) +static Foundation GetFoundation_Industry(TileIndex tile, Slope tileh) { - return SLOPE_FLAT; + return FlatteningFoundation(tileh); } static void GetAcceptedCargo_Industry(TileIndex tile, AcceptedCargo ac) @@ -398,7 +390,7 @@ return_cmd_error(STR_4800_IN_THE_WAY); } - if (flags & DC_EXEC) DeleteIndustry(i); + if (flags & DC_EXEC) delete i; return CommandCost(); } @@ -642,9 +634,7 @@ SetIndustryConstructionCounter(tile, 0); SetIndustryConstructionStage(tile, stage); StartStopIndustryTileAnimation(tile, IAT_CONSTRUCTION_STATE_CHANGE); - if (stage == 3) { - SetIndustryCompleted(tile, true); - } + if (stage == INDUSTRY_COMPLETED) SetIndustryCompleted(tile, true); MarkTileDirtyByTile(tile); @@ -704,7 +694,7 @@ EV_BUBBLE ); - if (v != NULL) v->u.special.unk2 = dir; + if (v != NULL) v->u.special.animation_substate = dir; } static void TileLoop_Industry(TileIndex tile) @@ -1404,27 +1394,6 @@ return true; } -static Industry *AllocateIndustry() -{ - Industry *i; - - /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. - * TODO - This is just a temporary stage, this will be removed. */ - for (i = GetIndustry(0); i != NULL; i = (i->index + 1U < GetIndustryPoolSize()) ? GetIndustry(i->index + 1U) : NULL) { - IndustryID index = i->index; - - if (IsValidIndustry(i)) continue; - - memset(i, 0, sizeof(*i)); - i->index = index; - - return i; - } - - /* Check if we can add a block to the pool */ - return AddBlockToPool(&_Industry_pool) ? AllocateIndustry() : NULL; -} - static void DoCreateNewIndustry(Industry *i, TileIndex tile, int type, const IndustryTileTable *it, const Town *t, Owner owner) { const IndustrySpec *indspec = GetIndustrySpec(type); @@ -1537,12 +1506,14 @@ if (!CheckIfIndustryIsAllowed(tile, type, t)) return NULL; if (!CheckSuitableIndustryPos(tile)) return NULL; - Industry *i = AllocateIndustry(); + Industry *i = new Industry(tile); if (i == NULL) return NULL; + AutoPtrT i_auto_delete = i; if (flags & DC_EXEC) { if (!custom_shape_check) CheckIfCanLevelIndustryPlatform(tile, DC_EXEC, it, type); DoCreateNewIndustry(i, tile, type, it, t, OWNER_NONE); + i_auto_delete.Detach(); } return i; @@ -1619,7 +1590,12 @@ return CreateNewIndustryHelper(tile, type, DC_EXEC, indspec, RandomRange(indspec->num_table)); } -static const byte _numof_industry_table[5][11] = { +enum { + NB_NUMOFINDUSTRY = 11, + NB_DIFFICULTY_LEVEL = 5, +}; + +static const byte _numof_industry_table[NB_DIFFICULTY_LEVEL][NB_NUMOFINDUSTRY] = { /* difficulty settings for number of industries */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //none {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, //very low @@ -1634,7 +1610,9 @@ * @param amount of industries that need to be built */ static void PlaceInitialIndustry(IndustryType type, int amount) { - int num = _numof_industry_table[_opt.diff.number_industries][amount]; + /* We need to bypass the amount given in parameter if it exceeds the maximum dimension of the + * _numof_industry_table. newgrf can specify a big amount */ + int num = (amount > NB_NUMOFINDUSTRY) ? amount : _numof_industry_table[_opt.diff.number_industries][amount]; const IndustrySpec *ind_spc = GetIndustrySpec(type); /* These are always placed next to the coastline, so we scale by the perimeter instead. */ @@ -1670,7 +1648,7 @@ /* Find the total amount of industries */ if (_opt.diff.number_industries > 0) { - for (it = IT_COAL_MINE; it < NUM_INDUSTRYTYPES; it++) { + for (it = 0; it < NUM_INDUSTRYTYPES; it++) { ind_spc = GetIndustrySpec(it); @@ -1683,7 +1661,7 @@ /* once the chance of appearance is determind, it have to be scaled by * the difficulty level. The "chance" in question is more an index into * the _numof_industry_table,in fact */ - int num = (chance < 11) ? chance : _numof_industry_table[_opt.diff.number_industries][chance]; + int num = (chance > NB_NUMOFINDUSTRY) ? chance : _numof_industry_table[_opt.diff.number_industries][chance]; /* These are always placed next to the coastline, so we scale by the perimeter instead. */ num = (ind_spc->check_proc == CHECK_REFINERY || ind_spc->check_proc == CHECK_OIL_RIG) ? ScaleByMapSize1D(num) : ScaleByMapSize(num); @@ -1695,7 +1673,7 @@ SetGeneratingWorldProgress(GWP_INDUSTRY, i); if (_opt.diff.number_industries > 0) { - for (it = IT_COAL_MINE; it < NUM_INDUSTRYTYPES; it++) { + for (it = 0; it < NUM_INDUSTRYTYPES; it++) { /* Once the number of industries has been determined, let's really create them. * The test for chance allows us to try create industries that are available only * for this landscape. @@ -1808,7 +1786,7 @@ InvalidateWindow(WC_INDUSTRY_VIEW, i->index); if (i->prod_level == 0) { - DeleteIndustry(i); + delete i; } else if (_patches.smooth_economy) { ExtChangeIndustryProduction(i); } @@ -1965,8 +1943,8 @@ void InitializeIndustries() { - CleanPool(&_Industry_pool); - AddBlockToPool(&_Industry_pool); + _Industry_pool.CleanPool(); + _Industry_pool.AddBlockToPool(); ResetIndustryCounts(); _industry_sort_dirty = true; @@ -2003,7 +1981,7 @@ ChangeTileOwner_Industry, /* change_tile_owner_proc */ GetProducedCargo_Industry, /* get_produced_cargo_proc */ NULL, /* vehicle_enter_tile_proc */ - GetSlopeTileh_Industry, /* get_slope_tileh_proc */ + GetFoundation_Industry, /* get_foundation_proc */ }; static const SaveLoad _industry_desc[] = { @@ -2055,6 +2033,37 @@ } } +/* Save and load the mapping between the industry/tile id on the map, and the grf file + * it came from. */ +static const SaveLoad _industries_id_mapping_desc[] = { + SLE_VAR(EntityIDMapping, grfid, SLE_UINT32), + SLE_VAR(EntityIDMapping, entity_id, SLE_UINT8), + SLE_VAR(EntityIDMapping, substitute_id, SLE_UINT8), + SLE_END() +}; + +static void Save_IIDS() +{ + uint i; + uint j = _industry_mngr.GetMaxMapping(); + + for (i = 0; i < j; i++) { + SlSetArrayIndex(i); + SlObject(&_industry_mngr.mapping_ID[i], _industries_id_mapping_desc); + } +} + +static void Save_TIDS() +{ + uint i; + uint j = _industile_mngr.GetMaxMapping(); + + for (i = 0; i < j; i++) { + SlSetArrayIndex(i); + SlObject(&_industile_mngr.mapping_ID[i], _industries_id_mapping_desc); + } +} + static void Load_INDY() { int index; @@ -2062,17 +2071,50 @@ ResetIndustryCounts(); while ((index = SlIterateArray()) != -1) { - Industry *i; - - if (!AddBlockIfNeeded(&_Industry_pool, index)) - error("Industries: failed loading savegame: too many industries"); - - i = GetIndustry(index); + Industry *i = new (index) Industry(); SlObject(i, _industry_desc); IncIndustryTypeCount(i->type); } } +static void Load_IIDS() +{ + int index; + uint max_id; + + /* clear the current mapping stored. + * This will create the manager if ever it is not yet done */ + _industry_mngr.ResetMapping(); + + /* get boundary for the temporary map loader NUM_INDUSTRYTYPES? */ + max_id = _industry_mngr.GetMaxMapping(); + + while ((index = SlIterateArray()) != -1) { + if ((uint)index >= max_id) break; + SlObject(&_industry_mngr.mapping_ID[index], _industries_id_mapping_desc); + } +} + +static void Load_TIDS() +{ + int index; + uint max_id; + + /* clear the current mapping stored. + * This will create the manager if ever it is not yet done */ + _industile_mngr.ResetMapping(); + + /* get boundary for the temporary map loader NUM_INDUSTILES? */ + max_id = _industile_mngr.GetMaxMapping(); + + while ((index = SlIterateArray()) != -1) { + if ((uint)index >= max_id) break; + SlObject(&_industile_mngr.mapping_ID[index], _industries_id_mapping_desc); + } +} + extern const ChunkHandler _industry_chunk_handlers[] = { - { 'INDY', Save_INDY, Load_INDY, CH_ARRAY | CH_LAST}, + { 'INDY', Save_INDY, Load_INDY, CH_ARRAY}, + { 'IIDS', Save_IIDS, Load_IIDS, CH_ARRAY}, + { 'TIDS', Save_TIDS, Load_TIDS, CH_ARRAY | CH_LAST}, }; diff -r 31fcaa5375a1 -r e72987579514 src/industry_gui.cpp --- a/src/industry_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/industry_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -114,7 +114,7 @@ /* We'll perform two distinct loops, one for secondary industries, and the other one for * primary ones. Each loop will fill the _fund_gui structure. */ - for (ind = IT_COAL_MINE; ind < NUM_INDUSTRYTYPES; ind++) { + for (ind = 0; ind < NUM_INDUSTRYTYPES; ind++) { indsp = GetIndustrySpec(ind); if (indsp->enabled && (!indsp->IsRawIndustry() || _game_mode == GM_EDITOR)) { _fund_gui.index[_fund_gui.count] = ind; @@ -124,7 +124,7 @@ } if (_patches.raw_industry_construction != 0 && _game_mode != GM_EDITOR) { - for (ind = IT_COAL_MINE; ind < NUM_INDUSTRYTYPES; ind++) { + for (ind = 0; ind < NUM_INDUSTRYTYPES; ind++) { indsp = GetIndustrySpec(ind); if (indsp->enabled && indsp->IsRawIndustry()) { _fund_gui.index[_fund_gui.count] = ind; @@ -153,9 +153,7 @@ * In Editor, you just build, while ingame, or you fund or you prospect */ if (_game_mode == GM_EDITOR) { /* We've chosen many random industries but no industries have been specified */ - if (indsp == NULL && _patches.raw_industry_construction == 0) { - _fund_gui.enabled[WP(w, fnd_d).index] = false; - } + if (indsp == NULL) _fund_gui.enabled[WP(w, fnd_d).index] = _opt.diff.number_industries != 0; w->widget[DYNA_INDU_FUND_WIDGET].data = STR_BUILD_NEW_INDUSTRY; } else { w->widget[DYNA_INDU_FUND_WIDGET].data = (_patches.raw_industry_construction == 2 && indsp->IsRawIndustry()) ? STR_PROSPECT_NEW_INDUSTRY : STR_FUND_NEW_INDUSTRY; @@ -365,7 +363,7 @@ }; static const WindowDesc _build_industry_dynamic_desc = { - WDP_AUTO, WDP_AUTO, 170, 212, + WDP_AUTO, WDP_AUTO, 170, 212, 170, 212, WC_BUILD_INDUSTRY, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE, _build_dynamic_industry_widgets, @@ -600,7 +598,7 @@ }; static const WindowDesc _industry_view_desc = { - WDP_AUTO, WDP_AUTO, 260, 160, + WDP_AUTO, WDP_AUTO, 260, 160, 260, 160, WC_INDUSTRY_VIEW, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON, _industry_view_widgets, @@ -857,7 +855,7 @@ /* Industry List */ static const WindowDesc _industry_directory_desc = { - WDP_AUTO, WDP_AUTO, 508, 190, + WDP_AUTO, WDP_AUTO, 508, 190, 508, 190, WC_INDUSTRY_DIRECTORY, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE, _industry_directory_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/industry_map.h --- a/src/industry_map.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/industry_map.h Fri Aug 03 22:09:42 2007 +0000 @@ -68,7 +68,7 @@ * @pre IsTileType(t, MP_INDUSTRY) * @return the industry */ -static inline Industry* GetIndustryByTile(TileIndex t) +static inline Industry *GetIndustryByTile(TileIndex t) { return GetIndustry(GetIndustryIndex(t)); } diff -r 31fcaa5375a1 -r e72987579514 src/intro_gui.cpp --- a/src/intro_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/intro_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -99,7 +99,7 @@ } static const WindowDesc _select_game_desc = { - WDP_CENTER, WDP_CENTER, 336, 195, + WDP_CENTER, WDP_CENTER, 336, 195, 336, 195, WC_SELECT_GAME, WC_NONE, WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _select_game_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/landscape.cpp --- a/src/landscape.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/landscape.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -56,13 +56,51 @@ 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 17, 0, 15, 18, 0, }; -const Slope _inclined_tileh[] = { - SLOPE_SW, SLOPE_NW, SLOPE_SW, SLOPE_SE, SLOPE_NE, SLOPE_SE, SLOPE_NE, SLOPE_NW, - SLOPE_E, SLOPE_N, SLOPE_W, SLOPE_S, - SLOPE_NWS, SLOPE_WSE, SLOPE_SEN, SLOPE_ENW -}; +SnowLine *_snow_line = NULL; -SnowLine *_snow_line = NULL; +/** + * Applys a foundation to a slope. + * + * @pre Foundation and slope must be valid combined. + * @param f The #Foundation. + * @param s The #Slope to modify. + * @return Increment to the tile Z coordinate. + */ +uint ApplyFoundationToSlope(Foundation f, Slope *s) +{ + + if (!IsFoundation(f)) return 0; + + if (IsLeveledFoundation(f)) { + *s = SLOPE_FLAT; + return TILE_HEIGHT; + } + + uint dz = IsSteepSlope(*s) ? TILE_HEIGHT : 0; + byte highest_corner = GetHighestSlopeCorner(*s); + + switch (f) { + case FOUNDATION_INCLINED_X: + *s = (highest_corner <= 1 ? SLOPE_SW : SLOPE_NE); + break; + + case FOUNDATION_INCLINED_Y: + *s = (((highest_corner == 1) || (highest_corner == 2)) ? SLOPE_SE : SLOPE_NW); + break; + + case FOUNDATION_STEEP_LOWER: + *s = (Slope) (1 << highest_corner); + break; + + case FOUNDATION_STEEP_HIGHER: + *s = (Slope) (*s & ~SLOPE_STEEP); + break; + + default: NOT_REACHED(); + } + return dz; +} + uint GetPartialZ(int x, int y, Slope corners) { @@ -152,7 +190,7 @@ break; case SLOPE_STEEP_E: - z = 1 + (((x ^ 0xF) + (y ^ 0xF)) >> 1); + z = 1 + (((x ^ 0xF) + y) >> 1); break; default: break; @@ -172,11 +210,9 @@ static Slope GetFoundationSlope(TileIndex tile, uint* z) { Slope tileh = GetTileSlope(tile, z); - Slope slope = _tile_type_procs[GetTileType(tile)]->get_slope_tileh_proc(tile, tileh); - - /* Flatter slope -> higher base height */ - if (slope < tileh) *z += TILE_HEIGHT; - return slope; + Foundation f = _tile_type_procs[GetTileType(tile)]->get_foundation_proc(tile, tileh); + *z += ApplyFoundationToSlope(f, &tileh); + return tileh; } @@ -212,34 +248,43 @@ } -void DrawFoundation(TileInfo *ti, uint f) +void DrawFoundation(TileInfo *ti, Foundation f) { - SpriteID sprite_base = SPR_SLOPES_BASE - 15; - Slope slope; + if (!IsFoundation(f)) return; + + SpriteID sprite_base = SPR_SLOPES_VIRTUAL_BASE; uint z; + Slope slope = GetFoundationSlope(ti->tile, &z); - slope = GetFoundationSlope(ti->tile, &z); - if (!HasFoundationNW(ti->tile, slope, z)) sprite_base += 22; - if (!HasFoundationNE(ti->tile, slope, z)) sprite_base += 44; + if (!HasFoundationNW(ti->tile, slope, z)) sprite_base += SPR_SLOPES_NO_FOUNDATION_NW_OFFSET; + if (!HasFoundationNE(ti->tile, slope, z)) sprite_base += SPR_SLOPES_NO_FOUNDATION_NE_OFFSET; if (IsSteepSlope(ti->tileh)) { SpriteID lower_base; - /* Lower part of foundation */ + /* Lower part of foundation + * Use the original slope sprites if NW and NE borders should be visible + */ lower_base = sprite_base; - if (lower_base == SPR_SLOPES_BASE - 15) lower_base = SPR_FOUNDATION_BASE; + if (lower_base == SPR_SLOPES_VIRTUAL_BASE) lower_base = SPR_FOUNDATION_BASE; AddSortableSpriteToDraw( lower_base + (ti->tileh & ~SLOPE_STEEP), PAL_NONE, ti->x, ti->y, 16, 16, 7, ti->z ); - ti->z += TILE_HEIGHT; - ti->tileh = _inclined_tileh[f - 15]; - if (f < 15 + 8) { - /* inclined */ - AddSortableSpriteToDraw(sprite_base + f, PAL_NONE, ti->x, ti->y, 16, 16, 1, ti->z); + + byte highest_corner = GetHighestSlopeCorner(ti->tileh); + ti->z += ApplyFoundationToSlope(f, &ti->tileh); + + if (IsInclinedFoundation(f)) { + /* inclined foundation */ + byte inclined = highest_corner * 2 + (f == FOUNDATION_INCLINED_Y ? 1 : 0); + + AddSortableSpriteToDraw(sprite_base + SPR_SLOPES_INCLINED_OFFSET + inclined, PAL_NONE, ti->x, ti->y, 16, 16, 1, ti->z); OffsetGroundSprite(31, 9); - } else if (f >= 15 + 8 + 4) { - /* three corners raised */ - SpriteID upper = sprite_base + 15 + (f - 15 - 8 - 4) * 2; + } else if (f >= FOUNDATION_STEEP_HIGHER) { + /* three corners raised: + * Draw inclined foundations for both axes, that results in the needed image. + */ + SpriteID upper = sprite_base + SPR_SLOPES_INCLINED_OFFSET + highest_corner * 2; AddSortableSpriteToDraw(upper, PAL_NONE, ti->x, ti->y, 16, 16, 1, ti->z); AddChildSpriteScreen(upper + 1, PAL_NONE, 31, 9); @@ -249,21 +294,22 @@ OffsetGroundSprite(31, 1); } } else { - if (f < 15) { + if (IsLeveledFoundation(f)) { /* leveled foundation - * Use the original slope sprites if NW and NE borders should be visible */ - if (sprite_base == SPR_SLOPES_BASE - 15) sprite_base = SPR_FOUNDATION_BASE; + * Use the original slope sprites if NW and NE borders should be visible + */ + if (sprite_base == SPR_SLOPES_VIRTUAL_BASE) sprite_base = SPR_FOUNDATION_BASE; - AddSortableSpriteToDraw(sprite_base + f, PAL_NONE, ti->x, ti->y, 16, 16, 7, ti->z); - ti->z += TILE_HEIGHT; - ti->tileh = SLOPE_FLAT; + AddSortableSpriteToDraw(sprite_base + ti->tileh, PAL_NONE, ti->x, ti->y, 16, 16, 7, ti->z); OffsetGroundSprite(31, 1); } else { /* inclined foundation */ - AddSortableSpriteToDraw(sprite_base + f, PAL_NONE, ti->x, ti->y, 16, 16, 1, ti->z); - ti->tileh = _inclined_tileh[f - 15]; + byte inclined = GetHighestSlopeCorner(ti->tileh) * 2 + (f == FOUNDATION_INCLINED_Y ? 1 : 0); + + AddSortableSpriteToDraw(sprite_base + SPR_SLOPES_INCLINED_OFFSET + inclined, PAL_NONE, ti->x, ti->y, 16, 16, 1, ti->z); OffsetGroundSprite(31, 9); } + ti->z += ApplyFoundationToSlope(f, &ti->tileh); } } diff -r 31fcaa5375a1 -r e72987579514 src/landscape.h --- a/src/landscape.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/landscape.h Fri Aug 03 22:09:42 2007 +0000 @@ -39,7 +39,8 @@ return RemapCoords(x, y, GetSlopeZ(x, y)); } -void DrawFoundation(TileInfo *ti, uint f); +uint ApplyFoundationToSlope(Foundation f, Slope *s); +void DrawFoundation(TileInfo *ti, Foundation f); void DoClearSquare(TileIndex tile); void RunTileLoop(); diff -r 31fcaa5375a1 -r e72987579514 src/lang/catalan.txt --- a/src/lang/catalan.txt Fri Aug 03 19:16:36 2007 +0000 +++ b/src/lang/catalan.txt Fri Aug 03 22:09:42 2007 +0000 @@ -603,7 +603,7 @@ STR_MESSAGES_ALL :{YELLOW}Adjust per tots els tipus de missatge (actiu/inactiu/resum) STR_MESSAGE_SOUND :{YELLOW}Emetre so per als nous missatges resumits STR_0210_TOO_FAR_FROM_PREVIOUS_DESTINATIO :{WHITE}...massa lluny del destí previ -STR_0211_TOP_COMPANIES_WHO_REACHED :{BIGFONT}{BLACK}Principals Empreses en asolir el Nivell {NUM}{}({STRING} ) +STR_0211_TOP_COMPANIES_WHO_REACHED :{BIGFONT}{BLACK}Principals empreses en aconseguir el Nivell {NUM}{}({STRING} ) STR_TOP_COMPANIES_NETWORK_GAME :{BIGFONT}{BLACK}Taula de Lliga d'Empreses a {NUM} STR_0212 :{BIGFONT}{COMMA}. STR_0213_BUSINESSMAN :Empresari @@ -2372,29 +2372,29 @@ STR_8019_T_I_M_ELECTRIC :'T.I.M.' (Elèctric) STR_801A_ASIASTAR_ELECTRIC :'AsiaStar' (Elèctric) STR_801B_PASSENGER_CAR :Vagó per Passatgers -STR_801C_MAIL_VAN :Furgó per Correu +STR_801C_MAIL_VAN :Vagó per Correu STR_801D_COAL_CAR :Vagó per Carbó STR_801E_OIL_TANKER :Tanc de Petroli -STR_801F_LIVESTOCK_VAN :Furgó per Bestiar -STR_8020_GOODS_VAN :Furgó de Mercaderies -STR_8021_GRAIN_HOPPER :Furgó per Gra +STR_801F_LIVESTOCK_VAN :Vagó per Bestiar +STR_8020_GOODS_VAN :Vagó de Mercaderies +STR_8021_GRAIN_HOPPER :Vagó per Gra STR_8022_WOOD_TRUCK :Vagó per Fusta STR_8023_IRON_ORE_HOPPER :Vagó per Mineral de Ferro STR_8024_STEEL_TRUCK :Vagó per Acer -STR_8025_ARMORED_VAN :Furgó Blindat -STR_8026_FOOD_VAN :Furgó per Queviures +STR_8025_ARMORED_VAN :Vagó Blindat +STR_8026_FOOD_VAN :Vagó per Queviures STR_8027_PAPER_TRUCK :Vagó per Paper -STR_8028_COPPER_ORE_HOPPER :Furgó per Mineral de Coure +STR_8028_COPPER_ORE_HOPPER :Vagó per Mineral de Coure STR_8029_WATER_TANKER :Tanc d'Aigua STR_802A_FRUIT_TRUCK :Vagó per Fruita STR_802B_RUBBER_TRUCK :Vagó per Cautxú STR_802C_SUGAR_TRUCK :Vagó per Sucre -STR_802D_COTTON_CANDY_HOPPER :Furgó per Cotó de Sucre -STR_802E_TOFFEE_HOPPER :Furgó per Caramels -STR_802F_BUBBLE_VAN :Furgó per Bombolles +STR_802D_COTTON_CANDY_HOPPER :Vagó per Cotó de Sucre +STR_802E_TOFFEE_HOPPER :Vagó per Caramels +STR_802F_BUBBLE_VAN :Vagó per Bombolles STR_8030_COLA_TANKER :Tanc per Refresc -STR_8031_CANDY_VAN :Furgó per Dolços -STR_8032_TOY_VAN :Furgó per Joguines +STR_8031_CANDY_VAN :Vagó per Dolços +STR_8032_TOY_VAN :Vagó per Joguines STR_8033_BATTERY_TRUCK :Vagó per Piles STR_8034_FIZZY_DRINK_TRUCK :Vagó per Begudes Gasoses STR_8035_PLASTIC_TRUCK :Vagó per Plàstic @@ -2402,29 +2402,29 @@ STR_8037_MILLENNIUM_Z1_ELECTRIC :'Millennium Z1' (Elèctric) STR_8038_WIZZOWOW_Z99 :Wizzowow Z99 STR_8039_PASSENGER_CAR :Vagó per Passatgers -STR_803A_MAIL_VAN :Furgó per Correu +STR_803A_MAIL_VAN :Vagó per Correu STR_803B_COAL_CAR :Vagó per Carbó STR_803C_OIL_TANKER :Tanc de Petroli -STR_803D_LIVESTOCK_VAN :Furgó per Bestiar -STR_803E_GOODS_VAN :Furgó de Mercaderies -STR_803F_GRAIN_HOPPER :Furgó per Gra +STR_803D_LIVESTOCK_VAN :Vagó per Bestiar +STR_803E_GOODS_VAN :Vagó de Mercaderies +STR_803F_GRAIN_HOPPER :Vagó per Gra STR_8040_WOOD_TRUCK :Vagó per Fusta STR_8041_IRON_ORE_HOPPER :Vagó per Mineral de Ferro STR_8042_STEEL_TRUCK :Vagó per Acer -STR_8043_ARMORED_VAN :Furgó Blindat -STR_8044_FOOD_VAN :Furgó per Queviures +STR_8043_ARMORED_VAN :Vagó Blindat +STR_8044_FOOD_VAN :Vagó per Queviures STR_8045_PAPER_TRUCK :Vagó per Paper -STR_8046_COPPER_ORE_HOPPER :Furgó per Mineral de Coure +STR_8046_COPPER_ORE_HOPPER :Vagó per Mineral de Coure STR_8047_WATER_TANKER :Tanc d'Aigua STR_8048_FRUIT_TRUCK :Vagó per Fruita STR_8049_RUBBER_TRUCK :Vagó per Cautxú STR_804A_SUGAR_TRUCK :Vagó per Sucre -STR_804B_COTTON_CANDY_HOPPER :Furgó per Cotó de Sucre -STR_804C_TOFFEE_HOPPER :Furgó per Caramels -STR_804D_BUBBLE_VAN :Furgó per Bombolles +STR_804B_COTTON_CANDY_HOPPER :Vagó per Cotó de Sucre +STR_804C_TOFFEE_HOPPER :Vagó per Caramels +STR_804D_BUBBLE_VAN :Vagó per Bombolles STR_804E_COLA_TANKER :Tanc per Refresc -STR_804F_CANDY_VAN :Furgó per Dolços -STR_8050_TOY_VAN :Furgó per Joguines +STR_804F_CANDY_VAN :Vagó per Dolços +STR_8050_TOY_VAN :Vagó per Joguines STR_8051_BATTERY_TRUCK :Vagó per Piles STR_8052_FIZZY_DRINK_TRUCK :Vagó per Begudes Gasoses STR_8053_PLASTIC_TRUCK :Vagó per Plàstic @@ -2434,29 +2434,29 @@ STR_8057_LEV4_CHIMAERA_ELECTRIC :Lev4 'Quimera' (Elèctric) STR_8058_WIZZOWOW_ROCKETEER :Wizzowow Rocketeer STR_8059_PASSENGER_CAR :Vagó per Passatgers -STR_805A_MAIL_VAN :Furgó per Correu +STR_805A_MAIL_VAN :Vagó per Correu STR_805B_COAL_CAR :Vagó per Carbó STR_805C_OIL_TANKER :Tanc de Petroli -STR_805D_LIVESTOCK_VAN :Furgó per Bestiar -STR_805E_GOODS_VAN :Furgó de Mercaderies -STR_805F_GRAIN_HOPPER :Furgó per Gra +STR_805D_LIVESTOCK_VAN :Vagó per Bestiar +STR_805E_GOODS_VAN :Vagó de Mercaderies +STR_805F_GRAIN_HOPPER :Vagó per Gra STR_8060_WOOD_TRUCK :Vagó per Fusta STR_8061_IRON_ORE_HOPPER :Vagó per Mineral de Ferro STR_8062_STEEL_TRUCK :Vagó per Acer -STR_8063_ARMORED_VAN :Furgó Blindat -STR_8064_FOOD_VAN :Furgó per Queviures +STR_8063_ARMORED_VAN :Vagó Blindat +STR_8064_FOOD_VAN :Vagó per Queviures STR_8065_PAPER_TRUCK :Vagó per Paper -STR_8066_COPPER_ORE_HOPPER :Furgó per Mineral de Coure +STR_8066_COPPER_ORE_HOPPER :Vagó per Mineral de Coure STR_8067_WATER_TANKER :Tanc d'Aigua STR_8068_FRUIT_TRUCK :Vagó per Fruita STR_8069_RUBBER_TRUCK :Vagó per Cautxú STR_806A_SUGAR_TRUCK :Vagó per Sucre -STR_806B_COTTON_CANDY_HOPPER :Furgó per Cotó de Sucre -STR_806C_TOFFEE_HOPPER :Furgó per Caramels -STR_806D_BUBBLE_VAN :Furgó per Bombolles +STR_806B_COTTON_CANDY_HOPPER :Vagó per Cotó de Sucre +STR_806C_TOFFEE_HOPPER :Vagó per Caramels +STR_806D_BUBBLE_VAN :Vagó per Bombolles STR_806E_COLA_TANKER :Tanc per Refresc -STR_806F_CANDY_VAN :Furgó per Dolços -STR_8070_TOY_VAN :Furgó per Joguines +STR_806F_CANDY_VAN :Vagó per Dolços +STR_8070_TOY_VAN :Vagó per Joguines STR_8071_BATTERY_TRUCK :Vagó per Piles STR_8072_FIZZY_DRINK_TRUCK :Vagó per Begudes Gasoses STR_8073_PLASTIC_TRUCK :Vagó per Plàstic @@ -2479,9 +2479,9 @@ STR_8084_WITCOMBE_OIL_TANKER :Cuba de Petroli Witcombe STR_8085_FOSTER_OIL_TANKER :Cuba de Petroli Foster STR_8086_PERRY_OIL_TANKER :Cuba de Petroli Perry -STR_8087_TALBOTT_LIVESTOCK_VAN :Furgó de Bestiar Talbott -STR_8088_UHL_LIVESTOCK_VAN :Furgó de Bestiar Uhl -STR_8089_FOSTER_LIVESTOCK_VAN :Furgó de Bestiar Foster +STR_8087_TALBOTT_LIVESTOCK_VAN :Camió de Bestiar Talbott +STR_8088_UHL_LIVESTOCK_VAN :Vagó de Bestiar Uhl +STR_8089_FOSTER_LIVESTOCK_VAN :Camió de Bestiar Foster STR_808A_BALOGH_GOODS_TRUCK :Camió de Mercaderies STR_808B_CRAIGHEAD_GOODS_TRUCK :Camió de Mercaderies STR_808C_GOSS_GOODS_TRUCK :Camió de Mercaderies Goss @@ -2710,13 +2710,13 @@ STR_883B_CAN_T_STOP_START_TRAIN :{WHITE}No es pot parar/arrencar el tren... STR_883C_SERVICING_INTERVAL_DAYS :{BLACK}Interval de manteniment: {LTBLUE}{COMMA}dies{BLACK} Darrer manteniment: {LTBLUE}{DATE_LONG} STR_SERVICING_INTERVAL_PERCENT :{BLACK}Interval de manteniment: {LTBLUE}{COMMA}%{BLACK} Darrer manteniment: {LTBLUE}{DATE_LONG} -STR_883D_TRAINS_CLICK_ON_TRAIN_FOR :{BLACK}Trens - clica al tren per informació +STR_883D_TRAINS_CLICK_ON_TRAIN_FOR :{BLACK}Trens - clica al tren per més informació STR_883E_BUILD_NEW_TRAINS_REQUIRES :{BLACK}Construeix nous trens (es necessita cotxera) STR_883F_TRAINS_CLICK_ON_TRAIN_FOR :{BLACK}Trens - clica al tren per info., arrossega el vehicle per afegir/treure del tren STR_8840_BUILD_NEW_TRAIN_VEHICLE :{BLACK}Construeix un nou element de tren STR_8841_DRAG_TRAIN_VEHICLE_TO_HERE :{BLACK}Arrossega l'element de tren fins aquí per vendre'l STR_8842_CENTER_MAIN_VIEW_ON_TRAIN :{BLACK}Centra la vista de la pantalla principal en la situació de la cotxera -STR_8843_TRAIN_VEHICLE_SELECTION :{BLACK}Llista de selecció d'elements de tren - clica a l'element per informació +STR_8843_TRAIN_VEHICLE_SELECTION :{BLACK}Llista de selecció d'elements de tren - clica a l'element per més informació STR_8844_BUILD_THE_HIGHLIGHTED_TRAIN :{BLACK}Construeix l'element de tren seleccionat STR_8845_RENAME_TRAIN_VEHICLE_TYPE :{BLACK}Reanomena el tipus d'element del tren STR_8846_CURRENT_TRAIN_ACTION_CLICK :{BLACK}Acció sobre el tren actual - clica aquí per parar/arrencar el tren @@ -2815,7 +2815,7 @@ STR_HEADING_FOR_ROAD_DEPOT_SERVICE_VEL :{LTBLUE}Revisió a la cotxera de {TOWN}, {VELOCITY} STR_9018_CAN_T_SEND_VEHICLE_TO_DEPOT :{WHITE}No es pot enviar el vehicle a cotxera... STR_9019_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}Impossible trobar la cotxera local -STR_901A_ROAD_VEHICLES_CLICK_ON :{BLACK}Automòbils - clica en un vehicle per informació +STR_901A_ROAD_VEHICLES_CLICK_ON :{BLACK}Automòbils - clica en un vehicle per més informació STR_901B_BUILD_NEW_ROAD_VEHICLES :{BLACK}Construeix nous automòbils (necessita una cotxera) STR_901C_CURRENT_VEHICLE_ACTION :{BLACK}Acció sobre el vehicle actual - clica aquí per parar/arrencar el vehicle STR_901D_SHOW_VEHICLE_S_ORDERS :{BLACK}Mostra les ordres dels vehicles @@ -2823,11 +2823,11 @@ STR_901F_SEND_VEHICLE_TO_DEPOT :{BLACK}Envia el vehicle a cotxera STR_9020_FORCE_VEHICLE_TO_TURN_AROUND :{BLACK}Obliga al vehicle a tornar STR_9021_SHOW_ROAD_VEHICLE_DETAILS :{BLACK}Mostra els detalls del vehicle -STR_9022_VEHICLES_CLICK_ON_VEHICLE :{BLACK}Vehicles - clica en un vehicle per informació +STR_9022_VEHICLES_CLICK_ON_VEHICLE :{BLACK}Vehicles - clica en un vehicle per més informació STR_9023_BUILD_NEW_ROAD_VEHICLE :{BLACK}Construeix un nou automòbil STR_9024_DRAG_ROAD_VEHICLE_TO_HERE :{BLACK}Arrossega el vehicle fins aquí per vendre'l STR_9025_CENTER_MAIN_VIEW_ON_ROAD :{BLACK}Centra la pantalla principal en la situació de la cotxera -STR_9026_ROAD_VEHICLE_SELECTION :{BLACK}Llista de selecció de Vehicles - clica en un vehicle per informació +STR_9026_ROAD_VEHICLE_SELECTION :{BLACK}Llista de selecció de Vehicles - clica en un vehicle per més informació STR_9027_BUILD_THE_HIGHLIGHTED_ROAD :{BLACK}Construeix l'automòbil seleccionat STR_902A_COST_SPEED_RUNNING_COST :{BLACK}Cost: {CURRENCY}{}Velocitat: {VELOCITY}{}Cost de circulació: {CURRENCY}/any{}Capacitat: {CARGO} STR_ARTICULATED_RV_CAPACITY :{BLACK}Capacitat: {LTBLUE} @@ -2891,13 +2891,13 @@ STR_981C_SHIP_IS_WAITING_IN_DEPOT :{WHITE}Vaixell {COMMA} esperant en drassana STR_981D_BUILD_SHIP_DOCK :{BLACK}Construeix un port STR_981E_BUILD_SHIP_DEPOT_FOR_BUILDING :{BLACK}Construeix una drassana (per construir i revisar vaixells) -STR_981F_SHIPS_CLICK_ON_SHIP_FOR :{BLACK}Vaixells - clica en un vaixell per informació +STR_981F_SHIPS_CLICK_ON_SHIP_FOR :{BLACK}Vaixells - clica en un vaixell per més informació STR_9820_BUILD_NEW_SHIP :{BLACK}Construeix un nou vaixell STR_9821_DRAG_SHIP_TO_HERE_TO_SELL :{BLACK}Arrossega el vaixell fins aquí per vendre'l STR_9822_CENTER_MAIN_VIEW_ON_SHIP :{BLACK}Centra la pantalla principal en la situació de la drassana -STR_9823_SHIPS_CLICK_ON_SHIP_FOR :{BLACK}Vaixells - clica en un vaixell per informació +STR_9823_SHIPS_CLICK_ON_SHIP_FOR :{BLACK}Vaixells - clica en un vaixell per més informació STR_9824_BUILD_NEW_SHIPS_REQUIRES :{BLACK}Construeix nous vaixells (necessites una drassana) -STR_9825_SHIP_SELECTION_LIST_CLICK :{BLACK}LLista de selecció de Vaixells - clica en un vaixell per informació +STR_9825_SHIP_SELECTION_LIST_CLICK :{BLACK}Llista de selecció de Vaixells - clica en un vaixell per més informació STR_9826_BUILD_THE_HIGHLIGHTED_SHIP :{BLACK}Construeix el vaixell seleccionat STR_9827_CURRENT_SHIP_ACTION_CLICK :{BLACK}Accions sobre el vaixell actual - clica aquí per parar/arrencar el vaixell STR_9828_SHOW_SHIP_S_ORDERS :{BLACK}Mostra les ordres del vaixell @@ -2963,13 +2963,13 @@ STR_A01C_CAN_T_SELL_AIRCRAFT :{WHITE}No es pot vendre l'avió... STR_A01D_AIRPORT_CONSTRUCTION :Construcció d'Aeroport STR_A01E_BUILD_AIRPORT :{BLACK}Construeix un aeroport -STR_A01F_AIRCRAFT_CLICK_ON_AIRCRAFT :{BLACK}Avió - clica sobre l'avió per informació +STR_A01F_AIRCRAFT_CLICK_ON_AIRCRAFT :{BLACK}Avió - clica sobre l'avió per més informació STR_A020_BUILD_NEW_AIRCRAFT_REQUIRES :{BLACK}Construeix nous avions (necessites un aeroport amb hangar) -STR_A021_AIRCRAFT_CLICK_ON_AIRCRAFT :{BLACK}Avió - clica sobre l'avió per informació +STR_A021_AIRCRAFT_CLICK_ON_AIRCRAFT :{BLACK}Avió - clica sobre l'avió per més informació STR_A022_BUILD_NEW_AIRCRAFT :{BLACK}Construeix nous avions STR_A023_DRAG_AIRCRAFT_TO_HERE_TO :{BLACK}Arrossega l'avió fins aquí per vendre'l STR_A024_CENTER_MAIN_VIEW_ON_HANGAR :{BLACK}Centra la pantalla principal en la situació de l'hangar -STR_A025_AIRCRAFT_SELECTION_LIST :{BLACK}Llista de selecció d'Avions - clica sobre l'avió per informació +STR_A025_AIRCRAFT_SELECTION_LIST :{BLACK}Llista de selecció d'Avions - clica sobre l'avió per més informació STR_A026_BUILD_THE_HIGHLIGHTED_AIRCRAFT :{BLACK}Construeix l'avió seleccionat STR_A027_CURRENT_AIRCRAFT_ACTION :{BLACK}Accions sobre l'avió actual - clica aquí per parar/arrencar l'avió STR_A028_SHOW_AIRCRAFT_S_ORDERS :{BLACK}Mostra les ordres de l'avió diff -r 31fcaa5375a1 -r e72987579514 src/lang/croatian.txt --- a/src/lang/croatian.txt Fri Aug 03 19:16:36 2007 +0000 +++ b/src/lang/croatian.txt Fri Aug 03 22:09:42 2007 +0000 @@ -2,6 +2,7 @@ ##ownname Hrvatski ##isocode hr_HR ##plural 6 +##case nom gen dat aku vok lok ins ##gender male female middle # @@ -22,50 +23,50 @@ STR_000C_ACCEPTS :{BLACK}Prihvaća: {WHITE} STR_000D_ACCEPTS :{BLACK}Prihvaća: {GOLD} STR_000E : -STR_000F_PASSENGERS :Putnici -STR_0010_COAL :Ugljen -STR_0011_MAIL :Pošta -STR_0012_OIL :Nafta -STR_0013_LIVESTOCK :Domaće životinje -STR_0014_GOODS :Robe -STR_0015_GRAIN :Žito -STR_0016_WOOD :Drvo -STR_0017_IRON_ORE :Željezo -STR_0018_STEEL :Čelik -STR_0019_VALUABLES :Dragocjenosti -STR_001A_COPPER_ORE :Bakar -STR_001B_MAIZE :Kukuruz -STR_001C_FRUIT :Voće -STR_001D_DIAMONDS :Dijamanti -STR_001E_FOOD :Hrana -STR_001F_PAPER :Papir -STR_0020_GOLD :Zlato -STR_0021_WATER :Voda -STR_0022_WHEAT :Pšenica -STR_0023_RUBBER :Guma -STR_0024_SUGAR :Šećer -STR_0025_TOYS :Igračke -STR_0026_CANDY :Slatkiši -STR_0027_COLA :Cola -STR_0028_COTTON_CANDY :Šećerna vuna -STR_0029_BUBBLES :Baloni -STR_002A_TOFFEE :Mliječne karamele -STR_002B_BATTERIES :Baterije -STR_002C_PLASTIC :Plastika -STR_002D_FIZZY_DRINKS :Gazirana pića +STR_000F_PASSENGERS :putnici +STR_0010_COAL :ugljen +STR_0011_MAIL :pošta +STR_0012_OIL :nafta +STR_0013_LIVESTOCK :domaće životinje +STR_0014_GOODS :robe +STR_0015_GRAIN :žito +STR_0016_WOOD :drvo +STR_0017_IRON_ORE :željezo +STR_0018_STEEL :čelik +STR_0019_VALUABLES :dragocjenosti +STR_001A_COPPER_ORE :bakar +STR_001B_MAIZE :kukuruz +STR_001C_FRUIT :voće +STR_001D_DIAMONDS :dijamanti +STR_001E_FOOD :hrana +STR_001F_PAPER :papir +STR_0020_GOLD :zlato +STR_0021_WATER :voda +STR_0022_WHEAT :pšenica +STR_0023_RUBBER :guma +STR_0024_SUGAR :šećer +STR_0025_TOYS :igrače +STR_0026_CANDY :slatkiši +STR_0027_COLA :cola +STR_0028_COTTON_CANDY :šećerna vuna +STR_0029_BUBBLES :baloni +STR_002A_TOFFEE :mliječne karamele +STR_002B_BATTERIES :baterije +STR_002C_PLASTIC :plastika +STR_002D_FIZZY_DRINKS :gazirana pića STR_002E : -STR_002F_PASSENGER :Putnik -STR_0030_COAL :Ugljen -STR_0031_MAIL :Pošta -STR_0032_OIL :Nafta -STR_0033_LIVESTOCK :Domaće životinje -STR_0034_GOODS :Robe -STR_0035_GRAIN :Žito -STR_0036_WOOD :Drvo -STR_0037_IRON_ORE :Željezo -STR_0038_STEEL :Čelik -STR_0039_VALUABLES :Dragocjenosti -STR_003A_COPPER_ORE :Bakar +STR_002F_PASSENGER :putnik +STR_0030_COAL :ugljen +STR_0031_MAIL :pošta +STR_0032_OIL :nafta +STR_0033_LIVESTOCK :domaće životinje +STR_0034_GOODS :robe +STR_0035_GRAIN :žito +STR_0036_WOOD :drvo +STR_0037_IRON_ORE :željezo +STR_0038_STEEL :čelik +STR_0039_VALUABLES :dragocjenosti +STR_003A_COPPER_ORE :bakar STR_003B_MAIZE :Kukuruz STR_003C_FRUIT :Voće STR_003D_DIAMOND :Dijamant @@ -154,7 +155,7 @@ STR_00AE :{WHITE}{DATE_SHORT} STR_00AF :{WHITE}{DATE_LONG} STR_00B0_MAP :{WHITE}Karta - {STRING} -STR_00B1_GAME_OPTIONS :{WHITE}Opcije za igru +STR_00B1_GAME_OPTIONS :{WHITE}Postavke igre STR_00B2_MESSAGE :{YELLOW}Poruka STR_00B3_MESSAGE_FROM :{YELLOW}Poruka od {STRING} STR_POPUP_CAUTION_CAPTION :{WHITE}Oprez! @@ -222,7 +223,7 @@ STR_00FB_POWER_STATION :{BLACK}{TINYFONT}Elektrana STR_00FC_FOREST :{BLACK}{TINYFONT}Šuma STR_00FD_SAWMILL :{BLACK}{TINYFONT}Pilana -STR_00FE_OIL_REFINERY :{BLACK}{TINYFONT}Naftna rafinerija +STR_00FE_OIL_REFINERY :{BLACK}{TINYFONT}Rafinerija nafte STR_00FF_FARM :{BLACK}{TINYFONT}Farma STR_0100_FACTORY :{BLACK}{TINYFONT}Tvornica STR_0101_PRINTING_WORKS :{BLACK}{TINYFONT}Tiskara @@ -349,7 +350,7 @@ STR_UNITS_FORCE_SI :{COMMA} kN ############ range for menu starts -STR_0154_OPERATING_PROFIT_GRAPH :Graf dobiti od poslovanja +STR_0154_OPERATING_PROFIT_GRAPH :Grafikon operativne dobiti STR_0155_INCOME_GRAPH :Graf prihoda STR_0156_DELIVERED_CARGO_GRAPH :Graf isporučenog tereta STR_0157_PERFORMANCE_HISTORY_GRAPH :Graf povijesti učinka @@ -364,7 +365,7 @@ STR_015D_LOAD_GAME :Učitaj igru STR_015E_QUIT_GAME :Napusti igru STR_015F_QUIT :Izlaz -STR_ABANDON_GAME_QUERY :{YELLOW}Jeste li sigurni da želite napustiti ovu igru? +STR_ABANDON_GAME_QUERY :{YELLOW}Jesi li siguran da želiš napustiti ovu igru? STR_0161_QUIT_GAME :{WHITE}Napusti igru STR_SORT_ORDER_TIP :{BLACK}Izaberi način sortiranja (silazno/uzlazno) STR_SORT_CRITERIA_TIP :{BLACK}Izaberi kriterij za sortiranje @@ -378,8 +379,8 @@ STR_SORT_BY_DROPDOWN_NAME :Ime STR_SORT_BY_DATE :{BLACK}Datum STR_SORT_BY_NUMBER :Broj -STR_SORT_BY_PROFIT_LAST_YEAR :Zarada prošle godine -STR_SORT_BY_PROFIT_THIS_YEAR :Zarada ove godine +STR_SORT_BY_PROFIT_LAST_YEAR :Dobit prošle godine +STR_SORT_BY_PROFIT_THIS_YEAR :Dobit ove godine STR_SORT_BY_AGE :Godine STR_SORT_BY_RELIABILITY :Pouzdanost STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :Totalna nosivost po vrsti tereta @@ -474,7 +475,7 @@ STR_0195_SHOW_VEGETATION_ON_MAP :{BLACK}Prikaži vegetaciju na karti STR_0196_SHOW_LAND_OWNERS_ON_MAP :{BLACK}Prikaži vlasnike zemlje na karti STR_0197_TOGGLE_TOWN_NAMES_ON_OFF :{BLACK}Prikaži/sakrij imena grada na karti -STR_0198_PROFIT_THIS_YEAR_LAST_YEAR :{TINYFONT}{BLACK}Ovogodišnja zarada: {CURRENCY} (prošlogodišnja: {CURRENCY}) +STR_0198_PROFIT_THIS_YEAR_LAST_YEAR :{TINYFONT}{BLACK}Ovogodišnja dobit: {CURRENCY} (prošlogodišnja: {CURRENCY}) ############ range for service numbers starts STR_AGE :{COMMA} godin{P a e a} ({COMMA}) @@ -633,7 +634,7 @@ STR_RESET_LANDSCAPE_CONFIRMATION_TEXT :{WHITE}Jeste li sigurni da želite obrisati sve u vlasništvu igrača? STR_022E_LANDSCAPE_GENERATION :{BLACK}Stvaranje krajolika STR_022F_TOWN_GENERATION :{BLACK}Stvaranje gradova -STR_0230_INDUSTRY_GENERATION :{BLACK}Stvaranje industrija +STR_0230_INDUSTRY_GENERATION :{BLACK}Stvaranje industrije STR_0231_ROAD_CONSTRUCTION :{BLACK}Izgradnja ceste STR_0233_TOWN_GENERATION :{WHITE}Stvaranje gradova STR_0234_NEW_TOWN :{BLACK}Novi grad @@ -688,7 +689,7 @@ STR_0263_CONSTRUCT_POWER_STATION :{BLACK}Izgradi elektranu STR_0264_CONSTRUCT_SAWMILL :{BLACK}Izgradi pilanu STR_0265_PLANT_FOREST :{BLACK}Posadi šumu -STR_0266_CONSTRUCT_OIL_REFINERY :{BLACK}Izgradi naftnu rafineriju +STR_0266_CONSTRUCT_OIL_REFINERY :{BLACK}Izgradi rafineriju nafte STR_0267_CONSTRUCT_OIL_RIG_CAN_ONLY :{BLACK}Izgradi naftnu bušotinu (može biti sagrađena samo blizu rubova karte) STR_0268_CONSTRUCT_FACTORY :{BLACK}Izgradi tvornicu STR_0269_CONSTRUCT_STEEL_MILL :{BLACK}Izgradi čeličanu @@ -767,24 +768,24 @@ STR_02BB_TOWN_DIRECTORY :Popis gradova STR_02BC_VEHICLE_DESIGN_NAMES :{BLACK}Imena dizajna vozila STR_02BD :{BLACK}{STRING} -STR_02BE_DEFAULT :Pretpostavljeno -STR_02BF_CUSTOM :Prilagođeno -STR_02C0_SAVE_CUSTOM_NAMES :{BLACK}Spremi prilagođena imena +STR_02BE_DEFAULT :Zadano +STR_02BF_CUSTOM :Proizvoljno +STR_02C0_SAVE_CUSTOM_NAMES :{BLACK}Spremi proizvoljna imena STR_02C1_VEHICLE_DESIGN_NAMES_SELECTION :{BLACK}Odabir imena dizajna vozila -STR_02C2_SAVE_CUSTOMIZED_VEHICLE :{BLACK}Spremi prilagođena imena dizajna vozila +STR_02C2_SAVE_CUSTOMIZED_VEHICLE :{BLACK}Spremi proizvoljna imena dizajna vozila STR_CHECKMARK :{CHECKMARK} ############ range for menu starts -STR_02C3_GAME_OPTIONS :Opcije igre +STR_02C3_GAME_OPTIONS :Postavke igre STR_02C5_DIFFICULTY_SETTINGS :Postavke težine STR_02C7_CONFIG_PATCHES :Konfiguriraj zakrpe STR_NEWGRF_SETTINGS :Postavke NewGRF-a STR_TRANSPARENCY_OPTIONS :Opcije prozirnosti STR_GAMEOPTMENU_0A : -STR_02CA_TOWN_NAMES_DISPLAYED :{SETX 12}Prikazana imena gradova -STR_02CC_STATION_NAMES_DISPLAYED :{SETX 12}Prikazana imena stanica -STR_02CE_SIGNS_DISPLAYED :{SETX 12}Prikazani znakovi -STR_WAYPOINTS_DISPLAYED2 :{SETX 12}Prikazana čvorišta +STR_02CA_TOWN_NAMES_DISPLAYED :{SETX 12}Prikaži imena gradova +STR_02CC_STATION_NAMES_DISPLAYED :{SETX 12}Prikaži imena stanica +STR_02CE_SIGNS_DISPLAYED :{SETX 12}Prikaži znakove +STR_WAYPOINTS_DISPLAYED2 :{SETX 12}Prikaži čvorišta STR_02D0_FULL_ANIMATION :{SETX 12}Sve animacije STR_02D2_FULL_DETAIL :{SETX 12}Svi detalji STR_02D4_TRANSPARENT_BUILDINGS :{SETX 12}Prozirne građevine @@ -818,9 +819,9 @@ STR_02E0_CURRENCY_UNITS :{BLACK}Novčane jedinice STR_02E1 :{BLACK}{SKIP}{STRING} STR_02E2_CURRENCY_UNITS_SELECTION :{BLACK}Odabir novčanih jedinica -STR_MEASURING_UNITS :{BLACK}Mjerne jedinice +STR_MEASURING_UNITS :{BLACK}Mjerni sustav STR_02E4 :{BLACK}{SKIP}{SKIP}{STRING} -STR_MEASURING_UNITS_SELECTION :{BLACK}Odabir mjernih jedinica +STR_MEASURING_UNITS_SELECTION :{BLACK}Odabir mjernog sustava STR_02E6_ROAD_VEHICLES :{BLACK}Cestovna vozila STR_02E7 :{BLACK}{SKIP}{SKIP}{SKIP}{STRING} STR_02E8_SELECT_SIDE_OF_ROAD_FOR :{BLACK}Izaberi na kojoj će strani ceste vozila prometovati @@ -839,12 +840,12 @@ STR_02FA_EVERY_12_MONTHS :Svakih 12 mjeseci STR_02FB_START_A_NEW_GAME :{BLACK}Započni novu igru STR_02FC_LOAD_A_SAVED_GAME :{BLACK}Učitaj spremljenu igru -STR_02FE_CREATE_A_CUSTOMIZED_GAME :{BLACK}Izradi prilagođeni igrački svijet/scenarij +STR_02FE_CREATE_A_CUSTOMIZED_GAME :{BLACK}Izradi proizvoljni igrački svijet/scenarij STR_02FF_SELECT_SINGLE_PLAYER_GAME :{BLACK}Odaberi igru za jednog igrača STR_0300_SELECT_MULTIPLAYER_GAME :{BLACK}Odaberi igru za 2-8 igrača -STR_0301_DISPLAY_GAME_OPTIONS :{BLACK}Prikaži opcije igre +STR_0301_DISPLAY_GAME_OPTIONS :{BLACK}Prikaži postavke igre STR_0302_DISPLAY_DIFFICULTY_OPTIONS :{BLACK}Prikaži opcije težine -STR_0303_START_A_NEW_GAME_USING :{BLACK}Započni novu igru koristeći prilagođeni scenarij +STR_0303_START_A_NEW_GAME_USING :{BLACK}Započni novu igru koristeći proizvoljni scenarij STR_0304_QUIT :{BLACK}Završi STR_0305_QUIT_OPENTTD :{BLACK}Završi 'OpenTTD' STR_0307_OPENTTD :{WHITE}OpenTTD {REV} @@ -856,8 +857,8 @@ STR_0312_FUND_CONSTRUCTION_OF_NEW :{BLACK}Financiraj izgradnju nove industrije ############ range for menu starts -STR_INDUSTRY_DIR :Lista gospodarstava -STR_0313_FUND_NEW_INDUSTRY :Financiraj novo gospodarstvo +STR_INDUSTRY_DIR :Lista industrija +STR_0313_FUND_NEW_INDUSTRY :Financiraj novu industriju ############ range ends here STR_0314_FUND_NEW_INDUSTRY :{WHITE}Financiraj novu industriju @@ -872,7 +873,7 @@ STR_0329_PURCHASE_LAND_FOR_FUTURE :{BLACK}Kupi zemlju za buduću uporabu STR_032F_AUTOSAVE :{RED}AUTOMATSKO SPREMANJE -STR_SAVING_GAME :{RED}* * SAVING GAME * * +STR_SAVING_GAME :{RED}* * SPREMAM IGRU * * STR_SAVE_STILL_IN_PROGRESS :{WHITE}Spremanje još u tijeku,{}molimo pričekajte dok se ne završi! STR_0330_SELECT_EZY_STREET_STYLE :{BLACK}Izaberi glazbeni program 'Ezy Street style' @@ -985,7 +986,7 @@ STR_END_OF_SHARED_ORDERS :{SETX 10}- - Kraj dijeljenih naredbi - - STR_TRAIN_IS_LOST :{WHITE}Vlak {COMMA} se izgubio. -STR_TRAIN_IS_UNPROFITABLE :{WHITE}Prošlogodišnja zarada vlaka {COMMA} bila je {CURRENCY} +STR_TRAIN_IS_UNPROFITABLE :{WHITE}Prošlogodišnja dobit vlaka {COMMA} bila je {CURRENCY} STR_EURO_INTRODUCE :{BLACK}{BIGFONT}Europska Monetarna Unija!{}{}Euro je predstavljen kao jedinstvena valuta za svakodnevnu uporabu u tvojoj zemlji! # Start of order review system. @@ -1035,10 +1036,10 @@ STR_CONFIG_PATCHES_SELECTGOODS :{LTBLUE}Dostavi teret u stanicu samo ako u njoj postoji potražnja: {ORANGE}{STRING} STR_CONFIG_PATCHES_LONGBRIDGES :{LTBLUE}Dopusti izgradnju vrlo dugačkih mostova: {ORANGE}{STRING} STR_CONFIG_PATCHES_GOTODEPOT :{LTBLUE}Dopusti naredbe za slanje u spremište: {ORANGE}{STRING} -STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD :{LTBLUE}Ručna metoda izgradnje za primarnu industriju: {ORANGE}{STRING} +STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD :{LTBLUE}Ručna metoda izgradnje primarne industrije: {ORANGE}{STRING} STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_NONE :ništa STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_NORMAL :kao i druge industrije -STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_PROSPECTING :prospektivno +STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_PROSPECTING :prosperirajuće STR_CONFIG_PATCHES_MULTIPINDTOWN :{LTBLUE}Dopusti više sličnih industrija po gradu: {ORANGE}{STRING} STR_CONFIG_PATCHES_SAMEINDCLOSE :{LTBLUE}Moguće je graditi spojene industrije iste vrste: {ORANGE}{STRING} STR_CONFIG_PATCHES_LONGDATE :{LTBLUE}Uvijek prikaži dugi datum u statusnoj traci: {ORANGE}{STRING} @@ -1105,14 +1106,14 @@ STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Skrolaj kartom STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :Isključeno STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Brzina kotačića za skrolanje: {ORANGE}{STRING} -STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Automatski pauziraj kad pokrećeš novu igru: {ORANGE}{STRING} +STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Automatski pauziraj prilikom pokretanja nove igre: {ORANGE}{STRING} STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Koristi naprednu listu vozila: {ORANGE}{STRING} STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}Koristi indikatore utovara: {ORANGE}{STRING} STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Uključi raspored za vozila: {ORANGE}{STRING} STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Pokaži raspored u otkucajima radije nego u danima: {ORANGE}{STRING} STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Zadana vrsta tračnica (poslije nove igre/podizanja igre): {ORANGE}{STRING} -STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_RAIL :Normalne Tračnice -STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_ELRAIL :Elektrificirane Tračnice +STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_RAIL :Normalne tračnice +STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_ELRAIL :Elektrificirane tračnice STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MONORAIL :Monopruga STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MAGLEV :Maglev STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_FIRST :Prvi dostupan @@ -1156,7 +1157,7 @@ STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID :{WHITE}Izgled grada "bezviše cesta" nije valjan u editoru scenarija STR_CONFIG_PATCHES_TOWN_LAYOUT :{LTBLUE}Odaberi grad-cesta raspored: {ORANGE}{STRING} STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS :nema više cesta -STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT :inicijalno +STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT :zadano STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS :bolje ceste STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID :2x2 mreža STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID :3x3 mreža @@ -1165,7 +1166,7 @@ STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :Lijevo STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :Sredina STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT :Desno -STR_CONFIG_PATCHES_SNAP_RADIUS :{LTBLUE}Radijus hvazanja prozora: {ORANGE}{STRING} px +STR_CONFIG_PATCHES_SNAP_RADIUS :{LTBLUE}Radijus hvatanja prozora: {ORANGE}{STRING} px STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED :{LTBLUE}Radijus hvatanja prozora: {ORANGE}isključen STR_CONFIG_PATCHES_TOWN_GROWTH :{LTBLUE}Brzina rasta gradova: {ORANGE}{STRING} STR_CONFIG_PATCHES_TOWN_GROWTH_NONE :Ništa @@ -1228,12 +1229,12 @@ STR_WAYPOINT_VIEWPORT :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEWPORT_TINY :{TINYFONT}{WHITE}{WAYPOINT} STR_WAYPOINT_RAW :{WAYPOINT} -STR_EDIT_WAYPOINT_NAME :{WHITE}Promjeni ime čvorišta +STR_EDIT_WAYPOINT_NAME :{WHITE}Promijeni ime čvorišta -STR_CANT_CHANGE_WAYPOINT_NAME :{WHITE}Ne možeš promijeniti ime smjerokaza... +STR_CANT_CHANGE_WAYPOINT_NAME :{WHITE}Ne možeš promijeniti ime čvorišta... STR_CONVERT_RAIL_TO_WAYPOINT_TIP :{BLACK}Promijeni tračnicu u čvorište -STR_CANT_BUILD_TRAIN_WAYPOINT :{WHITE}Ne možeš izgraditi željeznički smjerokaz ovdje... -STR_CANT_REMOVE_TRAIN_WAYPOINT :{WHITE}Ne možeš ukloniti željeznički smjerokaz odavdje... +STR_CANT_BUILD_TRAIN_WAYPOINT :{WHITE}Ne možeš izgraditi željezničko čvorište ovdje... +STR_CANT_REMOVE_TRAIN_WAYPOINT :{WHITE}Ne možeš ukloniti željezničko čvorište odavdje... STR_BUILD_AUTORAIL_TIP :{BLACK}Izgradi željezničku tračnicu koristeći Autorail modus @@ -1303,12 +1304,12 @@ STR_CONSTRUCT_TOFFEE_QUARRY_TIP :{BLACK}Financiraj kamenolom mliječne karamele STR_CONSTRUCT_SUGAR_MINE_TIP :{BLACK}Izgradi šećeranu -STR_INDUSTRYDIR_CAPTION :{WHITE}Gospodarstva +STR_INDUSTRYDIR_CAPTION :{WHITE}Industrije STR_INDUSTRYDIR_ITEM :{ORANGE}{INDUSTRY}{BLACK} ({CARGO}){YELLOW} ({COMMA}% prevezeno) STR_INDUSTRYDIR_ITEM_TWO :{ORANGE}{INDUSTRY}{BLACK} ({CARGO}/{CARGO}){YELLOW} ({COMMA}%/{COMMA}% prevezeno) STR_INDUSTRYDIR_ITEM_NOPROD :{ORANGE}{INDUSTRY} -STR_INDUSTRY_TOO_CLOSE :{WHITE}...preblizu drugom gospodarstvu +STR_INDUSTRY_TOO_CLOSE :{WHITE}...preblizu drugoj industriji STR_RAIL_REFIT_VEHICLE_TO_CARRY :{BLACK}Prepravi vlak kako bi nosio drugu vrstu tereta STR_RAIL_REFIT_VEHICLE :{BLACK}Prepravi vlak @@ -1404,7 +1405,7 @@ STR_NETWORK_LANGUAGE_TIP :{BLACK}Drugi igrači znati će kojim se jezikom govori na poslužitelju STR_NETWORK_COMBO5 :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING} STR_NETWORK_START_GAME :{BLACK}Započni igru -STR_NETWORK_START_GAME_TIP :{BLACK}Započni novu igru u mreži na nasumičnoj mapi ili iz scenarija +STR_NETWORK_START_GAME_TIP :{BLACK}Započni novu igru u mreži na nasumičnoj mapi ili iz nasumičnog scenarija STR_NETWORK_LOAD_GAME :{BLACK}Učitaj igru STR_NETWORK_LOAD_GAME_TIP :{BLACK}Nastavi snimljenu igru za više igrača (pazite da se spojite pod svojim imenom) @@ -1440,7 +1441,7 @@ STR_NETWORK_LANG_UKRAINIAN :Ukrajinski ############ End of leave-in-this-order -STR_NETWORK_GAME_LOBBY :{WHITE}Predvorje multiplayer igre +STR_NETWORK_GAME_LOBBY :{WHITE}Predvorje igre za više igrača STR_NETWORK_PREPARE_TO_JOIN :{BLACK}Pripremanje za pridruživanje: {ORANGE}{STRING} STR_NETWORK_COMPANY_LIST_TIP :{BLACK}Popis svih kompanija trenutno u igri. Možete se pridružiti jednoj ili osnovati novu ako postoji slobodno mjesto @@ -1495,7 +1496,7 @@ STR_NETWORK_ERR_NEWGRF_MISMATCH :{WHITE} Ne mogu se spojiti zbog neslaganja u NewGRF STR_NETWORK_ERR_DESYNC :{WHITE} Neuspješno usklađivanje mrežne igre STR_NETWORK_ERR_LOSTCONNECTION :{WHITE} Izgubljena veza sa mrežnom igrom -STR_NETWORK_ERR_SAVEGAMEERROR :{WHITE} Nemoguće je učitati snimljenu igru +STR_NETWORK_ERR_SAVEGAMEERROR :{WHITE} Nije moguće učitati snimljenu igru STR_NETWORK_ERR_SERVER_START :{WHITE} Nemoguće je pokrenuti poslužitelja STR_NETWORK_ERR_CLIENT_START :{WHITE} Nije se moguće spojiti STR_NETWORK_ERR_TIMEOUT :{WHITE} Istekla je veza #{NUM} @@ -1739,10 +1740,10 @@ STR_202E_OFFER_OF_SUBSIDY_EXPIRED :{BLACK}{BIGFONT}Istekla je ponuda subvencije:{}{}Prijevoz tereta ( {STRING} ) od {STRING} do {STRING} neće više biti subvencioniran. STR_202F_SUBSIDY_WITHDRAWN_SERVICE :{BLACK}{BIGFONT}Povučena subvencija:{}{}Prijevoz tereta ( {STRING} ) od {STATION} do {STATION} nije više subvencioniran. STR_2030_SERVICE_SUBSIDY_OFFERED :{BLACK}{BIGFONT}Ponuđena je subvencija:{}{}Prvi koji preveze teret ({STRING}) od {STRING} do {STRING} dobivat će subvenciju od lokalne samouprave! -STR_2031_SERVICE_SUBSIDY_AWARDED :{BLACK}{BIGFONT}Subvencija je dodjeljena tvrtki {COMPANY}!{}{}Prijevoz tereta ({STRING}) od {STATION} do {STATION} plaćat će se 50% više slijedećih godinu dana! -STR_2032_SERVICE_SUBSIDY_AWARDED :{BLACK}{BIGFONT}Subvencija je dodjeljena tvrtki {COMPANY}!{}{}Prijevoz tereta ({STRING}) od {STATION} do {STATION} plaćat će se dvostruko slijedećih godinu dana! -STR_2033_SERVICE_SUBSIDY_AWARDED :{BLACK}{BIGFONT}Subvencija je dodjeljena tvrtki {COMPANY}!{}{}Prijevoz tereta ({STRING}) od {STATION} do {STATION} plaćat će se trostruko slijedećih godinu dana! -STR_2034_SERVICE_SUBSIDY_AWARDED :{BLACK}{BIGFONT}Subvencija je dodjeljena tvrtki {COMPANY}!{}{}Prijevoz tereta ({STRING}) od {STATION} do {STATION} plaćat će se četverostruko slijedećih godinu dana! +STR_2031_SERVICE_SUBSIDY_AWARDED :{BLACK}{BIGFONT}Subvencija je dodjeljena tvrtki {COMPANY}!{}{}Prijevoz tereta ({STRING}) od {STATION} do {STATION} plaćat će se 50% više sljedećih godinu dana! +STR_2032_SERVICE_SUBSIDY_AWARDED :{BLACK}{BIGFONT}Subvencija je dodjeljena tvrtki {COMPANY}!{}{}Prijevoz tereta ({STRING}) od {STATION} do {STATION} plaćat će se dvostruko sljedećih godinu dana! +STR_2033_SERVICE_SUBSIDY_AWARDED :{BLACK}{BIGFONT}Subvencija je dodjeljena tvrtki {COMPANY}!{}{}Prijevoz tereta ({STRING}) od {STATION} do {STATION} plaćat će se trostruko sljedećih godinu dana! +STR_2034_SERVICE_SUBSIDY_AWARDED :{BLACK}{BIGFONT}Subvencija je dodjeljena tvrtki {COMPANY}!{}{}Prijevoz tereta ({STRING}) od {STATION} do {STATION} plaćat će se četverostruko sljedećih godinu dana! STR_2035_LOCAL_AUTHORITY_REFUSES :{WHITE}{TOWN} lokalne vlasti odbijaju dozvoliti izgradnju još jedne zračne luke u ovom gradu STR_2036_COTTAGES :Kolibe STR_2037_HOUSES :Kuće @@ -1774,8 +1775,8 @@ STR_2050_FUND_THE_RECONSTRUCTION :{WHITE}{STRING}{}{YELLOW} Financiraj popravak gradske mreže prometnica. Uzrokuje značajne poremećaje u cestovnom prometu do 6 mjeseci.{} Trošak: {CURRENCY} STR_2051_BUILD_A_STATUE_IN_HONOR :{WHITE}{STRING}{}{YELLOW} Izgradi kip u čast svoje tvrke.{} Trošak: {CURRENCY} STR_2052_FUND_THE_CONSTRUCTION_OF :{WHITE}{STRING}{}{YELLOW} Financiraj izgradnju novih poslovnih prostora u gradu.{} Trošak: {CURRENCY} -STR_2053_BUY_1_YEAR_S_EXCLUSIVE :{WHITE}{STRING}{}{YELLOW} Kupi jednogodišnje ekskluzivno pravo prijevoza u gradu. Gradska vlast će dopustiti putnicima i teretu da koriste samo stanice tvoje tvrtke.{} Trošak: {CURRENCY} -STR_TOWN_BRIBE_THE_LOCAL_AUTHORITY_DESC :{WHITE}{STRING}{}{YELLOW}Podmiti lokalnu vlast zbog povećanja rejtinga, riskirajući ozbiljne kazne ako vas uhvate{} Trošak: {CURRENCY} +STR_2053_BUY_1_YEAR_S_EXCLUSIVE :{WHITE}{STRING}{}{YELLOW} Kupi jednogodišnje ekskluzivno pravo prijevoza u gradu. Gradska vlast će dopustiti putnicima i teretu da koriste stanice samo tvoje tvrtke.{} Trošak: {CURRENCY} +STR_TOWN_BRIBE_THE_LOCAL_AUTHORITY_DESC :{WHITE}{STRING}{}{YELLOW} Podmiti lokalnu vlast zbog povećanja rejtinga, riskirajući ozbiljne kazne ako vas uhvate{} Trošak: {CURRENCY} STR_2055_TRAFFIC_CHAOS_IN_ROAD_REBUILDING :{BIGFONT}{BLACK}{TOWN} zahvatile prometne gužve!{}{}Program popravka cesta koji financira tvrtka {COMPANY} slijedećih će 6 mjeseci zadavati glavobolje motociskistima! STR_2056 :{TINYFONT}{WHITE}{TOWN} STR_2057 :{ORANGE}{TOWN}{BLACK} ({COMMA}) @@ -1922,16 +1923,16 @@ STR_4009_GAME_LOAD_FAILED :{WHITE}Učitavanje igre nije uspjelo{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Interna greška: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Pokvarena spremljena igra - {STRING} -STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Igra je spremljena sa novijom verzijom -STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE :Ne mogu pročitati datoteku +STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Spremljena igra je stvorena s novijom verzijom +STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE :Datoteka nije čitljiva STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE :Ne mogu pisati u datoteku STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Popis diskova, mapa i spremljenih datoteka STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Trenutno odabrano ime za spremanje igre STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Obriši trenutno odabranu spremljenu igru -STR_400D_SAVE_THE_CURRENT_GAME_USING :{BLACK}Spremi ovu igru, koristeći odabrano ime +STR_400D_SAVE_THE_CURRENT_GAME_USING :{BLACK}Spremi trenutnu igru koristeći odabrano ime STR_400E_SELECT_NEW_GAME_TYPE :{WHITE}Odaberi vrstu nove igre STR_400F_SELECT_SCENARIO_GREEN_PRE :{BLACK}Odaberi scenarij (zeleno), namještenu igru (plavo), ili nasumičnu novu igru -STR_4010_GENERATE_RANDOM_NEW_GAME :Izradi nasumičnu novu igru +STR_4010_GENERATE_RANDOM_NEW_GAME :Stvori nasumičnu novu igru STR_4011_LOAD_HEIGHTMAP :{WHITE}Učitaj visinsku kartu ##id 0x4800 @@ -1994,7 +1995,7 @@ STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Započela je izgradnja nove industrije ( {STRING} ) u blizini grada {TOWN}! STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Nova {STRING} trenutno se sadi blizu grada {TOWN}! STR_482F_COST :{BLACK}Trošak: {YELLOW}{CURRENCY} -STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY :{WHITE}Ovdje ne možeš izgraditi ovu vrstu industrije ovdje... +STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY :{WHITE}Ovdje nije moguće izgraditi ovu vrstu industrije... STR_4831_FOREST_CAN_ONLY_BE_PLANTED :{WHITE}...šume mogu jedino biti posađene iznad linije snijega STR_4832_ANNOUNCES_IMMINENT_CLOSURE :{BLACK}{BIGFONT}{INDUSTRY} objavljuje skoro zatvaranje! STR_4833_SUPPLY_PROBLEMS_CAUSE_TO :{BLACK}{BIGFONT}Zbog problema u nabavi {INDUSTRY} se uskoro zatvara! @@ -2006,8 +2007,8 @@ STR_4839_PRODUCTION_DOWN_BY_50 :{BLACK}{BIGFONT}{INDUSTRY} smanjuje proizvodnju za 50% STR_483A_INSECT_INFESTATION_CAUSES :{BLACK}{BIGFONT}{INDUSTRY} pod najezdom kukaca! Havarija!{}Proizvodnja je pala za 50% STR_483B_CAN_ONLY_BE_POSITIONED :{WHITE}...može se postaviti samo blizu rubova karte -STR_INDUSTRY_PROD_GOUP :{BLACK}{BIGFONT}{STRING} prozivodnja u {INDUSTRY} povećana je {COMMA}%! -STR_INDUSTRY_PROD_GODOWN :{BLACK}{BIGFONT}{STRING} prozivodnja u {INDUSTRY} smanjena je {COMMA}%! +STR_INDUSTRY_PROD_GOUP :{BLACK}{BIGFONT}Proizvodnja {STRING.gen} u {INDUSTRY} povećana je za {COMMA}%! +STR_INDUSTRY_PROD_GODOWN :{BLACK}{BIGFONT}Proizvodnja {STRING.gen} u {INDUSTRY} smanjena je za {COMMA}%! ##id 0x5000 STR_5000_TRAIN_IN_TUNNEL :{WHITE}Vlak u tunelu @@ -2079,7 +2080,7 @@ STR_SV_STNAME_HALT :{STRING} Zaustavi STR_SV_STNAME_VALLEY :{STRING} Dolina STR_SV_STNAME_HEIGHTS :{STRING} Visine -STR_SV_STNAME_WOODS :{STRING} Šume +STR_SV_STNAME_WOODS :{STRING} šume STR_SV_STNAME_LAKESIDE :{STRING} Jezero STR_SV_STNAME_EXCHANGE :{STRING} Burza STR_SV_STNAME_AIRPORT :{STRING} Zračna luka @@ -2122,7 +2123,7 @@ STR_6806_COMPETITOR_START_TIME :{LTBLUE}Vrijeme početka igre natjecatelja: {ORANGE}{STRING} STR_6807_NO_OF_TOWNS :{LTBLUE}Broj gradova: {ORANGE}{STRING} STR_6808_NO_OF_INDUSTRIES :{LTBLUE}Broj gospodarstava: {ORANGE}{STRING} -STR_6809_MAXIMUM_INITIAL_LOAN_000 :{LTBLUE}Maksimalni početni kredit: {ORANGE}{CURRENCY} +STR_6809_MAXIMUM_INITIAL_LOAN_000 :{LTBLUE}Maksimalni početni zajam: {ORANGE}{CURRENCY} STR_680A_INITIAL_INTEREST_RATE :{LTBLUE}Početna kamata kredita: {ORANGE}{COMMA}% STR_680B_VEHICLE_RUNNING_COSTS :{LTBLUE}Troškovi uporabe vozila: {ORANGE}{STRING} STR_680C_CONSTRUCTION_SPEED_OF_COMPETITOR :{LTBLUE}Brzina razvoja natjecatelja: {ORANGE}{STRING} @@ -2217,26 +2218,26 @@ STR_7022_INCOME_GRAPH :{WHITE}Graf prihoda STR_CURRCOMPACT :{CURRCOMPACT} STR_7024 :{COMMA} -STR_7025_OPERATING_PROFIT_GRAPH :{WHITE}Graf operativnih prihoda +STR_7025_OPERATING_PROFIT_GRAPH :{WHITE}Grafikon operativne dobiti STR_7026_BANK_BALANCE :{WHITE}Bankovna bilanca -STR_7027_LOAN :{WHITE}Kredit +STR_7027_LOAN :{WHITE}Zajam STR_MAX_LOAN :{WHITE}Maks zajam: {BLACK}{CURRENCY} STR_7028 :{BLACK}{CURRENCY} STR_7029_BORROW :{BLACK}Pozajmi {SKIP}{SKIP}{CURRENCY} STR_702A_REPAY :{BLACK}Otplati {SKIP}{SKIP}{CURRENCY} -STR_702B_MAXIMUM_PERMITTED_LOAN :{WHITE}...najveći dopušteni kredit iznosi {CURRENCY} +STR_702B_MAXIMUM_PERMITTED_LOAN :{WHITE}...najveći dopušteni zajam iznosi {CURRENCY} STR_702C_CAN_T_BORROW_ANY_MORE_MONEY :{WHITE}Ne možeš dobiti još kredita... -STR_702D_LOAN_ALREADY_REPAYED :{WHITE}...nemaš kredita za otplatu +STR_702D_LOAN_ALREADY_REPAYED :{WHITE}...nema zajma za otplatu STR_702E_REQUIRED :{WHITE}...{CURRENCY} potrebno -STR_702F_CAN_T_REPAY_LOAN :{WHITE}Ne možeš otplatiti kredit... +STR_702F_CAN_T_REPAY_LOAN :{WHITE}Ne možeš otplatiti zajam... STR_INSUFFICIENT_FUNDS :{WHITE}Ne možeš dati novac koji je pozajmljen od banke... STR_7030_SELECT_NEW_FACE_FOR_PRESIDENT :{BLACK}Odaberi novo lice za direktora STR_7031_CHANGE_THE_COMPANY_VEHICLE :{BLACK}Promijeni izgled vozila tvrtke STR_7032_CHANGE_THE_PRESIDENT_S :{BLACK}Promjeni ime direktora STR_7033_CHANGE_THE_COMPANY_NAME :{BLACK}Promijeni ime tvrtke STR_7034_CLICK_ON_SELECTED_NEW_COLOR :{BLACK}Klikni na odabranu boju -STR_7035_INCREASE_SIZE_OF_LOAN :{BLACK}Povećaj iznos kredita -STR_7036_REPAY_PART_OF_LOAN :{BLACK}Otplati dio kredita +STR_7035_INCREASE_SIZE_OF_LOAN :{BLACK}Povećaj iznos zajma +STR_7036_REPAY_PART_OF_LOAN :{BLACK}Otplati dio zajma STR_7037_PRESIDENT :{WHITE}{PLAYERNAME}{}{GOLD}(Direktor) STR_7038_INAUGURATED :{GOLD}Na poziciji od: {WHITE}{NUM} STR_7039_VEHICLES :{GOLD}Vozila: @@ -2268,7 +2269,7 @@ STR_7057_WILL_BE_SOLD_OFF_OR_DECLARED :{BLACK}{BIGFONT}{COMPANY} će biti rasprodana ili objaviti bankrot ukoliko se učinak uskoro ne poboljša! STR_7058_PRESIDENT :{BLACK}{PLAYERNAME}{}(Direktor) STR_7059_TRANSPORT_COMPANY_MERGER :{BLACK}{BIGFONT}Spajanje prijevoznih tvrki! -STR_705A_HAS_BEEN_SOLD_TO_FOR :{BLACK}{BIGFONT}{COMPANY} je bila prodana tvrtki {COMPANY} za {CURRENCY}! +STR_705A_HAS_BEEN_SOLD_TO_FOR :{BLACK}{BIGFONT}{COMPANY} je prodana tvrtki {COMPANY} za {CURRENCY}! STR_705B_WE_ARE_LOOKING_FOR_A_TRANSPORT :{WHITE}Tražimo prijevoznu tvrku koja bi preuzela našu tvrtku.{}{}Želiš li kupiti tvrtku{COMPANY} za {CURRENCY}? STR_705C_BANKRUPT :{BLACK}{BIGFONT}Bankrot! STR_705D_HAS_BEEN_CLOSED_DOWN_BY :{BLACK}{BIGFONT}{COMPANY} je zatvorena od strane kreditora i sva je imovina rasprodana! @@ -2313,7 +2314,7 @@ STR_707F_HAS_BEEN_TAKEN_OVER_BY :{BLACK}{BIGFONT}{COMPANY} je preuzeta od strane tvrtke {COMPANY}! STR_7080_PROTECTED :{WHITE}Ova tvrka još nije dovoljno stara da bi trgovala udjelima... -STR_LIVERY_DEFAULT :Standardna opskrba hranom +STR_LIVERY_DEFAULT :Standardna boja STR_LIVERY_STEAM :Parna lokomotva STR_LIVERY_DIESEL :Dieselska lokomotiva STR_LIVERY_ELECTRIC :Električna lokomotiva @@ -2322,12 +2323,12 @@ STR_LIVERY_DMU :DMU STR_LIVERY_EMU :EMU STR_LIVERY_PASSENGER_WAGON_STEAM :Lokomotiva s putnicima (Parna) -STR_LIVERY_PASSENGER_WAGON_DIESEL :Lokomotiva s putnicima (Dieselska) +STR_LIVERY_PASSENGER_WAGON_DIESEL :Putnička lokomotiva (dizelska) STR_LIVERY_PASSENGER_WAGON_ELECTRIC :Lokomotiva s putnicima (Električna) STR_LIVERY_FREIGHT_WAGON :Teretni vagon STR_LIVERY_BUS :Autobus STR_LIVERY_TRUCK :Kamion -STR_LIVERY_PASSENGER_SHIP :Trajekt +STR_LIVERY_PASSENGER_SHIP :Putnički trajekt STR_LIVERY_FREIGHT_SHIP :Teretni brod STR_LIVERY_HELICOPTER :Helikopter STR_LIVERY_SMALL_PLANE :Mali zrakoplov @@ -2372,14 +2373,14 @@ STR_8018_SH_40_ELECTRIC :SH '40' (Električni) STR_8019_T_I_M_ELECTRIC :'T.I.M.' (Električni) STR_801A_ASIASTAR_ELECTRIC :'AsiaStar' (Električni) -STR_801B_PASSENGER_CAR :Putnički prijevoz +STR_801B_PASSENGER_CAR :Putnički vagon STR_801C_MAIL_VAN :Poštanski kombi STR_801D_COAL_CAR :Kamion za ugljen STR_801E_OIL_TANKER :Naftna cisterna STR_801F_LIVESTOCK_VAN :Kamion za stoku STR_8020_GOODS_VAN :Kamion za robu STR_8021_GRAIN_HOPPER :Tegljač žita -STR_8022_WOOD_TRUCK :Kamion za drvo +STR_8022_WOOD_TRUCK :Kamion za drva STR_8023_IRON_ORE_HOPPER :Tegljač željeza STR_8024_STEEL_TRUCK :Kamion za čelik STR_8025_ARMORED_VAN :Oklopljeni kombi @@ -2402,14 +2403,14 @@ STR_8036_X2001_ELECTRIC :'X2001' (Električni) STR_8037_MILLENNIUM_Z1_ELECTRIC :'Millennium Z1' (Električni) STR_8038_WIZZOWOW_Z99 :Wizzowow Z99 -STR_8039_PASSENGER_CAR :Putnički prijevoz +STR_8039_PASSENGER_CAR :Putnički vagon STR_803A_MAIL_VAN :Poštanski kombi STR_803B_COAL_CAR :Kamion za ugljen STR_803C_OIL_TANKER :Naftni tanker STR_803D_LIVESTOCK_VAN :Kamion za stoku STR_803E_GOODS_VAN :Kamion za robu STR_803F_GRAIN_HOPPER :Tegljač žita -STR_8040_WOOD_TRUCK :Kamion za drvo +STR_8040_WOOD_TRUCK :Kamion za drva STR_8041_IRON_ORE_HOPPER :Tegljač željeza STR_8042_STEEL_TRUCK :Kamion za željezo STR_8043_ARMORED_VAN :Oklopno vozilo @@ -2477,9 +2478,9 @@ STR_8081_MIGHTYMOVER_MAIL_TRUCK :MightyMover Poštanski Kamion STR_8082_POWERNAUGHT_MAIL_TRUCK :Powernaught Poštanski Kamion STR_8083_WIZZOWOW_MAIL_TRUCK :Wizzwow Poštanski Kamion -STR_8084_WITCOMBE_OIL_TANKER :Witcombe Tanker Ulja -STR_8085_FOSTER_OIL_TANKER :Foster Tanker Ulja -STR_8086_PERRY_OIL_TANKER :Perry Tanker Ulja +STR_8084_WITCOMBE_OIL_TANKER :Witcombe naftna cisterna +STR_8085_FOSTER_OIL_TANKER :Foster naftna cisterna +STR_8086_PERRY_OIL_TANKER :Perry naftna cisterna STR_8087_TALBOTT_LIVESTOCK_VAN :Tallbot Stočni Kamion STR_8088_UHL_LIVESTOCK_VAN :Uhl Stočni Kamion STR_8089_FOSTER_LIVESTOCK_VAN :Foster Stočni Kamion @@ -2489,9 +2490,9 @@ STR_808D_HEREFORD_GRAIN_TRUCK :Hereford Kamion za žitarice STR_808E_THOMAS_GRAIN_TRUCK :Thomas Kamion za žitarice STR_808F_GOSS_GRAIN_TRUCK :Goss Kamion za žitarice -STR_8090_WITCOMBE_WOOD_TRUCK :Witcombe Kamion za drvo -STR_8091_FOSTER_WOOD_TRUCK :Foster Kamion za drvo -STR_8092_MORELAND_WOOD_TRUCK :Moreland Kamion za Drvo +STR_8090_WITCOMBE_WOOD_TRUCK :Witcombe Kamion za drva +STR_8091_FOSTER_WOOD_TRUCK :Foster Kamion za drva +STR_8092_MORELAND_WOOD_TRUCK :Moreland Kamion za drva STR_8093_MPS_IRON_ORE_TRUCK :MPS Kamion za željeznu rudu STR_8094_UHL_IRON_ORE_TRUCK :Uhl Kamion za željezu rudu STR_8095_CHIPPY_IRON_ORE_TRUCK :Chippy Kamion za željeznu rudu @@ -2549,13 +2550,13 @@ STR_80C9_MIGHTYMOVER_BUBBLE_TRUCK :MightyMover kamion s žvakačim gumama STR_80CA_POWERNAUGHT_BUBBLE_TRUCK :Powernaught kamion s žvakačim gumama STR_80CB_WIZZOWOW_BUBBLE_TRUCK :Wizzowow kamion s žvakačim gumama -STR_80CC_MPS_OIL_TANKER :MPS Tanker Ulja -STR_80CD_CS_INC_OIL_TANKER :CS-Inc. Tanker Ulja -STR_80CE_MPS_PASSENGER_FERRY :MPS Trajekt -STR_80CF_FFP_PASSENGER_FERRY :FFP Trajekt +STR_80CC_MPS_OIL_TANKER :MPS naftna cisterna +STR_80CD_CS_INC_OIL_TANKER :CS-Inc. naftna cisterna +STR_80CE_MPS_PASSENGER_FERRY :MPS putnički trajekt +STR_80CF_FFP_PASSENGER_FERRY :FFP putnički trajekt STR_80D0_BAKEWELL_300_HOVERCRAFT :Bakewell 300 Lebdjelica -STR_80D1_CHUGGER_CHUG_PASSENGER :Chugger-Chug Trajekt -STR_80D2_SHIVERSHAKE_PASSENGER_FERRY :Shivershake Trajekt +STR_80D1_CHUGGER_CHUG_PASSENGER :Chugger-Chug putnički trajekt +STR_80D2_SHIVERSHAKE_PASSENGER_FERRY :Shivershake putnički trajekt STR_80D3_YATE_CARGO_SHIP :Yate Teretni Brod STR_80D4_BAKEWELL_CARGO_SHIP :Bakewell Teretni Brod STR_80D5_MIGHTYMOVER_CARGO_SHIP :Mightymover Teretni Brod @@ -2612,7 +2613,7 @@ ##id 0x8800 STR_8800_TRAIN_DEPOT :{WHITE}{TOWN} Spremište vlakova -STR_8801_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Građani slave . . .{}Prvi vlak stiže na {STATION}! +STR_8801_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Građani slave . . .{}Prvi vlak je stigao na {STATION}! STR_8802_DETAILS :{WHITE}{VEHICLE} (Detalji) STR_8803_TRAIN_IN_THE_WAY :{WHITE}Vlak na putu STR_8804 :{SETX 10}{COMMA}: {STRING} {STRING} @@ -2745,12 +2746,12 @@ STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Obriši potrebno vrijeme za označenu naredbu STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Resetiraj brojač kašnjenja, kako bi vozilo stiglo na vrijeme STR_SERVICE_HINT :{BLACK}Preskoči ovu narudžbu osim ako servis nije potreban -STR_VEHICLE_INFO_COST_WEIGHT_SPEED_POWER :{BLACK}Trošak: {CURRENCY} Težina: {WEIGHT_S}{}Brzina: {VELOCITY} Snaga: {POWER}{}Troškovi održavanja: {CURRENCY}/god{}Kapacitet: {CARGO} +STR_VEHICLE_INFO_COST_WEIGHT_SPEED_POWER :{BLACK}Trošak: {CURRENCY} Težina: {WEIGHT_S}{}Brzina: {VELOCITY} Snaga: {POWER}{}Troškovi uporabe: {CURRENCY}/god{}Kapacitet: {CARGO} STR_885C_BROKEN_DOWN :{RED}Pokvaren STR_885D_AGE_RUNNING_COST_YR :{BLACK}Starost: {LTBLUE}{STRING}{BLACK} Troškovi uporabe: {LTBLUE}{CURRENCY}/god STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Težina {LTBLUE}{WEIGHT_S} {BLACK}Snaga: {LTBLUE}{POWER}{BLACK} Maks. brzina: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Težina: {LTBLUE}{WEIGHT_S} {BLACK}Snaga: {LTBLUE}{POWER}{BLACK} Maks. brzina: {LTBLUE}{VELOCITY} {BLACK}Maks. T.E.: {LTBLUE}{FORCE} -STR_885F_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Zarada ove godine: {LTBLUE}{CURRENCY} (prošle godine: {CURRENCY}) +STR_885F_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Dobit ove godine: {LTBLUE}{CURRENCY} (prošle godine: {CURRENCY}) STR_8860_RELIABILITY_BREAKDOWNS :{BLACK}Pouzdanost: {LTBLUE}{COMMA}% {BLACK}Kvarova od zadnjeg servisa: {LTBLUE}{COMMA} STR_8861_STOPPED :{RED}Zaustavljen STR_8862_CAN_T_MAKE_TRAIN_PASS_SIGNAL :{WHITE}Ne mogu natjerati vlak da ignorira signale dok je opasnost... @@ -2802,7 +2803,7 @@ STR_900C_DETAILS :{WHITE}{VEHICLE} (Detalji) STR_900D_AGE_RUNNING_COST_YR :{BLACK}Starost: {LTBLUE}{STRING}{BLACK} Trošak uporabe {LTBLUE}{CURRENCY}/god STR_900E_MAX_SPEED :{BLACK}Maks brzina: {LTBLUE}{VELOCITY} -STR_900F_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Zarada ove godine: {LTBLUE}{CURRENCY} (prošle godine: {CURRENCY}) +STR_900F_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Dobit ove godine: {LTBLUE}{CURRENCY} (prošle godine: {CURRENCY}) STR_9010_RELIABILITY_BREAKDOWNS :{BLACK}Pouzdanost: {LTBLUE}{COMMA}% {BLACK}Kvarovi od posljednjeg servisa: {LTBLUE}{COMMA} STR_9011_BUILT_VALUE :{LTBLUE}{ENGINE}{BLACK} Izgrađen: {LTBLUE}{NUM}{BLACK} Vrijednost: {LTBLUE}{CURRENCY} STR_9012_CAPACITY :{BLACK}Kapacitet: {LTBLUE}{CARGO} @@ -2837,10 +2838,10 @@ STR_902C_NAME_ROAD_VEHICLE :{WHITE}Imenuj cestovno vozilo STR_902D_CAN_T_NAME_ROAD_VEHICLE :{WHITE}Ne mogu imenovati cestovno vozilo... STR_902E_NAME_ROAD_VEHICLE :{BLACK}Imenuj cestovno vozilo -STR_902F_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Građani slave . . .{}Prvi bus stiže na {STATION}! -STR_9030_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Građani slave . . .{}Prvi kamion stiže na {STATION}! -STR_902F_CITIZENS_CELEBRATE_FIRST_TRAM :{BLACK}{BIGFONT}Građani slave . . .{}Prvi putnički tramvaj stigao na stanicu {STATION}! -STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM :{BLACK}{BIGFONT}Građani slave . . .{}Prvi teretni vlak je stigao u {STATION}! +STR_902F_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Građani slave . . .{}Prvi bus je stigao na {STATION}! +STR_9030_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Građani slave . . .{}Prvi kamion je stigao na {STATION}! +STR_902F_CITIZENS_CELEBRATE_FIRST_TRAM :{BLACK}{BIGFONT}Građani slave . . .{}Prvi putnički tramvaj je stigao na {STATION}! +STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM :{BLACK}{BIGFONT}Građani slave . . .{}Prvi teretni tramvaj je stigao u {STATION}! STR_9031_ROAD_VEHICLE_CRASH_DRIVER :{BLACK}{BIGFONT}Sudar cestovnog vozila!{}Vozač poginuo u eksploziji nakon sudara s vlakom STR_9032_ROAD_VEHICLE_CRASH_DIE :{BLACK}{BIGFONT}Sudar cestovnog vozila!{}{COMMA} poginulih u eksploziji nakon sudara s vlakom STR_9033_CAN_T_MAKE_VEHICLE_TURN :{WHITE}Ne mogu natjerati vozilo da se okrene... @@ -2878,7 +2879,7 @@ STR_9811_DETAILS :{WHITE}{VEHICLE} (Detalji) STR_9812_AGE_RUNNING_COST_YR :{BLACK}Starost: {LTBLUE}{STRING}{BLACK} Trošak uporabe: {LTBLUE}{CURRENCY}/god STR_9813_MAX_SPEED :{BLACK}Maks. brzina: {LTBLUE}{VELOCITY} -STR_9814_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Zarada ove godine: {LTBLUE}{CURRENCY} (prošle godine: {CURRENCY}) +STR_9814_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Dobit ove godine: {LTBLUE}{CURRENCY} (prošle godine: {CURRENCY}) STR_9815_RELIABILITY_BREAKDOWNS :{BLACK}Pouzdanost: {LTBLUE}{COMMA}% {BLACK}Kvarova od posljednjeg servisa: {LTBLUE}{COMMA} STR_9816_BUILT_VALUE :{LTBLUE}{ENGINE}{BLACK} Izgrađeno: {LTBLUE}{NUM}{BLACK} Vrijednost: {LTBLUE}{CURRENCY} STR_9817_CAPACITY :{BLACK}Zapremnina: {LTBLUE}{CARGO} @@ -2910,7 +2911,7 @@ STR_9831_NAME_SHIP :{WHITE}Imenuj brod STR_9832_CAN_T_NAME_SHIP :{WHITE}Ne mogu imenovati brod... -STR_9833_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Građani slave . . .{}Prvi brod stigao do {STATION}! +STR_9833_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Građani slave . . .{}Prvi brod je stigao u {STATION}! STR_9834_POSITION_BUOY_WHICH_CAN :{BLACK}Smjesti plutaču koja može biti korištena kao pokazatelj puta STR_9835_CAN_T_POSITION_BUOY_HERE :{WHITE}Ne mogu staviti plutaču ovdje... STR_9836_RENAME :{BLACK}Preimenuj @@ -2946,7 +2947,7 @@ STR_A00C_DETAILS :{WHITE}{VEHICLE} (Detalji) STR_A00D_AGE_RUNNING_COST_YR :{BLACK}Starost: {LTBLUE}{STRING}{BLACK} Troškovi uporabe {LTBLUE}{CURRENCY}/god STR_A00E_MAX_SPEED :{BLACK}Maks brzina: {LTBLUE}{VELOCITY} -STR_A00F_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Zarada ove godine: {LTBLUE}{CURRENCY} (prošle godine: {CURRENCY}) +STR_A00F_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Dobit ove godine: {LTBLUE}{CURRENCY} (prošle godine: {CURRENCY}) STR_A010_RELIABILITY_BREAKDOWNS :{BLACK}Pouzdanost: {LTBLUE}{COMMA}% {BLACK}Kvarova od poslijednjeg servisa: {LTBLUE}{COMMA} STR_A011_BUILT_VALUE :{LTBLUE}{ENGINE}{BLACK} Izgrađen: {LTBLUE}{NUM}{BLACK} Vrijednost: {LTBLUE}{CURRENCY} STR_A012_CAN_T_SEND_AIRCRAFT_TO :{WHITE}Ne mogu poslati zrakoplov u hangar @@ -2982,7 +2983,7 @@ STR_A030_NAME_AIRCRAFT :{WHITE}Imenuj zrakoplov STR_A031_CAN_T_NAME_AIRCRAFT :{WHITE}Ne mogu imenovati zrakoplov... STR_A032_NAME_AIRCRAFT :{BLACK}Imenuj zrakoplov -STR_A033_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Građani slave . . .{}Prvi zrakoplov stigao je na {STATION}! +STR_A033_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Građani slave . . .{}Prvi zrakoplov je stigao na {STATION}! STR_A034_PLANE_CRASH_DIE_IN_FIREBALL :{BLACK}{BIGFONT}Pad zrakoplova!{}{COMMA} poginulih u eksploziji na {STATION} STR_PLANE_CRASH_OUT_OF_FUEL :{BLACK}{BIGFONT}Avionska nesreća{}Avion je ostao bez goriva, {COMMA} poginulo u nesreći STR_A036 :{TINYFONT}{BLACK}{STATION} @@ -2996,10 +2997,10 @@ STR_A03E_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Izaberi vrstu tereta koju će zrakoplov nositi STR_A03F_REFIT_AIRCRAFT_TO_CARRY :{BLACK}Prenamijeni zrakoplov da nosi označenu vrstu tereta STR_A040_SELECT_CARGO_TYPE_TO_CARRY :{GOLD}Označi vrstu tereta za prijenos: -STR_A041_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Novi kapacitet: {GOLD}{STRING}{}{BLACK}Trošak prenamijene: {GOLD}{CURRENCY} +STR_A041_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Novi kapacitet: {GOLD}{STRING}{}{BLACK}Trošak prenamjene: {GOLD}{CURRENCY} STR_A042_CAN_T_REFIT_AIRCRAFT :{WHITE}Ne mogu prenamijeniti zrakoplov... STR_GO_TO_AIRPORT_HANGAR :Idi u {STATION} Hangar -SERVICE_AT_AIRPORT_HANGAR :Servisiranje u hangaru {STATION} +SERVICE_AT_AIRPORT_HANGAR :Servis u hangaru {STATION} STR_TIMETABLE_TITLE :{WHITE}{VEHICLE} (Raspored) @@ -3025,7 +3026,7 @@ ############ Those following lines need to be in this order!! STR_PERFORMANCE_DETAIL_VEHICLES :{BLACK}Vozila: STR_PERFORMANCE_DETAIL_STATIONS :{BLACK}Stations: -STR_PERFORMANCE_DETAIL_MIN_PROFIT :{BLACK}Min. prihod: +STR_PERFORMANCE_DETAIL_MIN_PROFIT :{BLACK}Min. dobit: STR_PERFORMANCE_DETAIL_MIN_INCOME :{BLACK}Min. prihod: STR_PERFORMANCE_DETAIL_MAX_INCOME :{BLACK}Maks. prihod: STR_PERFORMANCE_DETAIL_DELIVERED :{BLACK}Dostavljeno: @@ -3036,13 +3037,13 @@ ############ End of order list STR_PERFORMANCE_DETAIL_VEHICLES_TIP :{BLACK}Broj vozila; ovo uključuje cestovna vozila, vlakove, brodove i avione STR_PERFORMANCE_DETAIL_STATIONS_TIP :{BLACK}Broj dijelova stanice. Svaki dio stanice (npr. željeznički kolodvor, autobusna postaja, aerodrom) se računa, čak i ako su spojene kao jedna stanica -STR_PERFORMANCE_DETAIL_MIN_PROFIT_TIP :{BLACK}Profit vozila sa najnižim prihodom(od svih vozila starijih od 2 godine) +STR_PERFORMANCE_DETAIL_MIN_PROFIT_TIP :{BLACK}Dobit vozila s najnižim prihodom (od svih vozila starijih od 2 godine) STR_PERFORMANCE_DETAIL_MIN_INCOME_TIP :{BLACK}Količina gotovine ostvarene u mjesecu sa najnižim profitom u zadnjih 12 četvrtina STR_PERFORMANCE_DETAIL_MAX_INCOME_TIP :{BLACK}Količina gotovine ostvarene u mjesecu za najvišim profitom u zadnjih 12 četvrtina STR_PERFORMANCE_DETAIL_DELIVERED_TIP :{BLACK}Jedinice tereta dostavljene u zadnje četiri četvrtine STR_PERFORMANCE_DETAIL_CARGO_TIP :{BLACK}Broj vrsta tereta dostavljenog u zadnjoj četvrtini STR_PERFORMANCE_DETAIL_MONEY_TIP :{BLACK}Količina novca koji ova kompanija ima u banci -STR_PERFORMANCE_DETAIL_LOAN_TIP :{BLACK}Iznos novca koji je ova kompanija pozajmila +STR_PERFORMANCE_DETAIL_LOAN_TIP :{BLACK}Iznos novca koji je ova tvrtka pozajmila STR_PERFORMANCE_DETAIL_TOTAL_TIP :{BLACK}Totalni broj bodova od mogućih bodova STR_NEWGRF_SETTINGS_BUTTON :{BLACK}NewGRF Postavke @@ -3104,7 +3105,7 @@ STR_CURRENCY_SWITCH_TO_EURO :{LTBLUE}Prebaci se na euro: {ORANGE}{NUM} STR_CURRENCY_SWITCH_TO_EURO_NEVER :{LTBLUE}Prebaci se na euro: {ORANGE}nikad STR_CURRENCY_PREVIEW :{LTBLUE}Prikaz: {ORANGE}{CURRENCY} -STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Promijeni parametar proizvoljne valute +STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Promijeni parametre proizvoljne valute STR_TRAIN :{BLACK}{TRAIN} STR_BUS :{BLACK}{BUS} @@ -3205,7 +3206,7 @@ STR_PURCHASE_INFO_COST_WEIGHT :{BLACK}Trošak: {GOLD}{CURRENCY}{BLACK} Težina {GOLD}{WEIGHT_S} STR_PURCHASE_INFO_SPEED_POWER :{BLACK}Brzina: {GOLD}{VELOCITY}{BLACK} Snaga: {GOLD}{POWER} STR_PURCHASE_INFO_SPEED :{BLACK}Brzina: {GOLD}{VELOCITY} -STR_PURCHASE_INFO_RUNNINGCOST :{BLACK}Radni trošak: {GOLD}{CURRENCY}/god +STR_PURCHASE_INFO_RUNNINGCOST :{BLACK}Trošak uporabe: {GOLD}{CURRENCY}/god STR_PURCHASE_INFO_CAPACITY :{BLACK}Kapacitet: {GOLD}{CARGO}{STRING} STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}Dizajnirana: {GOLD}{NUM}{BLACK} Životni vijek: {GOLD}{COMMA} godina STR_PURCHASE_INFO_RELIABILITY :{BLACK}Maks. pouzdanost: {GOLD}{COMMA}% @@ -3230,7 +3231,7 @@ STR_LAND_GENERATOR :{BLACK}Izrađivač zemljišta: STR_TREE_PLACER :{BLACK} Algoritam za drveće: STR_HEIGHTMAP_ROTATION :{BLACK}Rotacija visinske mape: -STR_TERRAIN_TYPE :{BLACK}Tip terena: +STR_TERRAIN_TYPE :{BLACK}Vrsta terena: STR_QUANTITY_OF_SEA_LAKES :{BLACK}Razina mora: STR_SMOOTHNESS :{BLACK}Graduacija: STR_SNOW_LINE_HEIGHT :{BLACK}Visina linije snijega @@ -3259,7 +3260,7 @@ STR_TREE_GENERATION :{BLACK}Generiranje drveća STR_UNMOVABLE_GENERATION :{BLACK}Nepomično generiranje STR_CLEARING_TILES :{BLACK}Generiranje grubog i stjenovitog područja -STR_SETTINGUP_GAME :{BLACK}Uspostavljam igru +STR_SETTINGUP_GAME :{BLACK}Pripremam igru STR_PREPARING_TILELOOP :{BLACK}Izvršavam tile-petlju STR_PREPARING_GAME :{BLACK}Pripremam igru STR_DIFFICULTY_TO_CUSTOM :{WHITE}Ova akcija je izmjenila težinu na proizvoljnu diff -r 31fcaa5375a1 -r e72987579514 src/lang/german.txt --- a/src/lang/german.txt Fri Aug 03 19:16:36 2007 +0000 +++ b/src/lang/german.txt Fri Aug 03 22:09:42 2007 +0000 @@ -1231,11 +1231,11 @@ STR_EDIT_WAYPOINT_NAME :{WHITE}Wegpunktename ändern STR_CANT_CHANGE_WAYPOINT_NAME :{WHITE}Kann Wegpunktname nicht ändern... -STR_CONVERT_RAIL_TO_WAYPOINT_TIP :{BLACK}Ändere Schiene in einen Wegpunkt +STR_CONVERT_RAIL_TO_WAYPOINT_TIP :{BLACK}Ändere Gleis in einen Wegpunkt STR_CANT_BUILD_TRAIN_WAYPOINT :{WHITE}Kann Wegpunkt hier nicht bauen... STR_CANT_REMOVE_TRAIN_WAYPOINT :{WHITE}Kann Wegpunkt hier nicht entfernen... -STR_BUILD_AUTORAIL_TIP :{BLACK}Bauen von Schienen unter Verwendung des Autoschienenmodus +STR_BUILD_AUTORAIL_TIP :{BLACK}Bauen von Gleisen unter Verwendung des Automatikmodus STR_NO_TOWN_IN_SCENARIO :{WHITE}...in diesem Szenario gibt es keine Stadt @@ -3158,7 +3158,7 @@ STR_REPLACE_HELP_RIGHT_ARRAY :{BLACK}Wähle den Fahrzeugtyp, der anstelle des links gewählten Fahrzeugs verwendet werden soll STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Drücke diesen Button, wenn das Fahrzeug auf der linken Seite nicht ersetzt werden soll STR_REPLACE_HELP_START_BUTTON :{BLACK}Drücke diesen Button, wenn das Fahrzeug auf der linken Seite durch das auf der rechten Seite gewählte ersetzt werden soll -STR_REPLACE_HELP_RAILTYPE :{BLACK}Wähle einen Schienentyp für den Loks ersetzt werden sollen +STR_REPLACE_HELP_RAILTYPE :{BLACK}Wähle einen Gleistyp für den Loks ersetzt werden sollen STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Hier wird angezeigt, gegen welches Fahrzeug das auf der linken Seite gewählte ersetzt wird STR_REPLACE_HELP :{BLACK}Dieses Feature ermöglicht es, einen Fahrzeugtyp auszuwählen und ihn durch einen anderen ersetzen zu lassen. Dies geschieht automatisch, wenn das Fahrzeug regulär das Depot besucht. STR_REPLACE_REMOVE_WAGON :{BLACK}Waggon-Entfernung: {ORANGE}{SKIP}{STRING} diff -r 31fcaa5375a1 -r e72987579514 src/lang/polish.txt --- a/src/lang/polish.txt Fri Aug 03 19:16:36 2007 +0000 +++ b/src/lang/polish.txt Fri Aug 03 22:09:42 2007 +0000 @@ -2099,6 +2099,9 @@ STR_4829_REQUIRES :{BLACK}Wymaga: {YELLOW}{STRING}, {STRING}, {STRING} ############ range for requires ends +############ range for produces starts +############ range for produces ends + STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Wyprodukowano w ostatnim miesiącu: STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% przetransportowano) STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Centruj główny widok na przedsiębiorstwie @@ -3451,6 +3454,10 @@ STR_GROUP_ALL_ROADS :Wszystkie samochody STR_GROUP_ALL_SHIPS :Wszystkie statki STR_GROUP_ALL_AIRCRAFTS :Wszystkie samoloty +STR_GROUP_DEFAULT_TRAINS :Pociągi bez grupy +STR_GROUP_DEFAULT_ROADS :Samochody bez grupy +STR_GROUP_DEFAULT_SHIPS :Statki bez grupy +STR_GROUP_DEFAULT_AIRCRAFTS :Samoloty bez grupy STR_GROUP_TINY_NUM :{TINYFONT}{COMMA} STR_GROUP_ADD_SHARED_VEHICLE :Dodaj poj. współdzielące STR_GROUP_REMOVE_ALL_VEHICLES :Usuń wszystkie pojazdy @@ -3494,3 +3501,5 @@ STR_PREVIOUS_SIGN_TOOLTIP :{BLACK}Idź do poprzedniej tablicy ######## + +STR_INDUSTRY_SELECTION_HINT :{BLACK}Wybierz przedsiębiorstwo z listy diff -r 31fcaa5375a1 -r e72987579514 src/macros.h --- a/src/macros.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/macros.h Fri Aug 03 22:09:42 2007 +0000 @@ -5,11 +5,57 @@ #ifndef MACROS_H #define MACROS_H -/* Fetch n bits starting at bit s from x */ +/** + * Fetch n bits from x, started at bit s. + * + * This macro can be used to fetch n bits from the value x. The + * s value set the startposition to read. The startposition is + * count from the LSB and starts at 0. The result starts at a + * LSB, as this isn't just an and-bitmask but also some + * bit-shifting operations. GB(0xFF, 2, 1) will so + * return 0x01 (0000 0001) instead of + * 0x04 (0000 0100). + * + * @param x The value to read some bits. + * @param s The startposition to read some bits. + * @param n The number of bits to read. + * @return The selected bits, aligned to a LSB. + */ #define GB(x, s, n) (((x) >> (s)) & ((1U << (n)) - 1)) -/* Set n bits starting at bit s in x to d */ + +/** Set n bits from x starting at bit s to d + * + * This macro sets n bits from x which started as bit s to the value of + * d. The parameters x, s and n works the same as the parameters of + * #GB. The result is saved in x again. Unused bits in the window + * provided by n are set to 0 if the value of b isn't "big" enough. + * This is not a bug, its a feature. + * + * @note Parameter x must be a variable as the result is saved there. + * @note To avoid unexpecting results the value of b should not use more + * space as the provided space of n bits (log2) + * @param x The variable to change some bits + * @param s The startposition for the new bits + * @param n The size/window for the new bits + * @param d The actually new bits to save in the defined position. + * @return The new value of x + */ #define SB(x, s, n, d) ((x) = ((x) & ~(((1U << (n)) - 1) << (s))) | ((d) << (s))) -/* Add i to the n bits starting at bit s in x */ + +/** Add i to n bits of x starting at bit s. + * + * This add the value of i on n bits of x starting at bit s. The parameters x, + * s, i are similar to #GB besides x must be a variable as the result are + * saved there. An overflow does not affect the following bits of the given + * bit window and is simply ignored. + * + * @note Parameter x must be a variable as the result is saved there. + * @param x The variable to add some bits at some position + * @param s The startposition of the addition + * @param n The size/window for the addition + * @param i The value to add at the given startposition in the given window. + * @return The new value of x + */ #define AB(x, s, n, i) ((x) = ((x) & ~(((1U << (n)) - 1) << (s))) | (((x) + ((i) << (s))) & (((1U << (n)) - 1) << (s)))) #ifdef min @@ -20,23 +66,76 @@ #undef max #endif +/** + * Returns the maximum of two values. + * + * This function returns the greater value of two given values. + * If they are equal the value of a is returned. + * + * @param a The first value + * @param b The second value + * @return The greater value or a if equals + */ template static inline T max(T a, T b) { return a >= b ? a : b; } +/** + * Returns the minimum of two values. + * + * This function returns the smaller value of two given values. + * If they are equal the value of b is returned. + * + * @param a The first value + * @param b The second value + * @return The smaller value or b if equals + */ template static inline T min(T a, T b) { return a < b ? a : b; } +/** + * Returns the minimum of two integer. + * + * This function returns the smaller value of two given integers. + * + * @param a The first integer + * @param b The second integer + * @return The smaller value + */ static inline int min(int a, int b) { if (a <= b) return a; return b; } +/** + * Returns the minimum of two unsigned integers. + * + * This function returns the smaller value of two given unsigned integers. + * + * @param a The first unsigned integer + * @param b The second unsigned integer + * @return The smaller value + */ static inline uint minu(uint a, uint b) { if (a <= b) return a; return b; } - +/** + * Clamp an integer between an interval. + * + * This function returns a value which is between the given interval of + * min and max. If the given value is in this interval the value itself + * is returned otherwise the border of the interval is returned, according + * which side of the interval was 'left'. + * + * @note The min value must be less or equal of max or you get some + * unexpected results. + * @param a The value to clamp/truncate. + * @param min The minimum of the interval. + * @param max the maximum of the interval. + * @returns A value between min and max which is closest to a. + * @see clampu(uint, uint, uint) + */ static inline int clamp(int a, int min, int max) { if (a <= min) return min; @@ -44,6 +143,22 @@ return a; } +/** + * Clamp an unsigned integer between an interval. + * + * This function returns a value which is between the given interval of + * min and max. If the given value is in this interval the value itself + * is returned otherwise the border of the interval is returned, according + * which side of the interval was 'left'. + * + * @note The min value must be less or equal of max or you get some + * unexpected results. + * @param a The value to clamp/truncate. + * @param min The minimum of the interval. + * @param max the maximum of the interval. + * @returns A value between min and max which is closest to a. + * @see clamp(int, int, int) + */ static inline uint clampu(uint a, uint min, uint max) { if (a <= min) return min; @@ -51,7 +166,20 @@ return a; } -/* Gracefully reduce a signed 64-bit int to signed 32-bit -- no bogusly truncating the sign bit */ +/** + * Reduce a signed 64-bit int to a signed 32-bit one + * + * This function clamps a 64-bit integer to a 32-bit integer. + * If the 64-bit value is smaller than the smallest 32-bit integer + * value 0x80000000 this value is returned (the left one bit is the sign bit). + * If the 64-bit value is greater than the greatest 32-bit integer value 0x7FFFFFFF + * this value is returned. In all other cases the 64-bit value 'fits' in a + * 32-bits integer field and so the value is casted to int32 and returned. + * + * @param a The 64-bit value to clamps + * @return The 64-bit value reduced to a 32-bit value + * @see clamp(int, int, int) + */ static inline int32 ClampToI32(int64 a) { if (a <= (int32)0x80000000) return 0x80000000; @@ -59,36 +187,114 @@ return (int32)a; } +/** + * Multiply two integer values and shift the results to right. + * + * This function multiplies two integer values. The result is + * shifted by the amount of shift to right. + * + * @param a The first integer + * @param b The second integer + * @param shift The amount to shift the value to right. + * @return The shifted result + */ static inline int32 BIGMULSS(int32 a, int32 b, int shift) { return (int32)((int64)a * (int64)b >> shift); } +/** + * Multiply two unsigned integers and shift the results to right. + * + * This function multiplies two unsigned integers. The result is + * shifted by the amount of shift to right. + * + * @param a The first unsigned integer + * @param b The second unsigned integer + * @param shift The amount to shift the value to right. + * @return The shifted result + */ static inline uint32 BIGMULUS(uint32 a, uint32 b, int shift) { return (uint32)((uint64)a * (uint64)b >> shift); } +/** + * Checks if a value is between a window started at some base point. + * + * This macro checks if the value x is between the value of base + * and base+size. If x equals base this returns true. If x equals + * base+size this returns false. + * + * @param x The value to check + * @param base The base value of the interval + * @param size The size of the interval + * @return True if the value is in the interval, false else. + */ /* OPT: optimized into an unsigned comparison */ //#define IS_INSIDE_1D(x, base, size) ((x) >= (base) && (x) < (base) + (size)) #define IS_INSIDE_1D(x, base, size) ( (uint)((x) - (base)) < ((uint)(size)) ) +/** + * Checks if a bit in a value is set. + * + * This function checks if a bit inside a value is set or not. + * The y value specific the position of the bit, started at the + * LSB and count from 0. + * + * @param x The value to check + * @param y The position of the bit to check, started from the LSB + * @return True if the bit is set, false else. + */ template static inline bool HASBIT(T x, int y) { return (x & ((T)1 << y)) != 0; } +/** + * Set a bit in a variable. + * + * This function sets a bit in a variable. The variable is changed + * and the value is also returned. Parameter y defines the bit and + * starts at the LSB with 0. + * + * @param x The variable to set a bit + * @param y The bit position to set + * @return The new value of the old value with the bit set + */ template static inline T SETBIT(T& x, int y) { return x |= (T)1 << y; } +/** + * Clears a bit in a variable. + * + * This function clears a bit in a variable. The variable is + * changed and the value is also returned. Parameter y defines the bit + * to clear and starts at the LSB with 0. + * + * @param x The variable to clear the bit + * @param y The bit position to clear + * @return The new value of the old value with the bit cleared + */ template static inline T CLRBIT(T& x, int y) { return x &= ~((T)1 << y); } +/** + * Toggles a bit in a variable. + * + * This function toggles a bit in a variable. The variable is + * changed and the value is also returned. Parameter y defines the bit + * to toggle and starts at the LSB with 0. + * + * @param x The varliable to toggle the bit + * @param y The bit position to toggle + * @return The new value of the old value with the bit toggled + */ template static inline T TOGGLEBIT(T& x, int y) { return x ^= (T)1 << y; @@ -96,24 +302,84 @@ /* checking more bits. Maybe unneccessary, but easy to use */ +/** + * Check several bits in a value. + * + * This macro checks if a value contains at least one bit of an other + * value. + * + * @param x The first value + * @param y The second value + * @return True if at least one bit is set in both values, false else. + */ #define HASBITS(x, y) ((x) & (y)) + +/** + * Sets several bits in a variable. + * + * This macro sets several bits in a variable. The bits to set are provided + * by a value. The new value is also returned. + * + * @param x The variable to set some bits + * @param y The value with set bits for setting them in the variable + * @return The new value of x + */ #define SETBITS(x, y) ((x) |= (y)) + +/** + * Clears several bits in a variable. + * + * This macro clears several bits in a variable. The bits to clear are + * provided by a value. The new value is also returned. + * + * @param x The variable to clear some bits + * @param y The value with set bits for clearing them in the variable + * @return The new value of x + */ #define CLRBITS(x, y) ((x) &= ~(y)) #define GENERAL_SPRITE_COLOR(color) ((color) + PALETTE_RECOLOR_START) #define PLAYER_SPRITE_COLOR(owner) (GENERAL_SPRITE_COLOR(_player_colors[owner])) extern const byte _ffb_64[128]; -/* Returns the position of the first bit that is not zero, counted from the - * left. Ie, 10110100 returns 2, 00000001 returns 0, etc. When x == 0 returns + +/** + * Returns the first occure of a bit in a 6-bit value (from right). + * + * Returns the position of the first bit that is not zero, counted from the + * LSB. Ie, 110100 returns 2, 000001 returns 0, etc. When x == 0 returns * 0. + * + * @param x The 6-bit value to check the first zero-bit + * @return The first position of a bit started from the LSB or 0 if x is 0. */ #define FIND_FIRST_BIT(x) _ffb_64[(x)] -/* Returns x with the first bit that is not zero, counted from the left, set - * to zero. So, 10110100 returns 10110000, 00000001 returns 00000000, etc. + +/** + * Returns a value with the first occured of a bit set to zero. + * + * Returns x with the first bit from LSB that is not zero set + * to zero. So, 110100 returns 110000, 000001 returns 000000, etc. + * + * @param x The value to returned a new value + * @return The value which the first bit is set to zero */ #define KILL_FIRST_BIT(x) _ffb_64[(x) + 64] +/** + * Finds the position of the first bit in an integer. + * + * This function returns the position of the first bit set in the + * integer. It does only check the bits of the bitmask + * 0x3F3F (0011111100111111) and checks only the + * bits of the bitmask 0x3F00 if and only if the + * lower part 0x00FF is 0. This results the bits at 0x00C0 must + * be also zero to check the bits at 0x3F00. + * + * @param value The value to check the first bits + * @return The position of the first bit which is set + * @see FIND_FIRST_BIT + */ static inline int FindFirstBit2x64(int value) { /* @@ -131,9 +397,20 @@ } else { return FIND_FIRST_BIT(GB(value, 0, 6)); } - } +/** + * Clear the first bit in an integer. + * + * This function returns a value where the first bit (from LSB) + * is cleared. This function checks, similar to FindFirstBit2x64, + * the bits at 0x3F3F. + * + * @param value The value to clear the first bit + * @return The new value with the first bit cleared + * @see KILL_FIRST_BIT + * @see FindFirstBit2x64 + */ static inline int KillFirstBit2x64(int value) { if (GB(value, 0, 8) == 0) { @@ -143,16 +420,77 @@ } } -/** returns true if value a has only one bit set to 1 */ +/** + * Returns true if value a has only one bit set to 1 + * + * This macro returns true if only one bit is set. + * + * @param a The value to check + * @return True if only one bit is set, false else + */ #define HAS_SINGLE_BIT(a) ( ((a) & ((a) - 1)) == 0) -/* [min,max), strictly less than */ +/** + * Checks if a byte is in an interval. + * + * This macro returns true if a byte value is in the interval of [min, max). + * + * @param a The byte value to check + * @param min The minimum of the interval + * @param max The maximum of the interval + * @see IS_INSIDE_1D + */ #define IS_BYTE_INSIDE(a, min, max) ((byte)((a) - (min)) < (byte)((max) - (min))) + +/** + * Checks if an int is in an interval. + * + * This macro returns true if a integer value is in the interval of [min, max). + * + * @param a The integer value to check + * @param min The minimum of the interval + * @param max The maximum of the interval + * @see IS_INSIDE_1D + */ #define IS_INT_INSIDE(a, min, max) ((uint)((a) - (min)) < (uint)((max) - (min))) +/** + * Flips a coin with a given probability. + * + * This macro can be used to get true or false randomized according to a + * given probability. The parameter a and b create a percent value with + * (a/b). The macro returns true in (a/b) percent. + * + * @param a The numerator of the fraction + * @param b The denominator of the fraction, must of course not be null + * @return True in (a/b) percent + */ +#define CHANCE16(a, b) ((uint16)Random() <= (uint16)((65536 * (a)) / (b))) -#define CHANCE16(a, b) ((uint16)Random() <= (uint16)((65536 * (a)) / (b))) +/** + * Flips a coin with a given probability and saves the randomize-number in a variable. + * + * This macro uses the same parameters as the CHANCE16 marco. The third parameter + * must be a variable the randomize-number from Random() is saved in. + * + * @param a The numerator of the fraction, see CHANCE16 + * @param b The denominator of the fraction, see CHANCE16 + * @param r The variable to save the randomize-number from Random() + * @return True in (a/b) percent + */ #define CHANCE16R(a, b, r) ((uint16)(r = Random()) <= (uint16)((65536 * (a)) / (b))) + +/** + * Checks if a given randomize-number is below a given probability. + * + * This macro is used to check if the given probability by the fraction of (a/b) + * is greater than the given randomize-number v. + * + * @param a The numerator of the fraction, see CHANCE16 + * @param b The denominator of the fraction, see CHANCE16 + * @param v The given randomize-number + * @return True if v is less or equals (a/b) + */ #define CHANCE16I(a, b, v) ((uint16)(v) <= (uint16)((65536 * (a)) / (b))) diff -r 31fcaa5375a1 -r e72987579514 src/main_gui.cpp --- a/src/main_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/main_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -744,9 +744,9 @@ return w; } -static Window *PopupMainPlayerToolbMenu(Window *w, int x, int main_button, int gray) +static Window *PopupMainPlayerToolbMenu(Window *w, int main_button, int gray) { - x += w->left; + int x = w->widget[main_button].left + w->left; LowerWindowWidget(w, main_button); InvalidateWidget(w, main_button); @@ -795,17 +795,17 @@ static void ToolbarStationsClick(Window *w) { - PopupMainPlayerToolbMenu(w, 162, 7, 0); + PopupMainPlayerToolbMenu(w, 7, 0); } static void ToolbarMoneyClick(Window *w) { - PopupMainPlayerToolbMenu(w, 191, 8, 0); + PopupMainPlayerToolbMenu(w, 8, 0); } static void ToolbarPlayersClick(Window *w) { - PopupMainPlayerToolbMenu(w, 213, 9, 0); + PopupMainPlayerToolbMenu(w, 9, 0); } static void ToolbarGraphsClick(Window *w) @@ -832,7 +832,7 @@ FOR_ALL_VEHICLES(v) { if (v->type == VEH_TRAIN && IsFrontEngine(v)) CLRBIT(dis, v->owner); } - PopupMainPlayerToolbMenu(w, 310, 13, dis); + PopupMainPlayerToolbMenu(w, 13, dis); } static void ToolbarRoadClick(Window *w) @@ -843,7 +843,7 @@ FOR_ALL_VEHICLES(v) { if (v->type == VEH_ROAD && IsRoadVehFront(v)) CLRBIT(dis, v->owner); } - PopupMainPlayerToolbMenu(w, 332, 14, dis); + PopupMainPlayerToolbMenu(w, 14, dis); } static void ToolbarShipClick(Window *w) @@ -854,7 +854,7 @@ FOR_ALL_VEHICLES(v) { if (v->type == VEH_SHIP) CLRBIT(dis, v->owner); } - PopupMainPlayerToolbMenu(w, 354, 15, dis); + PopupMainPlayerToolbMenu(w, 15, dis); } static void ToolbarAirClick(Window *w) @@ -865,7 +865,7 @@ FOR_ALL_VEHICLES(v) { if (v->type == VEH_AIRCRAFT) CLRBIT(dis, v->owner); } - PopupMainPlayerToolbMenu(w, 376, 16, dis); + PopupMainPlayerToolbMenu(w, 16, dis); } /* Zooms a viewport in a window in or out */ @@ -1404,7 +1404,7 @@ } static const WindowDesc _scen_edit_land_gen_desc = { - WDP_AUTO, WDP_AUTO, 182, 103, + WDP_AUTO, WDP_AUTO, 182, 103, 182, 103, WC_SCEN_LAND_GEN, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON, _scen_edit_land_gen_widgets, @@ -1525,7 +1525,7 @@ } static const WindowDesc _scen_edit_town_gen_desc = { - WDP_AUTO, WDP_AUTO, 160, 95, + WDP_AUTO, WDP_AUTO, 160, 95, 160, 95, WC_SCEN_TOWN_GEN, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON, _scen_edit_town_gen_widgets, @@ -1649,7 +1649,13 @@ case WKC_SHIFT | WKC_F2: ShowVehicleListWindow(_local_player, VEH_ROAD); break; case WKC_SHIFT | WKC_F3: ShowVehicleListWindow(_local_player, VEH_SHIP); break; case WKC_SHIFT | WKC_F4: ShowVehicleListWindow(_local_player, VEH_AIRCRAFT); break; + case WKC_NUM_PLUS: // Fall through + case WKC_EQUALS: // Fall through + case WKC_SHIFT | WKC_EQUALS: // Fall through case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(w); break; + case WKC_NUM_MINUS: // Fall through + case WKC_MINUS: // Fall through + case WKC_SHIFT | WKC_MINUS: // Fall through case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(w); break; case WKC_SHIFT | WKC_F7: if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype, -1); break; case WKC_SHIFT | WKC_F8: ShowBuildRoadToolbar(_last_built_roadtype); break; @@ -1660,8 +1666,10 @@ case WKC_CTRL | 'S': MenuClickSmallScreenshot(); break; case WKC_CTRL | 'G': MenuClickWorldScreenshot(); break; case WKC_CTRL | WKC_ALT | 'C': if (!_networking) ShowCheatWindow(); break; - case 'A': if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype, 4); break; /* Invoke Autorail */ + case 'A': if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype, 4); break; // Invoke Autorail case 'L': ShowTerraformToolbar(); break; + case 'M': ShowSmallMap(); break; + case 'V': ShowExtraViewPortWindow(); break; default: return; } e->we.keypress.cont = false; @@ -1688,6 +1696,33 @@ } break; + case WE_RESIZE: { + /* There are 27 buttons plus some spacings if the space allows it */ + uint button_width; + uint spacing; + if (w->width >= 27 * 22) { + button_width = 22; + spacing = w->width - (27 * button_width); + } else { + button_width = w->width / 27; + spacing = 0; + } + uint extra_spacing_at[] = { 4, 8, 13, 17, 19, 24, 0 }; + + for (uint i = 0, x = 0, j = 0; i < 27; i++) { + if (extra_spacing_at[j] == i) { + j++; + uint add = spacing / (lengthof(extra_spacing_at) - j); + spacing -= add; + x += add; + } + + w->widget[i].left = x; + x += (spacing != 0) ? button_width : (w->width - x) / (27 - i); + w->widget[i].right = x - 1; + } + } break; + case WE_TIMEOUT: { uint i; for (i = 2; i < w->widget_count; i++) { @@ -1706,44 +1741,44 @@ } static const Widget _toolb_normal_widgets[] = { -{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 21, 0, 21, SPR_IMG_PAUSE, STR_0171_PAUSE_GAME}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 22, 43, 0, 21, SPR_IMG_FASTFORWARD, STR_FAST_FORWARD}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 44, 65, 0, 21, SPR_IMG_SETTINGS, STR_0187_OPTIONS}, -{ WWT_IMGBTN_2, RESIZE_NONE, 14, 66, 87, 0, 21, SPR_IMG_SAVE, STR_0172_SAVE_GAME_ABANDON_GAME}, - -{ WWT_IMGBTN, RESIZE_NONE, 14, 96, 117, 0, 21, SPR_IMG_SMALLMAP, STR_0174_DISPLAY_MAP}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 118, 139, 0, 21, SPR_IMG_TOWN, STR_0176_DISPLAY_TOWN_DIRECTORY}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 140, 161, 0, 21, SPR_IMG_SUBSIDIES, STR_02DC_DISPLAY_SUBSIDIES}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 162, 183, 0, 21, SPR_IMG_COMPANY_LIST, STR_0173_DISPLAY_LIST_OF_COMPANY}, - -{ WWT_IMGBTN, RESIZE_NONE, 14, 191, 212, 0, 21, SPR_IMG_COMPANY_FINANCE, STR_0177_DISPLAY_COMPANY_FINANCES}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 213, 235, 0, 21, SPR_IMG_COMPANY_GENERAL, STR_0178_DISPLAY_COMPANY_GENERAL}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 236, 257, 0, 21, SPR_IMG_GRAPHS, STR_0179_DISPLAY_GRAPHS}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 258, 279, 0, 21, SPR_IMG_COMPANY_LEAGUE, STR_017A_DISPLAY_COMPANY_LEAGUE}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 280, 301, 0, 21, SPR_IMG_INDUSTRY, STR_0312_FUND_CONSTRUCTION_OF_NEW}, +{ WWT_IMGBTN, RESIZE_LEFT, 14, 0, 0, 0, 21, SPR_IMG_PAUSE, STR_0171_PAUSE_GAME}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_FASTFORWARD, STR_FAST_FORWARD}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SETTINGS, STR_0187_OPTIONS}, +{ WWT_IMGBTN_2, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SAVE, STR_0172_SAVE_GAME_ABANDON_GAME}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 310, 331, 0, 21, SPR_IMG_TRAINLIST, STR_017B_DISPLAY_LIST_OF_COMPANY}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 332, 353, 0, 21, SPR_IMG_TRUCKLIST, STR_017C_DISPLAY_LIST_OF_COMPANY}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 354, 375, 0, 21, SPR_IMG_SHIPLIST, STR_017D_DISPLAY_LIST_OF_COMPANY}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 376, 397, 0, 21, SPR_IMG_AIRPLANESLIST, STR_017E_DISPLAY_LIST_OF_COMPANY}, - -{ WWT_IMGBTN, RESIZE_NONE, 14, 406, 427, 0, 21, SPR_IMG_ZOOMIN, STR_017F_ZOOM_THE_VIEW_IN}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 428, 449, 0, 21, SPR_IMG_ZOOMOUT, STR_0180_ZOOM_THE_VIEW_OUT}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SMALLMAP, STR_0174_DISPLAY_MAP}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_TOWN, STR_0176_DISPLAY_TOWN_DIRECTORY}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SUBSIDIES, STR_02DC_DISPLAY_SUBSIDIES}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_COMPANY_LIST, STR_0173_DISPLAY_LIST_OF_COMPANY}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 457, 478, 0, 21, SPR_IMG_BUILDRAIL, STR_0181_BUILD_RAILROAD_TRACK}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 479, 500, 0, 21, SPR_IMG_BUILDROAD, STR_0182_BUILD_ROADS}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 501, 522, 0, 21, SPR_IMG_BUILDWATER, STR_0183_BUILD_SHIP_DOCKS}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 523, 544, 0, 21, SPR_IMG_BUILDAIR, STR_0184_BUILD_AIRPORTS}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 545, 566, 0, 21, SPR_IMG_LANDSCAPING, STR_LANDSCAPING_TOOLBAR_TIP}, // tree icon is 0x2E6 +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_COMPANY_FINANCE, STR_0177_DISPLAY_COMPANY_FINANCES}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_COMPANY_GENERAL, STR_0178_DISPLAY_COMPANY_GENERAL}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_GRAPHS, STR_0179_DISPLAY_GRAPHS}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_COMPANY_LEAGUE, STR_017A_DISPLAY_COMPANY_LEAGUE}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_INDUSTRY, STR_0312_FUND_CONSTRUCTION_OF_NEW}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 574, 595, 0, 21, SPR_IMG_MUSIC, STR_01D4_SHOW_SOUND_MUSIC_WINDOW}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 596, 617, 0, 21, SPR_IMG_MESSAGES, STR_0203_SHOW_LAST_MESSAGE_NEWS}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 618, 639, 0, 21, SPR_IMG_QUERY, STR_0186_LAND_BLOCK_INFORMATION}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_TRAINLIST, STR_017B_DISPLAY_LIST_OF_COMPANY}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_TRUCKLIST, STR_017C_DISPLAY_LIST_OF_COMPANY}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SHIPLIST, STR_017D_DISPLAY_LIST_OF_COMPANY}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_AIRPLANESLIST, STR_017E_DISPLAY_LIST_OF_COMPANY}, + +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_ZOOMIN, STR_017F_ZOOM_THE_VIEW_IN}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_ZOOMOUT, STR_0180_ZOOM_THE_VIEW_OUT}, + +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDRAIL, STR_0181_BUILD_RAILROAD_TRACK}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDROAD, STR_0182_BUILD_ROADS}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDWATER, STR_0183_BUILD_SHIP_DOCKS}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDAIR, STR_0184_BUILD_AIRPORTS}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_LANDSCAPING, STR_LANDSCAPING_TOOLBAR_TIP}, // tree icon is 0x2E6 + +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_MUSIC, STR_01D4_SHOW_SOUND_MUSIC_WINDOW}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_MESSAGES, STR_0203_SHOW_LAST_MESSAGE_NEWS}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_QUERY, STR_0186_LAND_BLOCK_INFORMATION}, { WIDGETS_END}, }; static const WindowDesc _toolb_normal_desc = { - 0, 0, 640, 22, + 0, 0, 0, 22, 640, 22, WC_MAIN_TOOLBAR, WC_NONE, WDF_STD_TOOLTIPS | WDF_DEF_WIDGET, _toolb_normal_widgets, @@ -1752,28 +1787,28 @@ static const Widget _toolb_scen_widgets[] = { -{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 21, 0, 21, SPR_IMG_PAUSE, STR_0171_PAUSE_GAME}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 22, 43, 0, 21, SPR_IMG_FASTFORWARD, STR_FAST_FORWARD}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 44, 65, 0, 21, SPR_IMG_SETTINGS, STR_0187_OPTIONS}, -{WWT_IMGBTN_2, RESIZE_NONE, 14, 66, 87, 0, 21, SPR_IMG_SAVE, STR_0297_SAVE_SCENARIO_LOAD_SCENARIO}, - -{ WWT_PANEL, RESIZE_NONE, 14, 96, 225, 0, 21, 0x0, STR_NULL}, - -{ WWT_PANEL, RESIZE_NONE, 14, 233, 362, 0, 21, 0x0, STR_NULL}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 236, 247, 5, 16, SPR_ARROW_DOWN, STR_029E_MOVE_THE_STARTING_DATE}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 347, 358, 5, 16, SPR_ARROW_UP, STR_029F_MOVE_THE_STARTING_DATE}, +{ WWT_IMGBTN, RESIZE_LEFT, 14, 0, 0, 0, 21, SPR_IMG_PAUSE, STR_0171_PAUSE_GAME}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_FASTFORWARD, STR_FAST_FORWARD}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SETTINGS, STR_0187_OPTIONS}, +{WWT_IMGBTN_2, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SAVE, STR_0297_SAVE_SCENARIO_LOAD_SCENARIO}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 371, 392, 0, 21, SPR_IMG_SMALLMAP, STR_0175_DISPLAY_MAP_TOWN_DIRECTORY}, - -{ WWT_IMGBTN, RESIZE_NONE, 14, 400, 421, 0, 21, SPR_IMG_ZOOMIN, STR_017F_ZOOM_THE_VIEW_IN}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 422, 443, 0, 21, SPR_IMG_ZOOMOUT, STR_0180_ZOOM_THE_VIEW_OUT}, +{ WWT_PANEL, RESIZE_NONE, 14, 0, 0, 0, 21, 0x0, STR_NULL}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 452, 473, 0, 21, SPR_IMG_LANDSCAPING, STR_022E_LANDSCAPE_GENERATION}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 474, 495, 0, 21, SPR_IMG_TOWN, STR_022F_TOWN_GENERATION}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 496, 517, 0, 21, SPR_IMG_INDUSTRY, STR_0230_INDUSTRY_GENERATION}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 518, 539, 0, 21, SPR_IMG_BUILDROAD, STR_0231_ROAD_CONSTRUCTION}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 540, 561, 0, 21, SPR_IMG_PLANTTREES, STR_0288_PLANT_TREES}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 562, 583, 0, 21, SPR_IMG_SIGN, STR_0289_PLACE_SIGN}, +{ WWT_PANEL, RESIZE_NONE, 14, 0, 129, 0, 21, 0x0, STR_NULL}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 3, 14, 5, 16, SPR_ARROW_DOWN, STR_029E_MOVE_THE_STARTING_DATE}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 113, 125, 5, 16, SPR_ARROW_UP, STR_029F_MOVE_THE_STARTING_DATE}, + +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SMALLMAP, STR_0175_DISPLAY_MAP_TOWN_DIRECTORY}, + +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_ZOOMIN, STR_017F_ZOOM_THE_VIEW_IN}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_ZOOMOUT, STR_0180_ZOOM_THE_VIEW_OUT}, + +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_LANDSCAPING, STR_022E_LANDSCAPE_GENERATION}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_TOWN, STR_022F_TOWN_GENERATION}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_INDUSTRY, STR_0230_INDUSTRY_GENERATION}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDROAD, STR_0231_ROAD_CONSTRUCTION}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_PLANTTREES, STR_0288_PLANT_TREES}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SIGN, STR_0289_PLACE_SIGN}, { WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL}, { WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL}, @@ -1782,9 +1817,9 @@ { WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL}, { WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL}, { WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 596, 617, 0, 21, SPR_IMG_MUSIC, STR_01D4_SHOW_SOUND_MUSIC_WINDOW}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_MUSIC, STR_01D4_SHOW_SOUND_MUSIC_WINDOW}, { WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 618, 639, 0, 21, SPR_IMG_QUERY, STR_0186_LAND_BLOCK_INFORMATION}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_QUERY, STR_0186_LAND_BLOCK_INFORMATION}, {WIDGETS_END}, }; @@ -1832,11 +1867,13 @@ DrawWindowWidgets(w); SetDParam(0, ConvertYMDToDate(_patches_newgame.starting_year, 0, 1)); - DrawStringCentered(298, 6, STR_00AF, 0); + DrawStringCenteredTruncated(w->widget[6].right, w->widget[7].left, 6, STR_00AF, 0); - SetDParam(0, ConvertYMDToDate(_patches_newgame.starting_year, 0, 1)); - DrawStringCentered(161, 1, STR_0221_OPENTTD, 0); - DrawStringCentered(161, 11,STR_0222_SCENARIO_EDITOR, 0); + /* We hide this panel when the toolbar space gets too small */ + if (w->widget[4].left != w->widget[4].right) { + DrawStringCenteredTruncated(w->widget[4].left + 1, w->widget[4].right - 1, 1, STR_0221_OPENTTD, 0); + DrawStringCenteredTruncated(w->widget[4].left + 1, w->widget[4].right - 1, 11, STR_0222_SCENARIO_EDITOR, 0); + } break; @@ -1875,6 +1912,72 @@ SetWindowDirty(w); } break; + case WE_RESIZE: { + /* There are 15 buttons plus some spacings if the space allows it. + * Furthermore there are two panels of which one is non-essential + * and that one can be removed is the space is too small. */ + uint buttons_width; + uint spacing; + + static int normal_min_width = (15 * 22) + (2 * 130); + static int one_less_panel_min_width = (15 * 22) + 130; + + if (w->width >= one_less_panel_min_width) { + buttons_width = 15 * 22; + spacing = w->width - ((w->width >= normal_min_width) ? normal_min_width : one_less_panel_min_width); + } else { + buttons_width = w->width - 130; + spacing = 0; + } + uint extra_spacing_at[] = { 3, 4, 7, 8, 10, 16, 0 }; + + /* Yes, it defines about 27 widgets for this toolbar */ + for (uint i = 0, x = 0, j = 0, b = 0; i < 27; i++) { + switch (i) { + case 4: + w->widget[i].left = x; + if (w->width < normal_min_width) { + w->widget[i].right = x; + j++; + continue; + } + + x += 130; + w->widget[i].right = x - 1; + break; + + case 5: { + int offset = x - w->widget[i].left; + w->widget[i + 1].left += offset; + w->widget[i + 1].right += offset; + w->widget[i + 2].left += offset; + w->widget[i + 2].right += offset; + w->widget[i].left = x; + x += 130; + w->widget[i].right = x - 1; + i += 2; + } break; + + default: + if (w->widget[i].bottom == 0) continue; + + w->widget[i].left = x; + x += buttons_width / (15 - b); + w->widget[i].right = x - 1; + buttons_width -= buttons_width / (15 - b); + b++; + break; + } + + if (extra_spacing_at[j] == i) { + j++; + uint add = spacing / (lengthof(extra_spacing_at) - j); + spacing -= add; + x += add; + } + } + } break; + case WE_MOUSELOOP: if (IsWindowWidgetLowered(w, 0) != !!_pause_game) { ToggleWidgetLoweredState(w, 0); @@ -1894,7 +1997,7 @@ } static const WindowDesc _toolb_scen_desc = { - 0, 0, 640, 22, + 0, 0, 130, 22, 640, 22, WC_MAIN_TOOLBAR, WC_NONE, WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _toolb_scen_widgets, @@ -1904,7 +2007,7 @@ extern GetNewsStringCallbackProc * const _get_news_string_callback[]; -static bool DrawScrollingStatusText(const NewsItem *ni, int pos) +static bool DrawScrollingStatusText(const NewsItem *ni, int pos, int width) { char buf[512]; StringID str; @@ -1939,7 +2042,7 @@ } } - if (!FillDrawPixelInfo(&tmp_dpi, 141, 1, 358, 11)) return true; + if (!FillDrawPixelInfo(&tmp_dpi, 141, 1, width, 11)) return true; old_dpi = _cur_dpi; _cur_dpi = &tmp_dpi; @@ -1965,29 +2068,35 @@ if (p != NULL) { /* Draw player money */ SetDParam(0, p->player_money); - DrawStringCentered(570, 1, p->player_money >= 0 ? STR_0004 : STR_0005, 0); + DrawStringCentered(w->widget[2].left + 70, 1, p->player_money >= 0 ? STR_0004 : STR_0005, 0); } /* Draw status bar */ if (w->message.msg) { // true when saving is active - DrawStringCentered(320, 1, STR_SAVING_GAME, 0); + DrawStringCenteredTruncated(w->widget[1].left + 1, w->widget[1].right - 1, 1, STR_SAVING_GAME, 0); } else if (_do_autosave) { - DrawStringCentered(320, 1, STR_032F_AUTOSAVE, 0); + DrawStringCenteredTruncated(w->widget[1].left + 1, w->widget[1].right - 1, 1, STR_032F_AUTOSAVE, 0); } else if (_pause_game) { - DrawStringCentered(320, 1, STR_0319_PAUSED, 0); + DrawStringCenteredTruncated(w->widget[1].left + 1, w->widget[1].right - 1, 1, STR_0319_PAUSED, 0); } else if (WP(w,def_d).data_1 > -1280 && FindWindowById(WC_NEWS_WINDOW,0) == NULL && _statusbar_news_item.string_id != 0) { /* Draw the scrolling news text */ - if (!DrawScrollingStatusText(&_statusbar_news_item, WP(w,def_d).data_1)) + if (!DrawScrollingStatusText(&_statusbar_news_item, WP(w,def_d).data_1, w->widget[1].right - w->widget[1].left - 2)) { WP(w,def_d).data_1 = -1280; + if (p != NULL) { + /* This is the default text */ + SetDParam(0, p->index); + DrawStringCenteredTruncated(w->widget[1].left + 1, w->widget[1].right - 1, 1, STR_02BA, 0); + } + } } else { if (p != NULL) { /* This is the default text */ SetDParam(0, p->index); - DrawStringCentered(320, 1, STR_02BA, 0); + DrawStringCenteredTruncated(w->widget[1].left + 1, w->widget[1].right - 1, 1, STR_02BA, 0); } } - if (WP(w, def_d).data_2 > 0) DrawSprite(SPR_BLOT, PALETTE_TO_RED, 489, 2); + if (WP(w, def_d).data_2 > 0) DrawSprite(SPR_BLOT, PALETTE_TO_RED, w->widget[1].right - 11, 2); } break; case WE_MESSAGE: @@ -2025,13 +2134,13 @@ static const Widget _main_status_widgets[] = { { WWT_PANEL, RESIZE_NONE, 14, 0, 139, 0, 11, 0x0, STR_NULL}, -{ WWT_PUSHBTN, RESIZE_NONE, 14, 140, 499, 0, 11, 0x0, STR_02B7_SHOW_LAST_MESSAGE_OR_NEWS}, -{ WWT_PUSHBTN, RESIZE_NONE, 14, 500, 639, 0, 11, 0x0, STR_NULL}, +{ WWT_PUSHBTN, RESIZE_RIGHT, 14, 140, 179, 0, 11, 0x0, STR_02B7_SHOW_LAST_MESSAGE_OR_NEWS}, +{ WWT_PUSHBTN, RESIZE_LR, 14, 180, 319, 0, 11, 0x0, STR_NULL}, { WIDGETS_END}, }; static WindowDesc _main_status_desc = { - WDP_CENTER, 0, 640, 12, + WDP_CENTER, 0, 320, 12, 640, 12, WC_STATUS_BAR, WC_NONE, WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _main_status_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/map.cpp --- a/src/map.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/map.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -282,7 +282,7 @@ n = 2; if (proc(TileXY(x, y), data)) return true; - /* If tile test is not successfull, get one tile down and left, + /* If tile test is not successful, get one tile down and left, * ready for a test in first circle around center tile */ x += _tileoffs_by_dir[DIR_W].x; y += _tileoffs_by_dir[DIR_W].y; @@ -300,7 +300,7 @@ uint j; for (j = n; j != 0; j--) { if (x <= MapMaxX() && y <= MapMaxY() && ///< Is the tile within the map? - proc(TileXY(x, y), data)) { ///< Is the callback successfulll? + proc(TileXY(x, y), data)) { ///< Is the callback successful? return true; ///< then stop the search } diff -r 31fcaa5375a1 -r e72987579514 src/map.h --- a/src/map.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/map.h Fri Aug 03 22:09:42 2007 +0000 @@ -6,6 +6,7 @@ #define MAP_H #include "stdafx.h" +#include "direction.h" extern uint _map_tile_mask; @@ -190,17 +191,19 @@ uint TileAddWrap(TileIndex tile, int addx, int addy); -static inline TileIndexDiffC TileIndexDiffCByDiagDir(uint dir) { - extern const TileIndexDiffC _tileoffs_by_diagdir[4]; +static inline TileIndexDiffC TileIndexDiffCByDiagDir(DiagDirection dir) +{ + extern const TileIndexDiffC _tileoffs_by_diagdir[DIAGDIR_END]; - assert(dir < lengthof(_tileoffs_by_diagdir)); + assert(IsValidDiagDirection(dir)); return _tileoffs_by_diagdir[dir]; } /* Returns tile + the diff given in diff. If the result tile would end up * outside of the map, INVALID_TILE is returned instead. */ -static inline TileIndex AddTileIndexDiffCWrap(TileIndex tile, TileIndexDiffC diff) { +static inline TileIndex AddTileIndexDiffCWrap(TileIndex tile, TileIndexDiffC diff) +{ int x = TileX(tile) + diff.x; int y = TileY(tile) + diff.y; if (x < 0 || y < 0 || x > (int)MapMaxX() || y > (int)MapMaxY()) @@ -247,19 +250,19 @@ } while (var += TileDiffXY(0, 1) - (w), --h_cur != 0); \ } -static inline TileIndexDiff TileOffsByDiagDir(uint dir) +static inline TileIndexDiff TileOffsByDiagDir(DiagDirection dir) { - extern const TileIndexDiffC _tileoffs_by_diagdir[4]; + extern const TileIndexDiffC _tileoffs_by_diagdir[DIAGDIR_END]; - assert(dir < lengthof(_tileoffs_by_diagdir)); + assert(IsValidDiagDirection(dir)); return ToTileIndexDiff(_tileoffs_by_diagdir[dir]); } -static inline TileIndexDiff TileOffsByDir(uint dir) +static inline TileIndexDiff TileOffsByDir(Direction dir) { - extern const TileIndexDiffC _tileoffs_by_dir[8]; + extern const TileIndexDiffC _tileoffs_by_dir[DIR_END]; - assert(dir < lengthof(_tileoffs_by_dir)); + assert(IsValidDirection(dir)); return ToTileIndexDiff(_tileoffs_by_dir[dir]); } diff -r 31fcaa5375a1 -r e72987579514 src/misc/autoptr.hpp --- a/src/misc/autoptr.hpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/misc/autoptr.hpp Fri Aug 03 22:09:42 2007 +0000 @@ -45,7 +45,7 @@ } /** give-up ownership and NULLify the raw pointer */ - FORCEINLINE T* Release() + FORCEINLINE T* Detach() { T* p = m_p; m_p = NULL; @@ -81,8 +81,16 @@ /** assignment operator */ FORCEINLINE AutoPtrT& operator = (const AutoPtrT& src) { + /* Save original pointer and replace it with the given one to avoid recursive calls. */ + T* p = m_p; m_p = src.m_p; + if (m_p != NULL) src.m_p = NULL; + + if (p != NULL) { + /* Now we can safely delete the old one. */ + delete p; + } return *this; } diff -r 31fcaa5375a1 -r e72987579514 src/misc/countedobj.cpp --- a/src/misc/countedobj.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/misc/countedobj.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -19,4 +19,3 @@ } return res; } - diff -r 31fcaa5375a1 -r e72987579514 src/misc/countedptr.hpp --- a/src/misc/countedptr.hpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/misc/countedptr.hpp Fri Aug 03 22:09:42 2007 +0000 @@ -5,7 +5,6 @@ #ifndef COUNTEDPTR_HPP #define COUNTEDPTR_HPP -#if 1 // reenable when needed /** @file CCountedPtr - smart pointer implementation */ /** CCountedPtr - simple reference counting smart pointer. @@ -158,5 +157,4 @@ -#endif /* 0 */ #endif /* COUNTEDPTR_HPP */ diff -r 31fcaa5375a1 -r e72987579514 src/misc_gui.cpp --- a/src/misc_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/misc_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -77,7 +77,7 @@ }; static const WindowDesc _land_info_desc = { - WDP_AUTO, WDP_AUTO, 280, 93, + WDP_AUTO, WDP_AUTO, 280, 93, 280, 93, WC_LAND_INFO, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _land_info_widgets, @@ -134,7 +134,7 @@ GetString(_landinfo_data[3], STR_LANDINFO_COORDS, lastof(_landinfo_data[3])); SetDParam(0, STR_01A9_NONE); - if (t != NULL && IsValidTown(t)) { + if (t != NULL && t->IsValid()) { SetDParam(0, STR_TOWN); SetDParam(1, t->index); } @@ -298,7 +298,7 @@ }; static const WindowDesc _about_desc = { - WDP_CENTER, WDP_CENTER, 420, 272, + WDP_CENTER, WDP_CENTER, 420, 272, 420, 272, WC_GAME_OPTIONS, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _about_widgets, @@ -430,7 +430,7 @@ }; static const WindowDesc _build_trees_desc = { - 497, 22, 143, 171, + 497, 22, 143, 171, 143, 171, WC_BUILD_TREES, WC_SCEN_LAND_GEN, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _build_trees_widgets, @@ -459,7 +459,7 @@ }; static const WindowDesc _build_trees_scen_desc = { - WDP_AUTO, WDP_AUTO, 143, 184, + WDP_AUTO, WDP_AUTO, 143, 184, 143, 184, WC_BUILD_TREES, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _build_trees_scen_widgets, @@ -786,7 +786,8 @@ DrawStringMultiLine(str_x, str_y, STR_SPEC_USERSTRING, 144); } -void DrawStationCoverageAreaText(int sx, int sy, StationCoverageType sct, int rad) { +void DrawStationCoverageAreaText(int sx, int sy, StationCoverageType sct, int rad) +{ TileIndex tile = TileVirtXY(_thd.pos.x, _thd.pos.y); AcceptedCargo accepts; if (tile < MapSize()) { @@ -858,7 +859,7 @@ * The character is delete from the position the caret is at * @param tb Textbuf type to be changed * @param delmode Type of deletion, either WKC_BACKSPACE or WKC_DELETE - * @return Return true on successfull change of Textbuf, or false otherwise + * @return Return true on successful change of Textbuf, or false otherwise */ bool DeleteTextBufferChar(Textbuf *tb, int delmode) { @@ -890,7 +891,7 @@ * length of the string * @param tb Textbuf type to be changed * @param key Character to be inserted - * @return Return true on successfull change of Textbuf, or false otherwise + * @return Return true on successful change of Textbuf, or false otherwise */ bool InsertTextBufferChar(Textbuf *tb, WChar key) { @@ -914,7 +915,7 @@ * This defines where the caret will blink and the next characer interaction will occur * @param tb Textbuf type where navigation occurs * @param navmode Direction in which navigation occurs WKC_LEFT, WKC_RIGHT, WKC_END, WKC_HOME - * @return Return true on successfull change of Textbuf, or false otherwise + * @return Return true on successful change of Textbuf, or false otherwise */ bool MoveTextBufferPos(Textbuf *tb, int navmode) { @@ -1165,7 +1166,7 @@ }; static const WindowDesc _query_string_desc = { - 190, 219, 260, 42, + 190, 219, 260, 42, 260, 42, WC_QUERY_STRING, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _query_string_widgets, @@ -1289,7 +1290,7 @@ }; static const WindowDesc _query_desc = { - WDP_CENTER, WDP_CENTER, 210, 82, + WDP_CENTER, WDP_CENTER, 210, 82, 210, 82, WC_CONFIRM_POPUP_QUERY, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_UNCLICK_BUTTONS | WDF_DEF_WIDGET | WDF_MODAL, _query_widgets, @@ -1330,11 +1331,11 @@ { WWT_PUSHTXTBTN, RESIZE_NONE, 14, 0, 127, 14, 25, STR_SORT_BY_NAME, STR_SORT_ORDER_TIP}, { WWT_PUSHTXTBTN, RESIZE_NONE, 14, 128, 256, 14, 25, STR_SORT_BY_DATE, STR_SORT_ORDER_TIP}, { WWT_PANEL, RESIZE_RIGHT, 14, 0, 256, 26, 47, 0x0, STR_NULL}, -{ WWT_PANEL, RESIZE_RB, 14, 0, 256, 48, 293, 0x0, STR_NULL}, +{ WWT_PANEL, RESIZE_RB, 14, 0, 256, 48, 153, 0x0, STR_NULL}, { WWT_PUSHIMGBTN, RESIZE_LR, 14, 245, 256, 48, 59, SPR_HOUSE_ICON, STR_SAVELOAD_HOME_BUTTON}, -{ WWT_INSET, RESIZE_RB, 14, 2, 243, 50, 291, 0x0, STR_400A_LIST_OF_DRIVES_DIRECTORIES}, -{ WWT_SCROLLBAR, RESIZE_LRB, 14, 245, 256, 60, 281, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, -{ WWT_RESIZEBOX, RESIZE_LRTB, 14, 245, 256, 282, 293, 0x0, STR_RESIZE_BUTTON}, +{ WWT_INSET, RESIZE_RB, 14, 2, 243, 50, 151, 0x0, STR_400A_LIST_OF_DRIVES_DIRECTORIES}, +{ WWT_SCROLLBAR, RESIZE_LRB, 14, 245, 256, 60, 141, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, +{ WWT_RESIZEBOX, RESIZE_LRTB, 14, 245, 256, 142, 153, 0x0, STR_RESIZE_BUTTON}, { WIDGETS_END}, }; @@ -1344,15 +1345,15 @@ { WWT_PUSHTXTBTN, RESIZE_NONE, 14, 0, 127, 14, 25, STR_SORT_BY_NAME, STR_SORT_ORDER_TIP}, { WWT_PUSHTXTBTN, RESIZE_NONE, 14, 128, 256, 14, 25, STR_SORT_BY_DATE, STR_SORT_ORDER_TIP}, { WWT_PANEL, RESIZE_RIGHT, 14, 0, 256, 26, 47, 0x0, STR_NULL}, -{ WWT_PANEL, RESIZE_RB, 14, 0, 256, 48, 291, 0x0, STR_NULL}, +{ WWT_PANEL, RESIZE_RB, 14, 0, 256, 48, 151, 0x0, STR_NULL}, { WWT_PUSHIMGBTN, RESIZE_LR, 14, 245, 256, 48, 59, SPR_HOUSE_ICON, STR_SAVELOAD_HOME_BUTTON}, -{ WWT_INSET, RESIZE_RB, 14, 2, 243, 50, 290, 0x0, STR_400A_LIST_OF_DRIVES_DIRECTORIES}, -{ WWT_SCROLLBAR, RESIZE_LRB, 14, 245, 256, 60, 291, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, -{ WWT_PANEL, RESIZE_RTB, 14, 0, 256, 292, 307, 0x0, STR_NULL}, -{ WWT_PANEL, RESIZE_RTB, 14, 2, 254, 294, 305, 0x0, STR_400B_CURRENTLY_SELECTED_NAME}, -{ WWT_PUSHTXTBTN, RESIZE_TB, 14, 0, 127, 308, 319, STR_4003_DELETE, STR_400C_DELETE_THE_CURRENTLY_SELECTED}, -{ WWT_PUSHTXTBTN, RESIZE_TB, 14, 128, 244, 308, 319, STR_4002_SAVE, STR_400D_SAVE_THE_CURRENT_GAME_USING}, -{ WWT_RESIZEBOX, RESIZE_LRTB, 14, 245, 256, 308, 319, 0x0, STR_RESIZE_BUTTON}, +{ WWT_INSET, RESIZE_RB, 14, 2, 243, 50, 150, 0x0, STR_400A_LIST_OF_DRIVES_DIRECTORIES}, +{ WWT_SCROLLBAR, RESIZE_LRB, 14, 245, 256, 60, 151, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, +{ WWT_PANEL, RESIZE_RTB, 14, 0, 256, 152, 167, 0x0, STR_NULL}, +{ WWT_PANEL, RESIZE_RTB, 14, 2, 254, 154, 165, 0x0, STR_400B_CURRENTLY_SELECTED_NAME}, +{ WWT_PUSHTXTBTN, RESIZE_TB, 14, 0, 127, 168, 179, STR_4003_DELETE, STR_400C_DELETE_THE_CURRENTLY_SELECTED}, +{ WWT_PUSHTXTBTN, RESIZE_TB, 14, 128, 244, 168, 179, STR_4002_SAVE, STR_400D_SAVE_THE_CURRENT_GAME_USING}, +{ WWT_RESIZEBOX, RESIZE_LRTB, 14, 245, 256, 168, 179, 0x0, STR_RESIZE_BUTTON}, { WIDGETS_END}, }; @@ -1436,6 +1437,10 @@ switch (e->event) { case WE_CREATE: // Set up OPENTTD button + w->vscroll.cap = 10; + w->resize.step_width = 2; + w->resize.step_height = 10; + o_dir.type = FIOS_TYPE_DIRECT; switch (_saveload_mode) { case SLD_SAVE_GAME: @@ -1584,7 +1589,7 @@ ShowErrorMessage(INVALID_STRING_ID, STR_4008_UNABLE_TO_DELETE_FILE, 0, 0); } else { BuildFileList(); - /* Reset file name to current date on successfull delete */ + /* Reset file name to current date on successful delete */ if (_saveload_mode == SLD_SAVE_GAME) GenerateFileName(); } @@ -1626,7 +1631,7 @@ } static const WindowDesc _load_dialog_desc = { - WDP_CENTER, WDP_CENTER, 257, 294, + WDP_CENTER, WDP_CENTER, 257, 154, 257, 294, WC_SAVELOAD, WC_NONE, WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_STD_BTN | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE, _load_dialog_widgets, @@ -1634,7 +1639,7 @@ }; static const WindowDesc _save_dialog_desc = { - WDP_CENTER, WDP_CENTER, 257, 320, + WDP_CENTER, WDP_CENTER, 257, 180, 257, 320, WC_SAVELOAD, WC_NONE, WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_STD_BTN | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE, _save_dialog_widgets, @@ -1671,10 +1676,6 @@ assert((uint)mode < lengthof(saveload_captions)); w = AllocateWindowDesc(sld); w->widget[1].data = saveload_captions[mode]; - w->vscroll.cap = 24; - w->resize.step_width = 2; - w->resize.step_height = 10; - w->resize.height = w->height - 14 * 10; // Minimum of 10 items LowerWindowWidget(w, 7); WP(w, querystr_d).afilter = CS_ALPHANUMERAL; @@ -1951,7 +1952,7 @@ } static const WindowDesc _cheats_desc = { - 240, 22, 400, 170, + 240, 22, 400, 170, 400, 170, WC_CHEATS, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _cheat_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/mixer.h --- a/src/mixer.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/mixer.h Fri Aug 03 22:09:42 2007 +0000 @@ -15,9 +15,9 @@ }; bool MxInitialize(uint rate); -void MxMixSamples(void* buffer, uint samples); +void MxMixSamples(void *buffer, uint samples); -MixerChannel* MxAllocateChannel(); +MixerChannel *MxAllocateChannel(); void MxSetChannelRawSrc(MixerChannel *mc, int8 *mem, uint size, uint rate, uint flags); void MxSetChannelVolume(MixerChannel *mc, uint left, uint right); void MxActivateChannel(MixerChannel*); diff -r 31fcaa5375a1 -r e72987579514 src/music_gui.cpp --- a/src/music_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/music_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -322,7 +322,7 @@ }; static const WindowDesc _music_track_selection_desc = { - 104, 131, 432, 218, + 104, 131, 432, 218, 432, 218, WC_MUSIC_TRACK_SELECTION, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _music_track_selection_widgets, @@ -490,7 +490,7 @@ }; static const WindowDesc _music_window_desc = { - 0, 22, 300, 66, + 0, 22, 300, 66, 300, 66, WC_MUSIC_WINDOW, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _music_window_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/network/core/udp.cpp --- a/src/network/core/udp.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/network/core/udp.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -110,6 +110,7 @@ client_len = sizeof(client_addr); /* Try to receive anything */ + SetNonBlocking(this->sock); // Some OSes seem to loose the non-blocking status of the socket nbytes = recvfrom(this->sock, (char*)p.buffer, packet_len, 0, (struct sockaddr *)&client_addr, &client_len); /* We got some bytes for the base header of the packet. */ diff -r 31fcaa5375a1 -r e72987579514 src/network/network_gamelist.cpp --- a/src/network/network_gamelist.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/network/network_gamelist.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -18,9 +18,6 @@ NetworkGameList *_network_game_list = NULL; -/** Should we stop/contiue requerying of offline servers? */ -static bool _stop_requerying = false; - /** Add a new item to the linked gamelist. If the IP and Port match * return the existing item instead of adding it again * @param ip the IP-address (inet_addr) of the to-be added item @@ -50,7 +47,6 @@ DEBUG(net, 4, "[gamelist] added server to list"); UpdateNetworkGameWindow(false); - _stop_requerying = false; return item; } @@ -84,8 +80,9 @@ } enum { - MAX_GAME_LIST_REQUERY_COUNT = 5, - REQUERY_EVERY_X_GAMELOOPS = 60, + MAX_GAME_LIST_REQUERY_COUNT = 5, ///< How often do we requery in number of times per server? + REQUERY_EVERY_X_GAMELOOPS = 60, ///< How often do we requery in time? + REFRESH_GAMEINFO_X_REQUERIES = 50, ///< Refresh the game info itself after REFRESH_GAMEINFO_X_REQUERIES * REQUERY_EVERY_X_GAMELOOPS game loops }; /** Requeries the (game) servers we have not gotten a reply from */ @@ -93,27 +90,23 @@ { static uint8 requery_cnt = 0; - if (_stop_requerying || ++requery_cnt < REQUERY_EVERY_X_GAMELOOPS) return; - + if (++requery_cnt < REQUERY_EVERY_X_GAMELOOPS) return; requery_cnt = 0; - _stop_requerying = true; struct in_addr ip; NetworkGameList *item; for (item = _network_game_list; item != NULL; item = item->next) { - if (item->online || item->retries >= MAX_GAME_LIST_REQUERY_COUNT) continue; + item->retries++; + if (item->retries < REFRESH_GAMEINFO_X_REQUERIES && (item->online || item->retries >= MAX_GAME_LIST_REQUERY_COUNT)) continue; ip.s_addr = item->ip; /* item gets mostly zeroed by NetworkUDPQueryServer */ uint8 retries = item->retries; NetworkUDPQueryServer(inet_ntoa(ip), item->port); - item->retries = retries + 1; - - _stop_requerying = false; + item->retries = (retries >= REFRESH_GAMEINFO_X_REQUERIES) ? 0 : retries; } - } #endif /* ENABLE_NETWORK */ diff -r 31fcaa5375a1 -r e72987579514 src/network/network_gui.cpp --- a/src/network/network_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/network/network_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -87,7 +87,8 @@ static StringID _language_dropdown[NETLANG_COUNT + 1] = {STR_NULL}; -void SortNetworkLanguages() { +void SortNetworkLanguages() +{ /* Init the strings */ if (_language_dropdown[0] == STR_NULL) { for (int i = 0; i < NETLANG_COUNT; i++) _language_dropdown[i] = STR_NETWORK_LANG_ANY + i; @@ -230,6 +231,9 @@ switch (e->event) { case WE_CREATE: /* Focus input box */ + w->vscroll.cap = 13; + w->resize.step_height = NET_PRC__SIZE_OF_ROW; + nd->field = 3; nd->server = NULL; @@ -266,7 +270,7 @@ DrawEditBox(w, &WP(w, network_ql_d).q, 3); DrawString(9, 23, STR_NETWORK_CONNECTION, 2); - DrawString(210, 23, STR_NETWORK_PLAYER_NAME, 2); + DrawString(w->widget[3].left - 100, 23, STR_NETWORK_PLAYER_NAME, 2); /* Sort based on widgets: name, clients, compatibility */ switch (ld->sort_type) { @@ -298,7 +302,7 @@ SetDParam(1, cur_item->info.clients_max); SetDParam(2, cur_item->info.companies_on); SetDParam(3, cur_item->info.companies_max); - DrawStringCentered(210, y, STR_NETWORK_GENERAL_ONLINE, 2); + DrawStringCentered(w->widget[7].left + 39, y, STR_NETWORK_GENERAL_ONLINE, 2); // only draw icons if the server is online if (cur_item->online) { @@ -319,19 +323,19 @@ } /* Draw the right menu */ - GfxFillRect(311, 43, 539, 92, 157); + GfxFillRect(w->widget[15].left + 1, 43, w->widget[15].right - 1, 92, 157); if (sel == NULL) { - DrawStringCentered(425, 58, STR_NETWORK_GAME_INFO, 0); + DrawStringCentered(w->widget[15].left + 115, 58, STR_NETWORK_GAME_INFO, 0); } else if (!sel->online) { SetDParamStr(0, sel->info.server_name); - DrawStringCentered(425, 68, STR_ORANGE, 0); // game name + DrawStringCentered(w->widget[15].left + 115, 68, STR_ORANGE, 0); // game name - DrawStringCentered(425, 132, STR_NETWORK_SERVER_OFFLINE, 0); // server offline + DrawStringCentered(w->widget[15].left + 115, 132, STR_NETWORK_SERVER_OFFLINE, 0); // server offline } else { // show game info uint16 y = 100; const uint16 x = w->widget[15].left + 5; - DrawStringCentered(425, 48, STR_NETWORK_GAME_INFO, 0); + DrawStringCentered(w->widget[15].left + 115, 48, STR_NETWORK_GAME_INFO, 0); SetDParamStr(0, sel->info.server_name); @@ -380,12 +384,12 @@ y += 2; if (!sel->info.compatible) { - DrawStringCentered(425, y, sel->info.version_compatible ? STR_NETWORK_GRF_MISMATCH : STR_NETWORK_VERSION_MISMATCH, 0); // server mismatch + DrawStringCentered(w->widget[15].left + 115, y, sel->info.version_compatible ? STR_NETWORK_GRF_MISMATCH : STR_NETWORK_VERSION_MISMATCH, 0); // server mismatch } else if (sel->info.clients_on == sel->info.clients_max) { // Show: server full, when clients_on == clients_max - DrawStringCentered(425, y, STR_NETWORK_SERVER_FULL, 0); // server full + DrawStringCentered(w->widget[15].left + 115, y, STR_NETWORK_SERVER_FULL, 0); // server full } else if (sel->info.use_password) { - DrawStringCentered(425, y, STR_NETWORK_PASSWORD, 0); // password warning + DrawStringCentered(w->widget[15].left + 115, y, STR_NETWORK_PASSWORD, 0); // password warning } y += 10; @@ -395,7 +399,7 @@ case WE_CLICK: nd->field = e->we.click.widget; switch (e->we.click.widget) { - case 0: case 14: /* Close 'X' | Cancel button */ + case 14: // Cancel button DeleteWindowById(WC_NETWORK_WINDOW, 0); break; case 4: case 5: @@ -507,6 +511,23 @@ NetworkRebuildHostList(); break; + case WE_RESIZE: { + w->vscroll.cap += e->we.sizing.diff.y / (int)w->resize.step_height; + + w->widget[9].data = (w->vscroll.cap << 8) + 1; + + int widget_width = w->widget[11].right - w->widget[11].left; + int space = (w->width - 4 * widget_width - 25) / 3; + + int offset = 10; + for (uint i = 0; i < 4; i++) { + w->widget[11 + i].left = offset; + offset += widget_width; + w->widget[11 + i].right = offset; + offset += space; + } + } break; + case WE_DESTROY: /* Nicely clean up the sort-list */ free(WP(w, network_ql_d).sort_list); break; @@ -515,43 +536,45 @@ static const Widget _network_game_window_widgets[] = { { WWT_CLOSEBOX, RESIZE_NONE, BGC, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, -{ WWT_CAPTION, RESIZE_NONE, BGC, 11, 549, 0, 13, STR_NETWORK_MULTIPLAYER, STR_NULL}, -{ WWT_PANEL, RESIZE_NONE, BGC, 0, 549, 14, 263, 0x0, STR_NULL}, +{ WWT_CAPTION, RESIZE_RIGHT, BGC, 11, 449, 0, 13, STR_NETWORK_MULTIPLAYER, STR_NULL}, +{ WWT_PANEL, RESIZE_RB, BGC, 0, 449, 14, 263, 0x0, STR_NULL}, /* LEFT SIDE */ -{ WWT_PANEL, RESIZE_NONE, BGC, 310, 461, 22, 33, 0x0, STR_NETWORK_ENTER_NAME_TIP}, +{ WWT_PANEL, RESIZE_LR, BGC, 290, 440, 22, 33, 0x0, STR_NETWORK_ENTER_NAME_TIP}, { WWT_INSET, RESIZE_NONE, BGC, 90, 181, 22, 33, STR_NETWORK_COMBO1, STR_NETWORK_CONNECTION_TIP}, { WWT_TEXTBTN, RESIZE_NONE, BGC, 170, 180, 23, 32, STR_0225, STR_NETWORK_CONNECTION_TIP}, -{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 10, 170, 42, 53, STR_NETWORK_GAME_NAME, STR_NETWORK_GAME_NAME_TIP}, -{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 171, 250, 42, 53, STR_NETWORK_CLIENTS_CAPTION, STR_NETWORK_CLIENTS_CAPTION_TIP}, -{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 251, 290, 42, 53, STR_EMPTY, STR_NETWORK_INFO_ICONS_TIP}, +{ WWT_PUSHTXTBTN, RESIZE_RIGHT, BTC, 10, 70, 42, 53, STR_NETWORK_GAME_NAME, STR_NETWORK_GAME_NAME_TIP}, +{ WWT_PUSHTXTBTN, RESIZE_LR, BTC, 71, 150, 42, 53, STR_NETWORK_CLIENTS_CAPTION, STR_NETWORK_CLIENTS_CAPTION_TIP}, +{ WWT_PUSHTXTBTN, RESIZE_LR, BTC, 151, 190, 42, 53, STR_EMPTY, STR_NETWORK_INFO_ICONS_TIP}, -{ WWT_MATRIX, RESIZE_NONE, BGC, 10, 290, 54, 236, (13 << 8) + 1, STR_NETWORK_CLICK_GAME_TO_SELECT}, -{ WWT_SCROLLBAR, RESIZE_NONE, BGC, 291, 302, 42, 236, STR_NULL, STR_0190_SCROLL_BAR_SCROLLS_LIST}, +{ WWT_MATRIX, RESIZE_RB, BGC, 10, 190, 54, 236, (13 << 8) + 1, STR_NETWORK_CLICK_GAME_TO_SELECT}, +{ WWT_SCROLLBAR, RESIZE_LRB, BGC, 191, 202, 42, 236, STR_NULL, STR_0190_SCROLL_BAR_SCROLLS_LIST}, -{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 30, 130, 246, 257, STR_NETWORK_FIND_SERVER, STR_NETWORK_FIND_SERVER_TIP}, -{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 180, 280, 246, 257, STR_NETWORK_ADD_SERVER, STR_NETWORK_ADD_SERVER_TIP}, +{ WWT_PUSHTXTBTN, RESIZE_TB, BTC, 10, 110, 246, 257, STR_NETWORK_FIND_SERVER, STR_NETWORK_FIND_SERVER_TIP}, +{ WWT_PUSHTXTBTN, RESIZE_TB, BTC, 118, 218, 246, 257, STR_NETWORK_ADD_SERVER, STR_NETWORK_ADD_SERVER_TIP}, /* RIGHT SIDE */ -{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 315, 415, 246, 257, STR_NETWORK_START_SERVER, STR_NETWORK_START_SERVER_TIP}, -{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 430, 535, 246, 257, STR_012E_CANCEL, STR_NULL}, +{ WWT_PUSHTXTBTN, RESIZE_TB, BTC, 226, 326, 246, 257, STR_NETWORK_START_SERVER, STR_NETWORK_START_SERVER_TIP}, +{ WWT_PUSHTXTBTN, RESIZE_TB, BTC, 334, 434, 246, 257, STR_012E_CANCEL, STR_NULL}, -{ WWT_PANEL, RESIZE_NONE, BGC, 310, 540, 42, 236, 0x0, STR_NULL}, +{ WWT_PANEL, RESIZE_LRB, BGC, 210, 440, 42, 236, 0x0, STR_NULL}, -{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 315, 415, 215, 226, STR_NETWORK_JOIN_GAME, STR_NULL}, -{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 430, 535, 215, 226, STR_NETWORK_REFRESH, STR_NETWORK_REFRESH_TIP}, +{ WWT_PUSHTXTBTN, RESIZE_LRTB, BTC, 215, 315, 215, 226, STR_NETWORK_JOIN_GAME, STR_NULL}, +{ WWT_PUSHTXTBTN, RESIZE_LRTB, BTC, 330, 435, 215, 226, STR_NETWORK_REFRESH, STR_NETWORK_REFRESH_TIP}, -{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 430, 535, 197, 208, STR_NEWGRF_SETTINGS_BUTTON, STR_NULL}, +{ WWT_PUSHTXTBTN, RESIZE_LRTB, BTC, 330, 435, 197, 208, STR_NEWGRF_SETTINGS_BUTTON, STR_NULL}, + +{ WWT_RESIZEBOX, RESIZE_LRTB, BGC, 438, 449, 252, 263, 0x0, STR_RESIZE_BUTTON }, { WIDGETS_END}, }; static const WindowDesc _network_game_window_desc = { - WDP_CENTER, WDP_CENTER, 550, 264, + WDP_CENTER, WDP_CENTER, 450, 264, 550, 264, WC_NETWORK_WINDOW, WC_NONE, - WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, + WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_STD_BTN | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE, _network_game_window_widgets, NetworkGameWindowWndProc, }; @@ -581,8 +604,6 @@ querystr_d *querystr = &WP(w, network_ql_d).q; ttd_strlcpy(_edit_str_buf, _network_player_name, lengthof(_edit_str_buf)); - w->vscroll.cap = 13; - querystr->afilter = CS_ALPHANUMERAL; InitializeTextBuffer(&querystr->text, _edit_str_buf, lengthof(_edit_str_buf), 120); @@ -785,7 +806,7 @@ }; static const WindowDesc _network_start_server_window_desc = { - WDP_CENTER, WDP_CENTER, 420, 244, + WDP_CENTER, WDP_CENTER, 420, 244, 420, 244, WC_NETWORK_WINDOW, WC_NONE, WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _network_start_server_window_widgets, @@ -994,7 +1015,7 @@ }; static const WindowDesc _network_lobby_window_desc = { - WDP_CENTER, WDP_CENTER, 420, 235, + WDP_CENTER, WDP_CENTER, 420, 235, 420, 235, WC_NETWORK_WINDOW, WC_NONE, WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _network_lobby_window_widgets, @@ -1059,7 +1080,7 @@ }; static WindowDesc _client_list_desc = { - WDP_AUTO, WDP_AUTO, 250, 1, + WDP_AUTO, WDP_AUTO, 250, 1, 250, 1, WC_CLIENT_LIST, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON, _client_list_widgets, @@ -1133,7 +1154,8 @@ // Help, a action is clicked! What do we do? -static void HandleClientListPopupClick(byte index, byte clientno) { +static void HandleClientListPopupClick(byte index, byte clientno) +{ // A click on the Popup of the ClientList.. handle the command if (index < MAX_CLIENTLIST_ACTION && _clientlist_proc[index] != NULL) { _clientlist_proc[index](clientno); @@ -1166,7 +1188,8 @@ } // Finds the amount of actions in the popup and set the height correct -static uint ClientListPopupHeigth() { +static uint ClientListPopupHeight() +{ int i, num = 0; // Find the amount of actions @@ -1236,7 +1259,7 @@ } /* Calculate the height */ - h = ClientListPopupHeigth(); + h = ClientListPopupHeight(); // Allocate the popup w = AllocateWindow(x, y, 150, h + 1, ClientListPopupWndProc, WC_TOOLBAR_MENU, _client_list_popup_widgets); @@ -1468,7 +1491,7 @@ }; static const WindowDesc _network_join_status_window_desc = { - WDP_CENTER, WDP_CENTER, 250, 85, + WDP_CENTER, WDP_CENTER, 250, 85, 250, 85, WC_NETWORK_STATUS_WINDOW, WC_NONE, WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_MODAL, _network_join_status_window_widget, @@ -1486,7 +1509,7 @@ static void SendChat(const char *buf, DestType type, int dest) { - if (buf[0] == '\0') return; + if (StrEmpty(buf)) return; if (!_network_server) { SEND_COMMAND(PACKET_CLIENT_CHAT)((NetworkAction)(NETWORK_ACTION_CHAT + type), type, dest, buf); } else { @@ -1694,15 +1717,15 @@ } static const Widget _chat_window_widgets[] = { -{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, -{ WWT_PANEL, RESIZE_NONE, 14, 11, 639, 0, 13, 0x0, STR_NULL}, // background -{ WWT_PANEL, RESIZE_NONE, 14, 75, 577, 1, 12, 0x0, STR_NULL}, // text box -{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 578, 639, 1, 12, STR_NETWORK_SEND, STR_NULL}, // send button +{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, +{ WWT_PANEL, RESIZE_RIGHT, 14, 11, 319, 0, 13, 0x0, STR_NULL}, // background +{ WWT_PANEL, RESIZE_RIGHT, 14, 75, 257, 1, 12, 0x0, STR_NULL}, // text box +{ WWT_PUSHTXTBTN, RESIZE_LR, 14, 258, 319, 1, 12, STR_NETWORK_SEND, STR_NULL}, // send button { WIDGETS_END}, }; static const WindowDesc _chat_window_desc = { - WDP_CENTER, -26, 640, 14, // x, y, width, height + WDP_CENTER, -26, 320, 14, 640, 14, // x, y, width, height WC_SEND_NETWORK_MSG, WC_NONE, WDF_STD_TOOLTIPS | WDF_DEF_WIDGET, _chat_window_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/network/network_udp.cpp --- a/src/network/network_udp.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/network/network_udp.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -44,7 +44,7 @@ DEF_UDP_RECEIVE_COMMAND(Master, PACKET_UDP_MASTER_ACK_REGISTER) { _network_advertise_retries = 0; - DEBUG(net, 2, "[udp] advertising on master server successfull"); + DEBUG(net, 2, "[udp] advertising on master server successful"); /* We are advertised, but we don't want to! */ if (!_network_advertise) NetworkUDPRemoveAdvertise(); @@ -490,10 +490,12 @@ // Clear item in gamelist item = NetworkGameListAddItem(inet_addr(inet_ntoa(out_addr.sin_addr)), ntohs(out_addr.sin_port)); - memset(&item->info, 0, sizeof(item->info)); - ttd_strlcpy(item->info.server_name, host, lengthof(item->info.server_name)); - ttd_strlcpy(item->info.hostname, host, lengthof(item->info.hostname)); - item->online = false; + if (StrEmpty(item->info.server_name)) { + memset(&item->info, 0, sizeof(item->info)); + ttd_strlcpy(item->info.server_name, host, lengthof(item->info.server_name)); + ttd_strlcpy(item->info.hostname, host, lengthof(item->info.hostname)); + item->online = false; + } item->manually = manually; // Init the packet diff -r 31fcaa5375a1 -r e72987579514 src/newgrf_callbacks.h --- a/src/newgrf_callbacks.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/newgrf_callbacks.h Fri Aug 03 22:09:42 2007 +0000 @@ -15,6 +15,9 @@ * Names are formatted as CBID__ */ enum CallbackID { + /** Set when using the callback resolve system, but not to resolve a callback. */ + CBID_NO_CALLBACK = 0x00, + /** Set when calling a randomizing trigger (almost undocumented). */ CBID_RANDOM_TRIGGER = 0x01, diff -r 31fcaa5375a1 -r e72987579514 src/newgrf_canal.cpp --- a/src/newgrf_canal.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/newgrf_canal.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -73,7 +73,7 @@ res->u.canal.tile = tile; - res->callback = 0; + res->callback = CBID_NO_CALLBACK; res->callback_param1 = 0; res->callback_param2 = 0; res->last_value = 0; diff -r 31fcaa5375a1 -r e72987579514 src/newgrf_cargo.cpp --- a/src/newgrf_cargo.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/newgrf_cargo.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -58,7 +58,7 @@ res->u.cargo.cs = cs; - res->callback = 0; + res->callback = CBID_NO_CALLBACK; res->callback_param1 = 0; res->callback_param2 = 0; res->last_value = 0; @@ -81,7 +81,7 @@ } -uint16 GetCargoCallback(uint16 callback, uint32 param1, uint32 param2, const CargoSpec *cs) +uint16 GetCargoCallback(CallbackID callback, uint32 param1, uint32 param2, const CargoSpec *cs) { ResolverObject object; const SpriteGroup *group; diff -r 31fcaa5375a1 -r e72987579514 src/newgrf_cargo.h --- a/src/newgrf_cargo.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/newgrf_cargo.h Fri Aug 03 22:09:42 2007 +0000 @@ -5,6 +5,8 @@ #ifndef NEWGRF_CARGO_H #define NEWGRF_CARGO_H +#include "newgrf_callbacks.h" + enum { CC_NOAVAILABLE = 0, CC_PASSENGERS = 1 << 0, @@ -26,7 +28,7 @@ struct GRFFile; SpriteID GetCustomCargoSprite(const CargoSpec *cs); -uint16 GetCargoCallback(uint16 callback, uint32 param1, uint32 param2, const CargoSpec *cs); +uint16 GetCargoCallback(CallbackID callback, uint32 param1, uint32 param2, const CargoSpec *cs); CargoID GetCargoTranslation(uint8 cargo, const GRFFile *grffile); uint8 GetReverseCargoTranslation(CargoID cargo, const GRFFile *grffile); diff -r 31fcaa5375a1 -r e72987579514 src/newgrf_commons.h --- a/src/newgrf_commons.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/newgrf_commons.h Fri Aug 03 22:09:42 2007 +0000 @@ -25,8 +25,7 @@ uint8 substitute_id; ///< The (original) entity ID to use if this GRF is not available }; -class OverrideManagerBase -{ +class OverrideManagerBase { protected: uint16 *entity_overrides; @@ -50,40 +49,38 @@ uint16 GetSubstituteID(byte entity_id); uint16 GetID(uint8 grf_local_id, uint32 grfid); - inline uint16 GetMaxMapping() { return max_new_entities; }; - inline uint16 GetMaxOffset() { return max_offset; }; + inline uint16 GetMaxMapping() { return max_new_entities; } + inline uint16 GetMaxOffset() { return max_offset; } }; struct HouseSpec; -class HouseOverrideManager : public OverrideManagerBase -{ +class HouseOverrideManager : public OverrideManagerBase { public: HouseOverrideManager(uint16 offset, uint16 maximum, uint16 invalid) : - OverrideManagerBase(offset, maximum, invalid) {}; + OverrideManagerBase(offset, maximum, invalid) {} void SetEntitySpec(const HouseSpec *hs); }; struct IndustrySpec; -class IndustryOverrideManager : public OverrideManagerBase -{ - public: - IndustryOverrideManager(uint16 offset, uint16 maximum, uint16 invalid) : - OverrideManagerBase(offset, maximum, invalid) {}; +class IndustryOverrideManager : public OverrideManagerBase { +public: + IndustryOverrideManager(uint16 offset, uint16 maximum, uint16 invalid) : + OverrideManagerBase(offset, maximum, invalid) {} - virtual uint16 AddEntityID(byte grf_local_id, uint32 grfid, byte substitute_id); - void SetEntitySpec(const IndustrySpec *inds); + virtual uint16 AddEntityID(byte grf_local_id, uint32 grfid, byte substitute_id); + void SetEntitySpec(const IndustrySpec *inds); }; struct IndustryTileSpec; -class IndustryTileOverrideManager : public OverrideManagerBase -{ - public: - IndustryTileOverrideManager(uint16 offset, uint16 maximum, uint16 invalid) : - OverrideManagerBase(offset, maximum, invalid) {}; - void SetEntitySpec(const IndustryTileSpec *indts); +class IndustryTileOverrideManager : public OverrideManagerBase { +public: + IndustryTileOverrideManager(uint16 offset, uint16 maximum, uint16 invalid) : + OverrideManagerBase(offset, maximum, invalid) {} + + void SetEntitySpec(const IndustryTileSpec *indts); }; extern HouseOverrideManager _house_mngr; diff -r 31fcaa5375a1 -r e72987579514 src/newgrf_engine.cpp --- a/src/newgrf_engine.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/newgrf_engine.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -838,7 +838,7 @@ res->info_view = false; - res->callback = 0; + res->callback = CBID_NO_CALLBACK; res->callback_param1 = 0; res->callback_param2 = 0; res->last_value = 0; @@ -938,7 +938,7 @@ * @param v The vehicle to evaluate the callback for, or NULL if it doesnt exist yet * @return The value the callback returned, or CALLBACK_FAILED if it failed */ -uint16 GetVehicleCallback(uint16 callback, uint32 param1, uint32 param2, EngineID engine, const Vehicle *v) +uint16 GetVehicleCallback(CallbackID callback, uint32 param1, uint32 param2, EngineID engine, const Vehicle *v) { const SpriteGroup *group; ResolverObject object; @@ -965,7 +965,7 @@ * @param parent The vehicle to use for parent scope * @return The value the callback returned, or CALLBACK_FAILED if it failed */ -uint16 GetVehicleCallbackParent(uint16 callback, uint32 param1, uint32 param2, EngineID engine, const Vehicle *v, const Vehicle *parent) +uint16 GetVehicleCallbackParent(CallbackID callback, uint32 param1, uint32 param2, EngineID engine, const Vehicle *v, const Vehicle *parent) { const SpriteGroup *group; ResolverObject object; diff -r 31fcaa5375a1 -r e72987579514 src/newgrf_engine.h --- a/src/newgrf_engine.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/newgrf_engine.h Fri Aug 03 22:09:42 2007 +0000 @@ -30,8 +30,8 @@ const struct GRFFile *GetEngineGRF(EngineID engine); uint32 GetEngineGRFID(EngineID engine); -uint16 GetVehicleCallback(uint16 callback, uint32 param1, uint32 param2, EngineID engine, const Vehicle *v); -uint16 GetVehicleCallbackParent(uint16 callback, uint32 param1, uint32 param2, EngineID engine, const Vehicle *v, const Vehicle *parent); +uint16 GetVehicleCallback(CallbackID callback, uint32 param1, uint32 param2, EngineID engine, const Vehicle *v); +uint16 GetVehicleCallbackParent(CallbackID callback, uint32 param1, uint32 param2, EngineID engine, const Vehicle *v, const Vehicle *parent); bool UsesWagonOverride(const Vehicle *v); #define GetCustomVehicleSprite(v, direction) GetCustomEngineSprite(v->engine_type, v, direction) #define GetCustomVehicleIcon(et, direction) GetCustomEngineSprite(et, NULL, direction) diff -r 31fcaa5375a1 -r e72987579514 src/newgrf_gui.cpp --- a/src/newgrf_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/newgrf_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -219,22 +219,22 @@ { WWT_CAPTION, RESIZE_RIGHT, 14, 11, 306, 0, 13, STR_NEWGRF_ADD_CAPTION, STR_018C_WINDOW_TITLE_DRAG_THIS }, /* List of files */ -{ WWT_PANEL, RESIZE_RB, 14, 0, 294, 14, 221, 0x0, STR_NULL }, -{ WWT_INSET, RESIZE_RB, 14, 2, 292, 16, 219, 0x0, STR_NULL }, -{ WWT_SCROLLBAR, RESIZE_LRB, 14, 295, 306, 14, 221, 0x0, STR_NULL }, +{ WWT_PANEL, RESIZE_RB, 14, 0, 294, 14, 121, 0x0, STR_NULL }, +{ WWT_INSET, RESIZE_RB, 14, 2, 292, 16, 119, 0x0, STR_NULL }, +{ WWT_SCROLLBAR, RESIZE_LRB, 14, 295, 306, 14, 121, 0x0, STR_NULL }, /* NewGRF file info */ -{ WWT_PANEL, RESIZE_RTB, 14, 0, 306, 222, 324, 0x0, STR_NULL }, +{ WWT_PANEL, RESIZE_RTB, 14, 0, 306, 122, 224, 0x0, STR_NULL }, -{ WWT_PUSHTXTBTN, RESIZE_RTB, 14, 0, 146, 325, 336, STR_NEWGRF_ADD_FILE, STR_NEWGRF_ADD_FILE_TIP }, -{ WWT_PUSHTXTBTN, RESIZE_LRTB, 14, 147, 294, 325, 336, STR_NEWGRF_RESCAN_FILES, STR_NEWGRF_RESCAN_FILES_TIP }, -{ WWT_RESIZEBOX, RESIZE_LRTB, 14, 295, 306, 325, 336, 0x0, STR_RESIZE_BUTTON }, +{ WWT_PUSHTXTBTN, RESIZE_RTB, 14, 0, 146, 225, 236, STR_NEWGRF_ADD_FILE, STR_NEWGRF_ADD_FILE_TIP }, +{ WWT_PUSHTXTBTN, RESIZE_LRTB, 14, 147, 294, 225, 236, STR_NEWGRF_RESCAN_FILES, STR_NEWGRF_RESCAN_FILES_TIP }, +{ WWT_RESIZEBOX, RESIZE_LRTB, 14, 295, 306, 225, 236, 0x0, STR_RESIZE_BUTTON }, { WIDGETS_END }, }; static const WindowDesc _newgrf_add_dlg_desc = { - WDP_CENTER, WDP_CENTER, 307, 337, + WDP_CENTER, WDP_CENTER, 307, 237, 307, 337, WC_SAVELOAD, WC_NONE, WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_STD_BTN | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE, _newgrf_add_dlg_widgets, @@ -549,7 +549,7 @@ static const WindowDesc _newgrf_desc = { - WDP_CENTER, WDP_CENTER, 300, 225, + WDP_CENTER, WDP_CENTER, 300, 225, 300, 225, WC_GAME_OPTIONS, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE, _newgrf_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/newgrf_house.cpp --- a/src/newgrf_house.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/newgrf_house.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -274,7 +274,7 @@ res->u.house.town = town; res->u.house.house_id = house_id; - res->callback = 0; + res->callback = CBID_NO_CALLBACK; res->callback_param1 = 0; res->callback_param2 = 0; res->last_value = 0; @@ -282,7 +282,7 @@ res->reseed = 0; } -uint16 GetHouseCallback(uint16 callback, uint32 param1, uint32 param2, HouseID house_id, Town *town, TileIndex tile) +uint16 GetHouseCallback(CallbackID callback, uint32 param1, uint32 param2, HouseID house_id, Town *town, TileIndex tile) { ResolverObject object; const SpriteGroup *group; @@ -314,10 +314,7 @@ image = dtss->image + stage; pal = dtss->pal; - if (!HASBIT(image, SPRITE_MODIFIER_OPAQUE) && HASBIT(_transparent_opt, TO_HOUSES)) { - SETBIT(image, PALETTE_MODIFIER_TRANSPARENT); - pal = PALETTE_TO_TRANSPARENT; - } else if (HASBIT(image, PALETTE_MODIFIER_COLOR)) { + if ((HASBIT(image, SPRITE_MODIFIER_OPAQUE) || !HASBIT(_transparent_opt, TO_HOUSES)) && HASBIT(image, PALETTE_MODIFIER_COLOR)) { if (pal == 0) { const HouseSpec *hs = GetHouseSpecs(house_id); if (HASBIT(hs->callback_mask, CBM_BUILDING_COLOUR)) { @@ -339,7 +336,8 @@ image, pal, ti->x + dtss->delta_x, ti->y + dtss->delta_y, dtss->size_x, dtss->size_y, - dtss->size_z, ti->z + dtss->delta_z + dtss->size_z, ti->z + dtss->delta_z, + HASBIT(_transparent_opt, TO_HOUSES) ); } else { AddChildSpriteScreen(image, pal, dtss->delta_x, dtss->delta_y); @@ -353,7 +351,7 @@ const SpriteGroup *group; ResolverObject object; - if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, ti->tileh); + if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, FOUNDATION_LEVELED); NewHouseResolver(&object, house_id, ti->tile, GetTownByTile(ti->tile)); diff -r 31fcaa5375a1 -r e72987579514 src/newgrf_house.h --- a/src/newgrf_house.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/newgrf_house.h Fri Aug 03 22:09:42 2007 +0000 @@ -6,6 +6,7 @@ #define NEWGRF_HOUSE_H #include "town.h" +#include "newgrf_callbacks.h" /** * Makes class IDs unique to each GRF file. @@ -38,7 +39,7 @@ void AnimateNewHouseTile(TileIndex tile); void ChangeHouseAnimationFrame(TileIndex tile, uint16 callback_result); -uint16 GetHouseCallback(uint16 callback, uint32 param1, uint32 param2, HouseID house_id, Town *town, TileIndex tile); +uint16 GetHouseCallback(CallbackID callback, uint32 param1, uint32 param2, HouseID house_id, Town *town, TileIndex tile); bool CanDeleteHouse(TileIndex tile); diff -r 31fcaa5375a1 -r e72987579514 src/newgrf_industries.cpp --- a/src/newgrf_industries.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/newgrf_industries.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -87,8 +87,8 @@ if (GetIndustryIndex(new_tile) == i->index) { // Does it belong to the same industry? IndustryGfx gfx = GetIndustryGfx(new_tile); - const IndustryTileSpec *indtsp = GetIndustryTileSpec(gfx); - const IndustryTileSpec *indold = GetIndustryTileSpec(GetIndustryGfx(old_tile)); + const IndustryTileSpec *indtsp = GetIndustryTileSpec(gfx, false); + const IndustryTileSpec *indold = GetIndustryTileSpec(GetIndustryGfx(old_tile), false); if (gfx < NEW_INDUSTRYOFFSET) { // Does it belongs to an old type? /* It is an old tile. We have to see if it's been overriden */ @@ -178,7 +178,7 @@ } /* Distance of nearest industry of given type */ - case 0x64: return GetClosestIndustry(tile, MapNewGRFIndustryType(parameter, indspec->grf_prop.grffile->grfid), industry); // Distance of nearest industry of given type + case 0x64: return GetClosestIndustry(tile, MapNewGRFIndustryType(parameter, indspec->grf_prop.grffile->grfid), industry); /* Get town zone and Manhattan distance of closest town */ case 0x65: return GetTownRadiusGroup(industry->town, tile) << 16 | min(DistanceManhattan(tile, industry->town->xy), 0xFFFF); /* Get square of Euclidian distance of closes town */ @@ -189,6 +189,7 @@ * A lot more should be done, since it has to check for local id, grf id etc... * let's just say it is a beginning ;) */ case 0x67: return GetIndustryTypeCount(industry->type) << 16 | 0; + case 0x68: break; /* Industry structure access*/ case 0x80: return industry->xy; @@ -274,7 +275,7 @@ res->u.industry.ind = indus; res->u.industry.gfx = INVALID_INDUSTRYTILE; - res->callback = 0; + res->callback = CBID_NO_CALLBACK; res->callback_param1 = 0; res->callback_param2 = 0; res->last_value = 0; @@ -282,7 +283,7 @@ res->reseed = 0; } -uint16 GetIndustryCallback(uint16 callback, uint32 param1, uint32 param2, Industry *industry, IndustryType type, TileIndex tile) +uint16 GetIndustryCallback(CallbackID callback, uint32 param1, uint32 param2, Industry *industry, IndustryType type, TileIndex tile) { ResolverObject object; const SpriteGroup *group; diff -r 31fcaa5375a1 -r e72987579514 src/newgrf_industries.h --- a/src/newgrf_industries.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/newgrf_industries.h Fri Aug 03 22:09:42 2007 +0000 @@ -10,7 +10,7 @@ /* in newgrf_industry.cpp */ uint32 IndustryGetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available); -uint16 GetIndustryCallback(uint16 callback, uint32 param1, uint32 param2, Industry *industry, IndustryType type, TileIndex tile); +uint16 GetIndustryCallback(CallbackID callback, uint32 param1, uint32 param2, Industry *industry, IndustryType type, TileIndex tile); uint32 GetIndustryIDAtOffset(TileIndex new_tile, TileIndex old_tile, const Industry *i); void IndustryProductionCallback(Industry *ind, int reason); bool CheckIfCallBackAllowsCreation(TileIndex tile, IndustryType type, uint itspec_index); diff -r 31fcaa5375a1 -r e72987579514 src/newgrf_industrytiles.cpp --- a/src/newgrf_industrytiles.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/newgrf_industrytiles.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -142,7 +142,7 @@ res->u.industry.ind = indus; res->u.industry.gfx = gfx; - res->callback = 0; + res->callback = CBID_NO_CALLBACK; res->callback_param1 = 0; res->callback_param2 = 0; res->last_value = 0; @@ -166,10 +166,7 @@ image = dtss->image + stage; pal = dtss->pal; - if (!HASBIT(image, SPRITE_MODIFIER_OPAQUE) && HASBIT(_transparent_opt, TO_INDUSTRIES)) { - SETBIT(image, PALETTE_MODIFIER_TRANSPARENT); - pal = PALETTE_TO_TRANSPARENT; - } else if (HASBIT(image, PALETTE_MODIFIER_COLOR)) { + if (HASBIT(image, PALETTE_MODIFIER_COLOR)) { pal = GENERAL_SPRITE_COLOR(rnd_color); } else { pal = PAL_NONE; @@ -180,7 +177,8 @@ image, pal, ti->x + dtss->delta_x, ti->y + dtss->delta_y, dtss->size_x, dtss->size_y, - dtss->size_z, ti->z + dtss->delta_z + dtss->size_z, ti->z + dtss->delta_z, + !HASBIT(image, SPRITE_MODIFIER_OPAQUE) && HASBIT(_transparent_opt, TO_INDUSTRIES) ); } else { AddChildSpriteScreen(image, pal, dtss->delta_x, dtss->delta_y); @@ -188,7 +186,7 @@ } } -uint16 GetIndustryTileCallback(uint16 callback, uint32 param1, uint32 param2, IndustryGfx gfx_id, Industry *industry, TileIndex tile) +uint16 GetIndustryTileCallback(CallbackID callback, uint32 param1, uint32 param2, IndustryGfx gfx_id, Industry *industry, TileIndex tile) { ResolverObject object; const SpriteGroup *group; @@ -217,7 +215,7 @@ draw_old_one = callback_res != 0; } - if (draw_old_one) DrawFoundation(ti, ti->tileh); + if (draw_old_one) DrawFoundation(ti, FOUNDATION_LEVELED); } NewIndustryTileResolver(&object, gfx, ti->tile, i); diff -r 31fcaa5375a1 -r e72987579514 src/newgrf_industrytiles.h --- a/src/newgrf_industrytiles.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/newgrf_industrytiles.h Fri Aug 03 22:09:42 2007 +0000 @@ -14,7 +14,7 @@ }; bool DrawNewIndustryTile(TileInfo *ti, Industry *i, IndustryGfx gfx, const IndustryTileSpec *inds); -uint16 GetIndustryTileCallback(uint16 callback, uint32 param1, uint32 param2, IndustryGfx gfx_id, Industry *industry, TileIndex tile); +uint16 GetIndustryTileCallback(CallbackID callback, uint32 param1, uint32 param2, IndustryGfx gfx_id, Industry *industry, TileIndex tile); bool PerformIndustryTileSlopeCheck(TileIndex tile, const IndustryTileSpec *its, IndustryType type, IndustryGfx gfx); void AnimateNewIndustryTile(TileIndex tile); diff -r 31fcaa5375a1 -r e72987579514 src/newgrf_sound.cpp --- a/src/newgrf_sound.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/newgrf_sound.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -20,7 +20,7 @@ FileEntry *AllocateFileEntry() { if (_sound_count == GetSoundInternalPoolSize()) { - if (!AddBlockToPool(&_SoundInternal_pool)) return NULL; + if (!_SoundInternal_pool.AddBlockToPool()) return NULL; } return GetSoundInternal(_sound_count++); @@ -29,7 +29,7 @@ void InitializeSoundPool() { - CleanPool(&_SoundInternal_pool); + _SoundInternal_pool.CleanPool(); _sound_count = 0; /* Copy original sound data to the pool */ diff -r 31fcaa5375a1 -r e72987579514 src/newgrf_spritegroup.cpp --- a/src/newgrf_spritegroup.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/newgrf_spritegroup.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -62,7 +62,7 @@ { /* This is totally different to the other pool allocators, as we never remove an item from the pool. */ if (_spritegroup_count == GetSpriteGroupPoolSize()) { - if (!AddBlockToPool(&_SpriteGroup_pool)) return NULL; + if (!_SpriteGroup_pool.AddBlockToPool()) return NULL; } return GetSpriteGroup(_spritegroup_count++); @@ -71,7 +71,7 @@ void InitializeSpriteGroupPool() { - CleanPool(&_SpriteGroup_pool); + _SpriteGroup_pool.CleanPool(); _spritegroup_count = 0; } diff -r 31fcaa5375a1 -r e72987579514 src/newgrf_spritegroup.h --- a/src/newgrf_spritegroup.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/newgrf_spritegroup.h Fri Aug 03 22:09:42 2007 +0000 @@ -188,7 +188,7 @@ struct ResolverObject { - uint16 callback; + CallbackID callback; uint32 callback_param1; uint32 callback_param2; diff -r 31fcaa5375a1 -r e72987579514 src/newgrf_station.cpp --- a/src/newgrf_station.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/newgrf_station.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -555,7 +555,7 @@ res->u.station.statspec = statspec; res->u.station.tile = tile; - res->callback = 0; + res->callback = CBID_NO_CALLBACK; res->callback_param1 = 0; res->callback_param2 = 0; res->last_value = 0; @@ -627,7 +627,7 @@ } -uint16 GetStationCallback(uint16 callback, uint32 param1, uint32 param2, const StationSpec *statspec, const Station *st, TileIndex tile) +uint16 GetStationCallback(CallbackID callback, uint32 param1, uint32 param2, const StationSpec *statspec, const Station *st, TileIndex tile) { const SpriteGroup *group; ResolverObject object; diff -r 31fcaa5375a1 -r e72987579514 src/newgrf_station.h --- a/src/newgrf_station.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/newgrf_station.h Fri Aug 03 22:09:42 2007 +0000 @@ -6,6 +6,7 @@ #define NEWGRF_STATION_H #include "engine.h" +#include "newgrf_callbacks.h" #include "newgrf_cargo.h" #include "helpers.hpp" @@ -117,7 +118,7 @@ * for variational sprite groups. */ SpriteID GetCustomStationRelocation(const StationSpec *statspec, const Station *st, TileIndex tile); SpriteID GetCustomStationGroundRelocation(const StationSpec *statspec, const Station *st, TileIndex tile); -uint16 GetStationCallback(uint16 callback, uint32 param1, uint32 param2, const StationSpec *statspec, const Station *st, TileIndex tile); +uint16 GetStationCallback(CallbackID callback, uint32 param1, uint32 param2, const StationSpec *statspec, const Station *st, TileIndex tile); /* Check if a rail station tile is traversable. */ bool IsStationTileBlocked(TileIndex tile); diff -r 31fcaa5375a1 -r e72987579514 src/news_gui.cpp --- a/src/news_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/news_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -320,7 +320,7 @@ }; static WindowDesc _news_type13_desc = { - WDP_CENTER, 476, 430, 170, + WDP_CENTER, 476, 430, 170, 430, 170, WC_NEWS_WINDOW, WC_NONE, WDF_DEF_WIDGET, _news_type13_widgets, @@ -334,7 +334,7 @@ }; static WindowDesc _news_type2_desc = { - WDP_CENTER, 476, 430, 130, + WDP_CENTER, 476, 430, 130, 430, 130, WC_NEWS_WINDOW, WC_NONE, WDF_DEF_WIDGET, _news_type2_widgets, @@ -350,7 +350,7 @@ }; static WindowDesc _news_type0_desc = { - WDP_CENTER, 476, 280, 87, + WDP_CENTER, 476, 280, 87, 280, 87, WC_NEWS_WINDOW, WC_NONE, WDF_DEF_WIDGET, _news_type0_widgets, @@ -700,7 +700,7 @@ }; static const WindowDesc _message_history_desc = { - 240, 22, 400, 140, + 240, 22, 400, 140, 400, 140, WC_MESSAGE_HISTORY, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE, _message_history_widgets, @@ -910,7 +910,7 @@ }; static const WindowDesc _message_options_desc = { - 270, 22, 410, 197, + 270, 22, 410, 197, 410, 197, WC_GAME_OPTIONS, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _message_options_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/npf.cpp --- a/src/npf.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/npf.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -232,7 +232,7 @@ } break; - case MP_STREET: + case MP_ROAD: if (!IsTileDepotType(tile, TRANSPORT_ROAD)) { SetRoadside(tile, ROADSIDE_BARREN); MarkTileDirtyByTile(tile); @@ -276,7 +276,7 @@ cost = IsTunnel(tile) ? NPFTunnelCost(current) : NPFBridgeCost(current); break; - case MP_STREET: + case MP_ROAD: cost = NPF_TILE_LENGTH; /* Increase the cost for level crossings */ if (IsLevelCrossing(tile)) cost += _patches.npf_crossing_penalty; @@ -327,7 +327,7 @@ cost = _trackdir_length[trackdir]; /* Should be different for diagonal tracks */ break; - case MP_STREET: /* Railway crossing */ + case MP_ROAD: /* Railway crossing */ cost = NPF_TILE_LENGTH; break; @@ -468,7 +468,7 @@ } switch (GetTileType(tile)) { - case MP_STREET: + case MP_ROAD: /* rail-road crossing : are we looking at the railway part? */ if (IsLevelCrossing(tile) && DiagDirToAxis(enterdir) != GetCrossingRoadAxis(tile)) { diff -r 31fcaa5375a1 -r e72987579514 src/oldloader.cpp --- a/src/oldloader.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/oldloader.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -477,10 +477,7 @@ }; static bool LoadOldTown(LoadgameState *ls, int num) { - if (!AddBlockIfNeeded(&_Town_pool, num)) - error("Towns: failed loading savegame: too many towns"); - - return LoadChunk(ls, GetTown(num), town_chunk); + return LoadChunk(ls, new (num) Town(), town_chunk); } static uint16 _old_order; @@ -491,12 +488,9 @@ static bool LoadOldOrder(LoadgameState *ls, int num) { - if (!AddBlockIfNeeded(&_Order_pool, num)) - error("Orders: failed loading savegame: too many orders"); - if (!LoadChunk(ls, NULL, order_chunk)) return false; - AssignOrder(GetOrder(num), UnpackOldOrder(_old_order)); + AssignOrder(new (num) Order(), UnpackOldOrder(_old_order)); /* Relink the orders to eachother (in TTD(Patch) the orders for one vehicle are behind eachother, with an invalid order (OT_NOTHING) as indication that @@ -515,12 +509,9 @@ static bool LoadOldDepot(LoadgameState *ls, int num) { - if (!AddBlockIfNeeded(&_Depot_pool, num)) - error("Depots: failed loading savegame: too many depots"); + if (!LoadChunk(ls, new (num) Depot(), depot_chunk)) return false; - if (!LoadChunk(ls, GetDepot(num), depot_chunk)) return false; - - if (IsValidDepot(GetDepot(num))) { + if (IsValidDepotID(num)) { GetDepot(num)->town_index = REMAP_TOWN_IDX(_old_town_index); } @@ -707,15 +698,10 @@ static bool LoadOldIndustry(LoadgameState *ls, int num) { - Industry *i; - - if (!AddBlockIfNeeded(&_Industry_pool, num)) - error("Industries: failed loading savegame: too many industries"); - - i = GetIndustry(num); + Industry *i = new (num) Industry(); if (!LoadChunk(ls, i, industry_chunk)) return false; - if (IsValidIndustry(i)) { + if (i->IsValid()) { i->town = GetTown(REMAP_TOWN_IDX(_old_town_index)); } @@ -906,8 +892,8 @@ }; static const OldChunks vehicle_special_chunk[] = { - OCL_SVAR( OC_UINT16, VehicleSpecial, unk0 ), - OCL_SVAR( OC_UINT8, VehicleSpecial, unk2 ), + OCL_SVAR( OC_UINT16, VehicleSpecial, animation_state ), + OCL_SVAR( OC_UINT8, VehicleSpecial, animation_substate ), OCL_NULL( 7 ), // Junk @@ -916,7 +902,7 @@ static const OldChunks vehicle_disaster_chunk[] = { OCL_SVAR( OC_UINT16, VehicleDisaster, image_override ), - OCL_SVAR( OC_UINT16, VehicleDisaster, unk2 ), + OCL_SVAR( OC_UINT16, VehicleDisaster, big_ufo_destroyer_target ), OCL_NULL( 6 ), ///< Junk @@ -1047,14 +1033,9 @@ ReadTTDPatchFlags(); for (i = 0; i < _old_vehicle_multiplier; i++) { - Vehicle *v; - _current_vehicle_id = num * _old_vehicle_multiplier + i; - if (!AddBlockIfNeeded(&_Vehicle_pool, _current_vehicle_id)) - error("Vehicles: failed loading savegame: too many vehicles"); - - v = GetVehicle(_current_vehicle_id); + Vehicle *v = new (_current_vehicle_id) InvalidVehicle(); if (!LoadChunk(ls, v, vehicle_chunk)) return false; /* This should be consistent, else we have a big problem... */ @@ -1105,10 +1086,7 @@ static bool LoadOldSign(LoadgameState *ls, int num) { - if (!AddBlockIfNeeded(&_Sign_pool, num)) - error("Signs: failed loading savegame: too many signs"); - - return LoadChunk(ls, GetSign(num), sign_chunk); + return LoadChunk(ls, new (num) Sign(), sign_chunk); } static const OldChunks engine_chunk[] = { diff -r 31fcaa5375a1 -r e72987579514 src/oldpool.cpp --- a/src/oldpool.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/oldpool.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -12,27 +12,28 @@ /** * Clean a pool in a safe way (does free all blocks) */ -void CleanPool(OldMemoryPool *pool) +void OldMemoryPoolBase::CleanPool() { uint i; - DEBUG(misc, 4, "[Pool] (%s) cleaning pool..", pool->name); + DEBUG(misc, 4, "[Pool] (%s) cleaning pool..", this->name); /* Free all blocks */ - for (i = 0; i < pool->current_blocks; i++) { - if (pool->clean_block_proc != NULL) { - pool->clean_block_proc(i * (1 << pool->block_size_bits), (i + 1) * (1 << pool->block_size_bits) - 1); + for (i = 0; i < this->current_blocks; i++) { + if (this->clean_block_proc != NULL) { + this->clean_block_proc(i * (1 << this->block_size_bits), (i + 1) * (1 << this->block_size_bits) - 1); } - free(pool->blocks[i]); + free(this->blocks[i]); } /* Free the block itself */ - free(pool->blocks); + free(this->blocks); /* Clear up some critical data */ - pool->total_items = 0; - pool->current_blocks = 0; - pool->blocks = NULL; + this->total_items = 0; + this->current_blocks = 0; + this->blocks = NULL; + this->first_free_index = 0; } /** @@ -41,34 +42,32 @@ * * @return Returns false if the pool could not be increased */ -bool AddBlockToPool(OldMemoryPool *pool) +bool OldMemoryPoolBase::AddBlockToPool() { /* Is the pool at his max? */ - if (pool->max_blocks == pool->current_blocks) - return false; + if (this->max_blocks == this->current_blocks) return false; - pool->total_items = (pool->current_blocks + 1) * (1 << pool->block_size_bits); + this->total_items = (this->current_blocks + 1) * (1 << this->block_size_bits); - DEBUG(misc, 4, "[Pool] (%s) increasing size of pool to %d items (%d bytes)", pool->name, pool->total_items, pool->total_items * pool->item_size); + DEBUG(misc, 4, "[Pool] (%s) increasing size of pool to %d items (%d bytes)", this->name, this->total_items, this->total_items * this->item_size); /* Increase the poolsize */ - pool->blocks = ReallocT(pool->blocks, pool->current_blocks + 1); - if (pool->blocks == NULL) error("Pool: (%s) could not allocate memory for blocks", pool->name); + this->blocks = ReallocT(this->blocks, this->current_blocks + 1); + if (this->blocks == NULL) error("Pool: (%s) could not allocate memory for blocks", this->name); /* Allocate memory to the new block item */ - pool->blocks[pool->current_blocks] = MallocT(pool->item_size * (1 << pool->block_size_bits)); - if (pool->blocks[pool->current_blocks] == NULL) - error("Pool: (%s) could not allocate memory for blocks", pool->name); + this->blocks[this->current_blocks] = MallocT(this->item_size * (1 << this->block_size_bits)); + if (this->blocks[this->current_blocks] == NULL) + error("Pool: (%s) could not allocate memory for blocks", this->name); /* Clean the content of the new block */ - memset(pool->blocks[pool->current_blocks], 0, pool->item_size * (1 << pool->block_size_bits)); + memset(this->blocks[this->current_blocks], 0, this->item_size * (1 << this->block_size_bits)); /* Call a custom function if defined (e.g. to fill indexes) */ - if (pool->new_block_proc != NULL) - pool->new_block_proc(pool->current_blocks * (1 << pool->block_size_bits)); + if (this->new_block_proc != NULL) this->new_block_proc(this->current_blocks * (1 << this->block_size_bits)); /* We have a new block */ - pool->current_blocks++; + this->current_blocks++; return true; } @@ -78,11 +77,10 @@ * * @return Returns false if adding failed */ -bool AddBlockIfNeeded(OldMemoryPool *pool, uint index) +bool OldMemoryPoolBase::AddBlockIfNeeded(uint index) { - while (index >= pool->total_items) { - if (!AddBlockToPool(pool)) - return false; + while (index >= this->total_items) { + if (!this->AddBlockToPool()) return false; } return true; diff -r 31fcaa5375a1 -r e72987579514 src/oldpool.h --- a/src/oldpool.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/oldpool.h Fri Aug 03 22:09:42 2007 +0000 @@ -5,8 +5,6 @@ #ifndef OLDPOOL_H #define OLDPOOL_H -struct OldMemoryPool; - /* The function that is called after a new block is added start_item is the first item of the new made block */ typedef void OldMemoryPoolNewBlock(uint start_item); @@ -17,12 +15,22 @@ * Stuff for dynamic vehicles. Use the wrappers to access the OldMemoryPool * please try to avoid manual calls! */ -struct OldMemoryPool { +struct OldMemoryPoolBase { + void CleanPool(); + bool AddBlockToPool(); + bool AddBlockIfNeeded(uint index); + +protected: + OldMemoryPoolBase(const char *name, uint max_blocks, uint block_size_bits, uint item_size, + OldMemoryPoolNewBlock *new_block_proc, OldMemoryPoolCleanBlock *clean_block_proc) : + name(name), max_blocks(max_blocks), block_size_bits(block_size_bits), + new_block_proc(new_block_proc), clean_block_proc(clean_block_proc), current_blocks(0), + total_items(0), item_size(item_size), first_free_index(0), blocks(NULL) {} + const char* name; ///< Name of the pool (just for debugging) - uint max_blocks; ///< The max amount of blocks this pool can have - uint block_size_bits; ///< The size of each block in bits - uint item_size; ///< How many bytes one block is + const uint max_blocks; ///< The max amount of blocks this pool can have + const uint block_size_bits; ///< The size of each block in bits /// Pointer to a function that is called after a new block is added OldMemoryPoolNewBlock *new_block_proc; @@ -32,25 +40,238 @@ uint current_blocks; ///< How many blocks we have in our pool uint total_items; ///< How many items we now have in this pool +public: + const uint item_size; ///< How many bytes one block is + uint first_free_index; ///< The index of the first free pool item in this pool byte **blocks; ///< An array of blocks (one block hold all the items) + + /** + * Get the size of this pool, i.e. the total number of items you + * can put into it at the current moment; the pool might still + * be able to increase the size of the pool. + * @return the size of the pool + */ + inline uint GetSize() const + { + return this->total_items; + } + + /** + * Can this pool allocate more blocks, i.e. is the maximum amount + * of allocated blocks not yet reached? + * @return the if and only if the amount of allocable blocks is + * less than the amount of allocated blocks. + */ + inline bool CanAllocateMoreBlocks() const + { + return this->current_blocks < this->max_blocks; + } + + /** + * Get the maximum number of allocable blocks. + * @return the numebr of blocks + */ + inline uint GetBlockCount() const + { + return this->current_blocks; + } + + /** + * Get the name of this pool. + * @return the name + */ + inline const char *GetName() const + { + return this->name; + } +}; + +template +struct OldMemoryPool : public OldMemoryPoolBase { + OldMemoryPool(const char *name, uint max_blocks, uint block_size_bits, uint item_size, + OldMemoryPoolNewBlock *new_block_proc, OldMemoryPoolCleanBlock *clean_block_proc) : + OldMemoryPoolBase(name, max_blocks, block_size_bits, item_size, new_block_proc, clean_block_proc) {} + + /** + * Get the pool entry at the given index. + * @param index the index into the pool + * @pre index < this->GetSize() + * @return the pool entry. + */ + inline T *Get(uint index) const + { + assert(index < this->GetSize()); + return (T*)(this->blocks[index >> this->block_size_bits] + + (index & ((1 << this->block_size_bits) - 1)) * this->item_size); + } }; /** - * Those are the wrappers: - * CleanPool cleans the pool up, but you can use AddBlockToPool directly again - * (no need to call CreatePool!) - * AddBlockToPool adds 1 more block to the pool. Returns false if there is no - * more room + * Generic function to initialize a new block in a pool. + * @param start_item the first item that needs to be initialized */ -void CleanPool(OldMemoryPool *array); -bool AddBlockToPool(OldMemoryPool *array); +template *Tpool> +static void PoolNewBlock(uint start_item) +{ + for (T *t = Tpool->Get(start_item); t != NULL; t = (t->index + 1U < Tpool->GetSize()) ? Tpool->Get(t->index + 1U) : NULL) { + t = new (t) T(); + t->index = start_item++; + } +} /** - * Adds blocks to the pool if needed (and possible) till index fits inside the pool - * - * @return Returns false if adding failed + * Generic function to free a new block in a pool. + * This function uses QuickFree that is intended to only free memory that would be lost if the pool is freed. + * @param start_item the first item that needs to be cleaned + * @param end_item the last item that needs to be cleaned */ -bool AddBlockIfNeeded(OldMemoryPool *array, uint index); +template *Tpool> +static void PoolCleanBlock(uint start_item, uint end_item) +{ + for (uint i = start_item; i <= end_item; i++) { + T *t = Tpool->Get(i); + if (t->IsValid()) { + t->QuickFree(); + } + } +} + + +/** + * Generalization for all pool items that are saved in the savegame. + * It specifies all the mechanics to access the pool easily. + */ +template *Tpool> +struct PoolItem { + /** + * The pool-wide index of this object. + */ + Tid index; + + /** + * We like to have the correct class destructed. + */ + virtual ~PoolItem() + { + if (this->index < Tpool->first_free_index) Tpool->first_free_index = this->index; + } + + /** + * Called on each object when the pool is being destroyed, so one + * can free allocated memory without the need for freeing for + * example orders. + */ + virtual void QuickFree() + { + } + + /** + * An overriden version of new that allocates memory on the pool. + * @param size the size of the variable (unused) + * @return the memory that is 'allocated' + */ + void *operator new(size_t size) + { + return AllocateRaw(); + } + + /** + * 'Free' the memory allocated by the overriden new. + * @param p the memory to 'free' + */ + void operator delete(void *p) + { + } + + /** + * An overriden version of new, so you can directly allocate a new object with + * the correct index when one is loading the savegame. + * @param size the size of the variable (unused) + * @param index the index of the object + * @return the memory that is 'allocated' + */ + void *operator new(size_t size, int index) + { + if (!Tpool->AddBlockIfNeeded(index)) error("%s: failed loading savegame: too many %s", Tpool->GetName(), Tpool->GetName()); + + return Tpool->Get(index); + } + + /** + * 'Free' the memory allocated by the overriden new. + * @param p the memory to 'free' + * @param index the original parameter given to create the memory + */ + void operator delete(void *p, int index) + { + } + + /** + * An overriden version of new, so you can use the vehicle instance + * instead of a newly allocated piece of memory. + * @param size the size of the variable (unused) + * @param pn the already existing object to use as 'storage' backend + * @return the memory that is 'allocated' + */ + void *operator new(size_t size, T *pn) + { + return pn; + } + + /** + * 'Free' the memory allocated by the overriden new. + * @param p the memory to 'free' + * @param pn the pointer that was given to 'new' on creation. + */ + void operator delete(void *p, T *pn) + { + } + + /** + * Is this a valid object or not? + * @return true if and only if it is valid + */ + virtual bool IsValid() const + { + return false; + } + +protected: + /** + * Allocate a pool item; possibly allocate a new block in the pool. + * @return the allocated pool item (or NULL when the pool is full). + */ + static T *AllocateRaw() + { + return AllocateRaw(Tpool->first_free_index); + } + + /** + * Allocate a pool item; possibly allocate a new block in the pool. + * @param first the first pool item to start searching + * @return the allocated pool item (or NULL when the pool is full). + */ + static T *AllocateRaw(uint &first) + { + uint last_minus_one = Tpool->GetSize() - 1; + + for (T *t = Tpool->Get(first); t != NULL; t = (t->index < last_minus_one) ? Tpool->Get(t->index + 1U) : NULL) { + if (!t->IsValid()) { + first = t->index; + Tid index = t->index; + + memset(t, 0, Tpool->item_size); + t->index = index; + return t; + } + } + + /* Check if we can add a block to the pool */ + if (Tpool->AddBlockToPool()) return AllocateRaw(first); + + return NULL; + } +}; #define OLD_POOL_ENUM(name, type, block_size_bits, max_blocks) \ @@ -61,33 +282,25 @@ #define OLD_POOL_ACCESSORS(name, type) \ - static inline type* Get##name(uint index) \ - { \ - assert(index < _##name##_pool.total_items); \ - return (type*)( \ - _##name##_pool.blocks[index >> name##_POOL_BLOCK_SIZE_BITS] + \ - (index & ((1 << name##_POOL_BLOCK_SIZE_BITS) - 1)) * sizeof(type) \ - ); \ - } \ -\ - static inline uint Get##name##PoolSize() \ - { \ - return _##name##_pool.total_items; \ - } + static inline type* Get##name(uint index) { return _##name##_pool.Get(index); } \ + static inline uint Get##name##PoolSize() { return _##name##_pool.GetSize(); } #define DECLARE_OLD_POOL(name, type, block_size_bits, max_blocks) \ OLD_POOL_ENUM(name, type, block_size_bits, max_blocks) \ - extern OldMemoryPool _##name##_pool; \ + extern OldMemoryPool _##name##_pool; \ OLD_POOL_ACCESSORS(name, type) #define DEFINE_OLD_POOL(name, type, new_block_proc, clean_block_proc) \ - OldMemoryPool _##name##_pool = { \ + OldMemoryPool _##name##_pool( \ #name, name##_POOL_MAX_BLOCKS, name##_POOL_BLOCK_SIZE_BITS, sizeof(type), \ - new_block_proc, clean_block_proc, \ - 0, 0, NULL \ - }; + new_block_proc, clean_block_proc); + +#define DEFINE_OLD_POOL_GENERIC(name, type) \ + OldMemoryPool _##name##_pool( \ + #name, name##_POOL_MAX_BLOCKS, name##_POOL_BLOCK_SIZE_BITS, sizeof(type), \ + PoolNewBlock, PoolCleanBlock); #define STATIC_OLD_POOL(name, type, block_size_bits, max_blocks, new_block_proc, clean_block_proc) \ diff -r 31fcaa5375a1 -r e72987579514 src/openttd.cpp --- a/src/openttd.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/openttd.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -5,7 +5,6 @@ #include "stdafx.h" #define VARDEF #include "string.h" -#include "table/strings.h" #include "debug.h" #include "driver.h" #include "saveload.h" @@ -16,6 +15,7 @@ #include "ai/ai_factory.hpp" #include "openttd.h" +#include "table/strings.h" #include "strings.h" #include "bridge_map.h" #include "functions.h" @@ -309,14 +309,14 @@ UnInitializeAirports(); /* Uninitialize variables that are allocated dynamically */ - CleanPool(&_Town_pool); - CleanPool(&_Industry_pool); - CleanPool(&_Station_pool); - CleanPool(&_Vehicle_pool); - CleanPool(&_Sign_pool); - CleanPool(&_Order_pool); - CleanPool(&_Group_pool); - CleanPool(&_CargoPacket_pool); + _Town_pool.CleanPool(); + _Industry_pool.CleanPool(); + _Station_pool.CleanPool(); + _Vehicle_pool.CleanPool(); + _Sign_pool.CleanPool(); + _Order_pool.CleanPool(); + _Group_pool.CleanPool(); + _CargoPacket_pool.CleanPool(); free((void*)_town_sort); free((void*)_industry_sort); @@ -1162,7 +1162,7 @@ for (tile = 0; tile != MapSize(); tile++) { switch (GetTileType(tile)) { - case MP_STREET: + case MP_ROAD: if (GB(_m[tile].m5, 4, 2) == ROAD_TILE_CROSSING && HASBIT(_m[tile].m4, 7)) { _m[tile].m4 = OWNER_TOWN; } @@ -1482,7 +1482,7 @@ SetTownIndex(t, CalcClosestTownFromTile(t, (uint)-1)->index); break; - case MP_STREET: + case MP_ROAD: _m[t].m4 |= (_m[t].m2 << 4); if (IsTileOwner(t, OWNER_TOWN)) { SetTownIndex(t, CalcClosestTownFromTile(t, (uint)-1)->index); @@ -1544,7 +1544,7 @@ } break; - case MP_STREET: + case MP_ROAD: /* Swap m3 and m4, so the track type for rail crossings is the * same as for normal rail. */ Swap(_m[t].m3, _m[t].m4); @@ -1560,7 +1560,7 @@ bool old_bridge = CheckSavegameVersion(42); for (TileIndex t = 0; t < map_size; t++) { switch(GetTileType(t)) { - case MP_STREET: + case MP_ROAD: SB(_m[t].m5, 6, 2, GB(_m[t].m5, 4, 2)); switch (GetRoadTileType(t)) { default: NOT_REACHED(); @@ -1688,7 +1688,7 @@ SetRailType(t, UpdateRailType(GetRailType(t), min_rail)); break; - case MP_STREET: + case MP_ROAD: if (IsLevelCrossing(t)) { SetRailType(t, UpdateRailType(GetRailType(t), min_rail)); } @@ -1790,7 +1790,7 @@ } break; - case MP_STREET: /* Clear PBS reservation on crossing */ + case MP_ROAD: /* Clear PBS reservation on crossing */ if (IsLevelCrossing(t)) CLRBIT(_m[t].m5, 0); break; diff -r 31fcaa5375a1 -r e72987579514 src/openttd.h --- a/src/openttd.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/openttd.h Fri Aug 03 22:09:42 2007 +0000 @@ -51,7 +51,7 @@ typedef uint16 EngineID; typedef uint16 UnitID; typedef uint16 StringID; -#define INVALID_STRING_ID 0xFFFF +static const StringID INVALID_STRING_ID = 0xFFFF; typedef EngineID *EngineList; ///< engine list type placeholder acceptable for C code (see helpers.cpp) @@ -472,7 +472,7 @@ typedef void ChangeTileOwnerProc(TileIndex tile, PlayerID old_player, PlayerID new_player); /** @see VehicleEnterTileStatus to see what the return values mean */ typedef uint32 VehicleEnterTileProc(Vehicle *v, TileIndex tile, int x, int y); -typedef Slope GetSlopeTilehProc(TileIndex, Slope tileh); +typedef Foundation GetFoundationProc(TileIndex tile, Slope tileh); struct TileTypeProcs { DrawTileProc *draw_tile_proc; @@ -487,7 +487,7 @@ ChangeTileOwnerProc *change_tile_owner_proc; GetProducedCargoProc *get_produced_cargo_proc; VehicleEnterTileProc *vehicle_enter_tile_proc; - GetSlopeTilehProc *get_slope_tileh_proc; + GetFoundationProc *get_foundation_proc; }; diff -r 31fcaa5375a1 -r e72987579514 src/order.h --- a/src/order.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/order.h Fri Aug 03 22:09:42 2007 +0000 @@ -83,26 +83,30 @@ CO_UNSHARE = 2 }; +struct Order; +DECLARE_OLD_POOL(Order, Order, 6, 1000) + /* If you change this, keep in mind that it is saved on 3 places: * - Load_ORDR, all the global orders * - Vehicle -> current_order * - REF_ORDER (all REFs are currently limited to 16 bits!!) */ -struct Order { +struct Order : PoolItem { Order *next; ///< Pointer to next order. If NULL, end of list OrderTypeByte type; uint8 flags; DestinationID dest; ///< The destionation of the order. - OrderID index; ///< Index of the order, is not saved or anything, just for reference - CargoID refit_cargo; // Refit CargoID byte refit_subtype; // Refit subtype uint16 wait_time; ///< How long in ticks to wait at the destination. uint16 travel_time; ///< How long in ticks the journey to this destination should take. + Order() : refit_cargo(CT_NO_REFIT) {} + ~Order() { this->type = OT_NOTHING; } + bool IsValid() const; void Free(); void FreeChain(); @@ -121,8 +125,6 @@ VARDEF TileIndex _backup_orders_tile; VARDEF BackuppedOrders _backup_orders_data[1]; -DECLARE_OLD_POOL(Order, Order, 6, 1000) - static inline VehicleOrderID GetMaxOrderIndex() { /* TODO - This isn't the real content of the function, but @@ -143,21 +145,21 @@ */ inline bool Order::IsValid() const { - return type != OT_NOTHING; + return this->type != OT_NOTHING; } inline void Order::Free() { - type = OT_NOTHING; - flags = 0; - dest = 0; - next = NULL; + this->type = OT_NOTHING; + this->flags = 0; + this->dest = 0; + this->next = NULL; } inline void Order::FreeChain() { if (next != NULL) next->FreeChain(); - Free(); + delete this; } #define FOR_ALL_ORDERS_FROM(order, start) for (order = GetOrder(start); order != NULL; order = (order->index + 1U < GetOrderPoolSize()) ? GetOrder(order->index + 1U) : NULL) if (order->IsValid()) @@ -171,13 +173,9 @@ const Order *order; /* There is always room if not all blocks in the pool are reserved */ - if (_Order_pool.current_blocks < _Order_pool.max_blocks) - return true; + if (_Order_pool.CanAllocateMoreBlocks()) return true; - FOR_ALL_ORDERS(order) - if (!order->IsValid()) - if (--amount == 0) - return true; + FOR_ALL_ORDERS(order) if (!order->IsValid() && --amount == 0) return true; return false; } diff -r 31fcaa5375a1 -r e72987579514 src/order_cmd.cpp --- a/src/order_cmd.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/order_cmd.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -20,19 +20,7 @@ #include "cargotype.h" #include "strings.h" -/** - * Called if a new block is added to the order-pool - */ -static void OrderPoolNewBlock(uint start_item) -{ - Order *order; - - /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. - * TODO - This is just a temporary stage, this will be removed. */ - for (order = GetOrder(start_item); order != NULL; order = (order->index + 1U < GetOrderPoolSize()) ? GetOrder(order->index + 1U) : NULL) order->index = start_item++; -} - -DEFINE_OLD_POOL(Order, Order, OrderPoolNewBlock, NULL) +DEFINE_OLD_POOL_GENERIC(Order, Order) /** * @@ -113,41 +101,6 @@ /** * - * Allocate a new order - * - * @return Order* if a free space is found, else NULL. - * - */ -static Order *AllocateOrder() -{ - Order *order; - - /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. - * TODO - This is just a temporary stage, this will be removed. */ - for (order = GetOrder(0); order != NULL; order = (order->index + 1U < GetOrderPoolSize()) ? GetOrder(order->index + 1U) : NULL) { - if (!order->IsValid()) { - OrderID index = order->index; - - memset(order, 0, sizeof(*order)); - order->index = index; - order->next = NULL; - order->refit_cargo = CT_NO_REFIT; - order->refit_subtype = 0; - order->wait_time = 0; - order->travel_time = 0; - - return order; - } - } - - /* Check if we can add a block to the pool */ - if (AddBlockToPool(&_Order_pool)) return AllocateOrder(); - - return NULL; -} - -/** - * * Assign data to an order (from an other order) * This function makes sure that the index is maintained correctly * @@ -395,7 +348,7 @@ if (flags & DC_EXEC) { Vehicle *u; - Order *new_o = AllocateOrder(); + Order *new_o = new Order(); AssignOrder(new_o, new_order); /* Create new order and link in list */ @@ -890,7 +843,7 @@ order_dst = &dst->orders; FOR_VEHICLE_ORDERS(src, order) { - *order_dst = AllocateOrder(); + *order_dst = new Order(); AssignOrder(*order_dst, *order); order_dst = &(*order_dst)->next; } @@ -1316,8 +1269,8 @@ void InitializeOrders() { - CleanPool(&_Order_pool); - AddBlockToPool(&_Order_pool); + _Order_pool.CleanPool(); + _Order_pool.AddBlockToPool(); _backup_orders_tile = 0; } @@ -1367,10 +1320,8 @@ SlArray(orders, len, SLE_UINT16); for (i = 0; i < len; ++i) { - if (!AddBlockIfNeeded(&_Order_pool, i)) - error("Orders: failed loading savegame: too many orders"); - - AssignOrder(GetOrder(i), UnpackVersion4Order(orders[i])); + Order *order = new (i) Order(); + AssignOrder(order, UnpackVersion4Order(orders[i])); } } else if (CheckSavegameVersionOldStyle(5, 2)) { uint32 orders[5000]; @@ -1381,10 +1332,8 @@ SlArray(orders, len, SLE_UINT32); for (i = 0; i < len; ++i) { - if (!AddBlockIfNeeded(&_Order_pool, i)) - error("Orders: failed loading savegame: too many orders"); - - AssignOrder(GetOrder(i), UnpackOrder(orders[i])); + Order *order = new (i) Order(); + AssignOrder(order, UnpackOrder(orders[i])); } } @@ -1400,12 +1349,7 @@ int index; while ((index = SlIterateArray()) != -1) { - Order *order; - - if (!AddBlockIfNeeded(&_Order_pool, index)) - error("Orders: failed loading savegame: too many orders"); - - order = GetOrder(index); + Order *order = new (index) Order(); SlObject(order, _order_desc); } } diff -r 31fcaa5375a1 -r e72987579514 src/order_gui.cpp --- a/src/order_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/order_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -115,7 +115,6 @@ int sel; int y, i; bool shared_orders; - byte color; v = GetVehicle(w->window_number); @@ -192,6 +191,11 @@ SetDParam(1, 6); switch (order->type) { + case OT_DUMMY: + SetDParam(1, STR_INVALID_ORDER); + SetDParam(2, order->dest); + break; + case OT_GOTO_STATION: SetDParam(1, StationOrderStrings[order->flags]); SetDParam(2, order->dest); @@ -234,15 +238,10 @@ default: break; } - color = (i == WP(w,order_d).sel) ? 0xC : 0x10; + const byte colour = (i == WP(w,order_d).sel) ? 0xC : 0x10; SetDParam(0, i + 1); - if (order->type != OT_DUMMY) { - DrawString(2, y, str, color); - } else { - SetDParam(1, STR_INVALID_ORDER); - SetDParam(2, order->dest); - DrawString(2, y, str, color); - } + DrawString(2, y, str, colour); + y += 10; } @@ -252,8 +251,8 @@ if (i - w->vscroll.pos < w->vscroll.cap) { str = shared_orders ? STR_END_OF_SHARED_ORDERS : STR_882A_END_OF_ORDERS; - color = (i == WP(w,order_d).sel) ? 0xC : 0x10; - DrawString(2, y, str, color); + const byte colour = (i == WP(w,order_d).sel) ? 0xC : 0x10; + DrawString(2, y, str, colour); } } @@ -279,7 +278,7 @@ } break; - case MP_STREET: + case MP_ROAD: if (GetRoadTileType(tile) == ROAD_TILE_DEPOT && v->type == VEH_ROAD && IsTileOwner(tile, _local_player)) { order.type = OT_GOTO_DEPOT; order.flags = OF_PART_OF_ORDERS; @@ -771,7 +770,7 @@ }; static const WindowDesc _orders_train_desc = { - WDP_AUTO, WDP_AUTO, 399, 88, + WDP_AUTO, WDP_AUTO, 399, 88, 399, 88, WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE, _orders_train_widgets, @@ -808,7 +807,7 @@ }; static const WindowDesc _orders_desc = { - WDP_AUTO, WDP_AUTO, 410, 88, + WDP_AUTO, WDP_AUTO, 410, 88, 410, 88, WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE, _orders_widgets, @@ -845,7 +844,7 @@ }; static const WindowDesc _other_orders_desc = { - WDP_AUTO, WDP_AUTO, 332, 88, + WDP_AUTO, WDP_AUTO, 332, 88, 332, 88, WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE, _other_orders_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/os/macosx/splash.cpp --- a/src/os/macosx/splash.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/os/macosx/splash.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -128,7 +128,7 @@ _cur_palette[0xff].b = 0; _pal_first_dirty = 0; - _pal_count_dirty = 255; + _pal_count_dirty = 256; png_destroy_read_struct(&png_ptr, &info_ptr, &end_info); fclose(f); diff -r 31fcaa5375a1 -r e72987579514 src/os2.cpp --- a/src/os2.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/os2.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -44,6 +44,8 @@ _dos_getdrive(&save); // save original drive #else save = _getdrive(); // save original drive + char wd[MAX_PATH]; + getcwd(wd, MAX_PATH); total = 'z'; #endif @@ -55,7 +57,7 @@ for (disk = 'A';; disk++) { _chdrive(disk); #endif - if (disk >= total) return; + if (disk >= total) break; #ifndef __INNOTEK_LIBC__ _dos_getdrive(&disk2); @@ -80,7 +82,7 @@ #ifndef __INNOTEK_LIBC__ _dos_setdrive(save, &total); #else - _chdrive(save); + chdir(wd); #endif } @@ -171,7 +173,7 @@ * and append this up to the maximum length (either absolute or screenlength). If maxlength * is zero, we don't care about the screenlength but only about the physical length of the string * @param tb Textbuf type to be changed - * @return Return true on successfull change of Textbuf, or false otherwise + * @return Return true on successful change of Textbuf, or false otherwise */ bool InsertTextBufferClipboard(Textbuf *tb) { diff -r 31fcaa5375a1 -r e72987579514 src/player.h --- a/src/player.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/player.h Fri Aug 03 22:09:42 2007 +0000 @@ -80,8 +80,8 @@ void ChangeOwnershipOfPlayerItems(PlayerID old_player, PlayerID new_player); void GetNameOfOwner(Owner owner, TileIndex tile); -Money CalculateCompanyValue(const Player* p); -void InvalidatePlayerWindows(const Player* p); +Money CalculateCompanyValue(const Player *p); +void InvalidatePlayerWindows(const Player *p); void SetLocalPlayer(PlayerID new_player); #define FOR_ALL_PLAYERS(p) for (p = _players; p != endof(_players); p++) @@ -104,7 +104,7 @@ return count; } -static inline Player* GetPlayer(PlayerID i) +static inline Player *GetPlayer(PlayerID i) { assert(IS_INSIDE_1D(i, PLAYER_FIRST, lengthof(_players))); return &_players[i]; @@ -150,7 +150,7 @@ * @param p the player "in action" * @return The "best" railtype a player has available */ -static inline RailType GetBestRailtype(const Player* p) +static inline RailType GetBestRailtype(const Player *p) { if (HasRailtypeAvail(p, RAILTYPE_MAGLEV)) return RAILTYPE_MAGLEV; if (HasRailtypeAvail(p, RAILTYPE_MONO)) return RAILTYPE_MONO; diff -r 31fcaa5375a1 -r e72987579514 src/player_gui.cpp --- a/src/player_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/player_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -197,7 +197,7 @@ } static const WindowDesc _player_finances_desc = { - WDP_AUTO, WDP_AUTO, 407, 216, + WDP_AUTO, WDP_AUTO, 407, 216, 407, 216, WC_FINANCES, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON, _player_finances_widgets, @@ -205,7 +205,7 @@ }; static const WindowDesc _player_finances_small_desc = { - WDP_AUTO, WDP_AUTO, 280, 60, + WDP_AUTO, WDP_AUTO, 280, 60, 280, 60, WC_FINANCES, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON, _player_finances_small_widgets, @@ -213,7 +213,7 @@ }; static const WindowDesc _other_player_finances_desc = { - WDP_AUTO, WDP_AUTO, 407, 204, + WDP_AUTO, WDP_AUTO, 407, 204, 407, 204, WC_FINANCES, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON, _other_player_finances_widgets, @@ -221,7 +221,7 @@ }; static const WindowDesc _other_player_finances_small_desc = { - WDP_AUTO, WDP_AUTO, 280, 48, + WDP_AUTO, WDP_AUTO, 280, 48, 280, 48, WC_FINANCES, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON, _other_player_finances_small_widgets, @@ -480,7 +480,7 @@ }; static const WindowDesc _select_player_livery_2cc_desc = { - WDP_AUTO, WDP_AUTO, 400, 49 + 1 * 14, + WDP_AUTO, WDP_AUTO, 400, 49 + 1 * 14, 400, 49 + 1 * 14, WC_PLAYER_COLOR, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _select_player_livery_2cc_widgets, @@ -507,7 +507,7 @@ }; static const WindowDesc _select_player_livery_desc = { - WDP_AUTO, WDP_AUTO, 275, 49 + 1 * 14, + WDP_AUTO, WDP_AUTO, 275, 49 + 1 * 14, 275, 49 + 1 * 14, WC_PLAYER_COLOR, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _select_player_livery_widgets, @@ -599,7 +599,7 @@ }; static const WindowDesc _select_player_face_desc = { - WDP_AUTO, WDP_AUTO, 190, 149, + WDP_AUTO, WDP_AUTO, 190, 149, 190, 149, WC_PLAYER_FACE, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _select_player_face_widgets, @@ -912,7 +912,7 @@ static const WindowDesc _player_company_desc = { - WDP_AUTO, WDP_AUTO, 360, 170, + WDP_AUTO, WDP_AUTO, 360, 170, 360, 170, WC_COMPANY, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _player_company_widgets, @@ -972,7 +972,7 @@ }; static const WindowDesc _buy_company_desc = { - 153, 171, 334, 137, + 153, 171, 334, 137, 334, 137, WC_BUY_COMPANY, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _buy_company_widgets, @@ -1092,7 +1092,7 @@ }; static const WindowDesc _highscore_desc = { - 0, 0, 641, 481, + 0, 0, 641, 481, 641, 481, WC_HIGHSCORE, WC_NONE, 0, _highscore_widgets, @@ -1100,7 +1100,7 @@ }; static const WindowDesc _endgame_desc = { - 0, 0, 641, 481, + 0, 0, 641, 481, 641, 481, WC_ENDSCREEN, WC_NONE, 0, _highscore_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/queue.h --- a/src/queue.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/queue.h Fri Aug 03 22:09:42 2007 +0000 @@ -12,20 +12,20 @@ struct Queue; -typedef bool Queue_PushProc(Queue* q, void* item, int priority); -typedef void* Queue_PopProc(Queue* q); -typedef bool Queue_DeleteProc(Queue* q, void* item, int priority); -typedef void Queue_ClearProc(Queue* q, bool free_values); -typedef void Queue_FreeProc(Queue* q, bool free_values); +typedef bool Queue_PushProc(Queue *q, void *item, int priority); +typedef void* Queue_PopProc(Queue *q); +typedef bool Queue_DeleteProc(Queue *q, void* item, int priority); +typedef void Queue_ClearProc(Queue *q, bool free_values); +typedef void Queue_FreeProc(Queue *q, bool free_values); struct InsSortNode { - void* item; + void *item; int priority; InsSortNode* next; }; struct BinaryHeapNode { - void* item; + void *item; int priority; }; @@ -35,39 +35,39 @@ * Pushes an element into the queue, at the appropriate place for the queue. * Requires the queue pointer to be of an appropriate type, of course. */ - Queue_PushProc* push; + Queue_PushProc *push; /* * Pops the first element from the queue. What exactly is the first element, * is defined by the exact type of queue. */ - Queue_PopProc* pop; + Queue_PopProc *pop; /* * Deletes the item from the queue. priority should be specified if * known, which speeds up the deleting for some queue's. Should be -1 * if not known. */ - Queue_DeleteProc* del; + Queue_DeleteProc *del; /* Clears the queue, by removing all values from it. It's state is * effectively reset. If free_items is true, each of the items cleared * in this way are free()'d. */ - Queue_ClearProc* clear; + Queue_ClearProc *clear; /* Frees the queue, by reclaiming all memory allocated by it. After * this it is no longer usable. If free_items is true, any remaining * items are free()'d too. */ - Queue_FreeProc* free; + Queue_FreeProc *free; union { struct { - InsSortNode* first; + InsSortNode *first; } inssort; struct { uint max_size; uint size; uint blocks; ///< The amount of blocks for which space is reserved in elements - BinaryHeapNode** elements; + BinaryHeapNode **elements; } binaryheap; } data; }; @@ -79,7 +79,7 @@ /* Initializes a inssort and allocates internal memory. There is no maximum * size */ -void init_InsSort(Queue* q); +void init_InsSort(Queue *q); /* @@ -93,7 +93,7 @@ /** Initializes a binary heap and allocates internal memory for maximum of * max_size elements */ -void init_BinaryHeap(Queue* q, uint max_size); +void init_BinaryHeap(Queue *q, uint max_size); /* @@ -102,8 +102,8 @@ struct HashNode { uint key1; uint key2; - void* value; - HashNode* next; + void *value; + HashNode *next; }; /** * Generates a hash code from the given key pair. You should make sure that @@ -112,16 +112,16 @@ typedef uint Hash_HashProc(uint key1, uint key2); struct Hash { /* The hash function used */ - Hash_HashProc* hash; + Hash_HashProc *hash; /* The amount of items in the hash */ uint size; /* The number of buckets allocated */ uint num_buckets; /* A pointer to an array of num_buckets buckets. */ - HashNode* buckets; + HashNode *buckets; /* A pointer to an array of numbuckets booleans, which will be true if * there are any Nodes in the bucket */ - bool* buckets_in_use; + bool *buckets_in_use; }; /* Call these function to manipulate a hash */ @@ -129,32 +129,32 @@ /** Deletes the value with the specified key pair from the hash and returns * that value. Returns NULL when the value was not present. The value returned * is _not_ free()'d! */ -void* Hash_Delete(Hash* h, uint key1, uint key2); +void *Hash_Delete(Hash *h, uint key1, uint key2); /** Sets the value associated with the given key pair to the given value. * Returns the old value if the value was replaced, NULL when it was not yet present. */ -void* Hash_Set(Hash* h, uint key1, uint key2, void* value); +void *Hash_Set(Hash *h, uint key1, uint key2, void *value); /** Gets the value associated with the given key pair, or NULL when it is not * present. */ -void* Hash_Get(const Hash* h, uint key1, uint key2); +void *Hash_Get(const Hash *h, uint key1, uint key2); /* Call these function to create/destroy a hash */ /** Builds a new hash in an existing struct. Make sure that hash() always * returns a hash less than num_buckets! Call delete_hash after use */ -void init_Hash(Hash* h, Hash_HashProc* hash, uint num_buckets); +void init_Hash(Hash *h, Hash_HashProc *hash, uint num_buckets); /** * Deletes the hash and cleans up. Only cleans up memory allocated by new_Hash * & friends. If free is true, it will call free() on all the values that * are left in the hash. */ -void delete_Hash(Hash* h, bool free_values); +void delete_Hash(Hash *h, bool free_values); /** * Cleans the hash, but keeps the memory allocated */ -void clear_Hash(Hash* h, bool free_values); +void clear_Hash(Hash *h, bool free_values); /** * Gets the current size of the Hash */ -uint Hash_Size(const Hash* h); +uint Hash_Size(const Hash *h); #endif /* QUEUE_H */ diff -r 31fcaa5375a1 -r e72987579514 src/rail.cpp --- a/src/rail.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/rail.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -110,7 +110,7 @@ case MP_RAILWAY: return GetRailType(tile); - case MP_STREET: + case MP_ROAD: /* rail/road crossing */ if (IsLevelCrossing(tile)) return GetRailType(tile); break; diff -r 31fcaa5375a1 -r e72987579514 src/rail.h --- a/src/rail.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/rail.h Fri Aug 03 22:09:42 2007 +0000 @@ -9,14 +9,19 @@ #include "direction.h" #include "tile.h" +/** + * Enumeration for all possible railtypes. + * + * This enumeration defines all 4 possible railtypes. + */ enum RailType { - RAILTYPE_BEGIN = 0, - RAILTYPE_RAIL = 0, - RAILTYPE_ELECTRIC = 1, - RAILTYPE_MONO = 2, - RAILTYPE_MAGLEV = 3, - RAILTYPE_END, - INVALID_RAILTYPE = 0xFF + RAILTYPE_BEGIN = 0, ///< Used for iterations + RAILTYPE_RAIL = 0, ///< Standard non-electric rails + RAILTYPE_ELECTRIC = 1, ///< Electric rails + RAILTYPE_MONO = 2, ///< Monorail + RAILTYPE_MAGLEV = 3, ///< Maglev + RAILTYPE_END, ///< Used for iterations + INVALID_RAILTYPE = 0xFF ///< Flag for invalid railtype }; typedef byte RailTypeMask; @@ -28,18 +33,20 @@ typedef TinyEnumT RailTypeByte; -/** These are used to specify a single track. - * Can be translated to a trackbit with TrackToTrackbit */ +/** + * These are used to specify a single track. + * Can be translated to a trackbit with TrackToTrackbit + */ enum Track { - TRACK_BEGIN = 0, - TRACK_X = 0, - TRACK_Y = 1, - TRACK_UPPER = 2, - TRACK_LOWER = 3, - TRACK_LEFT = 4, - TRACK_RIGHT = 5, - TRACK_END, - INVALID_TRACK = 0xFF + TRACK_BEGIN = 0, ///< Used for iterations + TRACK_X = 0, ///< Track along the x-axis (north-east to south-west) + TRACK_Y = 1, ///< Track along the y-axis (north-west to south-east) + TRACK_UPPER = 2, ///< Track in the upper corner of the tile (north) + TRACK_LOWER = 3, ///< Track in the lower corner of the tile (south) + TRACK_LEFT = 4, ///< Track in the left corner of the tile (west) + TRACK_RIGHT = 5, ///< Track in the right corner of the tile (east) + TRACK_END, ///< Used for iterations + INVALID_TRACK = 0xFF ///< Flag for an invalid track }; /** Allow incrementing of Track variables */ @@ -49,10 +56,14 @@ typedef TinyEnumT TrackByte; -/** Convert an Axis to the corresponding Track +/** + * Convert an Axis to the corresponding Track * AXIS_X -> TRACK_X * AXIS_Y -> TRACK_Y * Uses the fact that they share the same internal encoding + * + * @param a the axis to convert + * @return the track corresponding to the axis */ static inline Track AxisToTrack(Axis a) { @@ -62,25 +73,25 @@ /** Bitfield corresponding to Track */ enum TrackBits { - TRACK_BIT_NONE = 0U, - TRACK_BIT_X = 1U << TRACK_X, - TRACK_BIT_Y = 1U << TRACK_Y, - TRACK_BIT_UPPER = 1U << TRACK_UPPER, - TRACK_BIT_LOWER = 1U << TRACK_LOWER, - TRACK_BIT_LEFT = 1U << TRACK_LEFT, - TRACK_BIT_RIGHT = 1U << TRACK_RIGHT, - TRACK_BIT_CROSS = TRACK_BIT_X | TRACK_BIT_Y, - TRACK_BIT_HORZ = TRACK_BIT_UPPER | TRACK_BIT_LOWER, - TRACK_BIT_VERT = TRACK_BIT_LEFT | TRACK_BIT_RIGHT, - TRACK_BIT_3WAY_NE = TRACK_BIT_X | TRACK_BIT_UPPER | TRACK_BIT_RIGHT, - TRACK_BIT_3WAY_SE = TRACK_BIT_Y | TRACK_BIT_LOWER | TRACK_BIT_RIGHT, - TRACK_BIT_3WAY_SW = TRACK_BIT_X | TRACK_BIT_LOWER | TRACK_BIT_LEFT, - TRACK_BIT_3WAY_NW = TRACK_BIT_Y | TRACK_BIT_UPPER | TRACK_BIT_LEFT, - TRACK_BIT_ALL = TRACK_BIT_CROSS | TRACK_BIT_HORZ | TRACK_BIT_VERT, - TRACK_BIT_MASK = 0x3FU, - TRACK_BIT_WORMHOLE = 0x40U, - TRACK_BIT_DEPOT = 0x80U, - INVALID_TRACK_BIT = 0xFF + TRACK_BIT_NONE = 0U, ///< No track + TRACK_BIT_X = 1U << TRACK_X, ///< X-axis track + TRACK_BIT_Y = 1U << TRACK_Y, ///< Y-axis track + TRACK_BIT_UPPER = 1U << TRACK_UPPER, ///< Upper track + TRACK_BIT_LOWER = 1U << TRACK_LOWER, ///< Lower track + TRACK_BIT_LEFT = 1U << TRACK_LEFT, ///< Left track + TRACK_BIT_RIGHT = 1U << TRACK_RIGHT, ///< Right track + TRACK_BIT_CROSS = TRACK_BIT_X | TRACK_BIT_Y, ///< X-Y-axis cross + TRACK_BIT_HORZ = TRACK_BIT_UPPER | TRACK_BIT_LOWER, ///< Upper and lower track + TRACK_BIT_VERT = TRACK_BIT_LEFT | TRACK_BIT_RIGHT, ///< Left and right track + TRACK_BIT_3WAY_NE = TRACK_BIT_X | TRACK_BIT_UPPER | TRACK_BIT_RIGHT,///< "Arrow" to the north-east + TRACK_BIT_3WAY_SE = TRACK_BIT_Y | TRACK_BIT_LOWER | TRACK_BIT_RIGHT,///< "Arrow" to the south-east + TRACK_BIT_3WAY_SW = TRACK_BIT_X | TRACK_BIT_LOWER | TRACK_BIT_LEFT, ///< "Arrow" to the south-west + TRACK_BIT_3WAY_NW = TRACK_BIT_Y | TRACK_BIT_UPPER | TRACK_BIT_LEFT, ///< "Arrow" to the north-west + TRACK_BIT_ALL = TRACK_BIT_CROSS | TRACK_BIT_HORZ | TRACK_BIT_VERT, ///< All possible tracks + TRACK_BIT_MASK = 0x3FU, ///< Bitmask for the first 6 bits + TRACK_BIT_WORMHOLE = 0x40U, ///< Bitflag for a wormhole (used for tunnels) + TRACK_BIT_DEPOT = 0x80U, ///< Bitflag for a depot + INVALID_TRACK_BIT = 0xFF ///< Flag for an invalid trackbits value }; /** Define basic enum properties */ @@ -91,70 +102,83 @@ /** * Maps a Track to the corresponding TrackBits value + * @param track the track to convert + * @return the converted TrackBits value of the track */ static inline TrackBits TrackToTrackBits(Track track) { return (TrackBits)(1 << track); } - +/** + * Maps an Axis to the corresponding TrackBits value + * @param a the axis to convert + * @return the converted TrackBits value of the axis + */ static inline TrackBits AxisToTrackBits(Axis a) { return TrackToTrackBits(AxisToTrack(a)); } -/** These are a combination of tracks and directions. Values are 0-5 in one +/** + * Enumeration for tracks and directions. + * + * These are a combination of tracks and directions. Values are 0-5 in one * direction (corresponding to the Track enum) and 8-13 in the other direction. * 6, 7, 14 and 15 are used to encode the reversing of road vehicles. Those * reversing track dirs are not considered to be 'valid' except in a small * corner in the road vehicle controller. */ enum Trackdir { - TRACKDIR_BEGIN = 0, - TRACKDIR_X_NE = 0, - TRACKDIR_Y_SE = 1, - TRACKDIR_UPPER_E = 2, - TRACKDIR_LOWER_E = 3, - TRACKDIR_LEFT_S = 4, - TRACKDIR_RIGHT_S = 5, - TRACKDIR_RVREV_NE = 6, - TRACKDIR_RVREV_SE = 7, - TRACKDIR_X_SW = 8, - TRACKDIR_Y_NW = 9, - TRACKDIR_UPPER_W = 10, - TRACKDIR_LOWER_W = 11, - TRACKDIR_LEFT_N = 12, - TRACKDIR_RIGHT_N = 13, - TRACKDIR_RVREV_SW = 14, - TRACKDIR_RVREV_NW = 15, - TRACKDIR_END, - INVALID_TRACKDIR = 0xFF, + TRACKDIR_BEGIN = 0, ///< Used for iterations + TRACKDIR_X_NE = 0, ///< X-axis and direction to north-east + TRACKDIR_Y_SE = 1, ///< Y-axis and direction to south-east + TRACKDIR_UPPER_E = 2, ///< Upper track and direction to east + TRACKDIR_LOWER_E = 3, ///< Lower track and direction to east + TRACKDIR_LEFT_S = 4, ///< Left track and direction to south + TRACKDIR_RIGHT_S = 5, ///< Right track and direction to south + TRACKDIR_RVREV_NE = 6, ///< (Road vehicle) reverse direction north-east + TRACKDIR_RVREV_SE = 7, ///< (Road vehicle) reverse direction south-east + TRACKDIR_X_SW = 8, ///< X-axis and direction to south-west + TRACKDIR_Y_NW = 9, ///< Y-axis and direction to north-west + TRACKDIR_UPPER_W = 10, ///< Upper track and direction to west + TRACKDIR_LOWER_W = 11, ///< Lower track and direction to west + TRACKDIR_LEFT_N = 12, ///< Left track and direction to north + TRACKDIR_RIGHT_N = 13, ///< Right track and direction to north + TRACKDIR_RVREV_SW = 14, ///< (Road vehicle) reverse direction south-west + TRACKDIR_RVREV_NW = 15, ///< (Road vehicle) reverse direction north-west + TRACKDIR_END, ///< Used for iterations + INVALID_TRACKDIR = 0xFF, ///< Flag for an invalid trackdir }; /** Define basic enum properties */ template <> struct EnumPropsT : MakeEnumPropsT {}; typedef TinyEnumT TrackdirByte; -/** These are a combination of tracks and directions. Values are 0-5 in one - * direction (corresponding to the Track enum) and 8-13 in the other direction. */ +/** + * Enumeration of bitmasks for the TrackDirs + * + * These are a combination of tracks and directions. Values are 0-5 in one + * direction (corresponding to the Track enum) and 8-13 in the other direction. + */ enum TrackdirBits { - TRACKDIR_BIT_NONE = 0x0000, - TRACKDIR_BIT_X_NE = 0x0001, - TRACKDIR_BIT_Y_SE = 0x0002, - TRACKDIR_BIT_UPPER_E = 0x0004, - TRACKDIR_BIT_LOWER_E = 0x0008, - TRACKDIR_BIT_LEFT_S = 0x0010, - TRACKDIR_BIT_RIGHT_S = 0x0020, + TRACKDIR_BIT_NONE = 0x0000, ///< No track build + TRACKDIR_BIT_X_NE = 0x0001, ///< Track x-axis, direction north-east + TRACKDIR_BIT_Y_SE = 0x0002, ///< Track y-axis, direction south-east + TRACKDIR_BIT_UPPER_E = 0x0004, ///< Track upper, direction east + TRACKDIR_BIT_LOWER_E = 0x0008, ///< Track lower, direction east + TRACKDIR_BIT_LEFT_S = 0x0010, ///< Track left, direction south + TRACKDIR_BIT_RIGHT_S = 0x0020, ///< Track right, direction south /* Again, note the two missing values here. This enables trackdir -> track conversion by doing (trackdir & 0xFF) */ - TRACKDIR_BIT_X_SW = 0x0100, - TRACKDIR_BIT_Y_NW = 0x0200, - TRACKDIR_BIT_UPPER_W = 0x0400, - TRACKDIR_BIT_LOWER_W = 0x0800, - TRACKDIR_BIT_LEFT_N = 0x1000, - TRACKDIR_BIT_RIGHT_N = 0x2000, - TRACKDIR_BIT_MASK = 0x3F3F, - INVALID_TRACKDIR_BIT = 0xFFFF, + TRACKDIR_BIT_X_SW = 0x0100, ///< Track x-axis, direction south-west + TRACKDIR_BIT_Y_NW = 0x0200, ///< Track y-axis, direction north-west + TRACKDIR_BIT_UPPER_W = 0x0400, ///< Track upper, direction west + TRACKDIR_BIT_LOWER_W = 0x0800, ///< Track lower, direction west + TRACKDIR_BIT_LEFT_N = 0x1000, ///< Track left, direction north + TRACKDIR_BIT_RIGHT_N = 0x2000, ///< Track right, direction north + TRACKDIR_BIT_MASK = 0x3F3F, ///< Bitmask for bit-operations + INVALID_TRACKDIR_BIT = 0xFFFF, ///< Flag for an invalid trackdirbit value }; /** Define basic enum properties */ @@ -195,14 +219,14 @@ } gui_sprites; struct { - CursorID rail_ns; - CursorID rail_swne; - CursorID rail_ew; - CursorID rail_nwse; - CursorID autorail; - CursorID depot; - CursorID tunnel; - CursorID convert; + CursorID rail_ns; ///< Cursor for building rail in N-S direction + CursorID rail_swne; ///< Cursor for building rail in X direction + CursorID rail_ew; ///< Cursor for building rail in E-W direction + CursorID rail_nwse; ///< Cursor for building rail in Y direction + CursorID autorail; ///< Cursor for autorail tool + CursorID depot; ///< Cursor for building a depot + CursorID tunnel; ///< Cursor for building a tunnel + CursorID convert; ///< Cursor for converting track } cursor; struct { @@ -248,12 +272,28 @@ /** * Maps a Trackdir to the corresponding TrackdirBits value + * @param trackdir the track direction to convert + * @return the converted TrackdirBits value */ -static inline TrackdirBits TrackdirToTrackdirBits(Trackdir trackdir) { return (TrackdirBits)(1 << trackdir); } +static inline TrackdirBits TrackdirToTrackdirBits(Trackdir trackdir) +{ + return (TrackdirBits)(1 << trackdir); +} /** -* Removes first Track from TrackBits and returns it -*/ + * Removes first Track from TrackBits and returns it + * + * This function searchs for the first bit in the TrackBits, + * remove this bit from the parameter and returns the found + * bit as Track value. It returns INVALID_TRACK if the + * parameter was TRACK_BIT_NONE or INVALID_TRACK_BIT. This + * is basically used in while-loops to get up to 6 possible + * tracks on a tile until the parameter becomes TRACK_BIT_NONE. + * + * @param tracks The value with the TrackBits + * @return The first Track from the TrackBits value + * @see FindFirstTrack + */ static inline Track RemoveFirstTrack(TrackBits *tracks) { if (*tracks != TRACK_BIT_NONE && *tracks != INVALID_TRACK_BIT) { @@ -265,8 +305,19 @@ } /** -* Removes first Trackdir from TrackdirBits and returns it -*/ + * Removes first Trackdir from TrackdirBits and returns it + * + * This function searchs for the first bit in the TrackdirBits parameter, + * remove this bit from the parameter and returns the fnound bit as + * Trackdir value. It returns INVALID_TRACKDIR if the trackdirs is + * TRACKDIR_BIT_NONE or INVALID_TRACKDIR_BIT. This is basically used in a + * while-loop to get all track-directions step by step until the value + * reaches TRACKDIR_BIT_NONE. + * + * @param trackdirs The value with the TrackdirBits + * @return The first Trackdir from the TrackdirBits value + * @see FindFirstTrackdir + */ static inline Trackdir RemoveFirstTrackdir(TrackdirBits *trackdirs) { if (*trackdirs != TRACKDIR_BIT_NONE && *trackdirs != INVALID_TRACKDIR_BIT) { @@ -278,16 +329,31 @@ } /** -* Returns first Track from TrackBits or INVALID_TRACK -*/ + * Returns first Track from TrackBits or INVALID_TRACK + * + * This function returns the first Track found in the TrackBits value as Track-value. + * It returns INVALID_TRACK if the parameter is TRACK_BIT_NONE or INVALID_TRACK_BIT. + * + * @param tracks The TrackBits value + * @return The first Track found or INVALID_TRACK + * @see RemoveFirstTrack + */ static inline Track FindFirstTrack(TrackBits tracks) { return (tracks != TRACK_BIT_NONE && tracks != INVALID_TRACK_BIT) ? (Track)FIND_FIRST_BIT(tracks) : INVALID_TRACK; } /** -* Converts TrackBits to Track. TrackBits must contain just one Track or INVALID_TRACK_BIT! -*/ + * Converts TrackBits to Track. + * + * This function converts a TrackBits value to a Track value. As it + * is not possible to convert two or more tracks to one track the + * parameter must contain only one track or be the INVALID_TRACK_BIT value. + * + * @param tracks The TrackBits value to convert + * @return The Track from the value or INVALID_TRACK + * @pre tracks must contains only one Track or be INVALID_TRACK_BIT + */ static inline Track TrackBitsToTrack(TrackBits tracks) { assert(tracks == INVALID_TRACK_BIT || (tracks != TRACK_BIT_NONE && KILL_FIRST_BIT(tracks & TRACK_BIT_MASK) == 0)); @@ -295,8 +361,17 @@ } /** -* Returns first Trackdir from TrackdirBits or INVALID_TRACKDIR -*/ + * Returns first Trackdir from TrackdirBits or INVALID_TRACKDIR + * + * This function returns the first Trackdir in the given TrackdirBits value or + * INVALID_TRACKDIR if the value is TRACKDIR_BIT_NONE. The TrackdirBits must + * not be INVALID_TRACKDIR_BIT. + * + * @param trackdirs The TrackdirBits value + * @return The first Trackdir from the TrackdirBits or INVALID_TRACKDIR on TRACKDIR_BIT_NONE. + * @pre trackdirs must not be INVALID_TRACKDIR_BIT + * @see RemoveFirstTrackdir + */ static inline Trackdir FindFirstTrackdir(TrackdirBits trackdirs) { assert((trackdirs & ~TRACKDIR_BIT_MASK) == TRACKDIR_BIT_NONE); @@ -304,13 +379,30 @@ } /** - * These functions check the validity of Tracks and Trackdirs. assert against - * them when convenient. + * Checks if a Track is valid. + * + * @param track The value to check + * @return true if the given value is a valid track. + * @note Use this in an assert() */ -static inline bool IsValidTrack(Track track) { return track < TRACK_END; } -static inline bool IsValidTrackdir(Trackdir trackdir) { return (TrackdirToTrackdirBits(trackdir) & TRACKDIR_BIT_MASK) != 0; } +static inline bool IsValidTrack(Track track) +{ + return track < TRACK_END; +} /** + * Checks if a Trackdir is valid. + * + * @param trackdir The value to check + * @return true if the given valie is a valid Trackdir + * @note Use this in an assert() + */ +static inline bool IsValidTrackdir(Trackdir trackdir) +{ + return (TrackdirToTrackdirBits(trackdir) & TRACKDIR_BIT_MASK) != 0; +} + +/* * Functions to map tracks to the corresponding bits in the signal * presence/status bytes in the map. You should not use these directly, but * wrapper functions below instead. XXX: Which are these? @@ -354,6 +446,13 @@ /** * Maps a trackdir to the reverse trackdir. + * + * Returns the reverse trackdir of a Trackdir value. The reverse trackdir + * is the same track with the other direction on it. + * + * @param trackdir The Trackdir value + * @return The reverse trackdir + * @pre trackdir must not be INVALID_TRACKDIR */ static inline Trackdir ReverseTrackdir(Trackdir trackdir) { @@ -363,20 +462,42 @@ /** * Returns the Track that a given Trackdir represents + * + * This function filters the Track which is used in the Trackdir value and + * returns it as a Track value. + * + * @param trackdir The trackdir value + * @return The Track which is used in the value */ -static inline Track TrackdirToTrack(Trackdir trackdir) { return (Track)(trackdir & 0x7); } +static inline Track TrackdirToTrack(Trackdir trackdir) +{ + return (Track)(trackdir & 0x7); +} /** - * Returns a Trackdir for the given Track. Since every Track corresponds to - * two Trackdirs, we choose the one which points between NE and S. - * Note that the actual implementation is quite futile, but this might change + * Returns a Trackdir for the given Track + * + * Since every Track corresponds to two Trackdirs, we choose the + * one which points between NE and S. Note that the actual + * implementation is quite futile, but this might change * in the future. + * + * @param track The given Track + * @return The Trackdir from the given Track */ -static inline Trackdir TrackToTrackdir(Track track) { return (Trackdir)track; } +static inline Trackdir TrackToTrackdir(Track track) +{ + return (Trackdir)track; +} /** - * Returns a TrackdirBit mask that contains the two TrackdirBits that + * Returns a TrackdirBit mask from a given Track + * + * The TrackdirBit mask contains the two TrackdirBits that * correspond with the given Track (one for each direction). + * + * @param track The track to get the TrackdirBits from + * @return The TrackdirBits which the selected tracks */ static inline TrackdirBits TrackToTrackdirBits(Track track) { @@ -385,8 +506,12 @@ } /** - * Discards all directional information from the given TrackdirBits. Any - * Track which is present in either direction will be present in the result. + * Discards all directional information from a TrackdirBits value + * + * Any Track which is present in either direction will be present in the result. + * + * @param bits The TrackdirBits to get the TrackBits from + * @return The TrackBits */ static inline TrackBits TrackdirBitsToTrackBits(TrackdirBits bits) { @@ -395,8 +520,13 @@ /** * Maps a trackdir to the trackdir that you will end up on if you go straight - * ahead. This will be the same trackdir for diagonal trackdirs, but a + * ahead. + * + * This will be the same trackdir for diagonal trackdirs, but a * different (alternating) one for straight trackdirs + * + * @param trackdir The given trackdir + * @return The next Trackdir value of the next tile. */ static inline Trackdir NextTrackdir(Trackdir trackdir) { @@ -406,6 +536,13 @@ /** * Maps a track to all tracks that make 90 deg turns with it. + * + * For the diagonal directions these are the complement of the + * direction, for the straight directions these are the + * two vertical or horizontal tracks, depend on the given direction + * + * @param track The given track + * @return The TrackBits with the tracks marked which cross the given track by 90 deg. */ static inline TrackBits TrackCrossesTracks(Track track) { @@ -416,6 +553,14 @@ /** * Maps a trackdir to the (4-way) direction the tile is exited when following * that trackdir. + * + * For the diagonal directions these are the same directions. For + * the straight directions these are the directions from the imagined + * base-tile to the bordering tile which will be joined if the given + * straight direction is leaved from the base-tile. + * + * @param trackdir The given track direction + * @return The direction which points to the resulting tile if following the Trackdir */ static inline DiagDirection TrackdirToExitdir(Trackdir trackdir) { @@ -426,6 +571,17 @@ /** * Maps a track and an (4-way) dir to the trackdir that represents the track * with the exit in the given direction. + * + * For the diagonal tracks the resulting track direction are clear for a given + * DiagDirection. It either matches the direction or it returns INVALID_TRACKDIR, + * as a TRACK_X cannot be applied with DIAG_SE. + * For the straight tracks the resulting track direction will be the + * direction which the DiagDirection is pointing. But this will be INVALID_TRACKDIR + * if the DiagDirection is pointing 'away' the track. + * + * @param track The track to applie an direction on + * @param diagdir The DiagDirection to applie on + * @return The resulting track direction or INVALID_TRACKDIR if not possible. */ static inline Trackdir TrackExitdirToTrackdir(Track track, DiagDirection diagdir) { @@ -435,7 +591,20 @@ /** * Maps a track and an (4-way) dir to the trackdir that represents the track - * with the exit in the given direction. + * with the entry in the given direction. + * + * For the diagonal tracks the return value is clear, its either the matching + * track direction or INVALID_TRACKDIR. + * For the straight tracks this returns the track direction which results if + * you follow the DiagDirection and then turn by 45 deg left or right on the + * next tile. The new direction on the new track will be the returning Trackdir + * value. If the parameters makes no sense like the track TRACK_UPPER and the + * diraction DIAGDIR_NE (target track cannot be reached) this function returns + * INVALID_TRACKDIR. + * + * @param track The target track + * @param diagdir The direction to "come from" + * @return the resulting Trackdir or INVALID_TRACKDIR if not possible. */ static inline Trackdir TrackEnterdirToTrackdir(Track track, DiagDirection diagdir) { @@ -456,6 +625,9 @@ /** * Maps a (4-way) direction to the diagonal trackdir that runs in that * direction. + * + * @param diagdir The direction + * @return The resulting Trackdir direction */ static inline Trackdir DiagdirToDiagTrackdir(DiagDirection diagdir) { @@ -465,8 +637,15 @@ /** * Returns all trackdirs that can be reached when entering a tile from a given - * (diagonal) direction. This will obviously include 90 degree turns, since no - * information is available about the exact angle of entering */ + * (diagonal) direction. + * + * This will obviously include 90 degree turns, since no information is available + * about the exact angle of entering + * + * @param diagdir The joining direction + * @return The TrackdirBits which can be used from the given direction + * @see DiagdirReachesTracks + */ static inline TrackdirBits DiagdirReachesTrackdirs(DiagDirection diagdir) { extern const TrackdirBits _exitdir_reaches_trackdirs[DIAGDIR_END]; @@ -475,26 +654,46 @@ /** * Returns all tracks that can be reached when entering a tile from a given - * (diagonal) direction. This will obviously include 90 degree turns, since no - * information is available about the exact angle of entering */ + * (diagonal) direction. + * + * This will obviously include 90 degree turns, since no + * information is available about the exact angle of entering + * + * @param diagdir The joining irection + * @return The tracks which can be used + * @see DiagdirReachesTrackdirs + */ static inline TrackBits DiagdirReachesTracks(DiagDirection diagdir) { return TrackdirBitsToTrackBits(DiagdirReachesTrackdirs(diagdir)); } /** * Maps a trackdir to the trackdirs that can be reached from it (ie, when - * entering the next tile. This will include 90 degree turns! + * entering the next tile. + * + * This will include 90 degree turns! + * + * @param trackdir The track direction which will be leaved + * @return The track directions which can be used from this direction (in the next tile) */ static inline TrackdirBits TrackdirReachesTrackdirs(Trackdir trackdir) { extern const TrackdirBits _exitdir_reaches_trackdirs[DIAGDIR_END]; return _exitdir_reaches_trackdirs[TrackdirToExitdir(trackdir)]; } - /* Note that there is no direct table for this function (there used to be), * but it uses two simpeler tables to achieve the result */ - /** * Maps a trackdir to all trackdirs that make 90 deg turns with it. + * + * For the diagonal tracks this returns the track direction bits + * of the other axis in both directions, which cannot be joined by + * the given track direction. + * For the straight tracks this returns all possible 90 deg turns + * either on the current tile (which no train can joined) or on the + * bordering tiles. + * + * @param trackdir The track direction + * @return The TrackdirBits which are (more or less) 90 deg turns. */ static inline TrackdirBits TrackdirCrossesTrackdirs(Trackdir trackdir) { @@ -502,13 +701,27 @@ return _track_crosses_trackdirs[TrackdirToTrack(trackdir)]; } +/** + * Checks if a given Track is diagonal + * + * @param track The given track to check + * @return true if diagonal, else false + */ +static inline bool IsDiagonalTrack(Track track) +{ + return (track == TRACK_X) || (track == TRACK_Y); +} -/* Checks if a given Track is diagonal */ -static inline bool IsDiagonalTrack(Track track) { return (track == TRACK_X) || (track == TRACK_Y); } - -/* Checks if a given Trackdir is diagonal. */ -static inline bool IsDiagonalTrackdir(Trackdir trackdir) { return IsDiagonalTrack(TrackdirToTrack(trackdir)); } - +/** + * Checks if a given Trackdir is diagonal. + * + * @param trackdir The given trackdir + * @return true if the trackdir use a diagonal track + */ +static inline bool IsDiagonalTrackdir(Trackdir trackdir) +{ + return IsDiagonalTrack(TrackdirToTrack(trackdir)); +} /** * Returns a pointer to the Railtype information for a given railtype @@ -535,6 +748,14 @@ return HASBIT(GetRailTypeInfo(enginetype)->compatible_railtypes, tiletype); } +/** + * Checks if an engine of the given RailType got power on a tile with a given + * RailType. This would normally just be an equality check, but for electric + * rails (which also support non-electric engines). + * @return Whether the engine got power on this tile. + * @param enginetype The RailType of the engine we are considering. + * @param tiletype The RailType of the tile we are considering. + */ static inline bool HasPowerOnRail(RailType enginetype, RailType tiletype) { return HASBIT(GetRailTypeInfo(enginetype)->powered_railtypes, tiletype); @@ -567,7 +788,7 @@ */ void DrawCatenary(const TileInfo *ti); -uint GetRailFoundation(Slope tileh, TrackBits bits); +Foundation GetRailFoundation(Slope tileh, TrackBits bits); int32 SettingsDisableElrail(int32 p1); ///< _patches.disable_elrail callback diff -r 31fcaa5375a1 -r e72987579514 src/rail_cmd.cpp --- a/src/rail_cmd.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/rail_cmd.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -37,6 +37,7 @@ #include "newgrf_callbacks.h" #include "newgrf_station.h" #include "train.h" +#include "misc/autoptr.hpp" const byte _track_sloped_sprites[14] = { 14, 15, 22, 13, @@ -156,36 +157,22 @@ } }; -uint GetRailFoundation(Slope tileh, TrackBits bits) +Foundation GetRailFoundation(Slope tileh, TrackBits bits) { - uint i; - if (!IsSteepSlope(tileh)) { - if ((~_valid_tileh_slopes[0][tileh] & bits) == 0) return 0; - if ((~_valid_tileh_slopes[1][tileh] & bits) == 0) return tileh; + if ((~_valid_tileh_slopes[0][tileh] & bits) == 0) return FOUNDATION_NONE; + if ((~_valid_tileh_slopes[1][tileh] & bits) == 0) return FOUNDATION_LEVELED; } switch (bits) { default: NOT_REACHED(); - case TRACK_BIT_X: i = 0; break; - case TRACK_BIT_Y: i = 1; break; - case TRACK_BIT_LEFT: return 15 + 8 + (tileh == SLOPE_STEEP_W ? 4 : 0); - case TRACK_BIT_LOWER: return 15 + 8 + (tileh == SLOPE_STEEP_S ? 5 : 1); - case TRACK_BIT_RIGHT: return 15 + 8 + (tileh == SLOPE_STEEP_E ? 6 : 2); - case TRACK_BIT_UPPER: return 15 + 8 + (tileh == SLOPE_STEEP_N ? 7 : 3); + case TRACK_BIT_X: return FOUNDATION_INCLINED_X; + case TRACK_BIT_Y: return FOUNDATION_INCLINED_Y; + case TRACK_BIT_LEFT: return (tileh == SLOPE_STEEP_W ? FOUNDATION_STEEP_HIGHER : FOUNDATION_STEEP_LOWER); + case TRACK_BIT_LOWER: return (tileh == SLOPE_STEEP_S ? FOUNDATION_STEEP_HIGHER : FOUNDATION_STEEP_LOWER); + case TRACK_BIT_RIGHT: return (tileh == SLOPE_STEEP_E ? FOUNDATION_STEEP_HIGHER : FOUNDATION_STEEP_LOWER); + case TRACK_BIT_UPPER: return (tileh == SLOPE_STEEP_N ? FOUNDATION_STEEP_HIGHER : FOUNDATION_STEEP_LOWER); } - switch (tileh) { - case SLOPE_W: - case SLOPE_STEEP_W: i += 0; break; - case SLOPE_S: - case SLOPE_STEEP_S: i += 2; break; - case SLOPE_E: - case SLOPE_STEEP_E: i += 4; break; - case SLOPE_N: - case SLOPE_STEEP_N: i += 6; break; - default: return 0; - } - return i + 15; } @@ -279,7 +266,7 @@ } break; - case MP_STREET: + case MP_ROAD: #define M(x) (1 << (x)) /* Level crossings may only be built on these slopes */ if (!HASBIT(M(SLOPE_SEN) | M(SLOPE_ENW) | M(SLOPE_NWS) | M(SLOPE_NS) | M(SLOPE_WSE) | M(SLOPE_EW) | M(SLOPE_FLAT), tileh)) { @@ -368,7 +355,7 @@ SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION); switch (GetTileType(tile)) { - case MP_STREET: { + case MP_ROAD: { if (!IsLevelCrossing(tile) || GetCrossingRailBits(tile) != trackbit || (_current_player != OWNER_WATER && !CheckTileOwnership(tile)) || @@ -588,7 +575,6 @@ */ CommandCost CmdBuildTrainDepot(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) { - Depot *d; CommandCost cost; Slope tileh; @@ -622,18 +608,20 @@ if (MayHaveBridgeAbove(tile) && IsBridgeAbove(tile)) return_cmd_error(STR_5007_MUST_DEMOLISH_BRIDGE_FIRST); - d = AllocateDepot(); + Depot *d = new Depot(tile); + if (d == NULL) return CMD_ERROR; + AutoPtrT d_auto_delete = d; if (flags & DC_EXEC) { MakeRailDepot(tile, _current_player, dir, (RailType)p1); MarkTileDirtyByTile(tile); - d->xy = tile; d->town_index = ClosestTownFromTile(tile, (uint)-1)->index; UpdateSignalsOnSegment(tile, dir); YapfNotifyTrackLayoutChange(tile, TrackdirToTrack(DiagdirToDiagTrackdir(dir))); + d_auto_delete.Detach(); } return cost.AddCost(_price.build_train_depot); @@ -770,7 +758,7 @@ } return true; - case MP_STREET: + case MP_ROAD: if (!IsLevelCrossing(tile)) return false; signal_ctr += 2; return true; @@ -1089,7 +1077,7 @@ switch (GetTileType(tile)) { case MP_RAILWAY: proc = DoConvertRail; break; case MP_STATION: proc = DoConvertStationRail; break; - case MP_STREET: proc = DoConvertStreetRail; break; + case MP_ROAD: proc = DoConvertStreetRail; break; case MP_TUNNELBRIDGE: proc = DoConvertTunnelBridgeRail; break; default: continue; } @@ -1123,7 +1111,8 @@ if (flags & DC_EXEC) { DiagDirection dir = GetRailDepotDirection(tile); - DeleteDepot(GetDepotByTile(tile)); + DoClearSquare(tile); + delete GetDepotByTile(tile); UpdateSignalsOnSegment(tile, dir); YapfNotifyTrackLayoutChange(tile, TrackdirToTrack(DiagdirToDiagTrackdir(dir))); } @@ -1224,16 +1213,16 @@ static void DrawTrackFence_NW(const TileInfo *ti) { - SpriteID image = 0x515; - if (ti->tileh != SLOPE_FLAT) image = (ti->tileh & SLOPE_S) ? 0x519 : 0x51B; + SpriteID image = SPR_TRACK_FENCE_FLAT_X; + if (ti->tileh != SLOPE_FLAT) image = (ti->tileh & SLOPE_S) ? SPR_TRACK_FENCE_SLOPE_SW : SPR_TRACK_FENCE_SLOPE_NE; AddSortableSpriteToDraw(image, _drawtile_track_palette, ti->x, ti->y + 1, 16, 1, 4, ti->z); } static void DrawTrackFence_SE(const TileInfo *ti) { - SpriteID image = 0x515; - if (ti->tileh != SLOPE_FLAT) image = (ti->tileh & SLOPE_S) ? 0x519 : 0x51B; + SpriteID image = SPR_TRACK_FENCE_FLAT_X; + if (ti->tileh != SLOPE_FLAT) image = (ti->tileh & SLOPE_S) ? SPR_TRACK_FENCE_SLOPE_SW : SPR_TRACK_FENCE_SLOPE_NE; AddSortableSpriteToDraw(image, _drawtile_track_palette, ti->x, ti->y + TILE_SIZE - 1, 16, 1, 4, ti->z); } @@ -1246,16 +1235,16 @@ static void DrawTrackFence_NE(const TileInfo *ti) { - SpriteID image = 0x516; - if (ti->tileh != SLOPE_FLAT) image = (ti->tileh & SLOPE_S) ? 0x51A : 0x51C; + SpriteID image = SPR_TRACK_FENCE_FLAT_Y; + if (ti->tileh != SLOPE_FLAT) image = (ti->tileh & SLOPE_S) ? SPR_TRACK_FENCE_SLOPE_SE : SPR_TRACK_FENCE_SLOPE_NW; AddSortableSpriteToDraw(image, _drawtile_track_palette, ti->x + 1, ti->y, 1, 16, 4, ti->z); } static void DrawTrackFence_SW(const TileInfo *ti) { - SpriteID image = 0x516; - if (ti->tileh != SLOPE_FLAT) image = (ti->tileh & SLOPE_S) ? 0x51A : 0x51C; + SpriteID image = SPR_TRACK_FENCE_FLAT_Y; + if (ti->tileh != SLOPE_FLAT) image = (ti->tileh & SLOPE_S) ? SPR_TRACK_FENCE_SLOPE_SE : SPR_TRACK_FENCE_SLOPE_NW; AddSortableSpriteToDraw(image, _drawtile_track_palette, ti->x + TILE_SIZE - 1, ti->y, 1, 16, 4, ti->z); } @@ -1266,35 +1255,47 @@ DrawTrackFence_SW(ti); } +/** + * Draw fence at eastern side of track. + */ static void DrawTrackFence_NS_1(const TileInfo *ti) { int z = ti->z; if (ti->tileh & SLOPE_W) z += TILE_HEIGHT; - AddSortableSpriteToDraw(0x517, _drawtile_track_palette, + AddSortableSpriteToDraw(SPR_TRACK_FENCE_FLAT_VERT, _drawtile_track_palette, ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2, 1, 1, 4, z); } +/** + * Draw fence at western side of track. + */ static void DrawTrackFence_NS_2(const TileInfo *ti) { int z = ti->z; if (ti->tileh & SLOPE_E) z += TILE_HEIGHT; - AddSortableSpriteToDraw(0x517, _drawtile_track_palette, + AddSortableSpriteToDraw(SPR_TRACK_FENCE_FLAT_VERT, _drawtile_track_palette, ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2, 1, 1, 4, z); } +/** + * Draw fence at southern side of track. + */ static void DrawTrackFence_WE_1(const TileInfo *ti) { int z = ti->z; if (ti->tileh & SLOPE_N) z += TILE_HEIGHT; - AddSortableSpriteToDraw(0x518, _drawtile_track_palette, + AddSortableSpriteToDraw(SPR_TRACK_FENCE_FLAT_HORZ, _drawtile_track_palette, ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2, 1, 1, 4, z); } +/** + * Draw fence at northern side of track. + */ static void DrawTrackFence_WE_2(const TileInfo *ti) { int z = ti->z; if (ti->tileh & SLOPE_S) z += TILE_HEIGHT; - AddSortableSpriteToDraw(0x518, _drawtile_track_palette, + AddSortableSpriteToDraw(SPR_TRACK_FENCE_FLAT_HORZ, _drawtile_track_palette, ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2, 1, 1, 4, z); } @@ -1349,14 +1350,11 @@ (image++, true); if (ti->tileh != SLOPE_FLAT) { - uint foundation = GetRailFoundation(ti->tileh, track); - - if (foundation != 0) DrawFoundation(ti, foundation); + DrawFoundation(ti, GetRailFoundation(ti->tileh, track)); /* DrawFoundation() modifies it. * Default sloped sprites.. */ - if (ti->tileh != SLOPE_FLAT) - image = _track_sloped_sprites[ti->tileh - 1] + rti->base_sprites.track_y; + if (ti->tileh != SLOPE_FLAT) image = _track_sloped_sprites[ti->tileh - 1] + rti->base_sprites.track_y; } switch (GetRailGroundType(ti->tile)) { @@ -1433,7 +1431,7 @@ const DrawTileSeqStruct* dtss; uint32 relocation; - if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, ti->tileh); + if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, FOUNDATION_LEVELED); if (IsRailDepot(ti->tile)) { dts = &_depot_gfx_table[GetRailDepotDirection(ti->tile)]; @@ -1513,10 +1511,7 @@ image += relocation; } - if (HASBIT(_transparent_opt, TO_BUILDINGS)) { - SETBIT(image, PALETTE_MODIFIER_TRANSPARENT); - pal = PALETTE_TO_TRANSPARENT; - } else if (HASBIT(image, PALETTE_MODIFIER_COLOR)) { + if (!HASBIT(_transparent_opt, TO_BUILDINGS) && HASBIT(image, PALETTE_MODIFIER_COLOR)) { pal = _drawtile_track_palette; } else { pal = dtss->pal; @@ -1527,7 +1522,8 @@ image, pal, ti->x + dtss->delta_x, ti->y + dtss->delta_y, dtss->size_x, dtss->size_y, - dtss->size_z, ti->z + dtss->delta_z + dtss->size_z, ti->z + dtss->delta_z, + HASBIT(_transparent_opt, TO_BUILDINGS) ); } else { AddChildSpriteScreen(image, pal, dtss->delta_x, dtss->delta_y); @@ -1675,13 +1671,10 @@ /* check for a vehicle with that trackdir on the end tile of the tunnel */ if (VehicleFromPos(end, &dest, SignalVehicleCheckProc) != NULL) return true; - /* now check all tiles from start to end for a warping vehicle - * NOTE: the hashes for tiles may overlap, so this could maybe be optimised a bit by not checking every tile? */ + /* now check all tiles from start to end for a warping vehicle */ dest.track = 0x40; //Vehicle inside a tunnel or on a bridge - for (; tile != end; tile += TileOffsByDiagDir(direction)) { - if (VehicleFromPos(tile, &dest, SignalVehicleCheckProc) != NULL) - return true; - } + if (VehicleFromPos(tile, &dest, SignalVehicleCheckProc) != NULL) return true; + if (VehicleFromPos(end, &dest, SignalVehicleCheckProc) != NULL) return true; /* no vehicle found */ return false; @@ -1839,34 +1832,16 @@ if (tileh == SLOPE_FLAT) return z; if (IsPlainRailTile(tile)) { - uint f = GetRailFoundation(tileh, GetTrackBits(tile)); - - if (f != 0) { - if (IsSteepSlope(tileh)) { - z += TILE_HEIGHT; - } else if (f < 15) { - return z + TILE_HEIGHT; // leveled foundation - } - tileh = _inclined_tileh[f - 15]; // inclined foundation - } + z += ApplyFoundationToSlope(GetRailFoundation(tileh, GetTrackBits(tile)), &tileh); return z + GetPartialZ(x & 0xF, y & 0xF, tileh); } else { return z + TILE_HEIGHT; } } -static Slope GetSlopeTileh_Track(TileIndex tile, Slope tileh) +static Foundation GetFoundation_Track(TileIndex tile, Slope tileh) { - if (tileh == SLOPE_FLAT) return SLOPE_FLAT; - if (IsPlainRailTile(tile)) { - uint f = GetRailFoundation(tileh, GetTrackBits(tile)); - - if (f == 0) return tileh; - if (f < 15) return SLOPE_FLAT; // leveled foundation - return _inclined_tileh[f - 15]; // inclined foundation - } else { - return SLOPE_FLAT; - } + return IsPlainRailTile(tile) ? GetRailFoundation(tileh, GetTrackBits(tile)) : FlatteningFoundation(tileh); } static void GetAcceptedCargo_Track(TileIndex tile, AcceptedCargo ac) @@ -2175,5 +2150,5 @@ ChangeTileOwner_Track, /* change_tile_owner_clear */ NULL, /* get_produced_cargo_proc */ VehicleEnter_Track, /* vehicle_enter_tile_proc */ - GetSlopeTileh_Track, /* get_slope_tileh_proc */ + GetFoundation_Track, /* get_foundation_proc */ }; diff -r 31fcaa5375a1 -r e72987579514 src/rail_gui.cpp --- a/src/rail_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/rail_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -600,7 +600,7 @@ }; static const WindowDesc _build_rail_desc = { - WDP_ALIGN_TBR, 22, 350, 36, + WDP_ALIGN_TBR, 22, 350, 36, 350, 36, WC_BUILD_TOOLBAR, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON, _build_rail_widgets, @@ -1021,7 +1021,7 @@ }; static const WindowDesc _station_builder_desc = { - WDP_AUTO, WDP_AUTO, 148, 200, + WDP_AUTO, WDP_AUTO, 148, 200, 148, 200, WC_BUILD_STATION, WC_BUILD_TOOLBAR, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _station_builder_widgets, @@ -1029,7 +1029,7 @@ }; static const WindowDesc _newstation_builder_desc = { - WDP_AUTO, WDP_AUTO, 148, 290, + WDP_AUTO, WDP_AUTO, 148, 290, 148, 290, WC_BUILD_STATION, WC_BUILD_TOOLBAR, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _newstation_builder_widgets, @@ -1108,7 +1108,7 @@ }; static const WindowDesc _build_depot_desc = { - WDP_AUTO, WDP_AUTO, 140, 122, + WDP_AUTO, WDP_AUTO, 140, 122, 140, 122, WC_BUILD_DEPOT, WC_BUILD_TOOLBAR, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _build_depot_widgets, @@ -1194,7 +1194,7 @@ }; static const WindowDesc _build_waypoint_desc = { - WDP_AUTO, WDP_AUTO, 344, 92, + WDP_AUTO, WDP_AUTO, 344, 92, 344, 92, WC_BUILD_DEPOT, WC_BUILD_TOOLBAR, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _build_waypoint_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/rail_map.h --- a/src/rail_map.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/rail_map.h Fri Aug 03 22:09:42 2007 +0000 @@ -389,8 +389,8 @@ RAIL_GROUND_FENCE_NE = 5, ///< Grass with a fence at the NE edge RAIL_GROUND_FENCE_SW = 6, ///< Grass with a fence at the SW edge RAIL_GROUND_FENCE_NESW = 7, ///< Grass with a fence at the NE and SW edges - RAIL_GROUND_FENCE_VERT1 = 8, ///< Grass with a fence at the western side - RAIL_GROUND_FENCE_VERT2 = 9, ///< Grass with a fence at the eastern side + RAIL_GROUND_FENCE_VERT1 = 8, ///< Grass with a fence at the eastern side + RAIL_GROUND_FENCE_VERT2 = 9, ///< Grass with a fence at the western side RAIL_GROUND_FENCE_HORIZ1 = 10, ///< Grass with a fence at the southern side RAIL_GROUND_FENCE_HORIZ2 = 11, ///< Grass with a fence at the northern side RAIL_GROUND_ICE_DESERT = 12, ///< Icy or sandy diff -r 31fcaa5375a1 -r e72987579514 src/road.h --- a/src/road.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/road.h Fri Aug 03 22:09:42 2007 +0000 @@ -9,30 +9,31 @@ /** * The different roadtypes we support - * @note currently only ROADTYPE_ROAD is supported. + * + * @note currently only ROADTYPE_ROAD and ROADTYPE_TRAM are supported. */ enum RoadType { - ROADTYPE_ROAD = 0, - ROADTYPE_TRAM = 1, - ROADTYPE_HWAY = 2, ///< Only a placeholder. Not sure what we are going to do with this road type. - ROADTYPE_END, - INVALID_ROADTYPE = 0xFF + ROADTYPE_ROAD = 0, ///< Basic road type + ROADTYPE_TRAM = 1, ///< Trams + ROADTYPE_HWAY = 2, ///< Only a placeholder. Not sure what we are going to do with this road type. + ROADTYPE_END, ///< Used for iterations + INVALID_ROADTYPE = 0xFF ///< flag for invalid roadtype }; DECLARE_POSTFIX_INCREMENT(RoadType); /** * The different roadtypes we support, but then a bitmask of them - * @note currently only ROADTYPES_ROAD is supported. + * @note currently only roadtypes with ROADTYPE_ROAD and ROADTYPE_TRAM are supported. */ enum RoadTypes { - ROADTYPES_NONE = 0, - ROADTYPES_ROAD = 1 << ROADTYPE_ROAD, - ROADTYPES_TRAM = 1 << ROADTYPE_TRAM, - ROADTYPES_HWAY = 1 << ROADTYPE_HWAY, - ROADTYPES_ROADTRAM = ROADTYPES_ROAD | ROADTYPES_TRAM, - ROADTYPES_ROADHWAY = ROADTYPES_ROAD | ROADTYPES_HWAY, - ROADTYPES_TRAMHWAY = ROADTYPES_TRAM | ROADTYPES_HWAY, - ROADTYPES_ALL = ROADTYPES_ROAD | ROADTYPES_TRAM | ROADTYPES_HWAY, + ROADTYPES_NONE = 0, ///< No roadtypes + ROADTYPES_ROAD = 1 << ROADTYPE_ROAD, ///< Road + ROADTYPES_TRAM = 1 << ROADTYPE_TRAM, ///< Trams + ROADTYPES_HWAY = 1 << ROADTYPE_HWAY, ///< Highway (or whatever substitute) + ROADTYPES_ROADTRAM = ROADTYPES_ROAD | ROADTYPES_TRAM, ///< Road + trams + ROADTYPES_ROADHWAY = ROADTYPES_ROAD | ROADTYPES_HWAY, ///< Road + highway (or whatever substitute) + ROADTYPES_TRAMHWAY = ROADTYPES_TRAM | ROADTYPES_HWAY, ///< Trams + highway (or whatever substitute) + ROADTYPES_ALL = ROADTYPES_ROAD | ROADTYPES_TRAM | ROADTYPES_HWAY, ///< Road + trams + highway (or whatever substitute) }; DECLARE_ENUM_AS_BIT_SET(RoadTypes); @@ -58,47 +59,91 @@ /** * Maps a RoadType to the corresponding RoadTypes value + * + * @param rt the roadtype to get the roadtypes from + * @return the roadtypes with the given roadtype */ static inline RoadTypes RoadTypeToRoadTypes(RoadType rt) { return (RoadTypes)(1 << rt); } +/** + * Returns the RoadTypes which are not present in the given RoadTypes + * + * This function returns the complement of a given RoadTypes. + * + * @param r The given RoadTypes + * @return The complement of the given RoadTypes + * @note The unused value ROADTYPES_HWAY will be used, too. + */ static inline RoadTypes ComplementRoadTypes(RoadTypes r) { return (RoadTypes)(ROADTYPES_ALL ^ r); } +/** + * Enumeration for the road parts on a tile. + * + * This enumeration defines the possible road parts which + * can be build on a tile. + */ enum RoadBits { - ROAD_NONE = 0U, - ROAD_NW = 1U, - ROAD_SW = 2U, - ROAD_SE = 4U, - ROAD_NE = 8U, - ROAD_X = ROAD_SW | ROAD_NE, - ROAD_Y = ROAD_NW | ROAD_SE, - ROAD_ALL = ROAD_X | ROAD_Y + ROAD_NONE = 0U, ///< No road-part is build + ROAD_NW = 1U, ///< North-west part + ROAD_SW = 2U, ///< South-west part + ROAD_SE = 4U, ///< South-east part + ROAD_NE = 8U, ///< North-east part + ROAD_X = ROAD_SW | ROAD_NE, ///< Full road along the x-axis (south-west + north-east) + ROAD_Y = ROAD_NW | ROAD_SE, ///< Full road along the y-axis (north-west + south-east) + ROAD_ALL = ROAD_X | ROAD_Y ///< Full 4-way crossing }; DECLARE_ENUM_AS_BIT_SET(RoadBits); +/** + * Calculate the complement of a RoadBits value + * + * Simply flips all bits in the RoadBits value to get the complement + * of the RoadBits. + * + * @param r The given RoadBits value + * @return the complement + */ static inline RoadBits ComplementRoadBits(RoadBits r) { return (RoadBits)(ROAD_ALL ^ r); } +/** + * Create the road-part which belongs to the given DiagDirection + * + * This function returns a RoadBits value which belongs to + * the given DiagDirection. + * + * @param d The DiagDirection + * @return The result RoadBits which the selected road-part set + */ static inline RoadBits DiagDirToRoadBits(DiagDirection d) { return (RoadBits)(1U << (3 ^ d)); } -/** Checks whether the trackdir means that we are reversing */ +/** + * Checks whether the trackdir means that we are reversing. + * @param dir the trackdir to check + * @return true if it is a reversing road trackdir + */ static inline bool IsReversingRoadTrackdir(Trackdir dir) { return (dir & 0x07) >= 6; } -/** Checks whether the given trackdir is a straight road */ +/** + * Checks whether the given trackdir is a straight road + * @param dir the trackdir to check + * @return true if it is a straight road trackdir + */ static inline bool IsStraightRoadTrackdir(Trackdir dir) { return (dir & 0x06) == 0; @@ -115,6 +160,11 @@ */ bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, Owner owner, bool *edge_road, RoadType rt); +/** + * Draw the catenary for tram road bits + * @param ti information about the tile (position, slope) + * @param tram the roadbits to draw the catenary for + */ void DrawTramCatenary(TileInfo *ti, RoadBits tram); #endif /* ROAD_H */ diff -r 31fcaa5375a1 -r e72987579514 src/road_cmd.cpp --- a/src/road_cmd.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/road_cmd.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -31,6 +31,7 @@ #include "newgrf.h" #include "station_map.h" #include "tunnel_map.h" +#include "misc/autoptr.hpp" static uint CountRoadBits(RoadBits r) @@ -124,7 +125,7 @@ Town *t = NULL; switch (GetTileType(tile)) { - case MP_STREET: + case MP_ROAD: if (_game_mode != GM_EDITOR && GetRoadOwner(tile, rt) == OWNER_TOWN) t = GetTownByTile(tile); break; @@ -154,7 +155,7 @@ * removal allowance depends on difficulty setting */ if (!CheckforTownRating(flags, t, ROAD_REMOVE)) return CMD_ERROR; - if (!IsTileType(tile, MP_STREET)) { + if (!IsTileType(tile, MP_ROAD)) { /* If it's the last roadtype, just clear the whole tile */ if (rts == RoadTypeToRoadTypes(rt)) return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR); @@ -298,10 +299,11 @@ RoadBits road_bits; if (IsSteepSlope(tileh)) { - if (existing == 0) { - /* force full pieces. */ - *pieces |= (RoadBits)((*pieces & 0xC) >> 2); - *pieces |= (RoadBits)((*pieces & 0x3) << 2); + /* force full pieces. */ + *pieces |= (RoadBits)((*pieces & 0xC) >> 2); + *pieces |= (RoadBits)((*pieces & 0x3) << 2); + + if (existing == 0 || existing == *pieces) { if (*pieces == ROAD_X || *pieces == ROAD_Y) return _price.terraform; } return CMD_ERROR; @@ -320,11 +322,12 @@ return CommandCost(existing != 0 ? 0 : _price.terraform); } + *pieces |= (RoadBits)((*pieces & 0xC) >> 2); + *pieces |= (RoadBits)((*pieces & 0x3) << 2); + /* partly leveled up tile, only if there's no road on that tile */ - if (existing == 0 && (tileh == SLOPE_W || tileh == SLOPE_S || tileh == SLOPE_E || tileh == SLOPE_N)) { + if ((existing == 0 || existing == *pieces) && (tileh == SLOPE_W || tileh == SLOPE_S || tileh == SLOPE_E || tileh == SLOPE_N)) { /* force full pieces. */ - *pieces |= (RoadBits)((*pieces & 0xC) >> 2); - *pieces |= (RoadBits)((*pieces & 0x3) << 2); if (*pieces == ROAD_X || *pieces == ROAD_Y) return _price.terraform; } return CMD_ERROR; @@ -362,7 +365,7 @@ tileh = GetTileSlope(tile, NULL); switch (GetTileType(tile)) { - case MP_STREET: + case MP_ROAD: switch (GetRoadTileType(tile)) { case ROAD_TILE_NORMAL: { if (HasRoadWorks(tile)) return_cmd_error(STR_ROAD_WORKS_IN_PROGRESS); @@ -479,7 +482,7 @@ cost.AddCost(ret); } - if (IsTileType(tile, MP_STREET)) { + if (IsTileType(tile, MP_ROAD)) { /* Don't put the pieces that already exist */ pieces &= ComplementRoadBits(existing); } @@ -492,7 +495,7 @@ if (flags & DC_EXEC) { switch (GetTileType(tile)) { - case MP_STREET: { + case MP_ROAD: { RoadTileType rtt = GetRoadTileType(tile); if (existing == ROAD_NONE || rtt == ROAD_TILE_CROSSING) { SetRoadTypes(tile, GetRoadTypes(tile) | RoadTypeToRoadTypes(rt)); @@ -527,7 +530,7 @@ break; } - if (rt != ROADTYPE_TRAM && IsTileType(tile, MP_STREET) && GetRoadTileType(tile) == ROAD_TILE_NORMAL) { + if (rt != ROADTYPE_TRAM && IsTileType(tile, MP_ROAD) && GetRoadTileType(tile) == ROAD_TILE_NORMAL) { existing |= pieces; SetDisallowedRoadDirections(tile, (existing == ROAD_X || existing == ROAD_Y) ? GetDisallowedRoadDirections(tile) ^ toggle_drd : DRD_NONE); @@ -719,7 +722,6 @@ CommandCost CmdBuildRoadDepot(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) { CommandCost cost; - Depot *dep; Slope tileh; SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION); @@ -743,15 +745,16 @@ if (MayHaveBridgeAbove(tile) && IsBridgeAbove(tile)) return_cmd_error(STR_5007_MUST_DEMOLISH_BRIDGE_FIRST); - dep = AllocateDepot(); + Depot *dep = new Depot(tile); if (dep == NULL) return CMD_ERROR; + AutoPtrT d_auto_delete = dep; if (flags & DC_EXEC) { - dep->xy = tile; dep->town_index = ClosestTownFromTile(tile, (uint)-1)->index; MakeRoadDepot(tile, _current_player, dir, rt); MarkTileDirtyByTile(tile); + d_auto_delete.Detach(); } return cost.AddCost(_price.build_road_depot); } @@ -763,7 +766,10 @@ if (!EnsureNoVehicle(tile)) return CMD_ERROR; - if (flags & DC_EXEC) DeleteDepot(GetDepotByTile(tile)); + if (flags & DC_EXEC) { + DoClearSquare(tile); + delete GetDepotByTile(tile); + } return CommandCost(_price.remove_road_depot); } @@ -834,34 +840,21 @@ #include "table/road_land.h" -uint GetRoadFoundation(Slope tileh, RoadBits bits) +Foundation GetRoadFoundation(Slope tileh, RoadBits bits) { - uint i; - - /* normal level sloped building */ - if (!IsSteepSlope(tileh) && - (~_valid_tileh_slopes_road[1][tileh] & bits) == 0) { - return tileh; + if (!IsSteepSlope(tileh)) { + if ((~_valid_tileh_slopes_road[0][tileh] & bits) == 0) { + /* As one can remove a single road piece when in a corner on a foundation as + * it is on a sloped piece of landscape, one creates a state that cannot be + * created directly, but the state itself is still perfectly drawable. + * However, as we do not want this to be build directly, we need to check + * for that situation in here. */ + return (tileh != 0 && HAS_SINGLE_BIT(bits)) ? FOUNDATION_LEVELED : FOUNDATION_NONE; + } + if ((~_valid_tileh_slopes_road[1][tileh] & bits) == 0) return FOUNDATION_LEVELED; } - /* inclined sloped building */ - switch (bits) { - case ROAD_X: i = 0; break; - case ROAD_Y: i = 1; break; - default: return 0; - } - switch (tileh) { - case SLOPE_W: - case SLOPE_STEEP_W: i += 0; break; - case SLOPE_S: - case SLOPE_STEEP_S: i += 2; break; - case SLOPE_E: - case SLOPE_STEEP_E: i += 4; break; - case SLOPE_N: - case SLOPE_STEEP_N: i += 6; break; - default: return 0; - } - return i + 15; + return (bits == ROAD_X ? FOUNDATION_INCLINED_X : FOUNDATION_INCLINED_Y); } const byte _road_sloped_sprites[14] = { @@ -913,15 +906,8 @@ front = SPR_TRAMWAY_BASE + _road_frontwire_sprites_1[tram]; } - SpriteID pal = PAL_NONE; - if (HASBIT(_transparent_opt, TO_BUILDINGS)) { - SETBIT(front, PALETTE_MODIFIER_TRANSPARENT); - SETBIT(back, PALETTE_MODIFIER_TRANSPARENT); - pal = PALETTE_TO_TRANSPARENT; - } - - AddSortableSpriteToDraw(back, pal, ti->x, ti->y, 16, 16, 0x1F, ti->z); - AddSortableSpriteToDraw(front, pal, ti->x, ti->y, 16, 16, 0x1F, ti->z); + AddSortableSpriteToDraw(back, PAL_NONE, ti->x, ti->y, 16, 16, 0x1F, ti->z, HASBIT(_transparent_opt, TO_BUILDINGS)); + AddSortableSpriteToDraw(front, PAL_NONE, ti->x, ti->y, 16, 16, 0x1F, ti->z, HASBIT(_transparent_opt, TO_BUILDINGS)); } /** @@ -956,9 +942,7 @@ Roadside roadside; if (ti->tileh != SLOPE_FLAT) { - int foundation = GetRoadFoundation(ti->tileh, road | tram); - - if (foundation != 0) DrawFoundation(ti, foundation); + DrawFoundation(ti, GetRoadFoundation(ti->tileh, road | tram)); /* DrawFoundation() modifies ti. * Default sloped sprites.. */ @@ -1031,7 +1015,7 @@ SpriteID pal = PAL_NONE; Roadside roadside = GetRoadside(ti->tile); - if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, ti->tileh); + if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, FOUNDATION_LEVELED); image = GetRailTypeInfo(GetRailType(ti->tile))->base_sprites.crossing; @@ -1063,7 +1047,7 @@ const DrawTileSeqStruct* dtss; SpriteID palette; - if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, ti->tileh); + if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, FOUNDATION_LEVELED); palette = PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile)); @@ -1079,10 +1063,7 @@ SpriteID image = dtss->image; SpriteID pal; - if (HASBIT(_transparent_opt, TO_BUILDINGS)) { - SETBIT(image, PALETTE_MODIFIER_TRANSPARENT); - pal = PALETTE_TO_TRANSPARENT; - } else if (HASBIT(image, PALETTE_MODIFIER_COLOR)) { + if (!HASBIT(_transparent_opt, TO_BUILDINGS) && HASBIT(image, PALETTE_MODIFIER_COLOR)) { pal = palette; } else { pal = PAL_NONE; @@ -1092,7 +1073,8 @@ image, pal, ti->x + dtss->delta_x, ti->y + dtss->delta_y, dtss->size_x, dtss->size_y, - dtss->size_z, ti->z + dtss->size_z, ti->z, + HASBIT(_transparent_opt, TO_BUILDINGS) ); } break; @@ -1127,33 +1109,20 @@ if (tileh == SLOPE_FLAT) return z; if (GetRoadTileType(tile) == ROAD_TILE_NORMAL) { - uint f = GetRoadFoundation(tileh, GetAllRoadBits(tile)); - - if (f != 0) { - if (IsSteepSlope(tileh)) { - z += TILE_HEIGHT; - } else if (f < 15) { - return z + TILE_HEIGHT; // leveled foundation - } - tileh = _inclined_tileh[f - 15]; // inclined foundation - } + Foundation f = GetRoadFoundation(tileh, GetAllRoadBits(tile)); + z += ApplyFoundationToSlope(f, &tileh); return z + GetPartialZ(x & 0xF, y & 0xF, tileh); } else { return z + TILE_HEIGHT; } } -static Slope GetSlopeTileh_Road(TileIndex tile, Slope tileh) +static Foundation GetFoundation_Road(TileIndex tile, Slope tileh) { - if (tileh == SLOPE_FLAT) return SLOPE_FLAT; if (GetRoadTileType(tile) == ROAD_TILE_NORMAL) { - uint f = GetRoadFoundation(tileh, GetAllRoadBits(tile)); - - if (f == 0) return tileh; - if (f < 15) return SLOPE_FLAT; // leveled foundation - return _inclined_tileh[f - 15]; // inclined foundation + return GetRoadFoundation(tileh, GetAllRoadBits(tile)); } else { - return SLOPE_FLAT; + return FlatteningFoundation(tileh); } } @@ -1411,5 +1380,5 @@ ChangeTileOwner_Road, /* change_tile_owner_clear */ NULL, /* get_produced_cargo_proc */ VehicleEnter_Road, /* vehicle_enter_tile_proc */ - GetSlopeTileh_Road, /* get_slope_tileh_proc */ + GetFoundation_Road, /* get_foundation_proc */ }; diff -r 31fcaa5375a1 -r e72987579514 src/road_gui.cpp --- a/src/road_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/road_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -122,7 +122,7 @@ { tile += TileOffsByDiagDir(direction); // if there is a roadpiece just outside of the station entrance, build a connecting route - if (IsTileType(tile, MP_STREET) && GetRoadTileType(tile) == ROAD_TILE_NORMAL) { + if (IsTileType(tile, MP_ROAD) && GetRoadTileType(tile) == ROAD_TILE_NORMAL) { if (GetRoadBits(tile, _cur_roadtype) != ROAD_NONE) { DoCommandP(tile, _cur_roadtype << 4 | DiagDirToRoadBits(ReverseDiagDir(direction)), 0, NULL, CMD_BUILD_ROAD); } @@ -169,7 +169,7 @@ static void PlaceRoad_TruckStation(TileIndex tile) { if (_remove_button_clicked) { - DoCommandP(tile, 0, RoadStop::TRUCK, CcPlaySound1D, CMD_REMOVE_ROAD_STOP | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_station[RoadStop::TRUCK])); + DoCommandP(tile, 0, RoadStop::TRUCK, CcPlaySound1D, CMD_REMOVE_ROAD_STOP | CMD_MSG(_road_type_infos[_cur_roadtype].err_remove_station[RoadStop::TRUCK])); } else { PlaceRoadStop(tile, (_ctrl_pressed << 5) | RoadTypeToRoadTypes(_cur_roadtype) << 2 | RoadStop::TRUCK, CMD_BUILD_ROAD_STOP | CMD_AUTO | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_station[RoadStop::TRUCK])); } @@ -386,7 +386,7 @@ }; static const WindowDesc _build_road_desc = { - WDP_ALIGN_TBR, 22, 218, 36, + WDP_ALIGN_TBR, 22, 218, 36, 218, 36, WC_BUILD_TOOLBAR, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON, _build_road_widgets, @@ -412,7 +412,7 @@ }; static const WindowDesc _build_tramway_desc = { - WDP_ALIGN_TBR, 22, 218, 36, + WDP_ALIGN_TBR, 22, 218, 36, 218, 36, WC_BUILD_TOOLBAR, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON, _build_tramway_widgets, @@ -447,7 +447,7 @@ }; static const WindowDesc _build_road_scen_desc = { - WDP_AUTO, WDP_AUTO, 152, 36, + WDP_AUTO, WDP_AUTO, 152, 36, 152, 36, WC_SCEN_BUILD_ROAD, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON, _build_road_scen_widgets, @@ -519,7 +519,7 @@ }; static const WindowDesc _build_road_depot_desc = { - WDP_AUTO, WDP_AUTO, 140, 122, + WDP_AUTO, WDP_AUTO, 140, 122, 140, 122, WC_BUILD_DEPOT, WC_BUILD_TOOLBAR, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _build_road_depot_widgets, @@ -527,7 +527,7 @@ }; static const WindowDesc _build_tram_depot_desc = { - WDP_AUTO, WDP_AUTO, 140, 122, + WDP_AUTO, WDP_AUTO, 140, 122, 140, 122, WC_BUILD_DEPOT, WC_BUILD_TOOLBAR, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _build_tram_depot_widgets, @@ -632,7 +632,7 @@ }; static const WindowDesc _rv_station_picker_desc = { - WDP_AUTO, WDP_AUTO, 207, 177, + WDP_AUTO, WDP_AUTO, 207, 177, 207, 177, WC_BUS_STATION, WC_BUILD_TOOLBAR, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _rv_station_picker_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/road_map.cpp --- a/src/road_map.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/road_map.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -19,7 +19,7 @@ if (!HASBIT(GetRoadTypes(tile), rt)) return ROAD_NONE; switch (GetTileType(tile)) { - case MP_STREET: + case MP_ROAD: switch (GetRoadTileType(tile)) { default: case ROAD_TILE_NORMAL: return GetRoadBits(tile, rt); @@ -51,7 +51,7 @@ uint32 r; /* Don't allow local authorities to build roads through road depots or road stops. */ - if ((IsTileType(tile, MP_STREET) && IsTileDepotType(tile, TRANSPORT_ROAD)) || (IsTileType(tile, MP_STATION) && !IsDriveThroughStopTile(tile)) || !HASBIT(GetRoadTypes(tile), rt)) { + if ((IsTileType(tile, MP_ROAD) && IsTileDepotType(tile, TRANSPORT_ROAD)) || (IsTileType(tile, MP_STATION) && !IsDriveThroughStopTile(tile)) || !HASBIT(GetRoadTypes(tile), rt)) { return TRACK_BIT_NONE; } diff -r 31fcaa5375a1 -r e72987579514 src/road_map.h --- a/src/road_map.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/road_map.h Fri Aug 03 22:09:42 2007 +0000 @@ -19,7 +19,7 @@ static inline RoadTileType GetRoadTileType(TileIndex t) { - assert(IsTileType(t, MP_STREET)); + assert(IsTileType(t, MP_ROAD)); return (RoadTileType)GB(_m[t].m5, 6, 2); } @@ -30,7 +30,7 @@ static inline bool IsLevelCrossingTile(TileIndex t) { - return IsTileType(t, MP_STREET) && IsLevelCrossing(t); + return IsTileType(t, MP_ROAD) && IsLevelCrossing(t); } static inline RoadBits GetRoadBits(TileIndex t, RoadType rt) @@ -62,7 +62,7 @@ static inline RoadTypes GetRoadTypes(TileIndex t) { - if (IsTileType(t, MP_STREET)) { + if (IsTileType(t, MP_ROAD)) { return (RoadTypes)GB(_me[t].m7, 5, 3); } else { return (RoadTypes)GB(_m[t].m3, 0, 3); @@ -71,7 +71,7 @@ static inline void SetRoadTypes(TileIndex t, RoadTypes rt) { - if (IsTileType(t, MP_STREET)) { + if (IsTileType(t, MP_ROAD)) { SB(_me[t].m7, 5, 3, rt); } else { assert(IsTileType(t, MP_STATION) || IsTileType(t, MP_TUNNELBRIDGE)); @@ -81,7 +81,7 @@ static inline Owner GetRoadOwner(TileIndex t, RoadType rt) { - if (!IsTileType(t, MP_STREET)) return GetTileOwner(t); + if (!IsTileType(t, MP_ROAD)) return GetTileOwner(t); switch (GetRoadTileType(t)) { default: NOT_REACHED(); @@ -115,7 +115,7 @@ static inline void SetRoadOwner(TileIndex t, RoadType rt, Owner o) { - if (!IsTileType(t, MP_STREET)) return SetTileOwner(t, o); + if (!IsTileType(t, MP_ROAD)) return SetTileOwner(t, o); switch (GetRoadTileType(t)) { default: NOT_REACHED(); @@ -307,7 +307,7 @@ static inline void MakeRoadNormal(TileIndex t, RoadBits bits, RoadTypes rot, TownID town, Owner road, Owner tram, Owner hway) { - SetTileType(t, MP_STREET); + SetTileType(t, MP_ROAD); SetTileOwner(t, road); _m[t].m2 = town; _m[t].m3 = 0; @@ -321,7 +321,7 @@ static inline void MakeRoadCrossing(TileIndex t, Owner road, Owner tram, Owner hway, Owner rail, Axis roaddir, RailType rat, RoadTypes rot, uint town) { - SetTileType(t, MP_STREET); + SetTileType(t, MP_ROAD); SetTileOwner(t, rail); _m[t].m2 = town; _m[t].m3 = rat; @@ -335,7 +335,7 @@ static inline void MakeRoadDepot(TileIndex t, Owner owner, DiagDirection dir, RoadType rt) { - SetTileType(t, MP_STREET); + SetTileType(t, MP_ROAD); SetTileOwner(t, owner); _m[t].m2 = 0; _m[t].m3 = 0; diff -r 31fcaa5375a1 -r e72987579514 src/roadveh.h --- a/src/roadveh.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/roadveh.h Fri Aug 03 22:09:42 2007 +0000 @@ -44,13 +44,13 @@ } -static inline bool IsRoadVehInDepot(const Vehicle* v) +static inline bool IsRoadVehInDepot(const Vehicle *v) { assert(v->type == VEH_ROAD); return v->u.road.state == 254; } -static inline bool IsRoadVehInDepotStopped(const Vehicle* v) +static inline bool IsRoadVehInDepotStopped(const Vehicle *v) { return IsRoadVehInDepot(v) && v->vehstatus & VS_STOPPED; } diff -r 31fcaa5375a1 -r e72987579514 src/roadveh_cmd.cpp --- a/src/roadveh_cmd.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/roadveh_cmd.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -186,7 +186,7 @@ Vehicle *vl[11]; memset(&vl, 0, sizeof(vl)); - if (!AllocateVehicles(vl, num_vehicles)) { + if (!Vehicle::AllocateList(vl, num_vehicles)) { return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME); } @@ -373,7 +373,7 @@ InvalidateWindow(WC_COMPANY, v->owner); DeleteWindowById(WC_VEHICLE_VIEW, v->index); DeleteDepotHighlightOfVehicle(v); - DeleteVehicle(v); + delete v; } return CommandCost(-v->value); @@ -396,7 +396,7 @@ tile += TileOffsByDiagDir(_road_pf_directions[trackdir]); - if (IsTileType(tile, MP_STREET) && + if (IsTileType(tile, MP_ROAD) && GetRoadTileType(tile) == ROAD_TILE_DEPOT && IsTileOwner(tile, rfdd->owner) && length < rfdd->best_length) { @@ -544,7 +544,7 @@ return CMD_ERROR; } - if (IsTileType(v->tile, MP_STREET) && GetRoadTileType(v->tile) == ROAD_TILE_NORMAL && GetDisallowedRoadDirections(v->tile) != DRD_NONE) return CMD_ERROR; + if (IsTileType(v->tile, MP_ROAD) && GetRoadTileType(v->tile) == ROAD_TILE_NORMAL && GetDisallowedRoadDirections(v->tile) != DRD_NONE) return CMD_ERROR; if (IsTunnelTile(v->tile) && DirToDiagDir(v->direction) == GetTunnelDirection(v->tile)) return CMD_ERROR; if (IsBridgeTile(v->tile) && DirToDiagDir(v->direction) == GetBridgeRampDirection(v->tile)) return CMD_ERROR; @@ -611,7 +611,7 @@ BeginVehicleMove(v); EndVehicleMove(v); - DeleteVehicle(v); + delete v; } static byte SetRoadVehPosition(Vehicle *v, int x, int y) @@ -740,7 +740,7 @@ if (!(v->vehstatus & VS_HIDDEN)) { Vehicle *u = CreateEffectVehicleRel(v, 4, 4, 5, EV_BREAKDOWN_SMOKE); - if (u != NULL) u->u.special.unk0 = v->breakdown_delay * 2; + if (u != NULL) u->u.special.animation_state = v->breakdown_delay * 2; } } @@ -1148,7 +1148,7 @@ TrackdirBits signal = (TrackdirBits)GB(r, 16, 16); TrackdirBits trackdirs = (TrackdirBits)GB(r, 0, 16); - if (IsTileType(tile, MP_STREET)) { + if (IsTileType(tile, MP_ROAD)) { if (GetRoadTileType(tile) == ROAD_TILE_DEPOT && (!IsTileOwner(tile, v->owner) || GetRoadDepotDirection(tile) == enterdir || (GetRoadTypes(tile) & v->u.road.compatible_roadtypes) == 0)) { /* Road depot owned by another player or with the wrong orientation */ trackdirs = TRACKDIR_BIT_NONE; @@ -1235,7 +1235,7 @@ } else { DiagDirection dir; - if (IsTileType(desttile, MP_STREET)) { + if (IsTileType(desttile, MP_ROAD)) { if (GetRoadTileType(desttile) == ROAD_TILE_DEPOT) { dir = GetRoadDepotDirection(desttile); goto do_it; @@ -1397,7 +1397,7 @@ diag_dir = GetTunnelDirection(tile); } else if (IsBridgeTile(tile)) { diag_dir = GetBridgeRampDirection(tile); - } else if (IsTileType(tile, MP_STREET) && GetRoadTileType(tile) == ROAD_TILE_DEPOT) { + } else if (IsTileType(tile, MP_ROAD) && GetRoadTileType(tile) == ROAD_TILE_DEPOT) { diag_dir = ReverseDiagDir(GetRoadDepotDirection(tile)); } @@ -1484,7 +1484,7 @@ (_opt.road_side << RVS_DRIVE_SIDE)) ^ v->u.road.overtaking][v->u.road.frame + 1]; if (rd.x & RDE_NEXT_TILE) { - TileIndex tile = v->tile + TileOffsByDiagDir(rd.x & 3); + TileIndex tile = v->tile + TileOffsByDiagDir((DiagDirection)(rd.x & 3)); Trackdir dir; uint32 r; Direction newdir; @@ -1515,12 +1515,12 @@ case TRACKDIR_RVREV_SW: needed = ROAD_NE; break; case TRACKDIR_RVREV_NW: needed = ROAD_SE; break; } - if (!IsTileType(tile, MP_STREET) || GetRoadTileType(tile) != ROAD_TILE_NORMAL || HasRoadWorks(tile) || (needed & GetRoadBits(tile, ROADTYPE_TRAM)) == ROAD_NONE) { + if (!IsTileType(tile, MP_ROAD) || GetRoadTileType(tile) != ROAD_TILE_NORMAL || HasRoadWorks(tile) || (needed & GetRoadBits(tile, ROADTYPE_TRAM)) == ROAD_NONE) { /* The tram cannot turn here */ v->cur_speed = 0; return false; } - } else if (IsTileType(v->tile, MP_STREET) && GetRoadTileType(v->tile) == ROAD_TILE_NORMAL && GetDisallowedRoadDirections(v->tile) != DRD_NONE) { + } else if (IsTileType(v->tile, MP_ROAD) && GetRoadTileType(v->tile) == ROAD_TILE_NORMAL && GetDisallowedRoadDirections(v->tile) != DRD_NONE) { v->cur_speed = 0; return false; } else { @@ -1628,7 +1628,7 @@ * it's on a depot tile, check if it's time to activate the next vehicle in * the chain yet. */ if (v->next != NULL && - IsTileType(v->tile, MP_STREET) && GetRoadTileType(v->tile) == ROAD_TILE_DEPOT) { + IsTileType(v->tile, MP_ROAD) && GetRoadTileType(v->tile) == ROAD_TILE_DEPOT) { if (v->u.road.frame == v->u.road.cached_veh_length + RVC_DEPOT_START_FRAME) { RoadVehLeaveDepot(v->next, false); diff -r 31fcaa5375a1 -r e72987579514 src/roadveh_gui.cpp --- a/src/roadveh_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/roadveh_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -242,7 +242,7 @@ }; static const WindowDesc _roadveh_details_desc = { - WDP_AUTO, WDP_AUTO, 380, 113, + WDP_AUTO, WDP_AUTO, 380, 113, 380, 113, WC_VEHICLE_DETAILS,WC_VEHICLE_VIEW, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _roadveh_details_widgets, @@ -416,7 +416,7 @@ }; static const WindowDesc _roadveh_view_desc = { - WDP_AUTO, WDP_AUTO, 250, 116, + WDP_AUTO, WDP_AUTO, 250, 116, 250, 116, WC_VEHICLE_VIEW, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE, _roadveh_view_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/saveload.cpp --- a/src/saveload.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/saveload.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -270,7 +270,8 @@ } /** Return how many bytes used to encode a gamma value */ -static inline uint SlGetGammaLength(uint i) { +static inline uint SlGetGammaLength(uint i) +{ return 1 + (i >= (1 << 7)) + (i >= (1 << 14)) + (i >= (1 << 21)); } @@ -1121,8 +1122,8 @@ { _ts.count = 0; - CleanPool(&_Savegame_pool); - AddBlockToPool(&_Savegame_pool); + _Savegame_pool.CleanPool(); + _Savegame_pool.AddBlockToPool(); /* A block from the pool is a contigious area of memory, so it is safe to write to it sequentially */ _sl.bufsize = GetSavegamePoolSize(); @@ -1132,14 +1133,14 @@ static void UnInitMem() { - CleanPool(&_Savegame_pool); + _Savegame_pool.CleanPool(); } static void WriteMem(uint size) { _ts.count += size; /* Allocate new block and new buffer-pointer */ - AddBlockIfNeeded(&_Savegame_pool, _ts.count); + _Savegame_pool.AddBlockIfNeeded(_ts.count); _sl.buf = GetSavegame(_ts.count); } @@ -1342,37 +1343,37 @@ switch (rt) { case REF_ORDER: { - if (!AddBlockIfNeeded(&_Order_pool, index)) + if (!_Order_pool.AddBlockIfNeeded(index)) error("Orders: failed loading savegame: too many orders"); return GetOrder(index); } case REF_VEHICLE: { - if (!AddBlockIfNeeded(&_Vehicle_pool, index)) + if (!_Vehicle_pool.AddBlockIfNeeded(index)) error("Vehicles: failed loading savegame: too many vehicles"); return GetVehicle(index); } case REF_STATION: { - if (!AddBlockIfNeeded(&_Station_pool, index)) + if (!_Station_pool.AddBlockIfNeeded(index)) error("Stations: failed loading savegame: too many stations"); return GetStation(index); } case REF_TOWN: { - if (!AddBlockIfNeeded(&_Town_pool, index)) + if (!_Town_pool.AddBlockIfNeeded(index)) error("Towns: failed loading savegame: too many towns"); return GetTown(index); } case REF_ROADSTOPS: { - if (!AddBlockIfNeeded(&_RoadStop_pool, index)) + if (!_RoadStop_pool.AddBlockIfNeeded(index)) error("RoadStops: failed loading savegame: too many RoadStops"); return GetRoadStop(index); } case REF_ENGINE_RENEWS: { - if (!AddBlockIfNeeded(&_EngineRenew_pool, index)) + if (!_EngineRenew_pool.AddBlockIfNeeded(index)) error("EngineRenews: failed loading savegame: too many EngineRenews"); return GetEngineRenew(index); } case REF_CARGO_PACKET: { - if (!AddBlockIfNeeded(&_CargoPacket_pool, index)) + if (!_CargoPacket_pool.AddBlockIfNeeded(index)) error("CargoPackets: failed loading savegame: too many Cargo packets"); return GetCargoPacket(index); } @@ -1385,7 +1386,7 @@ if (index == INVALID_VEHICLE) return NULL; - if (!AddBlockIfNeeded(&_Vehicle_pool, index)) + if (!_Vehicle_pool.AddBlockIfNeeded(index)) error("Vehicles: failed loading savegame: too many vehicles"); return GetVehicle(index); } @@ -1551,7 +1552,7 @@ uint count = 1 << Savegame_POOL_BLOCK_SIZE_BITS; assert(_ts.count == _sl.offs_base); - for (i = 0; i != _Savegame_pool.current_blocks - 1; i++) { + for (i = 0; i != _Savegame_pool.GetBlockCount() - 1; i++) { _sl.buf = _Savegame_pool.blocks[i]; fmt->writer(count); } diff -r 31fcaa5375a1 -r e72987579514 src/settings_gui.cpp --- a/src/settings_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/settings_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -337,7 +337,7 @@ }; static const WindowDesc _game_options_desc = { - WDP_CENTER, WDP_CENTER, 370, 239, + WDP_CENTER, WDP_CENTER, 370, 239, 370, 239, WC_GAME_OPTIONS, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _game_options_widgets, @@ -613,7 +613,7 @@ }; static const WindowDesc _game_difficulty_desc = { - WDP_CENTER, WDP_CENTER, 370, 279, + WDP_CENTER, WDP_CENTER, 370, 279, 370, 279, WC_GAME_OPTIONS, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _game_difficulty_widgets, @@ -993,7 +993,7 @@ }; static const WindowDesc _patches_selection_desc = { - WDP_CENTER, WDP_CENTER, 370, 381, + WDP_CENTER, WDP_CENTER, 370, 381, 370, 381, WC_GAME_OPTIONS, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _patches_selection_widgets, @@ -1213,7 +1213,7 @@ }; static const WindowDesc _cust_currency_desc = { - WDP_CENTER, WDP_CENTER, 230, 120, + WDP_CENTER, WDP_CENTER, 230, 120, 230, 120, WC_CUSTOM_CURRENCY, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _cust_currency_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/ship.h --- a/src/ship.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/ship.h Fri Aug 03 22:09:42 2007 +0000 @@ -12,13 +12,13 @@ void RecalcShipStuff(Vehicle *v); void GetShipSpriteSize(EngineID engine, uint &width, uint &height); -static inline bool IsShipInDepot(const Vehicle* v) +static inline bool IsShipInDepot(const Vehicle *v) { assert(v->type == VEH_SHIP); return v->u.ship.state == 0x80; } -static inline bool IsShipInDepotStopped(const Vehicle* v) +static inline bool IsShipInDepotStopped(const Vehicle *v) { return IsShipInDepot(v) && v->vehstatus & VS_STOPPED; } diff -r 31fcaa5375a1 -r e72987579514 src/ship_cmd.cpp --- a/src/ship_cmd.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/ship_cmd.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -33,6 +33,7 @@ #include "newgrf_sound.h" #include "date.h" #include "spritecache.h" +#include "misc/autoptr.hpp" static const uint16 _ship_sprites[] = {0x0E5D, 0x0E55, 0x0E65, 0x0E6D}; @@ -220,7 +221,7 @@ if (!(v->vehstatus & VS_HIDDEN)) { Vehicle *u = CreateEffectVehicleRel(v, 4, 4, 5, EV_BREAKDOWN_SMOKE); - if (u != NULL) u->u.special.unk0 = v->breakdown_delay * 2; + if (u != NULL) u->u.special.animation_state = v->breakdown_delay * 2; } } @@ -833,8 +834,9 @@ if (!IsTileDepotType(tile, TRANSPORT_WATER)) return CMD_ERROR; if (!IsTileOwner(tile, _current_player)) return CMD_ERROR; - v = AllocateVehicle(); + v = new Ship(); unit_num = HASBIT(p2, 0) ? 0 : GetFreeUnitNumber(VEH_SHIP); + AutoPtrT v_auto_delete = v; if (v == NULL || unit_num > _patches.max_ships) return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME); @@ -898,6 +900,8 @@ InvalidateAutoreplaceWindow(VEH_SHIP, v->group_id); // updates the replace Ship window GetPlayer(_current_player)->num_engines[p1]++; + + v_auto_delete.Detach(); } return value; @@ -931,7 +935,7 @@ InvalidateWindow(WC_COMPANY, v->owner); DeleteWindowById(WC_VEHICLE_VIEW, v->index); DeleteDepotHighlightOfVehicle(v); - DeleteVehicle(v); + delete v; } return CommandCost(-v->value); diff -r 31fcaa5375a1 -r e72987579514 src/ship_gui.cpp --- a/src/ship_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/ship_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -156,7 +156,7 @@ }; static const WindowDesc _ship_details_desc = { - WDP_AUTO, WDP_AUTO, 405, 113, + WDP_AUTO, WDP_AUTO, 405, 113, 405, 113, WC_VEHICLE_DETAILS, WC_VEHICLE_VIEW, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _ship_details_widgets, @@ -334,7 +334,7 @@ }; static const WindowDesc _ship_view_desc = { - WDP_AUTO, WDP_AUTO, 250, 116, + WDP_AUTO, WDP_AUTO, 250, 116, 250, 116, WC_VEHICLE_VIEW, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE, _ship_view_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/signs.cpp --- a/src/signs.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/signs.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -13,24 +13,29 @@ #include "saveload.h" #include "command.h" #include "variables.h" +#include "misc/autoptr.hpp" SignID _new_sign_id; uint _total_signs; -/** - * Called if a new block is added to the sign-pool - */ -static void SignPoolNewBlock(uint start_item) +/* Initialize the sign-pool */ +DEFINE_OLD_POOL_GENERIC(Sign, Sign) + +Sign::Sign(StringID string) { - Sign *si; - - /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. - * TODO - This is just a temporary stage, this will be removed. */ - for (si = GetSign(start_item); si != NULL; si = (si->index + 1U < GetSignPoolSize()) ? GetSign(si->index + 1U) : NULL) si->index = start_item++; + this->str = string; } -/* Initialize the sign-pool */ -DEFINE_OLD_POOL(Sign, Sign, SignPoolNewBlock, NULL) +Sign::~Sign() +{ + this->QuickFree(); + this->str = STR_NULL; +} + +void Sign::QuickFree() +{ + DeleteName(this->str); +} /** * @@ -77,45 +82,6 @@ } /** - * - * Allocates a new sign - * - * @return The pointer to the new sign, or NULL if there is no more free space - */ -static Sign *AllocateSign() -{ - Sign *si; - - /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. - * TODO - This is just a temporary stage, this will be removed. */ - for (si = GetSign(0); si != NULL; si = (si->index + 1U < GetSignPoolSize()) ? GetSign(si->index + 1U) : NULL) { - if (!IsValidSign(si)) { - uint index = si->index; - - memset(si, 0, sizeof(Sign)); - si->index = index; - - return si; - } - } - - /* Check if we can add a block to the pool */ - if (AddBlockToPool(&_Sign_pool)) - return AllocateSign(); - - return NULL; -} - -/** - * Destroy a sign placed on the map - * @param si Pointer to the Sign to remove - */ -void DestroySign(Sign *si) -{ - DeleteName(si->str); -} - -/** * Place a sign at the given coordinates. Ownership of sign has * no effect whatsoever except for the colour the sign gets for easy recognition, * but everybody is able to rename/remove it. @@ -126,18 +92,16 @@ */ CommandCost CmdPlaceSign(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) { - Sign *si; - /* Try to locate a new sign */ - si = AllocateSign(); + Sign *si = new Sign(STR_280A_SIGN); if (si == NULL) return_cmd_error(STR_2808_TOO_MANY_SIGNS); + AutoPtrT s_auto_delete = si; /* When we execute, really make the sign */ if (flags & DC_EXEC) { int x = TileX(tile) * TILE_SIZE; int y = TileY(tile) * TILE_SIZE; - si->str = STR_280A_SIGN; si->x = x; si->y = y; si->owner = _current_player; // owner of the sign; just eyecandy @@ -148,6 +112,7 @@ _sign_sort_dirty = true; _new_sign_id = si->index; _total_signs++; + s_auto_delete.Detach(); } return CommandCost(); @@ -197,7 +162,7 @@ Sign *si = GetSign(p1); MarkSignDirty(si); - DeleteSign(si); + delete si; InvalidateWindow(WC_SIGN_LIST, 0); _sign_sort_dirty = true; @@ -242,8 +207,8 @@ void InitializeSigns() { _total_signs = 0; - CleanPool(&_Sign_pool); - AddBlockToPool(&_Sign_pool); + _Sign_pool.CleanPool(); + _Sign_pool.AddBlockToPool(); } static const SaveLoad _sign_desc[] = { @@ -282,12 +247,7 @@ _total_signs = 0; int index; while ((index = SlIterateArray()) != -1) { - Sign *si; - - if (!AddBlockIfNeeded(&_Sign_pool, index)) - error("Signs: failed loading savegame: too many signs"); - - si = GetSign(index); + Sign *si = new (index) Sign(); SlObject(si, _sign_desc); _total_signs++; diff -r 31fcaa5375a1 -r e72987579514 src/signs.h --- a/src/signs.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/signs.h Fri Aug 03 22:09:42 2007 +0000 @@ -7,7 +7,10 @@ #include "oldpool.h" -struct Sign { +struct Sign; +DECLARE_OLD_POOL(Sign, Sign, 2, 16000) + +struct Sign : PoolItem { StringID str; ViewportSign sign; int32 x; @@ -15,7 +18,17 @@ byte z; PlayerByte owner; // placed by this player. Anyone can delete them though. OWNER_NONE for gray signs from old games. - SignID index; + /** + * Creates a new sign + */ + Sign(StringID string = STR_NULL); + + /** Destroy the sign */ + ~Sign(); + + bool IsValid() const { return this->str != STR_NULL; } + + void QuickFree(); }; enum { @@ -24,7 +37,6 @@ extern SignID _new_sign_id; -DECLARE_OLD_POOL(Sign, Sign, 2, 16000) static inline SignID GetMaxSignIndex() { @@ -42,28 +54,12 @@ return _total_signs; } -/** - * Check if a Sign really exists. - */ -static inline bool IsValidSign(const Sign *si) -{ - return si->str != STR_NULL; -} - static inline bool IsValidSignID(uint index) { - return index < GetSignPoolSize() && IsValidSign(GetSign(index)); + return index < GetSignPoolSize() && GetSign(index)->IsValid(); } -void DestroySign(Sign *si); - -static inline void DeleteSign(Sign *si) -{ - DestroySign(si); - si->str = STR_NULL; -} - -#define FOR_ALL_SIGNS_FROM(ss, start) for (ss = GetSign(start); ss != NULL; ss = (ss->index + 1U < GetSignPoolSize()) ? GetSign(ss->index + 1U) : NULL) if (IsValidSign(ss)) +#define FOR_ALL_SIGNS_FROM(ss, start) for (ss = GetSign(start); ss != NULL; ss = (ss->index + 1U < GetSignPoolSize()) ? GetSign(ss->index + 1U) : NULL) if (ss->IsValid()) #define FOR_ALL_SIGNS(ss) FOR_ALL_SIGNS_FROM(ss, 0) VARDEF bool _sign_sort_dirty; diff -r 31fcaa5375a1 -r e72987579514 src/signs_gui.cpp --- a/src/signs_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/signs_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -133,7 +133,7 @@ }; static const WindowDesc _sign_list_desc = { - WDP_AUTO, WDP_AUTO, 358, 138, + WDP_AUTO, WDP_AUTO, 358, 138, 358, 138, WC_SIGN_LIST, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON | WDF_RESIZABLE, _sign_list_widget, @@ -296,7 +296,7 @@ }; static const WindowDesc _query_sign_edit_desc = { - 190, 170, 260, 42, + 190, 170, 260, 42, 260, 42, WC_QUERY_STRING, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _query_sign_edit_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/slope.h --- a/src/slope.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/slope.h Fri Aug 03 22:09:42 2007 +0000 @@ -1,43 +1,164 @@ /* $Id$ */ -/** @file slope.h */ +/** @file slope.h Definitions of a slope. + * This file defines the enumeration and helper functions for handling + * the slope info of a tile. + */ #ifndef SLOPE_H #define SLOPE_H +/** + * Enumeration for the slope-type. + * + * This enumeration use the chars N,E,S,W corresponding the + * direction north, east, south and west. The top corner of a tile + * is the north-part of the tile. The whole slope is encoded with + * 5 bits, 4 bits for each corner and 1 bit for a steep-flag. + */ enum Slope { - SLOPE_FLAT = 0x00, - SLOPE_W = 0x01, - SLOPE_S = 0x02, - SLOPE_E = 0x04, - SLOPE_N = 0x08, - SLOPE_STEEP = 0x10, - SLOPE_NW = SLOPE_N | SLOPE_W, - SLOPE_SW = SLOPE_S | SLOPE_W, - SLOPE_SE = SLOPE_S | SLOPE_E, - SLOPE_NE = SLOPE_N | SLOPE_E, - SLOPE_EW = SLOPE_E | SLOPE_W, - SLOPE_NS = SLOPE_N | SLOPE_S, - SLOPE_ELEVATED = SLOPE_N | SLOPE_E | SLOPE_S | SLOPE_W, - SLOPE_NWS = SLOPE_N | SLOPE_W | SLOPE_S, - SLOPE_WSE = SLOPE_W | SLOPE_S | SLOPE_E, - SLOPE_SEN = SLOPE_S | SLOPE_E | SLOPE_N, - SLOPE_ENW = SLOPE_E | SLOPE_N | SLOPE_W, - SLOPE_STEEP_W = SLOPE_STEEP | SLOPE_NWS, - SLOPE_STEEP_S = SLOPE_STEEP | SLOPE_WSE, - SLOPE_STEEP_E = SLOPE_STEEP | SLOPE_SEN, - SLOPE_STEEP_N = SLOPE_STEEP | SLOPE_ENW + SLOPE_FLAT = 0x00, ///< a flat tile + SLOPE_W = 0x01, ///< the west corner of the tile is raised + SLOPE_S = 0x02, ///< the south corner of the tile is raised + SLOPE_E = 0x04, ///< the east corner of the tile is raised + SLOPE_N = 0x08, ///< the north corner of the tile is raised + SLOPE_STEEP = 0x10, ///< indicates the slope is steep + SLOPE_NW = SLOPE_N | SLOPE_W, ///< north and west corner are raised + SLOPE_SW = SLOPE_S | SLOPE_W, ///< south and west corner are raised + SLOPE_SE = SLOPE_S | SLOPE_E, ///< south and east corner are raised + SLOPE_NE = SLOPE_N | SLOPE_E, ///< north and east corner are raised + SLOPE_EW = SLOPE_E | SLOPE_W, ///< east and west corner are raised + SLOPE_NS = SLOPE_N | SLOPE_S, ///< north and south corner are raised + SLOPE_ELEVATED = SLOPE_N | SLOPE_E | SLOPE_S | SLOPE_W, ///< all corner are raised, similar to SLOPE_FLAT + SLOPE_NWS = SLOPE_N | SLOPE_W | SLOPE_S, ///< north, west and south corner are raised + SLOPE_WSE = SLOPE_W | SLOPE_S | SLOPE_E, ///< west, south and east corner are raised + SLOPE_SEN = SLOPE_S | SLOPE_E | SLOPE_N, ///< south, east and north corner are raised + SLOPE_ENW = SLOPE_E | SLOPE_N | SLOPE_W, ///< east, north and west corner are raised + SLOPE_STEEP_W = SLOPE_STEEP | SLOPE_NWS, ///< a steep slope falling to east (from west) + SLOPE_STEEP_S = SLOPE_STEEP | SLOPE_WSE, ///< a steep slope falling to north (from south) + SLOPE_STEEP_E = SLOPE_STEEP | SLOPE_SEN, ///< a steep slope falling to west (from east) + SLOPE_STEEP_N = SLOPE_STEEP | SLOPE_ENW ///< a steep slope falling to south (from north) }; +/** + * Checks if a slope is steep. + * + * @param s The given #Slope. + * @return True if the slope is steep, else false. + */ static inline bool IsSteepSlope(Slope s) { return (s & SLOPE_STEEP) != 0; } +/** + * Return the complement of a slope. + * + * This method returns the complement of a slope. The complement of a + * slope is a slope with raised corner which aren't raised in the given + * slope. + * + * @pre The slope must not be steep. + * @param s The #Slope to get the complement. + * @return a complement Slope of the given slope. + */ static inline Slope ComplementSlope(Slope s) { assert(!IsSteepSlope(s)); return (Slope)(0xF ^ s); } +/** + * Returns the highest corner of a slope (one corner raised or a steep slope). + * + * @pre The slope must be a slope with one corner raised or a steep slope. + * @param s The #Slope. + * @return Number of the highest corner. (0 west, 1 south, 2 east, 3 north) + */ +static inline byte GetHighestSlopeCorner(Slope s) +{ + switch (s) { + case SLOPE_W: + case SLOPE_STEEP_W: return 0; + case SLOPE_S: + case SLOPE_STEEP_S: return 1; + case SLOPE_E: + case SLOPE_STEEP_E: return 2; + case SLOPE_N: + case SLOPE_STEEP_N: return 3; + default: NOT_REACHED(); + } +} + + +/** + * Enumeration for Foundations. + */ +enum Foundation { + FOUNDATION_NONE, ///< The tile has no foundation, the slope remains unchanged. + FOUNDATION_LEVELED, ///< The tile is leveled up to a flat slope. + FOUNDATION_INCLINED_X, ///< The tile has an along X-axis inclined foundation. + FOUNDATION_INCLINED_Y, ///< The tile has an along Y-axis inclined foundation. + FOUNDATION_STEEP_LOWER, ///< The tile has a steep slope. The lowerst corner is raised by a foundation to allow building railroad on the lower halftile. + FOUNDATION_STEEP_HIGHER, ///< The tile has a steep slope. Three corners are raised by a foundation to allow building railroad on the higher halftile. +}; + +/** + * Tests for FOUNDATION_NONE. + * + * @param f Maybe a #Foundation. + * @return true iff f is a foundation. + */ +static inline bool IsFoundation(Foundation f) +{ + return f != FOUNDATION_NONE; +} + +/** + * Tests if the foundation is a leveled foundation. + * + * @param f The #Foundation. + * @return true iff f is a leveled foundation. + */ +static inline bool IsLeveledFoundation(Foundation f) +{ + return f == FOUNDATION_LEVELED; +} + +/** + * Tests if the foundation is an inclined foundation. + * + * @param f The #Foundation. + * @return true iff f is an inclined foundation. + */ +static inline bool IsInclinedFoundation(Foundation f) +{ + return (f == FOUNDATION_INCLINED_X) || (f == FOUNDATION_INCLINED_Y); +} + +/** + * Returns the foundation needed to flatten a slope. + * The returned foundation is either FOUNDATION_NONE if the tile was already flat, or FOUNDATION_LEVELED. + * + * @pre The slope must not be steep. + * @param s The current #Slope. + * @return The needed #Foundation. + */ +static inline Foundation FlatteningFoundation(Slope s) +{ + assert(!IsSteepSlope(s)); + return (s == SLOPE_FLAT ? FOUNDATION_NONE : FOUNDATION_LEVELED); +} + +/** + * Returns the along a specific axis inclined foundation. + * + * @param axis The #Axis. + * @return The needed #Foundation. + */ +static inline Foundation InclinedFoundation(Axis axis) +{ + return (axis == AXIS_X ? FOUNDATION_INCLINED_X : FOUNDATION_INCLINED_Y); +} + #endif /* SLOPE_H */ diff -r 31fcaa5375a1 -r e72987579514 src/smallmap_gui.cpp --- a/src/smallmap_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/smallmap_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -30,21 +30,21 @@ static const Widget _smallmap_widgets[] = { { WWT_CLOSEBOX, RESIZE_NONE, 13, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, -{ WWT_CAPTION, RESIZE_RIGHT, 13, 11, 433, 0, 13, STR_00B0_MAP, STR_018C_WINDOW_TITLE_DRAG_THIS}, -{ WWT_STICKYBOX, RESIZE_LR, 13, 434, 445, 0, 13, 0x0, STR_STICKY_BUTTON}, -{ WWT_PANEL, RESIZE_RB, 13, 0, 445, 14, 257, 0x0, STR_NULL}, -{ WWT_INSET, RESIZE_RB, 13, 2, 443, 16, 255, 0x0, STR_NULL}, -{ WWT_IMGBTN, RESIZE_LRTB, 13, 380, 401, 258, 279, SPR_IMG_SHOW_COUNTOURS, STR_0191_SHOW_LAND_CONTOURS_ON_MAP}, -{ WWT_IMGBTN, RESIZE_LRTB, 13, 402, 423, 258, 279, SPR_IMG_SHOW_VEHICLES, STR_0192_SHOW_VEHICLES_ON_MAP}, -{ WWT_IMGBTN, RESIZE_LRTB, 13, 424, 445, 258, 279, SPR_IMG_INDUSTRY, STR_0193_SHOW_INDUSTRIES_ON_MAP}, -{ WWT_IMGBTN, RESIZE_LRTB, 13, 380, 401, 280, 301, SPR_IMG_SHOW_ROUTES, STR_0194_SHOW_TRANSPORT_ROUTES_ON}, -{ WWT_IMGBTN, RESIZE_LRTB, 13, 402, 423, 280, 301, SPR_IMG_PLANTTREES, STR_0195_SHOW_VEGETATION_ON_MAP}, -{ WWT_IMGBTN, RESIZE_LRTB, 13, 424, 445, 280, 301, SPR_IMG_COMPANY_GENERAL, STR_0196_SHOW_LAND_OWNERS_ON_MAP}, -{ WWT_IMGBTN, RESIZE_LRTB, 13, 358, 379, 258, 279, SPR_IMG_SMALLMAP, STR_SMALLMAP_CENTER}, -{ WWT_IMGBTN, RESIZE_LRTB, 13, 358, 379, 280, 301, SPR_IMG_TOWN, STR_0197_TOGGLE_TOWN_NAMES_ON_OFF}, -{ WWT_PANEL, RESIZE_RTB, 13, 0, 357, 258, 301, 0x0, STR_NULL}, -{ WWT_PANEL, RESIZE_RTB, 13, 0, 433, 302, 313, 0x0, STR_NULL}, -{ WWT_RESIZEBOX, RESIZE_LRTB, 13, 434, 445, 302, 313, 0x0, STR_RESIZE_BUTTON}, +{ WWT_CAPTION, RESIZE_RIGHT, 13, 11, 337, 0, 13, STR_00B0_MAP, STR_018C_WINDOW_TITLE_DRAG_THIS}, +{ WWT_STICKYBOX, RESIZE_LR, 13, 338, 349, 0, 13, 0x0, STR_STICKY_BUTTON}, +{ WWT_PANEL, RESIZE_RB, 13, 0, 349, 14, 157, 0x0, STR_NULL}, +{ WWT_INSET, RESIZE_RB, 13, 2, 347, 16, 155, 0x0, STR_NULL}, +{ WWT_IMGBTN, RESIZE_LRTB, 13, 284, 305, 158, 179, SPR_IMG_SHOW_COUNTOURS, STR_0191_SHOW_LAND_CONTOURS_ON_MAP}, +{ WWT_IMGBTN, RESIZE_LRTB, 13, 306, 327, 158, 179, SPR_IMG_SHOW_VEHICLES, STR_0192_SHOW_VEHICLES_ON_MAP}, +{ WWT_IMGBTN, RESIZE_LRTB, 13, 328, 349, 158, 179, SPR_IMG_INDUSTRY, STR_0193_SHOW_INDUSTRIES_ON_MAP}, +{ WWT_IMGBTN, RESIZE_LRTB, 13, 284, 307, 180, 201, SPR_IMG_SHOW_ROUTES, STR_0194_SHOW_TRANSPORT_ROUTES_ON}, +{ WWT_IMGBTN, RESIZE_LRTB, 13, 306, 327, 180, 201, SPR_IMG_PLANTTREES, STR_0195_SHOW_VEGETATION_ON_MAP}, +{ WWT_IMGBTN, RESIZE_LRTB, 13, 328, 349, 180, 201, SPR_IMG_COMPANY_GENERAL, STR_0196_SHOW_LAND_OWNERS_ON_MAP}, +{ WWT_IMGBTN, RESIZE_LRTB, 13, 262, 283, 158, 179, SPR_IMG_SMALLMAP, STR_SMALLMAP_CENTER}, +{ WWT_IMGBTN, RESIZE_LRTB, 13, 262, 283, 180, 201, SPR_IMG_TOWN, STR_0197_TOGGLE_TOWN_NAMES_ON_OFF}, +{ WWT_PANEL, RESIZE_RTB, 13, 0, 261, 158, 201, 0x0, STR_NULL}, +{ WWT_PANEL, RESIZE_RTB, 13, 0, 337, 202, 213, 0x0, STR_NULL}, +{ WWT_RESIZEBOX, RESIZE_LRTB, 13, 338, 349, 202, 213, 0x0, STR_RESIZE_BUTTON}, { WIDGETS_END}, }; @@ -193,8 +193,10 @@ #define MKCOLOR(x) TO_LE32X(x) -/* Height encodings; 16 levels XXX - needs updating for more/finer heights! */ -static const uint32 _map_height_bits[16] = { +/** + * Height encodings; MAX_TILE_HEIGHT + 1 levels, from 0 to MAX_TILE_HEIGHT + */ +static const uint32 _map_height_bits[] = { MKCOLOR(0x5A5A5A5A), MKCOLOR(0x5A5B5A5B), MKCOLOR(0x5B5B5B5B), @@ -212,6 +214,7 @@ MKCOLOR(0x27272727), MKCOLOR(0x27272727), }; +assert_compile(lengthof(_map_height_bits) == MAX_TILE_HEIGHT + 1); struct AndOr { uint32 mor; @@ -315,7 +318,7 @@ } switch (tt) { case TRANSPORT_RAIL: t = MP_RAILWAY; break; - case TRANSPORT_ROAD: t = MP_STREET; break; + case TRANSPORT_ROAD: t = MP_ROAD; break; default: t = MP_WATER; break; } } @@ -909,7 +912,7 @@ } static const WindowDesc _smallmap_desc = { - WDP_AUTO, WDP_AUTO, 446, 314, + WDP_AUTO, WDP_AUTO, 350, 214, 446, 314, WC_SMALLMAP, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON | WDF_RESIZABLE, _smallmap_widgets, @@ -925,26 +928,24 @@ LowerWindowWidget(w, _smallmap_type + 5); SetWindowWidgetLoweredState(w, 12, _smallmap_show_towns); - w->resize.width = 350; - w->resize.height = 250; SmallMapCenterOnCurrentPos(w); } /* Extra ViewPort Window Stuff */ static const Widget _extra_view_port_widgets[] = { -{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, -{ WWT_CAPTION, RESIZE_RIGHT, 14, 11, 287, 0, 13, STR_EXTRA_VIEW_PORT_TITLE, STR_018C_WINDOW_TITLE_DRAG_THIS}, -{ WWT_STICKYBOX, RESIZE_LR, 14, 288, 299, 0, 13, 0x0, STR_STICKY_BUTTON}, -{ WWT_PANEL, RESIZE_RB, 14, 0, 299, 14, 233, 0x0, STR_NULL}, -{ WWT_INSET, RESIZE_RB, 14, 2, 297, 16, 231, 0x0, STR_NULL}, -{ WWT_PUSHIMGBTN, RESIZE_TB, 14, 0, 21, 234, 255, SPR_IMG_ZOOMIN, STR_017F_ZOOM_THE_VIEW_IN}, -{ WWT_PUSHIMGBTN, RESIZE_TB, 14, 22, 43, 234, 255, SPR_IMG_ZOOMOUT, STR_0180_ZOOM_THE_VIEW_OUT}, -{ WWT_PUSHTXTBTN, RESIZE_TB, 14, 44, 171, 234, 255, STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW, STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT}, -{ WWT_PUSHTXTBTN, RESIZE_TB, 14, 172, 298, 234, 255, STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN, STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT}, -{ WWT_PANEL, RESIZE_RTB, 14, 299, 299, 234, 255, 0x0, STR_NULL}, -{ WWT_PANEL, RESIZE_RTB, 14, 0, 287, 256, 267, 0x0, STR_NULL}, -{ WWT_RESIZEBOX, RESIZE_LRTB, 14, 288, 299, 256, 267, 0x0, STR_RESIZE_BUTTON}, +{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, +{ WWT_CAPTION, RESIZE_RIGHT, 14, 11, 287, 0, 13, STR_EXTRA_VIEW_PORT_TITLE, STR_018C_WINDOW_TITLE_DRAG_THIS}, +{ WWT_STICKYBOX, RESIZE_LR, 14, 288, 299, 0, 13, 0x0, STR_STICKY_BUTTON}, +{ WWT_PANEL, RESIZE_RB, 14, 0, 299, 14, 33, 0x0, STR_NULL}, +{ WWT_INSET, RESIZE_RB, 14, 2, 297, 16, 31, 0x0, STR_NULL}, +{ WWT_PUSHIMGBTN, RESIZE_TB, 14, 0, 21, 34, 55, SPR_IMG_ZOOMIN, STR_017F_ZOOM_THE_VIEW_IN}, +{ WWT_PUSHIMGBTN, RESIZE_TB, 14, 22, 43, 34, 55, SPR_IMG_ZOOMOUT, STR_0180_ZOOM_THE_VIEW_OUT}, +{ WWT_PUSHTXTBTN, RESIZE_TB, 14, 44, 171, 34, 55, STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW, STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT}, +{ WWT_PUSHTXTBTN, RESIZE_TB, 14, 172, 298, 34, 55, STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN, STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT}, +{ WWT_PANEL, RESIZE_RTB, 14, 299, 299, 34, 55, 0x0, STR_NULL}, +{ WWT_PANEL, RESIZE_RTB, 14, 0, 287, 56, 67, 0x0, STR_NULL}, +{ WWT_RESIZEBOX, RESIZE_LRTB, 14, 288, 299, 56, 67, 0x0, STR_RESIZE_BUTTON}, { WIDGETS_END}, }; @@ -952,6 +953,9 @@ { switch (e->event) { case WE_CREATE: /* Disable zoom in button */ + /* New viewport start at (zero,zero) */ + AssignWindowViewport(w, 3, 17, w->widget[4].right - w->widget[4].left - 1, w->widget[4].bottom - w->widget[4].top - 1, 0, ZOOM_LVL_VIEWPORT); + DisableWindowWidget(w, 5); break; @@ -1024,7 +1028,7 @@ } static const WindowDesc _extra_view_port_desc = { - WDP_AUTO, WDP_AUTO, 300, 268, + WDP_AUTO, WDP_AUTO, 300, 68, 300, 268, WC_EXTRA_VIEW_PORT, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE, _extra_view_port_widgets, @@ -1044,14 +1048,12 @@ int x, y; /* the main window with the main view */ v = FindWindowById(WC_MAIN_WINDOW, 0); - /* New viewport start ats (zero,zero) */ - AssignWindowViewport(w, 3, 17, 294, 214, 0 , ZOOM_LVL_VIEWPORT); /* center on same place as main window (zoom is maximum, no adjustment needed) */ x = WP(v, vp_d).scrollpos_x; y = WP(v, vp_d).scrollpos_y; - WP(w, vp_d).scrollpos_x = x + (v->viewport->virtual_width - (294)) / 2; - WP(w, vp_d).scrollpos_y = y + (v->viewport->virtual_height - (214)) / 2; + WP(w, vp_d).scrollpos_x = x + (v->viewport->virtual_width - (w->widget[4].right - w->widget[4].left) - 1) / 2; + WP(w, vp_d).scrollpos_y = y + (v->viewport->virtual_height - (w->widget[4].bottom - w->widget[4].top) - 1) / 2; WP(w, vp_d).dest_scrollpos_x = WP(w, vp_d).scrollpos_x; WP(w, vp_d).dest_scrollpos_y = WP(w, vp_d).scrollpos_y; } diff -r 31fcaa5375a1 -r e72987579514 src/sprite.h --- a/src/sprite.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/sprite.h Fri Aug 03 22:09:42 2007 +0000 @@ -24,7 +24,7 @@ struct DrawTileSprites { SpriteID ground_sprite; SpriteID ground_pal; - const DrawTileSeqStruct* seq; + const DrawTileSeqStruct *seq; }; /** diff -r 31fcaa5375a1 -r e72987579514 src/station.cpp --- a/src/station.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/station.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -64,7 +64,6 @@ { DEBUG(station, cDebugCtorLevel, "I-%3d", index); - DeleteName(string_id); MarkDirty(); RebuildStationLists(); InvalidateWindowClasses(WC_STATION_LIST); @@ -77,35 +76,19 @@ /* Subsidies need removal as well */ DeleteSubsidyWithStation(index); - free(speclist); xy = 0; for (CargoID c = 0; c < NUM_CARGO; c++) { goods[c].cargo.Truncate(0); } -} -void* Station::operator new(size_t size) -{ - Station *st = AllocateRaw(); - return st; + this->QuickFree(); } -void* Station::operator new(size_t size, int st_idx) +void Station::QuickFree() { - if (!AddBlockIfNeeded(&_Station_pool, st_idx)) - error("Stations: failed loading savegame: too many stations"); - - Station *st = GetStation(st_idx); - return st; -} - -void Station::operator delete(void *p) -{ -} - -void Station::operator delete(void *p, int st_idx) -{ + DeleteName(this->string_id); + free(this->speclist); } /** Called when new facility is built on the station. If it is the first facility @@ -170,30 +153,6 @@ return IsTileType(tile, MP_STATION) && GetStationIndex(tile) == index && IsRailwayStation(tile); } -/*static*/ Station *Station::AllocateRaw() -{ - Station *st = NULL; - - /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. - * TODO - This is just a temporary stage, this will be removed. */ - for (st = GetStation(0); st != NULL; st = (st->index + 1U < GetStationPoolSize()) ? GetStation(st->index + 1U) : NULL) { - if (!st->IsValid()) { - StationID index = st->index; - - memset(st, 0, sizeof(Station)); - st->index = index; - return st; - } - } - - /* Check if we can add a block to the pool */ - if (AddBlockToPool(&_Station_pool)) return AllocateRaw(); - - _error_message = STR_3008_TOO_MANY_STATIONS_LOADING; - return NULL; -} - - /** Obtain the length of a platform * @pre tile must be a railway station tile * @param tile A tile that contains the platform in question @@ -420,36 +379,6 @@ /* RoadStop implementation */ /************************************************************************/ -/** Allocates a new RoadStop onto the pool, or recycles an unsed one - * @return a pointer to the new roadstop - */ -void *RoadStop::operator new(size_t size) -{ - RoadStop *rs = AllocateRaw(); - return rs; -} - -/** Gets a RoadStop with a given index and allocates it when needed - * @return a pointer to the roadstop - */ -void *RoadStop::operator new(size_t size, int index) -{ - if (!AddBlockIfNeeded(&_RoadStop_pool, index)) { - error("RoadStops: failed loading savegame: too many RoadStops"); - } - - RoadStop *rs = GetRoadStop(index); - return rs; -} - -void RoadStop::operator delete(void *p) -{ -} - -void RoadStop::operator delete(void *p, int index) -{ -} - /** Initializes a RoadStop */ RoadStop::RoadStop(TileIndex tile) : xy(tile), @@ -477,38 +406,13 @@ DEBUG(ms, cDebugCtorLevel , "I- at %d[0x%x]", xy, xy); - xy = INVALID_TILE; -} - - -/** Low-level function for allocating a RoadStop on the pool */ -RoadStop *RoadStop::AllocateRaw() -{ - RoadStop *rs; - - /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. - * TODO - This is just a temporary stage, this will be removed. */ - for (rs = GetRoadStop(0); rs != NULL; rs = (rs->index + 1U < GetRoadStopPoolSize()) ? GetRoadStop(rs->index + 1U) : NULL) { - if (!rs->IsValid()) { - RoadStopID index = rs->index; - - memset(rs, 0, sizeof(*rs)); - rs->index = index; - - return rs; - } - } - - /* Check if we can add a block to the pool */ - if (AddBlockToPool(&_RoadStop_pool)) return AllocateRaw(); - - return NULL; + xy = 0; } /** Determines whether a RoadStop is a valid (i.e. existing) one */ bool RoadStop::IsValid() const { - return xy != INVALID_TILE; + return xy != 0; } /** Checks whether there is a free bay in this road stop */ diff -r 31fcaa5375a1 -r e72987579514 src/station.h --- a/src/station.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/station.h Fri Aug 03 22:09:42 2007 +0000 @@ -15,6 +15,12 @@ #include "cargopacket.h" #include +struct Station; +struct RoadStop; + +DECLARE_OLD_POOL(Station, Station, 6, 1000) +DECLARE_OLD_POOL(RoadStop, RoadStop, 5, 2000) + static const byte INITIAL_STATION_RATING = 175; struct GoodsEntry { @@ -35,7 +41,7 @@ }; /** A Stop for a Road Vehicle */ -struct RoadStop { +struct RoadStop : PoolItem { /** Types of RoadStops */ enum Type { BUS, ///< A standard stop for buses @@ -47,20 +53,12 @@ static const uint MAX_BAY_COUNT = 2; ///< The maximum number of loading bays TileIndex xy; ///< Position on the map - RoadStopID index; ///< Global (i.e. pool-wide) index byte status; ///< Current status of the Stop. Like which spot is taken. Access using *Bay and *Busy functions. byte num_vehicles; ///< Number of vehicles currently slotted to this stop struct RoadStop *next; ///< Next stop of the given type at this station - RoadStop(TileIndex tile); - ~RoadStop(); - - void *operator new (size_t size); - void operator delete(void *rs); - - /* For loading games */ - void *operator new (size_t size, int index); - void operator delete(void *rs, int index); + RoadStop(TileIndex tile = 0); + virtual ~RoadStop(); bool IsValid() const; @@ -72,8 +70,6 @@ void FreeBay(uint nr); bool IsEntranceBusy() const; void SetEntranceBusy(bool busy); -protected: - static RoadStop *AllocateRaw(); }; struct StationSpecList { @@ -105,7 +101,7 @@ StationRect& operator = (Rect src); }; -struct Station { +struct Station : PoolItem { public: RoadStop *GetPrimaryRoadStop(RoadStop::Type type) const { @@ -148,7 +144,6 @@ Date build_date; uint64 airport_flags; ///< stores which blocks on the airport are taken. was 16 bit earlier on, then 32 - StationID index; byte last_vehicle_type; std::list loading_vehicles; @@ -162,15 +157,9 @@ static const int cDebugCtorLevel = 3; Station(TileIndex tile = 0); - ~Station(); + virtual ~Station(); - /* normal new/delete operators. Used when building/removing station */ - void* operator new (size_t size); - void operator delete(void *p); - - /* new/delete operators accepting station index. Used when loading station from savegame. */ - void* operator new (size_t size, int st_idx); - void operator delete(void *p, int st_idx); + void QuickFree(); void AddFacility(byte new_facility_bit, TileIndex facil_xy); void MarkDirty() const; @@ -180,9 +169,6 @@ uint GetPlatformLength(TileIndex tile) const; bool IsBuoy() const; bool IsValid() const; - -protected: - static Station *AllocateRaw(); }; enum StationType { @@ -232,8 +218,6 @@ void RebuildStationLists(); void ResortStationLists(); -DECLARE_OLD_POOL(Station, Station, 6, 1000) - static inline StationID GetMaxStationIndex() { /* TODO - This isn't the real content of the function, but @@ -260,8 +244,6 @@ /* Stuff for ROADSTOPS */ -DECLARE_OLD_POOL(RoadStop, RoadStop, 5, 2000) - #define FOR_ALL_ROADSTOPS_FROM(rs, start) for (rs = GetRoadStop(start); rs != NULL; rs = (rs->index + 1U < GetRoadStopPoolSize()) ? GetRoadStop(rs->index + 1U) : NULL) if (rs->IsValid()) #define FOR_ALL_ROADSTOPS(rs) FOR_ALL_ROADSTOPS_FROM(rs, 0) diff -r 31fcaa5375a1 -r e72987579514 src/station_cmd.cpp --- a/src/station_cmd.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/station_cmd.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -43,41 +43,30 @@ #include "cargotype.h" #include "strings.h" -/** - * Called if a new block is added to the station-pool - */ -static void StationPoolNewBlock(uint start_item) -{ - /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. - * TODO - This is just a temporary stage, this will be removed. */ - for (Station *st = GetStation(start_item); st != NULL; st = (st->index + 1U < GetStationPoolSize()) ? GetStation(st->index + 1U) : NULL) st->index = start_item++; -} - -static void StationPoolCleanBlock(uint start_item, uint end_item) -{ - for (uint i = start_item; i <= end_item; i++) { - Station *st = GetStation(i); - if (st->IsValid()) st->~Station(); - } -} +DEFINE_OLD_POOL_GENERIC(Station, Station) +DEFINE_OLD_POOL_GENERIC(RoadStop, RoadStop) + /** - * Called if a new block is added to the roadstop-pool + * Check whether the given tile is a hangar. + * @param t the tile to of whether it is a hangar. + * @pre IsTileType(t, MP_STATION) + * @return true if and only if the tile is a hangar. */ -static void RoadStopPoolNewBlock(uint start_item) +bool IsHangar(TileIndex t) { - /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. - * TODO - This is just a temporary stage, this will be removed. */ - for (RoadStop *rs = GetRoadStop(start_item); rs != NULL; rs = (rs->index + 1U < GetRoadStopPoolSize()) ? GetRoadStop(rs->index + 1U) : NULL) { - rs->xy = INVALID_TILE; - rs->index = start_item++; + assert(IsTileType(t, MP_STATION)); + + const Station *st = GetStationByTile(t); + const AirportFTAClass *apc = st->Airport(); + + for (uint i = 0; i < apc->nof_depots; i++) { + if (st->airport_tile + ToTileIndexDiff(apc->airport_depots[i]) == t) return true; } + + return false; } -DEFINE_OLD_POOL(Station, Station, StationPoolNewBlock, StationPoolCleanBlock) -DEFINE_OLD_POOL(RoadStop, RoadStop, RoadStopPoolNewBlock, NULL) - - RoadStop* GetRoadStopByTile(TileIndex tile, RoadStop::Type type) { const Station* st = GetStationByTile(tile); @@ -137,6 +126,12 @@ return (closest_station == INVALID_STATION) ? NULL : GetStation(closest_station); } +/** + * Function to check whether the given tile matches some criterion. + * @param tile the tile to check + * @return true if it matches, false otherwise + */ +typedef bool (*CMSAMatcher)(TileIndex tile); /** * Counts the numbers of tiles matching a specific type in the area around @@ -146,39 +141,85 @@ * in all other cases this parameter is ignored * @return the result the noumber of matching tiles around */ -static int CountMapSquareAround(TileIndex tile, TileType type, IndustryType industry) +static int CountMapSquareAround(TileIndex tile, CMSAMatcher cmp) { int num = 0; for (int dx = -3; dx <= 3; dx++) { for (int dy = -3; dy <= 3; dy++) { - TileIndex cur_tile = TILE_MASK(tile + TileDiffXY(dx, dy)); - - if (IsTileType(cur_tile, type)) { - switch (type) { - case MP_INDUSTRY: - if (GetIndustryType(cur_tile) == industry) - num++; - break; - - case MP_WATER: - if (!IsWater(cur_tile)) - break; - /* FALL THROUGH WHEN WATER TILE */ - case MP_TREES: - num++; - break; - - default: - break; - } - } + if (cmp(TILE_MASK(tile + TileDiffXY(dx, dy)))) num++; } } return num; } +/** + * Check whether the tile is a mine. + * @param tile the tile to investigate. + * @return true if and only if the tile is a mine + */ +static bool CMSAMine(TileIndex tile) +{ + /* No industry */ + if (!IsTileType(tile, MP_INDUSTRY)) return false; + + const IndustrySpec *indsp = GetIndustrySpec(GetIndustryByTile(tile)->type); + + /* No extractive industry */ + if ((indsp->life_type & INDUSTRYLIFE_EXTRACTIVE) == 0) return false; + + for (uint i = 0; i < lengthof(indsp->produced_cargo); i++) { + /* The industry extracts something non-liquid, i.e. no oil or plastic, so it is a mine */ + if (indsp->produced_cargo[i] != CT_INVALID && (GetCargo(indsp->produced_cargo[i])->classes & CC_LIQUID) == 0) return true; + } + + return false; +} + +/** + * Check whether the tile is water. + * @param tile the tile to investigate. + * @return true if and only if the tile is a mine + */ +static bool CMSAWater(TileIndex tile) +{ + return IsTileType(tile, MP_WATER) && IsWater(tile); +} + +/** + * Check whether the tile is a tree. + * @param tile the tile to investigate. + * @return true if and only if the tile is a mine + */ +static bool CMSATree(TileIndex tile) +{ + return IsTileType(tile, MP_TREES); +} + +/** + * Check whether the tile is a forest. + * @param tile the tile to investigate. + * @return true if and only if the tile is a mine + */ +static bool CMSAForest(TileIndex tile) +{ + /* No industry */ + if (!IsTileType(tile, MP_INDUSTRY)) return false; + + const IndustrySpec *indsp = GetIndustrySpec(GetIndustryByTile(tile)->type); + + /* No extractive industry */ + if ((indsp->life_type & INDUSTRYLIFE_ORGANIC) == 0) return false; + + for (uint i = 0; i < lengthof(indsp->produced_cargo); i++) { + /* The industry produces wood. */ + if (indsp->produced_cargo[i] != CT_INVALID && GetCargo(indsp->produced_cargo[i])->label == 'WOOD') return true; + } + + return false; +} + #define M(x) ((x) - STR_SV_STNAME) static bool GenerateStationName(Station *st, TileIndex tile, int flag) @@ -221,11 +262,7 @@ /* check mine? */ if (HASBIT(free_names, M(STR_SV_STNAME_MINES))) { - if (CountMapSquareAround(tile, MP_INDUSTRY, IT_COAL_MINE) >= 2 || - CountMapSquareAround(tile, MP_INDUSTRY, IT_IRON_MINE) >= 2 || - CountMapSquareAround(tile, MP_INDUSTRY, IT_COPPER_MINE) >= 2 || - CountMapSquareAround(tile, MP_INDUSTRY, IT_GOLD_MINE) >= 2 || - CountMapSquareAround(tile, MP_INDUSTRY, IT_DIAMOND_MINE) >= 2) { + if (CountMapSquareAround(tile, CMSAMine) >= 2) { found = M(STR_SV_STNAME_MINES); goto done; } @@ -243,15 +280,15 @@ /* Check lakeside */ if (HASBIT(free_names, M(STR_SV_STNAME_LAKESIDE)) && DistanceFromEdge(tile) < 20 && - CountMapSquareAround(tile, MP_WATER, 0) >= 5) { + CountMapSquareAround(tile, CMSAWater) >= 5) { found = M(STR_SV_STNAME_LAKESIDE); goto done; } /* Check woods */ if (HASBIT(free_names, M(STR_SV_STNAME_WOODS)) && ( - CountMapSquareAround(tile, MP_TREES, 0) >= 8 || - CountMapSquareAround(tile, MP_INDUSTRY, IT_FOREST) >= 2) + CountMapSquareAround(tile, CMSATree) >= 8 || + CountMapSquareAround(tile, CMSAForest) >= 2) ) { found = _opt.landscape == LT_TROPIC ? M(STR_SV_STNAME_FOREST) : M(STR_SV_STNAME_WOODS); @@ -890,7 +927,7 @@ } else { /* allocate and initialize new station */ st = new Station(tile_org); - if (st == NULL) return CMD_ERROR; + if (st == NULL) return_cmd_error(STR_3008_TOO_MANY_STATIONS_LOADING); /* ensure that in case of error (or no DC_EXEC) the station gets deleted upon return */ st_auto_delete = st; @@ -982,7 +1019,7 @@ RebuildStationLists(); InvalidateWindow(WC_STATION_LIST, st->owner); /* success, so don't delete the new station */ - st_auto_delete.Release(); + st_auto_delete.Detach(); } return cost; @@ -1244,7 +1281,7 @@ { bool type = HASBIT(p2, 0); bool is_drive_through = HASBIT(p2, 1); - bool build_over_road = is_drive_through && IsTileType(tile, MP_STREET) && GetRoadTileType(tile) == ROAD_TILE_NORMAL; + bool build_over_road = is_drive_through && IsTileType(tile, MP_ROAD) && GetRoadTileType(tile) == ROAD_TILE_NORMAL; bool town_owned_road = build_over_road && IsTileOwner(tile, OWNER_TOWN); RoadTypes rts = (RoadTypes)GB(p2, 2, 3); @@ -1321,7 +1358,7 @@ } else { /* allocate and initialize new station */ st = new Station(tile); - if (st == NULL) return CMD_ERROR; + if (st == NULL) return_cmd_error(STR_3008_TOO_MANY_STATIONS_LOADING); /* ensure that in case of error (or no DC_EXEC) the new station gets deleted upon return */ st_auto_delete = st; @@ -1361,8 +1398,8 @@ RebuildStationLists(); InvalidateWindow(WC_STATION_LIST, st->owner); /* success, so don't delete the new station and the new road stop */ - st_auto_delete.Release(); - rs_auto_delete.Release(); + st_auto_delete.Detach(); + rs_auto_delete.Detach(); } return cost; } @@ -1615,7 +1652,7 @@ /* allocate and initialize new station */ st = new Station(tile); - if (st == NULL) return CMD_ERROR; + if (st == NULL) return_cmd_error(STR_3008_TOO_MANY_STATIONS_LOADING); /* ensure that in case of error (or no DC_EXEC) the station gets deleted upon return */ st_auto_delete = st; @@ -1668,7 +1705,7 @@ RebuildStationLists(); InvalidateWindow(WC_STATION_LIST, st->owner); /* success, so don't delete the new station */ - st_auto_delete.Release(); + st_auto_delete.Detach(); } return cost; @@ -1737,7 +1774,7 @@ /* allocate and initialize new station */ Station *st = new Station(tile); - if (st == NULL) return CMD_ERROR; + if (st == NULL) return_cmd_error(STR_3008_TOO_MANY_STATIONS_LOADING); /* ensure that in case of error (or no DC_EXEC) the station gets deleted upon return */ AutoPtrT st_auto_delete(st); @@ -1764,7 +1801,7 @@ RebuildStationLists(); InvalidateWindow(WC_STATION_LIST, st->owner); /* success, so don't delete the new station */ - st_auto_delete.Release(); + st_auto_delete.Detach(); } return CommandCost(_price.build_dock); @@ -1902,7 +1939,7 @@ } else { /* allocate and initialize new station */ st = new Station(tile); - if (st == NULL) return CMD_ERROR; + if (st == NULL) return_cmd_error(STR_3008_TOO_MANY_STATIONS_LOADING); /* ensure that in case of error (or no DC_EXEC) the station gets deleted upon return */ st_auto_delete = st; @@ -1931,7 +1968,7 @@ RebuildStationLists(); InvalidateWindow(WC_STATION_LIST, st->owner); /* success, so don't delete the new station */ - st_auto_delete.Release(); + st_auto_delete.Detach(); } return CommandCost(_price.build_dock); } @@ -2003,7 +2040,7 @@ // don't show foundation for docks if (ti->tileh != SLOPE_FLAT && !IsDock(ti->tile)) - DrawFoundation(ti, ti->tileh); + DrawFoundation(ti, FOUNDATION_LEVELED); if (IsCustomStationSpecIndex(ti->tile)) { // look for customization @@ -2063,10 +2100,7 @@ } SpriteID pal; - if (HASBIT(_transparent_opt, TO_BUILDINGS)) { - SETBIT(image, PALETTE_MODIFIER_TRANSPARENT); - pal = PALETTE_TO_TRANSPARENT; - } else if (HASBIT(image, PALETTE_MODIFIER_COLOR)) { + if (!HASBIT(_transparent_opt, TO_BUILDINGS) && HASBIT(image, PALETTE_MODIFIER_COLOR)) { pal = palette; } else { pal = dtss->pal; @@ -2077,7 +2111,8 @@ image, pal, ti->x + dtss->delta_x, ti->y + dtss->delta_y, dtss->size_x, dtss->size_y, - dtss->size_z, ti->z + dtss->delta_z + dtss->size_z, ti->z + dtss->delta_z, + HASBIT(_transparent_opt, TO_BUILDINGS) ); } else { AddChildSpriteScreen(image, pal, dtss->delta_x, dtss->delta_y); @@ -2110,9 +2145,9 @@ return GetTileMaxZ(tile); } -static Slope GetSlopeTileh_Station(TileIndex tile, Slope tileh) +static Foundation GetFoundation_Station(TileIndex tile, Slope tileh) { - return SLOPE_FLAT; + return FlatteningFoundation(tileh); } static void GetAcceptedCargo_Station(TileIndex tile, AcceptedCargo ac) @@ -2814,12 +2849,12 @@ void InitializeStations() { /* Clean the station pool and create 1 block in it */ - CleanPool(&_Station_pool); - AddBlockToPool(&_Station_pool); + _Station_pool.CleanPool(); + _Station_pool.AddBlockToPool(); /* Clean the roadstop pool and create 1 block in it */ - CleanPool(&_RoadStop_pool); - AddBlockToPool(&_RoadStop_pool); + _RoadStop_pool.CleanPool(); + _RoadStop_pool.AddBlockToPool(); _station_tick_ctr = 0; @@ -2855,7 +2890,7 @@ ChangeTileOwner_Station, /* change_tile_owner_clear */ NULL, /* get_produced_cargo_proc */ VehicleEnter_Station, /* vehicle_enter_tile_proc */ - GetSlopeTileh_Station, /* get_slope_tileh_proc */ + GetFoundation_Station, /* get_foundation_proc */ }; static const SaveLoad _roadstop_desc[] = { diff -r 31fcaa5375a1 -r e72987579514 src/station_gui.cpp --- a/src/station_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/station_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -569,7 +569,7 @@ }; static const WindowDesc _player_stations_desc = { - WDP_AUTO, WDP_AUTO, 358, 162, + WDP_AUTO, WDP_AUTO, 358, 162, 358, 162, WC_STATION_LIST, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON | WDF_RESIZABLE, _player_stations_widgets, @@ -895,7 +895,7 @@ static const WindowDesc _station_view_desc = { - WDP_AUTO, WDP_AUTO, 249, 110, + WDP_AUTO, WDP_AUTO, 249, 110, 249, 110, WC_STATION_VIEW, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON, _station_view_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/station_map.h --- a/src/station_map.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/station_map.h Fri Aug 03 22:09:42 2007 +0000 @@ -17,7 +17,7 @@ return (StationID)_m[t].m2; } -static inline Station* GetStationByTile(TileIndex t) +static inline Station *GetStationByTile(TileIndex t) { return GetStation(GetStationIndex(t)); } @@ -42,15 +42,6 @@ GFX_WINDSACK_INTERCON_LAST = 143, }; -enum HangarTile { - HANGAR_TILE_0 = 24, - HANGAR_TILE_1 = 57, - HANGAR_TILE_2 = 62, - HANGAR_TILE_3 = 105, // added for west facing hangar - HANGAR_TILE_4 = 106, // added for north facing hangar - HANGAR_TILE_5 = 107 // added for east facing hangar -}; - static inline StationType GetStationType(TileIndex t) { return (StationType)GB(_m[t].m6, 3, 3); @@ -89,17 +80,7 @@ return GetStationType(t) == STATION_AIRPORT; } -static inline bool IsHangar(TileIndex t) -{ - StationGfx gfx = GetStationGfx(t); - return IsAirport(t) && ( - gfx == HANGAR_TILE_0 || - gfx == HANGAR_TILE_1 || - gfx == HANGAR_TILE_2 || - gfx == HANGAR_TILE_3 || - gfx == HANGAR_TILE_4 || - gfx == HANGAR_TILE_5); -} +bool IsHangar(TileIndex t); static inline bool IsTruckStop(TileIndex t) { diff -r 31fcaa5375a1 -r e72987579514 src/strgen/strgen.cpp --- a/src/strgen/strgen.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/strgen/strgen.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -1019,19 +1019,20 @@ out = fopen("tmp.xxx", "w"); if (out == NULL) fatal("can't open tmp.xxx"); - fprintf(out, "enum StringIdEnum {"); + fprintf(out, "/* This file is automatically generated. Do not modify */\n\n"); + fprintf(out, "#ifndef TABLE_STRINGS_H\n"); + fprintf(out, "#define TABLE_STRINGS_H\n"); lastgrp = 0; for (i = 0; i != lengthof(_strings); i++) { if (_strings[i] != NULL) { - fprintf(out, next == i ? "\t%s,\n" : "\n\t%s = 0x%X,\n", _strings[i]->name, i); + if (next != i) fprintf(out, "\n"); + fprintf(out, "static const StringID %s = 0x%X;\n", _strings[i]->name, i); next = i + 1; } } - fprintf(out, "};\n"); - fprintf(out, "\nenum {\n" "\tLANGUAGE_PACK_IDENT = 0x474E414C, // Big Endian value for 'LANG' (LE is 0x 4C 41 4E 47)\n" @@ -1039,6 +1040,8 @@ "};\n", (uint)_hash ); + fprintf(out, "\n#endif /* TABLE_STRINGS_H */\n"); + fclose(out); if (CompareFiles("tmp.xxx", filename)) { diff -r 31fcaa5375a1 -r e72987579514 src/string.h --- a/src/string.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/string.h Fri Aug 03 22:09:42 2007 +0000 @@ -24,10 +24,10 @@ * if NULL no boundary check is performed * @return a pointer to the terminating \0 in the destination buffer */ -char* strecat(char* dst, const char* src, const char* last); -char* strecpy(char* dst, const char* src, const char* last); +char *strecat(char *dst, const char *src, const char *last); +char *strecpy(char *dst, const char *src, const char *last); -char* CDECL str_fmt(const char* str, ...); +char *CDECL str_fmt(const char *str, ...); /** Scans the string for valid characters and if it finds invalid ones, * replaces them with a question mark '?' */ @@ -49,7 +49,7 @@ void strtolower(char *str); -static inline bool StrEmpty(const char* s) { return s[0] == '\0'; } +static inline bool StrEmpty(const char *s) { return s[0] == '\0'; } /** Get the length of a string, within a limited buffer */ diff -r 31fcaa5375a1 -r e72987579514 src/strings.cpp --- a/src/strings.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/strings.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -224,27 +224,14 @@ memmove(_decode_parameters + amount, _decode_parameters, sizeof(_decode_parameters) - amount * sizeof(uint64)); } -static const uint32 _divisor_table[] = { - 1000000000, - 100000000, - 10000000, - 1000000, - - 100000, - 10000, - 1000, - 100, - 10, - 1 -}; - // TODO -static char *FormatCommaNumber(char *buff, int32 number, const char* last) +static char *FormatCommaNumber(char *buff, int64 number, const char *last) { - uint32 quot,divisor; + uint64 divisor = 10000000000000000000ULL; + uint64 quot; int i; - uint32 tot; - uint32 num; + uint64 tot; + uint64 num; if (number < 0) { *buff++ = '-'; @@ -254,17 +241,18 @@ num = number; tot = 0; - for (i = 0; i != 10; i++) { - divisor = _divisor_table[i]; + for (i = 0; i < 20; i++) { quot = 0; if (num >= divisor) { - quot = num / _divisor_table[i]; - num = num % _divisor_table[i]; + quot = num / divisor; + num = num % divisor; } - if (tot |= quot || i == 9) { + if (tot |= quot || i == 19) { *buff++ = '0' + quot; - if (i == 0 || i == 3 || i == 6) *buff++ = ','; + if ((i % 3) == 1 && i != 19) *buff++ = ','; } + + divisor /= 10; } *buff = '\0'; @@ -273,12 +261,13 @@ } // TODO -static char *FormatNoCommaNumber(char *buff, int32 number, const char* last) +static char *FormatNoCommaNumber(char *buff, int64 number, const char *last) { - uint32 quot,divisor; + uint64 divisor = 10000000000000000000ULL; + uint64 quot; int i; - uint32 tot; - uint32 num; + uint64 tot; + uint64 num; if (number < 0) { buff = strecpy(buff, "-", last); @@ -288,16 +277,17 @@ num = number; tot = 0; - for (i = 0; i != 10; i++) { - divisor = _divisor_table[i]; + for (i = 0; i < 20; i++) { quot = 0; if (num >= divisor) { - quot = num / _divisor_table[i]; - num = num % _divisor_table[i]; + quot = num / divisor; + num = num % divisor; } - if (tot |= quot || i == 9) { + if (tot |= quot || i == 19) { *buff++ = '0' + quot; } + + divisor /= 10; } *buff = '\0'; @@ -396,10 +386,11 @@ return buff; } -static int DeterminePluralForm(int32 n) +static int DeterminePluralForm(int64 cnt) { + uint64 n = cnt; /* The absolute value determines plurality */ - if (n < 0) n = -n; + if (cnt < 0) n = -cnt; switch (_langpack->plural_form) { /* Two forms, singular used for one only @@ -665,7 +656,7 @@ int64 args[2]; /* industry not valid anymore? */ - if (!IsValidIndustry(i)) break; + if (!i->IsValid()) break; /* First print the town name and the industry type name * The string STR_INDUSTRY_PATTERN controls the formatting */ @@ -705,7 +696,7 @@ * 8bit - cargo type * 16-bit - cargo count */ CargoID cargo = GetInt32(&argv); - StringID cargo_str = (cargo == CT_INVALID) ? (StringID)STR_8838_N_A : GetCargo(cargo)->quantifier; + StringID cargo_str = (cargo == CT_INVALID) ? STR_8838_N_A : GetCargo(cargo)->quantifier; buff = GetStringWithArgs(buff, cargo_str, argv++, last); break; } @@ -776,7 +767,7 @@ } case SCC_COMMA: // {COMMA} - buff = FormatCommaNumber(buff, GetInt32(&argv), last); + buff = FormatCommaNumber(buff, GetInt64(&argv), last); break; case SCC_ARG_INDEX: // Move argument pointer @@ -784,7 +775,7 @@ break; case SCC_PLURAL_LIST: { // {P} - int32 v = argv_orig[(byte)*str++]; // contains the number that determines plural + int64 v = argv_orig[(byte)*str++]; // contains the number that determines plural int len; str = ParseStringChoice(str, DeterminePluralForm(v), buff, &len); buff += len; @@ -792,7 +783,7 @@ } case SCC_NUM: // {NUM} - buff = FormatNoCommaNumber(buff, GetInt32(&argv), last); + buff = FormatNoCommaNumber(buff, GetInt64(&argv), last); break; case SCC_CURRENCY: // {CURRENCY} @@ -833,7 +824,7 @@ const Town* t = GetTown(GetInt32(&argv)); int64 temp[1]; - assert(IsValidTown(t)); + assert(t->IsValid()); temp[0] = t->townnameparts; uint32 grfid = t->townnamegrfid; @@ -858,10 +849,10 @@ const Group *g = GetGroup(GetInt32(&argv)); int64 args[1]; - assert(IsValidGroup(g)); + assert(g->IsValid()); args[0] = g->index; - buff = GetStringWithArgs(buff, IsCustomName(g->string_id) ? g->string_id : (StringID)STR_GROUP_NAME_FORMAT, args, last); + buff = GetStringWithArgs(buff, IsCustomName(g->string_id) ? g->string_id : STR_GROUP_NAME_FORMAT, args, last); break; } @@ -1226,6 +1217,8 @@ return true; } +/* Win32 implementation in win32.cpp. */ +#ifndef WIN32 /** Determine the current charset based on the environment * First check some default values, after this one we passed ourselves * and if none exist return the value for $LANG @@ -1249,6 +1242,7 @@ return getenv("LANG"); } +#endif /* ifndef WIN32 */ static int CDECL LanguageCompareFunc(const void *a, const void *b) { diff -r 31fcaa5375a1 -r e72987579514 src/strings.h --- a/src/strings.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/strings.h Fri Aug 03 22:09:42 2007 +0000 @@ -6,7 +6,7 @@ #define STRINGS_H char *InlineString(char *buf, StringID string); -char *GetString(char *buffr, StringID string, const char* last); +char *GetString(char *buffr, StringID string, const char *last); extern char _userstring[128]; diff -r 31fcaa5375a1 -r e72987579514 src/subsidy_gui.cpp --- a/src/subsidy_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/subsidy_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -166,7 +166,7 @@ }; static const WindowDesc _subsidies_list_desc = { - WDP_AUTO, WDP_AUTO, 630, 127, + WDP_AUTO, WDP_AUTO, 630, 127, 630, 127, WC_SUBSIDIES_LIST, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON, _subsidies_list_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/table/ai_rail.h --- a/src/table/ai_rail.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/table/ai_rail.h Fri Aug 03 22:09:42 2007 +0000 @@ -2,7 +2,7 @@ struct AiDefaultBlockData { byte mode; - byte attr; + DiagDirection attr; TileIndexDiffC tileoffs; }; @@ -22,11 +22,11 @@ #define MKHDR(a, b, c, d, e) a, b, c, d, e, -#define MKDEPOT(a, b, c) {0, a, {b, c}} -#define MKSTATION(a, b, c) {1, a, {b, c}} -#define MKRAIL(a, b, c) {2, a, {b, c}} -#define MKCLRRAIL(a, b, c) {3, a, {b, c}} -#define MKEND {4, 0, {0, 0}} +#define MKDEPOT(a, b, c) {0, (DiagDirection)a, {b, c}} +#define MKSTATION(a, b, c) {1, (DiagDirection)a, {b, c}} +#define MKRAIL(a, b, c) {2, (DiagDirection)a, {b, c}} +#define MKCLRRAIL(a, b, c) {3, (DiagDirection)a, {b, c}} +#define MKEND {4, (DiagDirection)0, {0, 0}} static const AiDefaultBlockData _raildata_ai_0_data[] = { MKDEPOT(2, -1, 1), @@ -555,38 +555,50 @@ NULL }; -#define MKAIR(a, b, c) {0, a, {b, c}} +#undef MKHDR +#undef MKDEPOT +#undef MKSTATION +#undef MKRAIL +#undef MKCLRRAIL +#undef MKEND + + +#define MKAIR(a, b, c) {0, (DiagDirection)a, {b, c}} +#define MKEND() {1, (DiagDirection)0, {0, 0}} static const AiDefaultBlockData _airportdata_ai_0[] = { MKAIR(1, 0, 0), - {1, 0, {0, 0}}, + MKEND(), }; static const AiDefaultBlockData _airportdata_ai_1[] = { MKAIR(0, 0, 0), - {1, 0, {0, 0}} + MKEND(), }; static const AiDefaultBlockData _airportdata_ai_3[] = { MKAIR(3, 0, 0), - {1, 0, {0, 0}}, + MKEND(), }; static const AiDefaultBlockData _airportdata_ai_4[] = { MKAIR(4, 0, 0), - {1, 0, {0, 0}}, + MKEND(), }; static const AiDefaultBlockData _airportdata_ai_5[] = { MKAIR(5, 0, 0), - {1, 0, {0, 0}}, + MKEND(), }; static const AiDefaultBlockData _airportdata_ai_7[] = { MKAIR(7, 0, 0), - {1, 0, {0, 0}} + MKEND(), }; +#undef MKAIR +#undef MDEND + static const AiDefaultBlockData * const _airport_default_block_data[] = { _airportdata_ai_7, // intercontinental airport _airportdata_ai_4, // international airport diff -r 31fcaa5375a1 -r e72987579514 src/table/build_industry.h --- a/src/table/build_industry.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/table/build_industry.h Fri Aug 03 22:09:42 2007 +0000 @@ -1091,6 +1091,47 @@ /** Array with... hem... a sound of toyland */ static const uint8 _plastic_mine_sounds[] = { SND_33_PLASTIC_MINE }; +enum { + IT_COAL_MINE = 0, + IT_POWER_STATION = 1, + IT_SAWMILL = 2, + IT_FOREST = 3, + IT_OIL_REFINERY = 4, + IT_OIL_RIG = 5, + IT_FACTORY = 6, + IT_PRINTING_WORKS = 7, + IT_STEEL_MILL = 8, + IT_FARM = 9, + IT_COPPER_MINE = 10, + IT_OIL_WELL = 11, + IT_BANK_TEMP = 12, + IT_FOOD_PROCESS = 13, + IT_PAPER_MILL = 14, + IT_GOLD_MINE = 15, + IT_BANK_TROPIC_ARCTIC = 16, + IT_DIAMOND_MINE = 17, + IT_IRON_MINE = 18, + IT_FRUIT_PLANTATION = 19, + IT_RUBBER_PLANTATION = 20, + IT_WATER_SUPPLY = 21, + IT_WATER_TOWER = 22, + IT_FACTORY_2 = 23, + IT_FARM_2 = 24, + IT_LUMBER_MILL = 25, + IT_COTTON_CANDY = 26, + IT_CANDY_FACTORY = 27, + IT_BATTERY_FARM = 28, + IT_COLA_WELLS = 29, + IT_TOY_SHOP = 30, + IT_TOY_FACTORY = 31, + IT_PLASTIC_FOUNTAINS = 32, + IT_FIZZY_DRINK_FACTORY = 33, + IT_BUBBLE_GENERATOR = 34, + IT_TOFFEE_QUARRY = 35, + IT_SUGAR_MINE = 36, + IT_END, +}; + /** * Writes the properties of an industry into the IndustrySpec struct. * @param tbl tile table @@ -1532,7 +1573,7 @@ * @param a2 next frame of animation * @param a3 chooses between animation or construction state */ -#define MT(ca1, c1, ca2, c2, ca3, c3, sl, a1, a2, a3) {{c1, c2, c3}, {ca1, ca2, ca3}, sl, a1, a2, a3, 0, 0xFFFF, 2, 0, 0, true, {0, 0, NULL, NULL, 0}} +#define MT(ca1, c1, ca2, c2, ca3, c3, sl, a1, a2, a3) {{c1, c2, c3}, {ca1, ca2, ca3}, sl, a1, a2, a3, 0, 0xFFFF, 2, 0, 0, true, {0, 0, NULL, NULL, INVALID_INDUSTRYTILE}} static const IndustryTileSpec _origin_industry_tile_specs[NEW_INDUSTRYTILEOFFSET] = { /* Coal Mine */ MT(0, CT_INVALID, 0, CT_INVALID, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), diff -r 31fcaa5375a1 -r e72987579514 src/table/sprites.h --- a/src/table/sprites.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/table/sprites.h Fri Aug 03 22:09:42 2007 +0000 @@ -50,7 +50,13 @@ OPENTTD_SPRITES_COUNT = 112, // number of gfx-sprites in openttd.grf SPR_SIGNALS_BASE = 4896, SPR_CANALS_BASE = SPR_SIGNALS_BASE + 486, - SPR_SLOPES_BASE = SPR_CANALS_BASE + 70, + + SPR_SLOPES_BASE = SPR_CANALS_BASE + 70, + SPR_SLOPES_INCLINED_OFFSET = 15, + SPR_SLOPES_VIRTUAL_BASE = SPR_SLOPES_BASE - SPR_SLOPES_INCLINED_OFFSET, // The original foundations (see SPR_FOUNDATION_BASE below) are mapped before the additional foundations. + SPR_SLOPES_NO_FOUNDATION_NW_OFFSET = 22, // no wall on the NW edge of the tile. + SPR_SLOPES_NO_FOUNDATION_NE_OFFSET = 44, // no wall on the NE edge of the tile. + SPR_AUTORAIL_BASE = SPR_SLOPES_BASE + 78, SPR_ELRAIL_BASE = SPR_AUTORAIL_BASE + 55, SPR_2CCMAP_BASE = SPR_ELRAIL_BASE + 53, @@ -303,6 +309,16 @@ OFFSET_TILEH_13 = 19, OFFSET_TILEH_14 = 16, + /* Track fences */ + SPR_TRACK_FENCE_FLAT_X = 1301, + SPR_TRACK_FENCE_FLAT_Y = 1302, + SPR_TRACK_FENCE_FLAT_VERT = 1303, + SPR_TRACK_FENCE_FLAT_HORZ = 1304, + SPR_TRACK_FENCE_SLOPE_SW = 1305, + SPR_TRACK_FENCE_SLOPE_SE = 1306, + SPR_TRACK_FENCE_SLOPE_NE = 1307, + SPR_TRACK_FENCE_SLOPE_NW = 1308, + /* Elrail stuff */ /* Wires. First identifier is the direction of the track, second is the required placement of the pylon. * "short" denotes a wire that requires a pylon on each end. Third identifier is the direction of the slope diff -r 31fcaa5375a1 -r e72987579514 src/terraform_gui.cpp --- a/src/terraform_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/terraform_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -278,7 +278,7 @@ }; static const WindowDesc _terraform_desc = { - WDP_ALIGN_TBR, 22 + 36, 158, 36, + WDP_ALIGN_TBR, 22 + 36, 158, 36, 158, 36, WC_SCEN_LAND_GEN, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON, _terraform_widgets, @@ -295,5 +295,7 @@ */ w->top = 22; link->left = w->left - link->width; + + SetWindowDirty(link); } } diff -r 31fcaa5375a1 -r e72987579514 src/thread.h --- a/src/thread.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/thread.h Fri Aug 03 22:09:42 2007 +0000 @@ -7,10 +7,10 @@ struct OTTDThread; -typedef void* (*OTTDThreadFunc)(void*); +typedef void * (*OTTDThreadFunc)(void*); -OTTDThread* OTTDCreateThread(OTTDThreadFunc, void*); -void* OTTDJoinThread(OTTDThread*); +OTTDThread *OTTDCreateThread(OTTDThreadFunc, void*); +void *OTTDJoinThread(OTTDThread*); void OTTDExitThread(); diff -r 31fcaa5375a1 -r e72987579514 src/tile.cpp --- a/src/tile.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/tile.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -23,11 +23,11 @@ min = a = TileHeight(tile); b = TileHeight(tile + TileDiffXY(1, 0)); - if (min >= b) min = b; + if (min > b) min = b; c = TileHeight(tile + TileDiffXY(0, 1)); - if (min >= c) min = c; + if (min > c) min = c; d = TileHeight(tile + TileDiffXY(1, 1)); - if (min >= d) min = d; + if (min > d) min = d; r = SLOPE_FLAT; if ((a -= min) != 0) r += (--a << 4) + SLOPE_N; @@ -42,24 +42,25 @@ uint GetTileZ(TileIndex tile) { - uint h; - GetTileSlope(tile, &h); - return h; + if (TileX(tile) == MapMaxX() || TileY(tile) == MapMaxY()) return 0; + + uint h = TileHeight(tile); + h = min(h, TileHeight(tile + TileDiffXY(1, 0))); + h = min(h, TileHeight(tile + TileDiffXY(0, 1))); + h = min(h, TileHeight(tile + TileDiffXY(1, 1))); + + return h * TILE_HEIGHT; } uint GetTileMaxZ(TileIndex t) { - uint max; - uint h; + if (TileX(t) == MapMaxX() || TileY(t) == MapMaxY()) return 0; - h = TileHeight(t); - max = h; - h = TileHeight(t + TileDiffXY(1, 0)); - if (h > max) max = h; - h = TileHeight(t + TileDiffXY(0, 1)); - if (h > max) max = h; - h = TileHeight(t + TileDiffXY(1, 1)); - if (h > max) max = h; - return max * 8; + uint h = TileHeight(t); + h = max(h, TileHeight(t + TileDiffXY(1, 0))); + h = max(h, TileHeight(t + TileDiffXY(0, 1))); + h = max(h, TileHeight(t + TileDiffXY(1, 1))); + + return h * TILE_HEIGHT; } diff -r 31fcaa5375a1 -r e72987579514 src/tile.h --- a/src/tile.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/tile.h Fri Aug 03 22:09:42 2007 +0000 @@ -10,54 +10,121 @@ #include "map.h" #include "slope.h" +/** Maximum allowed tile height */ +#define MAX_TILE_HEIGHT 15 + +/** Maximum allowed snowline height */ +#define MAX_SNOWLINE_HEIGHT (MAX_TILE_HEIGHT - 2) + +/** + * The different type of a tile. + * + * Each tile belongs to one type, according whatever is build on it. + * + * @note A railway with a crossing street is marked as MP_ROAD. + */ enum TileType { - MP_CLEAR, - MP_RAILWAY, - MP_STREET, - MP_HOUSE, - MP_TREES, - MP_STATION, - MP_WATER, - MP_VOID, // invisible tiles at the SW and SE border - MP_INDUSTRY, - MP_TUNNELBRIDGE, - MP_UNMOVABLE, + MP_CLEAR, ///< A tile without any structures, i.e. grass, rocks, farm fields etc. + MP_RAILWAY, ///< A railway + MP_ROAD, ///< A tile with road (or tram tracks) + MP_HOUSE, ///< A house by a town + MP_TREES, ///< Tile got trees + MP_STATION, ///< A tile of a station + MP_WATER, ///< Water tile + MP_VOID, ///< Invisible tiles at the SW and SE border + MP_INDUSTRY, ///< Part of an industry + MP_TUNNELBRIDGE, ///< Tunnel entry/exit and bridge heads + MP_UNMOVABLE, ///< Contains an object with cannot be removed like transmitters }; +/** + * Additional infos of a tile on a tropic game. + * + * Each non-water tile in a tropic game is either a rainforest tile or a + * desert one. + */ enum TropicZone { - TROPICZONE_INVALID = 0, - TROPICZONE_DESERT = 1, - TROPICZONE_RAINFOREST = 2, + TROPICZONE_INVALID = 0, ///< Invalid tropiczone-type + TROPICZONE_DESERT = 1, ///< Tile is desert + TROPICZONE_RAINFOREST = 2, ///< Rainforest tile }; Slope GetTileSlope(TileIndex tile, uint *h); uint GetTileZ(TileIndex tile); uint GetTileMaxZ(TileIndex tile); +/** + * Returns the height of a tile + * + * This function returns the height of the northern corner of a tile. + * This is saved in the global map-array. It does not take affect by + * any slope-data of the tile. + * + * @param tile The tile to get the height from + * @return the height of the tile + * @pre tile < MapSize() + */ static inline uint TileHeight(TileIndex tile) { assert(tile < MapSize()); return GB(_m[tile].type_height, 0, 4); } +/** + * Sets the height of a tile. + * + * This function sets the height of the northern corner of a tile. + * + * @param tile The tile to change the height + * @param height The new height value of the tile + * @pre tile < MapSize() + * @pre heigth <= MAX_TILE_HEIGHT + */ static inline void SetTileHeight(TileIndex tile, uint height) { assert(tile < MapSize()); - assert(height < 16); + assert(height <= MAX_TILE_HEIGHT); SB(_m[tile].type_height, 0, 4, height); } +/** + * Returns the height of a tile in pixels. + * + * This function returns the height of the northern corner of a tile in pixels. + * + * @param tile The tile to get the height + * @return The height of the tile in pixel + */ static inline uint TilePixelHeight(TileIndex tile) { return TileHeight(tile) * TILE_HEIGHT; } +/** + * Get the tiletype of a given tile. + * + * @param tile The tile to get the TileType + * @return The tiletype of the tile + * @pre tile < MapSize() + */ static inline TileType GetTileType(TileIndex tile) { assert(tile < MapSize()); return (TileType)GB(_m[tile].type_height, 4, 4); } +/** + * Set the type of a tile + * + * This functions sets the type of a tile. If the type + * MP_VOID is selected the tile must be at the south-west or + * south-east edges of the map and vice versa. + * + * @param tile The tile to save the new type + * @param type The type to save + * @pre tile < MapSize() + * @pre type MP_VOID <=> tile is on the south-east or south-west edge. + */ static inline void SetTileType(TileIndex tile, TileType type) { assert(tile < MapSize()); @@ -67,12 +134,32 @@ SB(_m[tile].type_height, 4, 4, type); } +/** + * Checks if a tile is a give tiletype. + * + * This function checks if a tile got the given tiletype. + * + * @param tile The tile to check + * @param type The type to check agains + * @return true If the type matches agains the type of the tile + */ static inline bool IsTileType(TileIndex tile, TileType type) { return GetTileType(tile) == type; } - +/** + * Returns the owner of a tile + * + * This function returns the owner of a tile. This cannot used + * for tiles which type is one of MP_HOUSE, MP_VOID and MP_INDUSTRY + * as no player owned any of these buildings. + * + * @param tile The tile to check + * @return The owner of the tile + * @pre tile < MapSize() + * @pre The type of the tile must not be MP_HOUSE, MP_VOID and MP_INDUSTRY + */ static inline Owner GetTileOwner(TileIndex tile) { assert(tile < MapSize()); @@ -83,6 +170,17 @@ return (Owner)_m[tile].m1; } +/** + * Sets the owner of a tile + * + * This function sets the owner status of a tile. Note that you cannot + * set a owner for tiles of type MP_HOUSE, MP_VOID and MP_INDUSTRY. + * + * @param tile The tile to change the owner status. + * @param owner The new owner. + * @pre tile < MapSize() + * @pre The type of the tile must not be MP_HOUSE, MP_VOID and MP_INDUSTRY + */ static inline void SetTileOwner(TileIndex tile, Owner owner) { assert(tile < MapSize()); @@ -93,6 +191,13 @@ _m[tile].m1 = owner; } +/** + * Checks if a tile belongs to the given owner + * + * @param tile The tile to check + * @param owner The owner to check agains + * @return True if a tile belongs the the given owner + */ static inline bool IsTileOwner(TileIndex tile, Owner owner) { return GetTileOwner(tile) == owner; diff -r 31fcaa5375a1 -r e72987579514 src/timetable_gui.cpp --- a/src/timetable_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/timetable_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -96,6 +96,10 @@ SetDParam(2, STR_EMPTY); switch (order->type) { + case OT_DUMMY: + SetDParam(0, STR_INVALID_ORDER); + break; + case OT_GOTO_STATION: SetDParam(0, (order->flags & OF_NON_STOP) ? STR_880C_GO_NON_STOP_TO : STR_8806_GO_TO); SetDParam(1, order->dest); @@ -137,14 +141,8 @@ default: break; } - byte colour = (i == selected) ? 0xC : 0x10; - - if (order->type != OT_DUMMY) { - DrawString(2, y, STR_TIMETABLE_GO_TO, colour); - } else { - SetDParam(0, STR_INVALID_ORDER); - DrawString(2, y, STR_TIMETABLE_GO_TO, colour); - } + const byte colour = (i == selected) ? 0xC : 0x10; + DrawString(2, y, STR_TIMETABLE_GO_TO, colour); order_id++; @@ -164,7 +162,7 @@ string = STR_TIMETABLE_TRAVEL_FOR; } - byte colour = (i == selected) ? 0xC : 0x10; + const byte colour = (i == selected) ? 0xC : 0x10; DrawString(12, y, string, colour); if (final_order) break; @@ -316,7 +314,7 @@ }; static const WindowDesc _timetable_desc = { - WDP_AUTO, WDP_AUTO, 400, 130, + WDP_AUTO, WDP_AUTO, 400, 130, 400, 130, WC_VEHICLE_TIMETABLE, WC_VEHICLE_VIEW, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE, _timetable_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/town.h --- a/src/town.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/town.h Fri Aug 03 22:09:42 2007 +0000 @@ -75,7 +75,10 @@ uint8 class_count[HOUSE_CLASS_MAX]; }; -struct Town { +struct Town; +DECLARE_OLD_POOL(Town, Town, 3, 8000) + +struct Town : PoolItem { TileIndex xy; /* Current population of people and amount of houses. */ @@ -139,9 +142,6 @@ /* Fund road reconstruction in action? */ byte road_build_months; - /* Index in town array */ - TownID index; - /* If this is a larger town, and should grow more quickly. */ bool larger_town; @@ -150,6 +150,18 @@ /* NOSAVE: The number of each type of building in the town. */ BuildingCounts building_counts; + + /** + * Creates a new town + */ + Town(TileIndex tile = 0); + + /** Destroy the town */ + ~Town(); + + bool IsValid() const { return this->xy != 0; } + + void QuickFree(); }; struct HouseSpec { @@ -270,8 +282,6 @@ VARDEF const Town** _town_sort; -DECLARE_OLD_POOL(Town, Town, 3, 8000) - static inline HouseSpec *GetHouseSpecs(HouseID house_id) { assert(house_id < HOUSE_MAX); @@ -279,23 +289,13 @@ } /** - * Check if a Town really exists. - * @param town to inquiry - * @return true if it exists - */ -static inline bool IsValidTown(const Town* town) -{ - return town->xy != 0; -} - -/** * Check if a TownID is valid. * @param index to inquiry in the pool of town * @return true if it exists */ static inline bool IsValidTownID(TownID index) { - return index < GetTownPoolSize() && IsValidTown(GetTown(index)); + return index < GetTownPoolSize() && GetTown(index)->IsValid(); } VARDEF uint _total_towns; @@ -337,17 +337,9 @@ return GetTown(index); } -void DestroyTown(Town *t); - -static inline void DeleteTown(Town *t) -{ - DestroyTown(t); - t->xy = 0; -} - Town* CalcClosestTownFromTile(TileIndex tile, uint threshold); -#define FOR_ALL_TOWNS_FROM(t, start) for (t = GetTown(start); t != NULL; t = (t->index + 1U < GetTownPoolSize()) ? GetTown(t->index + 1U) : NULL) if (IsValidTown(t)) +#define FOR_ALL_TOWNS_FROM(t, start) for (t = GetTown(start); t != NULL; t = (t->index + 1U < GetTownPoolSize()) ? GetTown(t->index + 1U) : NULL) if (t->IsValid()) #define FOR_ALL_TOWNS(t) FOR_ALL_TOWNS_FROM(t, 0) VARDEF bool _town_sort_dirty; diff -r 31fcaa5375a1 -r e72987579514 src/town_cmd.cpp --- a/src/town_cmd.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/town_cmd.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -40,52 +40,40 @@ #include "newgrf_house.h" #include "newgrf_commons.h" #include "newgrf_townname.h" - -/** - * Called if a new block is added to the town-pool - */ -static void TownPoolNewBlock(uint start_item) -{ - Town *t; - - /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. - * TODO - This is just a temporary stage, this will be removed. */ - for (t = GetTown(start_item); t != NULL; t = (t->index + 1U < GetTownPoolSize()) ? GetTown(t->index + 1U) : NULL) t->index = start_item++; -} +#include "misc/autoptr.hpp" /* Initialize the town-pool */ -DEFINE_OLD_POOL(Town, Town, TownPoolNewBlock, NULL) - -/** - * Removes a specific town as well as all industries - * under its "juridiction" - * @param t Town to remove - */ -void DestroyTown(Town *t) +DEFINE_OLD_POOL_GENERIC(Town, Town) + +Town::Town(TileIndex tile) +{ + this->xy = tile; +} + +Town::~Town() { Industry *i; - TileIndex tile; /* Delete town authority window * and remove from list of sorted towns */ - DeleteWindowById(WC_TOWN_VIEW, t->index); + DeleteWindowById(WC_TOWN_VIEW, this->index); _town_sort_dirty = true; _total_towns--; /* Delete all industries belonging to the town */ - FOR_ALL_INDUSTRIES(i) if (i->town == t) DeleteIndustry(i); + FOR_ALL_INDUSTRIES(i) if (i->town == this) delete i; /* Go through all tiles and delete those belonging to the town */ - for (tile = 0; tile < MapSize(); ++tile) { + for (TileIndex tile = 0; tile < MapSize(); ++tile) { switch (GetTileType(tile)) { case MP_HOUSE: - if (GetTownByTile(tile) == t) DoCommand(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR); + if (GetTownByTile(tile) == this) DoCommand(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR); break; - case MP_STREET: + case MP_ROAD: case MP_TUNNELBRIDGE: if (IsTileOwner(tile, OWNER_TOWN) && - ClosestTownFromTile(tile, (uint)-1) == t) + ClosestTownFromTile(tile, (uint)-1) == this) DoCommand(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR); break; @@ -94,10 +82,17 @@ } } - DeleteName(t->townnametype); - DeleteSubsidyWithTown(t->index); + DeleteSubsidyWithTown(this->index); MarkWholeScreenDirty(); + + this->QuickFree(); + this->xy = 0; +} + +void Town::QuickFree() +{ + DeleteName(this->townnametype); } // Local @@ -154,7 +149,7 @@ /* Retrieve pointer to the draw town tile struct */ dcts = &_town_draw_tile_data[house_id << 4 | OriginalTileRandomiser(ti->x, ti->y) << 2 | GetHouseBuildingStage(ti->tile)]; - if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, ti->tileh); + if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, FOUNDATION_LEVELED); image = dcts->ground.sprite; pal = dcts->ground.pal; @@ -163,20 +158,14 @@ /* Add a house on top of the ground? */ image = dcts->building.sprite; if (image != 0) { - if (HASBIT(_transparent_opt, TO_HOUSES)) { - SETBIT(image, PALETTE_MODIFIER_TRANSPARENT); - pal = PALETTE_TO_TRANSPARENT; - } else { - pal = dcts->building.pal; - } - - AddSortableSpriteToDraw(image, pal, + AddSortableSpriteToDraw(image, dcts->building.pal, ti->x + dcts->subtile_x, ti->y + dcts->subtile_y, dcts->width + 1, dcts->height + 1, dcts->dz, - ti->z + ti->z, + HASBIT(_transparent_opt, TO_HOUSES) ); if (HASBIT(_transparent_opt, TO_HOUSES)) return; @@ -194,9 +183,9 @@ return GetTileMaxZ(tile); } -static Slope GetSlopeTileh_Town(TileIndex tile, Slope tileh) +static Foundation GetFoundation_Town(TileIndex tile, Slope tileh) { - return SLOPE_FLAT; + return FlatteningFoundation(tileh); } /** @@ -1157,7 +1146,7 @@ do block = Random() & 3; while (!HASBIT(mask, block)); tile += ToTileIndexDiff(_roadblock_tileadd[block]); - if (IsTileType(tile, MP_STREET)) { + if (IsTileType(tile, MP_ROAD)) { /* Don't allow building over roads of other cities */ if (IsTileOwner(tile, OWNER_TOWN) && GetTownByTile(tile) != t) { _grow_town_result = -1; @@ -1365,10 +1354,6 @@ extern int _nb_orig_names; int x, i; - /* clear the town struct */ - i = t->index; - memset(t, 0, sizeof(Town)); - t->index = i; _total_towns++; t->xy = tile; @@ -1452,30 +1437,6 @@ UpdateTownMaxPass(t); } -static Town *AllocateTown() -{ - Town *t; - - /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. - * TODO - This is just a temporary stage, this will be removed. */ - for (t = GetTown(0); t != NULL; t = (t->index + 1U < GetTownPoolSize()) ? GetTown(t->index + 1U) : NULL) { - if (!IsValidTown(t)) { - TownID index = t->index; - - memset(t, 0, sizeof(Town)); - t->index = index; - - return t; - } - } - - /* Check if we can add a block to the pool */ - if (AddBlockToPool(&_Town_pool)) - return AllocateTown(); - - return NULL; -} - /** Create a new town. * This obviously only works in the scenario editor. Function not removed * as it might be possible in the future to fund your own town :) @@ -1486,7 +1447,6 @@ */ CommandCost CmdBuildTown(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) { - Town *t; uint32 townnameparts; /* Only in the scenario editor */ @@ -1513,14 +1473,16 @@ return_cmd_error(STR_023A_TOO_MANY_TOWNS); /* Allocate town struct */ - t = AllocateTown(); + Town *t = new Town(tile); if (t == NULL) return_cmd_error(STR_023A_TOO_MANY_TOWNS); + AutoPtrT t_auto_delete = t; /* Create the town */ if (flags & DC_EXEC) { _generating_world = true; DoCreateTown(t, tile, townnameparts, (TownSizeMode)p2, p1); _generating_world = false; + t_auto_delete.Detach(); } return CommandCost(); } @@ -1546,7 +1508,7 @@ if (!CreateTownName(&townnameparts)) break; /* Allocate a town struct */ - t = AllocateTown(); + t = new Town(tile); if (t == NULL) break; DoCreateTown(t, tile, townnameparts, mode, size); @@ -2239,7 +2201,7 @@ Town *ClosestTownFromTile(TileIndex tile, uint threshold) { if (IsTileType(tile, MP_HOUSE) || ( - IsTileType(tile, MP_STREET) && + IsTileType(tile, MP_ROAD) && GetRoadOwner(tile, ROADTYPE_ROAD) == OWNER_TOWN )) { return GetTownByTile(tile); @@ -2330,8 +2292,8 @@ Subsidy *s; /* Clean the town pool and create 1 block in it */ - CleanPool(&_Town_pool); - AddBlockToPool(&_Town_pool); + _Town_pool.CleanPool(); + _Town_pool.AddBlockToPool(); memset(_subsidies, 0, sizeof(_subsidies)); for (s=_subsidies; s != endof(_subsidies); s++) @@ -2356,7 +2318,7 @@ ChangeTileOwner_Town, /* change_tile_owner_clear */ NULL, /* get_produced_cargo_proc */ NULL, /* vehicle_enter_tile_proc */ - GetSlopeTileh_Town, /* get_slope_tileh_proc */ + GetFoundation_Town, /* get_foundation_proc */ }; @@ -2482,12 +2444,7 @@ _total_towns = 0; while ((index = SlIterateArray()) != -1) { - Town *t; - - if (!AddBlockIfNeeded(&_Town_pool, index)) - error("Towns: failed loading savegame: too many towns"); - - t = GetTown(index); + Town *t = new (index) Town(); SlObject(t, _town_desc); _total_towns++; diff -r 31fcaa5375a1 -r e72987579514 src/town_gui.cpp --- a/src/town_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/town_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -214,7 +214,7 @@ } static const WindowDesc _town_authority_desc = { - WDP_AUTO, WDP_AUTO, 317, 222, + WDP_AUTO, WDP_AUTO, 317, 222, 317, 222, WC_TOWN_AUTHORITY, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _town_authority_widgets, @@ -278,7 +278,7 @@ break; case 10: /* delete town */ - DeleteTown(t); + delete t; break; } break; @@ -308,7 +308,7 @@ }; static const WindowDesc _town_view_desc = { - WDP_AUTO, WDP_AUTO, 260, 150, + WDP_AUTO, WDP_AUTO, 260, 150, 260, 150, WC_TOWN_VIEW, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON, _town_view_widgets, @@ -331,7 +331,7 @@ }; static const WindowDesc _town_view_scen_desc = { - WDP_AUTO, WDP_AUTO, 260, 150, + WDP_AUTO, WDP_AUTO, 260, 150, 260, 150, WC_TOWN_VIEW, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON, _town_view_scen_widgets, @@ -508,7 +508,7 @@ } static const WindowDesc _town_directory_desc = { - WDP_AUTO, WDP_AUTO, 208, 202, + WDP_AUTO, WDP_AUTO, 208, 202, 208, 202, WC_TOWN_DIRECTORY, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE, _town_directory_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/town_map.h --- a/src/town_map.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/town_map.h Fri Aug 03 22:09:42 2007 +0000 @@ -11,25 +11,25 @@ /** * Get the index of which town this house/street is attached to. * @param t the tile - * @pre IsTileType(t, MP_HOUSE) or IsTileType(t, MP_STREET) + * @pre IsTileType(t, MP_HOUSE) or IsTileType(t, MP_ROAD) * @return TownID */ static inline TownID GetTownIndex(TileIndex t) { - assert(IsTileType(t, MP_HOUSE) || IsTileType(t, MP_STREET)); // XXX incomplete + assert(IsTileType(t, MP_HOUSE) || IsTileType(t, MP_ROAD)); // XXX incomplete return _m[t].m2; } /** * Set the town index for a road or house tile. * @param t the tile - * @pre IsTileType(t, MP_HOUSE) or IsTileType(t, MP_STREET) + * @pre IsTileType(t, MP_HOUSE) or IsTileType(t, MP_ROAD) * @param index the index of the town - * @pre IsTileType(t, MP_STREET) || IsTileType(t, MP_HOUSE) + * @pre IsTileType(t, MP_ROAD) || IsTileType(t, MP_HOUSE) */ static inline void SetTownIndex(TileIndex t, TownID index) { - assert(IsTileType(t, MP_HOUSE) || IsTileType(t, MP_STREET)); + assert(IsTileType(t, MP_HOUSE) || IsTileType(t, MP_ROAD)); _m[t].m2 = index; } @@ -38,7 +38,7 @@ * @param t the tile to get the town of * @return the town */ -static inline Town* GetTownByTile(TileIndex t) +static inline Town *GetTownByTile(TileIndex t) { return GetTown(GetTownIndex(t)); } diff -r 31fcaa5375a1 -r e72987579514 src/train_cmd.cpp --- a/src/train_cmd.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/train_cmd.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -519,7 +519,7 @@ memset(&vl, 0, sizeof(vl)); - if (!AllocateVehicles(vl, num_vehicles)) + if (!Vehicle::AllocateList(vl, num_vehicles)) return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME); if (flags & DC_EXEC) { @@ -687,7 +687,7 @@ memset(&vl, 0, sizeof(vl)); - if (!AllocateVehicles(vl, num_vehicles)) + if (!Vehicle::AllocateList(vl, num_vehicles)) return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME); Vehicle *v = vl[0]; @@ -1254,7 +1254,7 @@ if (flags & DC_EXEC) { UnlinkWagon(rear, first); DeleteDepotHighlightOfVehicle(rear); - DeleteVehicle(rear); + delete rear; } } @@ -1309,7 +1309,7 @@ if (flags & DC_EXEC) { first = UnlinkWagon(v, first); DeleteDepotHighlightOfVehicle(v); - DeleteVehicle(v); + delete v; /* 4 If the second wagon was an engine, update it to front_engine * which UnlinkWagon() has changed to TS_Free_Car */ @@ -1368,7 +1368,7 @@ if (flags & DC_EXEC) { first = UnlinkWagon(rear, first); DeleteDepotHighlightOfVehicle(rear); - DeleteVehicle(rear); + delete rear; } } } else if (v->u.rail.other_multiheaded_part != NULL) { @@ -1381,7 +1381,7 @@ if (flags & DC_EXEC) { first = UnlinkWagon(v, first); DeleteDepotHighlightOfVehicle(v); - DeleteVehicle(v); + delete v; RemoveVehicleFromGroup(v); } } @@ -2761,7 +2761,16 @@ tcc.num = 0; /* find colliding vehicles */ - VehicleFromPosXY(v->x_pos, v->y_pos, &tcc, FindTrainCollideEnum); + if (v->u.rail.track == TRACK_BIT_WORMHOLE) { + VehicleFromPos(v->tile, &tcc, FindTrainCollideEnum); + if (IsBridgeTile(v->tile)) { + VehicleFromPos(GetOtherBridgeEnd(v->tile), &tcc, FindTrainCollideEnum); + } else { + VehicleFromPos(GetOtherTunnelEnd(v->tile), &tcc, FindTrainCollideEnum); + } + } else { + VehicleFromPosXY(v->x_pos, v->y_pos, &tcc, FindTrainCollideEnum); + } /* any dead -> no crash */ if (tcc.num == 0) return; @@ -3032,7 +3041,7 @@ BeginVehicleMove(v); EndVehicleMove(v); - DeleteVehicle(v); + delete v; if (v->u.rail.track != TRACK_BIT_DEPOT && v->u.rail.track != TRACK_BIT_WORMHOLE) SetSignalsOnBothDir(v->tile, FIND_FIRST_BIT(v->u.rail.track)); @@ -3140,7 +3149,7 @@ if (!(v->vehstatus & VS_HIDDEN)) { Vehicle *u = CreateEffectVehicleRel(v, 4, 4, 5, EV_BREAKDOWN_SMOKE); - if (u != NULL) u->u.special.unk0 = v->breakdown_delay * 2; + if (u != NULL) u->u.special.animation_state = v->breakdown_delay * 2; } } @@ -3322,8 +3331,7 @@ TrainLocoHandler(this, true); } else if (IsFreeWagon(this) && HASBITS(this->vehstatus, VS_CRASHED)) { /* Delete flooded standalone wagon */ - if (++this->u.rail.crash_anim_pos >= 4400) - DeleteVehicle(this); + if (++this->u.rail.crash_anim_pos >= 4400) delete this; } } diff -r 31fcaa5375a1 -r e72987579514 src/train_gui.cpp --- a/src/train_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/train_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -69,7 +69,8 @@ * @param len Length measured in 1/8ths of a standard wagon. * @return Number of pixels across. */ -int WagonLengthToPixels(int len) { +int WagonLengthToPixels(int len) +{ return (len * _traininfo_vehicle_width) / 8; } @@ -308,7 +309,7 @@ } static const WindowDesc _train_view_desc = { - WDP_AUTO, WDP_AUTO, 250, 134, + WDP_AUTO, WDP_AUTO, 250, 134, 250, 134, WC_VEHICLE_VIEW, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE, _train_view_widgets, @@ -591,7 +592,7 @@ static const WindowDesc _train_details_desc = { - WDP_AUTO, WDP_AUTO, 370, 164, + WDP_AUTO, WDP_AUTO, 370, 164, 370, 164, WC_VEHICLE_DETAILS,WC_VEHICLE_VIEW, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE, _train_details_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/transparency_gui.cpp --- a/src/transparency_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/transparency_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -78,7 +78,7 @@ }; static const WindowDesc _transparency_desc = { - WDP_ALIGN_TBR, 58+36, 197, 36, + WDP_ALIGN_TBR, 58+36, 197, 36, 197, 36, WC_TRANSPARENCY_TOOLBAR, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON, _transparency_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/tree_cmd.cpp --- a/src/tree_cmd.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/tree_cmd.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -374,13 +374,8 @@ i = GetTreeCount(ti->tile) + 1; do { SpriteID image = s[0].sprite + (--i == 0 ? GetTreeGrowth(ti->tile) : 3); - SpriteID pal; - if (HASBIT(_transparent_opt, TO_TREES)) { - SETBIT(image, PALETTE_MODIFIER_TRANSPARENT); - pal = PALETTE_TO_TRANSPARENT; - } else { - pal = s[0].pal; - } + SpriteID pal = s[0].pal; + te[i].image = image; te[i].pal = pal; te[i].x = d->x; @@ -404,7 +399,7 @@ if (tep == NULL) break; - AddSortableSpriteToDraw(tep->image, tep->pal, ti->x + tep->x, ti->y + tep->y, 5, 5, 0x10, z); + AddSortableSpriteToDraw(tep->image, tep->pal, ti->x + tep->x, ti->y + tep->y, 5, 5, 0x10, z, HASBIT(_transparent_opt, TO_TREES)); tep->image = 0; } } @@ -421,9 +416,9 @@ return z + GetPartialZ(x & 0xF, y & 0xF, tileh); } -static Slope GetSlopeTileh_Trees(TileIndex tile, Slope tileh) +static Foundation GetFoundation_Trees(TileIndex tile, Slope tileh) { - return tileh; + return FOUNDATION_NONE; } static CommandCost ClearTile_Trees(TileIndex tile, byte flags) @@ -560,7 +555,7 @@ case 2: { /* add a neighbouring tree */ TreeType treetype = GetTreeType(tile); - tile += TileOffsByDir(Random() & 7); + tile += TileOffsByDir((Direction)(Random() & 7)); if (!IsTileType(tile, MP_CLEAR) || IsBridgeAbove(tile)) return; @@ -675,5 +670,5 @@ ChangeTileOwner_Trees, /* change_tile_owner_clear */ NULL, /* get_produced_cargo_proc */ NULL, /* vehicle_enter_tile_proc */ - GetSlopeTileh_Trees, /* get_slope_tileh_proc */ + GetFoundation_Trees, /* get_foundation_proc */ }; diff -r 31fcaa5375a1 -r e72987579514 src/tunnel_map.cpp --- a/src/tunnel_map.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/tunnel_map.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -64,8 +64,6 @@ bool IsTunnelInWay(TileIndex tile, uint z) { return - IsTunnelInWayDir(tile, z, DIAGDIR_NE) || - IsTunnelInWayDir(tile, z, DIAGDIR_SE) || - IsTunnelInWayDir(tile, z, DIAGDIR_SW) || - IsTunnelInWayDir(tile, z, DIAGDIR_NW); + IsTunnelInWayDir(tile, z, (TileX(tile) > (MapMaxX() / 2)) ? DIAGDIR_NE : DIAGDIR_SW) || + IsTunnelInWayDir(tile, z, (TileY(tile) > (MapMaxY() / 2)) ? DIAGDIR_NW : DIAGDIR_SE); } diff -r 31fcaa5375a1 -r e72987579514 src/tunnelbridge_cmd.cpp --- a/src/tunnelbridge_cmd.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/tunnelbridge_cmd.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -388,7 +388,7 @@ if (!IsPlainRailTile(tile)) goto not_valid_below; break; - case MP_STREET: + case MP_ROAD: if (GetRoadTileType(tile) == ROAD_TILE_DEPOT) goto not_valid_below; break; @@ -504,6 +504,8 @@ int tiles_coef = 3; /** Number of tiles from start of tunnel */ int tiles = 0; + /** Number of tiles at which the cost increase coefficient per tile is halved */ + int tiles_bump = 25; for (;;) { end_tile += delta; @@ -516,7 +518,10 @@ } tiles++; - if (tiles == 25 || tiles == 50 || tiles == 100 || tiles == 200 || tiles == 400 || tiles == 800) tiles_coef++; + if (tiles == tiles_bump) { + tiles_coef++; + tiles_bump *= 2; + } cost.AddCost(_price.build_tunnel); cost.AddCost(cost.GetCost() >> tiles_coef); // add a multiplier for longer tunnels @@ -825,7 +830,6 @@ int back_height, front_height; int i = z; const byte *p; - SpriteID pal; static const byte _tileh_bits[4][8] = { { 2, 1, 8, 4, 16, 2, 0, 9 }, @@ -834,13 +838,6 @@ { 2, 4, 8, 1, 2, 16, 9, 0 } }; - if (HASBIT(_transparent_opt, TO_BRIDGES)) { - SETBIT(image, PALETTE_MODIFIER_TRANSPARENT); - pal = PALETTE_TO_TRANSPARENT; - } else { - pal = psid->pal; - } - p = _tileh_bits[(image & 1) * 2 + (axis == AXIS_X ? 0 : 1)]; front_height = ti->z + (ti->tileh & p[0] ? TILE_HEIGHT : 0); back_height = ti->z + (ti->tileh & p[1] ? TILE_HEIGHT : 0); @@ -855,36 +852,21 @@ * sprites is at the top */ if (z >= front_height) { // front facing pillar - AddSortableSpriteToDraw(image, pal, x, y, p[4], p[5], 1, z); + AddSortableSpriteToDraw(image, psid->pal, x, y, p[4], p[5], 1, z, HASBIT(_transparent_opt, TO_BRIDGES)); } if (drawfarpillar && z >= back_height && z < i - TILE_HEIGHT) { // back facing pillar - AddSortableSpriteToDraw(image, pal, x - p[6], y - p[7], p[4], p[5], 1, z); + AddSortableSpriteToDraw(image, psid->pal, x - p[6], y - p[7], p[4], p[5], 1, z, HASBIT(_transparent_opt, TO_BRIDGES)); } } } } -uint GetBridgeFoundation(Slope tileh, Axis axis) +Foundation GetBridgeFoundation(Slope tileh, Axis axis) { - uint i; - - if (HASBIT(BRIDGE_FULL_LEVELED_FOUNDATION, tileh)) return tileh; - - /* inclined sloped building */ - switch (tileh) { - case SLOPE_W: - case SLOPE_STEEP_W: i = 0; break; - case SLOPE_S: - case SLOPE_STEEP_S: i = 2; break; - case SLOPE_E: - case SLOPE_STEEP_E: i = 4; break; - case SLOPE_N: - case SLOPE_STEEP_N: i = 6; break; - default: return 0; - } - if (axis != AXIS_X) ++i; - return i + 15; + if (HASBIT(BRIDGE_NO_FOUNDATION, tileh)) return FOUNDATION_NONE; + if (HASBIT(BRIDGE_FULL_LEVELED_FOUNDATION, tileh)) return FlatteningFoundation(tileh); + return InclinedFoundation(axis); } /** @@ -904,20 +886,11 @@ static const uint size_x[6] = { 11, 16, 16, 16, 16, 16 }; static const uint size_y[6] = { 16, 11, 16, 16, 16, 16 }; - AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + tram_offsets[overlay][offset], PAL_NONE, x, y, size_x[offset], size_y[offset], offset >= 2 ? 1 : 0, z); + AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + tram_offsets[overlay][offset], PAL_NONE, x, y, size_x[offset], size_y[offset], offset >= 2 ? 1 : 0, z, HASBIT(_transparent_opt, TO_BRIDGES)); - SpriteID front = SPR_TRAMWAY_BASE + front_offsets[offset]; - SpriteID back = SPR_TRAMWAY_BASE + back_offsets[offset]; - SpriteID pal = PAL_NONE; - if (HASBIT(_transparent_opt, TO_BUILDINGS)) { - SETBIT(front, PALETTE_MODIFIER_TRANSPARENT); - SETBIT(back, PALETTE_MODIFIER_TRANSPARENT); - pal = PALETTE_TO_TRANSPARENT; - } - - AddSortableSpriteToDraw(back, pal, x, y, size_x[offset], size_y[offset], 0, z); + AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + back_offsets[offset], PAL_NONE, x, y, size_x[offset], size_y[offset], 0, z, HASBIT(_transparent_opt, TO_BUILDINGS)); /* For sloped sprites the bounding box needs to be higher, as the pylons stop on a higher point */ - AddSortableSpriteToDraw(front, pal, x, y, size_x[offset], size_y[offset], offset >= 2 ? 0x30 : 0x10, z); + AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + front_offsets[offset], PAL_NONE, x, y, size_x[offset], size_y[offset], offset >= 2 ? 0x30 : 0x10, z, HASBIT(_transparent_opt, TO_BUILDINGS)); } /** @@ -936,7 +909,6 @@ static void DrawTile_TunnelBridge(TileInfo *ti) { SpriteID image; - SpriteID pal; if (IsTunnel(ti->tile)) { if (GetTunnelTransportType(ti->tile) == TRANSPORT_RAIL) { @@ -980,10 +952,7 @@ /* as the lower 3 bits are used for other stuff, make sure they are clear */ assert( (base_offset & 0x07) == 0x00); - if (!HASBIT(BRIDGE_NO_FOUNDATION, ti->tileh)) { - int f = GetBridgeFoundation(ti->tileh, DiagDirToAxis(GetBridgeRampDirection(ti->tile))); - if (f != 0) DrawFoundation(ti, f); - } + DrawFoundation(ti, GetBridgeFoundation(ti->tileh, DiagDirToAxis(GetBridgeRampDirection(ti->tile)))); /* HACK Wizardry to convert the bridge ramp direction into a sprite offset */ base_offset += (6 - GetBridgeRampDirection(ti->tile)) % 4; @@ -999,21 +968,13 @@ DrawGroundSprite(SPR_FLAT_SNOWY_TILE + _tileh_to_sprite[ti->tileh], PAL_NONE); } - image = psid->sprite; - /* draw ramp */ - if (HASBIT(_transparent_opt, TO_BRIDGES)) { - SETBIT(image, PALETTE_MODIFIER_TRANSPARENT); - pal = PALETTE_TO_TRANSPARENT; - } else { - pal = psid->pal; - } /* HACK set the height of the BB of a sloped ramp to 1 so a vehicle on * it doesn't disappear behind it */ AddSortableSpriteToDraw( - image, pal, ti->x, ti->y, 16, 16, ti->tileh == SLOPE_FLAT ? 0 : 8, ti->z + psid->sprite, psid->pal, ti->x, ti->y, 16, 16, ti->tileh == SLOPE_FLAT ? 0 : 8, ti->z, HASBIT(_transparent_opt, TO_BRIDGES) ); if (GetBridgeTransportType(ti->tile) == TRANSPORT_ROAD) { @@ -1076,8 +1037,6 @@ void DrawBridgeMiddle(const TileInfo* ti) { const PalSpriteID* psid; - SpriteID image; - SpriteID pal; uint base_offset; TileIndex rampnorth; TileIndex rampsouth; @@ -1114,28 +1073,13 @@ uint bridge_z = GetBridgeHeight(rampsouth); z = bridge_z - 3; - image = psid->sprite; - if (HASBIT(_transparent_opt, TO_BRIDGES)) { - SETBIT(image, PALETTE_MODIFIER_TRANSPARENT); - pal = PALETTE_TO_TRANSPARENT; + if (axis == AXIS_X) { + AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 16, 11, 1, z, HASBIT(_transparent_opt, TO_BRIDGES)); } else { - pal = psid->pal; - } - - if (axis == AXIS_X) { - AddSortableSpriteToDraw(image, pal, x, y, 16, 11, 1, z); - } else { - AddSortableSpriteToDraw(image, pal, x, y, 11, 16, 1, z); + AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 11, 16, 1, z, HASBIT(_transparent_opt, TO_BRIDGES)); } psid++; - image = psid->sprite; - if (HASBIT(_transparent_opt, TO_BRIDGES)) { - SETBIT(image, PALETTE_MODIFIER_TRANSPARENT); - pal = PALETTE_TO_TRANSPARENT; - } else { - pal = psid->pal; - } if (GetBridgeTransportType(rampsouth) == TRANSPORT_ROAD) { RoadTypes rts = GetRoadTypes(rampsouth); @@ -1150,22 +1094,21 @@ /* draw roof, the component of the bridge which is logically between the vehicle and the camera */ if (axis == AXIS_X) { y += 12; - if (image & SPRITE_MASK) AddSortableSpriteToDraw(image, pal, x, y, 16, 1, 0x28, z); + if (psid->sprite & SPRITE_MASK) AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 16, 1, 0x28, z, HASBIT(_transparent_opt, TO_BRIDGES)); } else { x += 12; - if (image & SPRITE_MASK) AddSortableSpriteToDraw(image, pal, x, y, 1, 16, 0x28, z); + if (psid->sprite & SPRITE_MASK) AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 1, 16, 0x28, z, HASBIT(_transparent_opt, TO_BRIDGES)); } psid++; if (ti->z + 5 == z) { /* draw poles below for small bridges */ if (psid->sprite != 0) { - image = psid->sprite; + SpriteID image = psid->sprite; + SpriteID pal = psid->pal; if (HASBIT(_transparent_opt, TO_BRIDGES)) { SETBIT(image, PALETTE_MODIFIER_TRANSPARENT); pal = PALETTE_TO_TRANSPARENT; - } else { - pal = psid->pal; } DrawGroundSpriteAt(image, pal, x, y, z); @@ -1194,14 +1137,14 @@ DiagDirection dir = GetBridgeRampDirection(tile); uint pos = (DiagDirToAxis(dir) == AXIS_X ? y : x); + z += ApplyFoundationToSlope(GetBridgeFoundation(tileh, DiagDirToAxis(dir)), &tileh); + /* On the bridge ramp? */ if (5 <= pos && pos <= 10) { uint delta; - if (IsSteepSlope(tileh)) return z + TILE_HEIGHT * 2; if (HASBIT(BRIDGE_HORZ_RAMP, tileh)) return z + TILE_HEIGHT; - if (HASBIT(BRIDGE_FULL_LEVELED_FOUNDATION, tileh)) z += TILE_HEIGHT; switch (dir) { default: NOT_REACHED(); case DIAGDIR_NE: delta = (TILE_SIZE - 1 - x) / 2; break; @@ -1210,38 +1153,15 @@ case DIAGDIR_NW: delta = (TILE_SIZE - 1 - y) / 2; break; } return z + 1 + delta; - } else { - uint f = GetBridgeFoundation(tileh, DiagDirToAxis(dir)); - - if (f != 0) { - if (IsSteepSlope(tileh)) { - z += TILE_HEIGHT; - } else if (f < 15) { - return z + TILE_HEIGHT; - } - tileh = (Slope)_inclined_tileh[f - 15]; - } } } return z + GetPartialZ(x, y, tileh); } -static Slope GetSlopeTileh_TunnelBridge(TileIndex tile, Slope tileh) +static Foundation GetFoundation_TunnelBridge(TileIndex tile, Slope tileh) { - if (IsTunnel(tile)) { - return tileh; - } else { - if (HASBIT(BRIDGE_NO_FOUNDATION, tileh)) { - return tileh; - } else { - uint f = GetBridgeFoundation(tileh, DiagDirToAxis(GetBridgeRampDirection(tile))); - - if (f == 0) return tileh; - if (f < 15) return SLOPE_FLAT; - return (Slope)_inclined_tileh[f - 15]; - } - } + return IsTunnel(tile) ? FOUNDATION_NONE : GetBridgeFoundation(tileh, DiagDirToAxis(GetBridgeRampDirection(tile))); } @@ -1513,5 +1433,5 @@ ChangeTileOwner_TunnelBridge, /* change_tile_owner_clear */ NULL, /* get_produced_cargo_proc */ VehicleEnter_TunnelBridge, /* vehicle_enter_tile_proc */ - GetSlopeTileh_TunnelBridge, /* get_slope_tileh_proc */ + GetFoundation_TunnelBridge, /* get_foundation_proc */ }; diff -r 31fcaa5375a1 -r e72987579514 src/unmovable_cmd.cpp --- a/src/unmovable_cmd.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/unmovable_cmd.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -112,30 +112,21 @@ static void DrawTile_Unmovable(TileInfo *ti) { - SpriteID image; - SpriteID pal; switch (GetUnmovableType(ti->tile)) { case UNMOVABLE_TRANSMITTER: case UNMOVABLE_LIGHTHOUSE: { const DrawTileUnmovableStruct* dtus; - if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, ti->tileh); + if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, FOUNDATION_LEVELED); DrawClearLandTile(ti, 2); dtus = &_draw_tile_unmovable_data[GetUnmovableType(ti->tile)]; - image = dtus->image; - if (HASBIT(_transparent_opt, TO_STRUCTURES)) { - SETBIT(image, PALETTE_MODIFIER_TRANSPARENT); - pal = PALETTE_TO_TRANSPARENT; - } else { - pal = PAL_NONE; - } - AddSortableSpriteToDraw( - image, pal, ti->x | dtus->subcoord_x, ti->y | dtus->subcoord_y, - dtus->width, dtus->height, dtus->z_size, ti->z + dtus->image, PAL_NONE, ti->x | dtus->subcoord_x, ti->y | dtus->subcoord_y, + dtus->width, dtus->height, dtus->z_size, ti->z, + HASBIT(_transparent_opt, TO_STRUCTURES) ); break; } @@ -143,23 +134,14 @@ case UNMOVABLE_STATUE: DrawGroundSprite(SPR_CONCRETE_GROUND, PAL_NONE); - image = SPR_STATUE_COMPANY; - if (HASBIT(_transparent_opt, TO_STRUCTURES)) { - SETBIT(image, PALETTE_MODIFIER_TRANSPARENT); - pal = PALETTE_TO_TRANSPARENT; - } else { - pal = PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile)); - } - AddSortableSpriteToDraw(image, pal, ti->x, ti->y, 16, 16, 25, ti->z); + AddSortableSpriteToDraw(SPR_STATUE_COMPANY, PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile)), ti->x, ti->y, 16, 16, 25, ti->z, HASBIT(_transparent_opt, TO_STRUCTURES)); break; case UNMOVABLE_OWNED_LAND: DrawClearLandTile(ti, 0); - image = SPR_BOUGHT_LAND; - pal = PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile)); AddSortableSpriteToDraw( - image, pal, + SPR_BOUGHT_LAND, PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile)), ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2, 1, 1, 10, GetSlopeZ(ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2) ); DrawBridgeMiddle(ti); @@ -171,7 +153,7 @@ SpriteID palette; assert(IsCompanyHQ(ti->tile)); - if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, ti->tileh); + if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, FOUNDATION_LEVELED); palette = PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile)); @@ -179,18 +161,12 @@ DrawGroundSprite(t->ground_sprite, palette); foreach_draw_tile_seq(dtss, t->seq) { - image = dtss->image; - if (HASBIT(_transparent_opt, TO_STRUCTURES)) { - SETBIT(image, PALETTE_MODIFIER_TRANSPARENT); - pal = PALETTE_TO_TRANSPARENT; - } else { - pal = palette; - } AddSortableSpriteToDraw( - image, pal, + dtss->image, palette, ti->x + dtss->delta_x, ti->y + dtss->delta_y, dtss->size_x, dtss->size_y, - dtss->size_z, ti->z + dtss->delta_z + dtss->size_z, ti->z + dtss->delta_z, + HASBIT(_transparent_opt, TO_STRUCTURES) ); } break; @@ -210,9 +186,9 @@ } } -static Slope GetSlopeTileh_Unmovable(TileIndex tile, Slope tileh) +static Foundation GetFoundation_Unmovable(TileIndex tile, Slope tileh) { - return IsOwnedLand(tile) ? tileh : SLOPE_FLAT; + return IsOwnedLand(tile) ? FOUNDATION_NONE : FlatteningFoundation(tileh); } static CommandCost ClearTile_Unmovable(TileIndex tile, byte flags) @@ -435,5 +411,5 @@ ChangeTileOwner_Unmovable, /* change_tile_owner_clear */ NULL, /* get_produced_cargo_proc */ NULL, /* vehicle_enter_tile_proc */ - GetSlopeTileh_Unmovable, /* get_slope_tileh_proc */ + GetFoundation_Unmovable, /* get_foundation_proc */ }; diff -r 31fcaa5375a1 -r e72987579514 src/variables.h --- a/src/variables.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/variables.h Fri Aug 03 22:09:42 2007 +0000 @@ -327,7 +327,6 @@ /* landscape.cpp */ extern const byte _tileh_to_sprite[32]; -extern const Slope _inclined_tileh[16]; extern const TileTypeProcs * const _tile_type_procs[16]; diff -r 31fcaa5375a1 -r e72987579514 src/vehicle.cpp --- a/src/vehicle.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/vehicle.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -78,27 +78,8 @@ }; -enum { - BLOCKS_FOR_SPECIAL_VEHICLES = 2, ///< Blocks needed for special vehicles -}; - -/** - * Called if a new block is added to the vehicle-pool - */ -static void VehiclePoolNewBlock(uint start_item) -{ - Vehicle *v; - - /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. - * TODO - This is just a temporary stage, this will be removed. */ - for (v = GetVehicle(start_item); v != NULL; v = (v->index + 1U < GetVehiclePoolSize()) ? GetVehicle(v->index + 1) : NULL) { - v->index = start_item++; - v = new (v) InvalidVehicle(); - } -} - /* Initialize the vehicle-pool */ -DEFINE_OLD_POOL(Vehicle, Vehicle, VehiclePoolNewBlock, NULL) +DEFINE_OLD_POOL_GENERIC(Vehicle, Vehicle) void VehicleServiceInDepot(Vehicle *v) { @@ -282,28 +263,12 @@ } } -static Vehicle *InitializeVehicle(Vehicle *v) +Vehicle::Vehicle() { - VehicleID index = v->index; - memset(v, 0, sizeof(Vehicle)); - v->index = index; - - assert(v->orders == NULL); - - v = new (v) InvalidVehicle(); - v->left_coord = INVALID_COORD; - v->first = NULL; - v->next = NULL; - v->next_hash = NULL; - v->string_id = 0; - v->next_shared = NULL; - v->prev_shared = NULL; - v->depot_list = NULL; - v->random_bits = 0; - v->group_id = DEFAULT_GROUP; - v->fill_percent_te_id = INVALID_TE_ID; - - return v; + this->type = VEH_INVALID; + this->left_coord = INVALID_COORD; + this->group_id = DEFAULT_GROUP; + this->fill_percent_te_id = INVALID_TE_ID; } /** @@ -315,87 +280,21 @@ return GB(Random(), 0, 8); } -Vehicle *ForceAllocateSpecialVehicle() -{ - /* This stays a strange story.. there should always be room for special - * vehicles (special effects all over the map), but with 65k of vehicles - * is this realistic to double-check for that? For now we just reserve - * BLOCKS_FOR_SPECIAL_VEHICLES times block_size vehicles that may only - * be used for special vehicles.. should work nicely :) */ - - Vehicle *v; - - /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. - * TODO - This is just a temporary stage, this will be removed. */ - for (v = GetVehicle(0); v != NULL; v = (v->index + 1U < GetVehiclePoolSize()) ? GetVehicle(v->index + 1) : NULL) { - /* No more room for the special vehicles, return NULL */ - if (v->index >= (1 << Vehicle_POOL_BLOCK_SIZE_BITS) * BLOCKS_FOR_SPECIAL_VEHICLES) - return NULL; - - if (!IsValidVehicle(v)) return InitializeVehicle(v); - } - - return NULL; -} - -/** - * finds a free vehicle in the memory or allocates a new one - * returns a pointer to the first free vehicle or NULL if all vehicles are in use - * *skip_vehicles is an offset to where in the array we should begin looking - * this is to avoid looping though the same vehicles more than once after we learned that they are not free - * this feature is used by AllocateVehicles() since it need to allocate more than one and when - * another block is added to _Vehicle_pool, since we only do that when we know it's already full - */ -static Vehicle *AllocateSingleVehicle(VehicleID *skip_vehicles) + +/* static */ bool Vehicle::AllocateList(Vehicle **vl, int num) { - /* See note by ForceAllocateSpecialVehicle() why we skip the - * first blocks */ - Vehicle *v; - const int offset = (1 << Vehicle_POOL_BLOCK_SIZE_BITS) * BLOCKS_FOR_SPECIAL_VEHICLES; - - /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. - * @todo - This is just a temporary stage, this will be removed. */ - if (*skip_vehicles < (_Vehicle_pool.total_items - offset)) { // make sure the offset in the array is not larger than the array itself - for (v = GetVehicle(offset + *skip_vehicles); v != NULL; v = (v->index + 1U < GetVehiclePoolSize()) ? GetVehicle(v->index + 1) : NULL) { - (*skip_vehicles)++; - if (!IsValidVehicle(v)) return InitializeVehicle(v); - } - } - - /* Check if we can add a block to the pool */ - if (AddBlockToPool(&_Vehicle_pool)) - return AllocateSingleVehicle(skip_vehicles); - - return NULL; -} - - -Vehicle *AllocateVehicle() -{ - VehicleID counter = 0; - return AllocateSingleVehicle(&counter); -} - - -/** Allocates a lot of vehicles and frees them again - * @param vl pointer to an array of vehicles to get allocated. Can be NULL if the vehicles aren't needed (makes it test only) - * @param num number of vehicles to allocate room for - * @return true if there is room to allocate all the vehicles - */ -bool AllocateVehicles(Vehicle **vl, int num) -{ - int i; - Vehicle *v; - VehicleID counter = 0; - - for (i = 0; i != num; i++) { - v = AllocateSingleVehicle(&counter); - if (v == NULL) { - return false; - } + uint counter = _Vehicle_pool.first_free_index; + + for (int i = 0; i != num; i++) { + Vehicle *v = AllocateRaw(counter); + + if (v == NULL) return false; + v = new (v) InvalidVehicle(); + if (vl != NULL) { vl[i] = v; } + counter++; } return true; @@ -471,8 +370,8 @@ if (remove) { new_hash = NULL; } else { - int x = GB(v->x_pos / TILE_SIZE, HASH_RES, HASH_BITS); - int y = GB(v->y_pos / TILE_SIZE, HASH_RES, HASH_BITS) << HASH_BITS; + int x = GB(TileX(v->tile), HASH_RES, HASH_BITS); + int y = GB(TileY(v->tile), HASH_RES, HASH_BITS) << HASH_BITS; new_hash = &_new_vehicle_position_hash[(x + y) & TOTAL_HASH_MASK]; } @@ -555,16 +454,8 @@ void InitializeVehicles() { - uint i; - - /* Clean the vehicle pool, and reserve enough blocks - * for the special vehicles, plus one for all the other - * vehicles (which is increased on-the-fly) */ - CleanPool(&_Vehicle_pool); - AddBlockToPool(&_Vehicle_pool); - for (i = 0; i < BLOCKS_FOR_SPECIAL_VEHICLES; i++) { - AddBlockToPool(&_Vehicle_pool); - } + _Vehicle_pool.CleanPool(); + _Vehicle_pool.AddBlockToPool(); ResetVehiclePosHash(); } @@ -671,44 +562,51 @@ } } -void DestroyVehicle(Vehicle *v) +Vehicle::~Vehicle() { - if (IsValidStationID(v->last_station_visited)) { - GetStation(v->last_station_visited)->loading_vehicles.remove(v); - - HideFillingPercent(v->fill_percent_te_id); - v->fill_percent_te_id = INVALID_TE_ID; + if (IsValidStationID(this->last_station_visited)) { + GetStation(this->last_station_visited)->loading_vehicles.remove(this); + + HideFillingPercent(this->fill_percent_te_id); + this->fill_percent_te_id = INVALID_TE_ID; } - if (IsEngineCountable(v)) { - GetPlayer(v->owner)->num_engines[v->engine_type]--; - if (v->owner == _local_player) InvalidateAutoreplaceWindow(v->engine_type, v->group_id); - - if (IsValidGroupID(v->group_id)) GetGroup(v->group_id)->num_engines[v->engine_type]--; - if (v->IsPrimaryVehicle()) DecreaseGroupNumVehicle(v->group_id); + if (IsEngineCountable(this)) { + GetPlayer(this->owner)->num_engines[this->engine_type]--; + if (this->owner == _local_player) InvalidateAutoreplaceWindow(this->engine_type, this->group_id); + + if (IsValidGroupID(this->group_id)) GetGroup(this->group_id)->num_engines[this->engine_type]--; + if (this->IsPrimaryVehicle()) DecreaseGroupNumVehicle(this->group_id); } - DeleteVehicleNews(v->index, INVALID_STRING_ID); - - DeleteName(v->string_id); - if (v->type == VEH_ROAD) ClearSlot(v); - - if (v->type != VEH_TRAIN || (v->type == VEH_TRAIN && (IsFrontEngine(v) || IsFreeWagon(v)))) { - InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile); + DeleteVehicleNews(this->index, INVALID_STRING_ID); + + this->QuickFree(); + if (this->type == VEH_ROAD) ClearSlot(this); + + if (this->type != VEH_TRAIN || (this->type == VEH_TRAIN && (IsFrontEngine(this) || IsFreeWagon(this)))) { + InvalidateWindowData(WC_VEHICLE_DEPOT, this->tile); } - v->cargo.Truncate(0); - UpdateVehiclePosHash(v, INVALID_COORD, 0); - v->next_hash = NULL; - v->next_new_hash = NULL; - if (IsPlayerBuildableVehicleType(v)) DeleteVehicleOrders(v); + this->cargo.Truncate(0); + UpdateVehiclePosHash(this, INVALID_COORD, 0); + this->next_hash = NULL; + this->next_new_hash = NULL; + if (IsPlayerBuildableVehicleType(this)) DeleteVehicleOrders(this); /* Now remove any artic part. This will trigger an other * destroy vehicle, which on his turn can remove any * other artic parts. */ - if ((v->type == VEH_TRAIN && EngineHasArticPart(v)) || (v->type == VEH_ROAD && RoadVehHasArticPart(v))) { - DeleteVehicle(v->next); + if ((this->type == VEH_TRAIN && EngineHasArticPart(this)) || (this->type == VEH_ROAD && RoadVehHasArticPart(this))) { + delete this->next; } + + new (this) InvalidVehicle(); +} + +void Vehicle::QuickFree() +{ + DeleteName(this->string_id); } /** @@ -725,7 +623,7 @@ do { Vehicle *u = v; v = v->next; - DeleteVehicle(u); + delete u; } while (v != NULL); } @@ -852,17 +750,14 @@ SpriteID image = v->cur_image; SpriteID pal; - if (v->vehstatus & VS_SHADOW) { - SETBIT(image, PALETTE_MODIFIER_TRANSPARENT); - pal = PALETTE_TO_TRANSPARENT; - } else if (v->vehstatus & VS_DEFPAL) { + if (v->vehstatus & VS_DEFPAL) { pal = (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(v); } else { pal = PAL_NONE; } AddSortableSpriteToDraw(image, pal, v->x_pos + v->x_offs, v->y_pos + v->y_offs, - v->sprite_width, v->sprite_height, v->z_height, v->z_pos); + v->sprite_width, v->sprite_height, v->z_height, v->z_pos, (v->vehstatus & VS_SHADOW) != 0); } void ViewportAddVehicles(DrawPixelInfo *dpi) @@ -935,7 +830,7 @@ tile = TileVirtXY(v->x_pos, v->y_pos); if (!IsTileType(tile, MP_INDUSTRY)) { EndVehicleMove(v); - DeleteVehicle(v); + delete v; return; } @@ -974,7 +869,7 @@ v->cur_image++; } else { EndVehicleMove(v); - DeleteVehicle(v); + delete v; return; } moved = true; @@ -1009,7 +904,7 @@ EndVehicleMove(v); } else { EndVehicleMove(v); - DeleteVehicle(v); + delete v; } } } @@ -1033,7 +928,7 @@ EndVehicleMove(v); } else { EndVehicleMove(v); - DeleteVehicle(v); + delete v; } } } @@ -1062,7 +957,7 @@ v->cur_image++; } else { EndVehicleMove(v); - DeleteVehicle(v); + delete v; return; } moved = true; @@ -1091,7 +986,7 @@ EndVehicleMove(v); } else { EndVehicleMove(v); - DeleteVehicle(v); + delete v; } } } @@ -1116,11 +1011,11 @@ EndVehicleMove(v); } - v->u.special.unk0--; - if (v->u.special.unk0 == 0) { + v->u.special.animation_state--; + if (v->u.special.animation_state == 0) { BeginVehicleMove(v); EndVehicleMove(v); - DeleteVehicle(v); + delete v; } } @@ -1141,7 +1036,7 @@ EndVehicleMove(v); } else { EndVehicleMove(v); - DeleteVehicle(v); + delete v; } } } @@ -1150,8 +1045,8 @@ { v->cur_image = SPR_BULLDOZER_NE; v->progress = 0; - v->u.special.unk0 = 0; - v->u.special.unk2 = 0; + v->u.special.animation_state = 0; + v->u.special.animation_substate = 0; } struct BulldozerMovement { @@ -1197,7 +1092,7 @@ { v->progress++; if ((v->progress & 7) == 0) { - const BulldozerMovement* b = &_bulldozer_movement[v->u.special.unk0]; + const BulldozerMovement* b = &_bulldozer_movement[v->u.special.animation_state]; BeginVehicleMove(v); @@ -1206,13 +1101,13 @@ v->x_pos += _inc_by_dir[b->direction].x; v->y_pos += _inc_by_dir[b->direction].y; - v->u.special.unk2++; - if (v->u.special.unk2 >= b->duration) { - v->u.special.unk2 = 0; - v->u.special.unk0++; - if (v->u.special.unk0 == lengthof(_bulldozer_movement)) { + v->u.special.animation_substate++; + if (v->u.special.animation_substate >= b->duration) { + v->u.special.animation_substate = 0; + v->u.special.animation_state++; + if (v->u.special.animation_state == lengthof(_bulldozer_movement)) { EndVehicleMove(v); - DeleteVehicle(v); + delete v; return; } } @@ -1402,7 +1297,7 @@ EndVehicleMove(v); return; } - if (v->u.special.unk2 != 0) { + if (v->u.special.animation_substate != 0) { v->spritenum = GB(InteractiveRandom(), 0, 2) + 1; } else { v->spritenum = 6; @@ -1416,7 +1311,7 @@ if (b->y == 4 && b->x == 0) { EndVehicleMove(v); - DeleteVehicle(v); + delete v; return; } @@ -1485,9 +1380,8 @@ { Vehicle *v; - v = ForceAllocateSpecialVehicle(); + v = new SpecialVehicle(); if (v != NULL) { - v = new (v) SpecialVehicle(); v->subtype = type; v->x_pos = x; v->y_pos = y; @@ -1881,7 +1775,7 @@ veh_counter++; } while ((v = v->next) != NULL); - if (!AllocateVehicles(NULL, veh_counter)) { + if (!Vehicle::AllocateList(NULL, veh_counter)) { return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME); } } @@ -2395,6 +2289,7 @@ break; case VEH_ROAD: + if (!IsRoadVehFront(v)) continue; break; case VEH_AIRCRAFT: @@ -2480,7 +2375,8 @@ static Rect _old_vehicle_coords; -void BeginVehicleMove(Vehicle *v) { +void BeginVehicleMove(Vehicle *v) +{ _old_vehicle_coords.left = v->left_coord; _old_vehicle_coords.top = v->top_coord; _old_vehicle_coords.right = v->right_coord; @@ -3044,8 +2940,8 @@ SLE_VAR(Vehicle, progress, SLE_UINT8), SLE_VAR(Vehicle, vehstatus, SLE_UINT8), - SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleSpecial, unk0), SLE_UINT16), - SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleSpecial, unk2), SLE_UINT8), + SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleSpecial, animation_state), SLE_UINT16), + SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleSpecial, animation_substate), SLE_UINT8), /* reserve extra space in savegame here. (currently 16 bytes) */ SLE_CONDNULL(16, 2, SL_MAX_VERSION), @@ -3082,8 +2978,8 @@ SLE_CONDVAR(Vehicle, age, SLE_INT32, 31, SL_MAX_VERSION), SLE_VAR(Vehicle, tick_counter, SLE_UINT8), - SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleDisaster, image_override), SLE_UINT16), - SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleDisaster, unk2), SLE_UINT16), + SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleDisaster, image_override), SLE_UINT16), + SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleDisaster, big_ufo_destroyer_target), SLE_UINT16), /* reserve extra space in savegame here. (currently 16 bytes) */ SLE_CONDNULL(16, 2, SL_MAX_VERSION), @@ -3092,7 +2988,7 @@ }; -static const void *_veh_descs[] = { +static const SaveLoad *_veh_descs[] = { _train_desc, _roadveh_desc, _ship_desc, @@ -3108,7 +3004,7 @@ /* Write the vehicles */ FOR_ALL_VEHICLES(v) { SlSetArrayIndex(v->index); - SlObject(v, (SaveLoad*)_veh_descs[v->type]); + SlObject(v, _veh_descs[v->type]); } } @@ -3122,25 +3018,20 @@ while ((index = SlIterateArray()) != -1) { Vehicle *v; - - if (!AddBlockIfNeeded(&_Vehicle_pool, index)) - error("Vehicles: failed loading savegame: too many vehicles"); - - v = GetVehicle(index); VehicleType vtype = (VehicleType)SlReadByte(); switch (vtype) { - case VEH_TRAIN: v = new (v) Train(); break; - case VEH_ROAD: v = new (v) RoadVehicle(); break; - case VEH_SHIP: v = new (v) Ship(); break; - case VEH_AIRCRAFT: v = new (v) Aircraft(); break; - case VEH_SPECIAL: v = new (v) SpecialVehicle(); break; - case VEH_DISASTER: v = new (v) DisasterVehicle(); break; - case VEH_INVALID: v = new (v) InvalidVehicle(); break; + case VEH_TRAIN: v = new (index) Train(); break; + case VEH_ROAD: v = new (index) RoadVehicle(); break; + case VEH_SHIP: v = new (index) Ship(); break; + case VEH_AIRCRAFT: v = new (index) Aircraft(); break; + case VEH_SPECIAL: v = new (index) SpecialVehicle(); break; + case VEH_DISASTER: v = new (index) DisasterVehicle(); break; + case VEH_INVALID: v = new (index) InvalidVehicle(); break; default: NOT_REACHED(); } - SlObject(v, (SaveLoad*)_veh_descs[vtype]); + SlObject(v, _veh_descs[vtype]); if (_cargo_count != 0 && IsPlayerBuildableVehicleType(v)) { /* Don't construct the packet with station here, because that'll fail with old savegames */ diff -r 31fcaa5375a1 -r e72987579514 src/vehicle.h --- a/src/vehicle.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/vehicle.h Fri Aug 03 22:09:42 2007 +0000 @@ -202,26 +202,26 @@ }; struct VehicleSpecial { - uint16 unk0; - byte unk2; + uint16 animation_state; + byte animation_substate; }; struct VehicleDisaster { uint16 image_override; - uint16 unk2; + VehicleID big_ufo_destroyer_target; }; struct VehicleShip { TrackBitsByte state; }; +struct Vehicle; +DECLARE_OLD_POOL(Vehicle, Vehicle, 9, 125) -struct Vehicle { +struct Vehicle : PoolItem { VehicleTypeByte type; ///< Type of vehicle byte subtype; // subtype (Filled with values from EffectVehicles/TrainSubTypes/AircraftSubTypes) - VehicleID index; // NOSAVE: Index in vehicle array - Vehicle *next; // next Vehicle *first; // NOSAVE: pointer to the first vehicle in the chain Vehicle *depot_list; //NOSAVE: linked list to tell what vehicles entered a depot during the last tick. Used by autoreplace @@ -335,6 +335,23 @@ VehicleShip ship; } u; + + /** + * Allocates a lot of vehicles. + * @param vl pointer to an array of vehicles to get allocated. Can be NULL if the vehicles aren't needed (makes it test only) + * @param num number of vehicles to allocate room for + * @return true if there is room to allocate all the vehicles + */ + static bool AllocateList(Vehicle **vl, int num); + + /** Create a new vehicle */ + Vehicle(); + + /** We want to 'destruct' the right class. */ + virtual ~Vehicle(); + + void QuickFree(); + void BeginLoading(); void LeaveStation(); @@ -346,41 +363,10 @@ void HandleLoading(bool mode = false); /** - * An overriden version of new, so you can use the vehicle instance - * instead of a newly allocated piece of memory. - * @param size the size of the variable (unused) - * @param v the vehicle to use as 'storage' backend - * @return the memory that is 'allocated' - */ - void* operator new(size_t size, Vehicle *v) { return v; } - - /** - * 'Free' the memory allocated by the overriden new. - * @param p the memory to 'free' - * @param v the vehicle that was given to 'new' on creation. - * @note This function isn't used (at the moment) and only added - * to please some compiler. - */ - void operator delete(void *p, Vehicle *v) {} - - /** - * 'Free' the memory allocated by the overriden new. - * @param p the memory to 'free' - * @note This function isn't used (at the moment) and only added - * as the above function was needed to please some compiler - * which made it necessary to add this to please yet - * another compiler... - */ - void operator delete(void *p) {} - - /** We want to 'destruct' the right class. */ - virtual ~Vehicle() {} - - /** * Get a string 'representation' of the vehicle type. * @return the string representation. */ - virtual const char* GetTypeString() const = 0; + virtual const char* GetTypeString() const { return "base vehicle"; } /** * Marks the vehicles to be redrawn and updates cached variables @@ -431,7 +417,9 @@ /** * Calls the tick handler of the vehicle */ - virtual void Tick() = 0; + virtual void Tick() {}; + + bool IsValid() const { return this->type != VEH_INVALID; } }; /** @@ -507,16 +495,12 @@ typedef void *VehicleFromPosProc(Vehicle *v, void *data); void VehicleServiceInDepot(Vehicle *v); -Vehicle *AllocateVehicle(); -bool AllocateVehicles(Vehicle **vl, int num); -Vehicle *ForceAllocateVehicle(); -Vehicle *ForceAllocateSpecialVehicle(); void VehiclePositionChanged(Vehicle *v); void AfterLoadVehicles(); Vehicle *GetLastVehicleInChain(Vehicle *v); Vehicle *GetPrevVehicleInChain(const Vehicle *v); Vehicle *GetFirstVehicleInChain(const Vehicle *v); -uint CountVehiclesInChain(const Vehicle* v); +uint CountVehiclesInChain(const Vehicle *v); bool IsEngineCountable(const Vehicle *v); void DeleteVehicleChain(Vehicle *v); void *VehicleFromPos(TileIndex tile, void *data, VehicleFromPosProc *proc); @@ -592,7 +576,7 @@ }; struct GetNewVehiclePosResult { - int x,y; + int x, y; TileIndex old_tile; TileIndex new_tile; }; @@ -612,12 +596,10 @@ /* returns true if staying in the same tile */ GetNewVehiclePosResult GetNewVehiclePos(const Vehicle *v); -Direction GetDirectionTowards(const Vehicle* v, int x, int y); +Direction GetDirectionTowards(const Vehicle *v, int x, int y); #define BEGIN_ENUM_WAGONS(v) do { -#define END_ENUM_WAGONS(v) } while ( (v=v->next) != NULL); - -DECLARE_OLD_POOL(Vehicle, Vehicle, 9, 125) +#define END_ENUM_WAGONS(v) } while ((v = v->next) != NULL); static inline VehicleID GetMaxVehicleIndex() { @@ -634,22 +616,6 @@ return GetVehiclePoolSize(); } -/** - * Check if a Vehicle really exists. - */ -static inline bool IsValidVehicle(const Vehicle *v) -{ - return v->type != VEH_INVALID; -} - -void DestroyVehicle(Vehicle *v); - -static inline void DeleteVehicle(Vehicle *v) -{ - DestroyVehicle(v); - v = new (v) InvalidVehicle(); -} - static inline bool IsPlayerBuildableVehicleType(VehicleType type) { switch (type) { @@ -668,7 +634,7 @@ return IsPlayerBuildableVehicleType(v->type); } -#define FOR_ALL_VEHICLES_FROM(v, start) for (v = GetVehicle(start); v != NULL; v = (v->index + 1U < GetVehiclePoolSize()) ? GetVehicle(v->index + 1) : NULL) if (IsValidVehicle(v)) +#define FOR_ALL_VEHICLES_FROM(v, start) for (v = GetVehicle(start); v != NULL; v = (v->index + 1U < GetVehiclePoolSize()) ? GetVehicle(v->index + 1) : NULL) if (v->IsValid()) #define FOR_ALL_VEHICLES(v) FOR_ALL_VEHICLES_FROM(v, 0) /** @@ -678,7 +644,7 @@ */ static inline bool IsValidVehicleID(uint index) { - return index < GetVehiclePoolSize() && IsValidVehicle(GetVehicle(index)); + return index < GetVehiclePoolSize() && GetVehicle(index)->IsValid(); } /* Returns order 'index' of a vehicle or NULL when it doesn't exists */ diff -r 31fcaa5375a1 -r e72987579514 src/vehicle_gui.cpp --- a/src/vehicle_gui.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/vehicle_gui.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -409,7 +409,7 @@ }; static const WindowDesc _vehicle_refit_desc = { - WDP_AUTO, WDP_AUTO, 240, 174, + WDP_AUTO, WDP_AUTO, 240, 174, 240, 174, WC_VEHICLE_REFIT, WC_VEHICLE_VIEW, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE, _vehicle_refit_widgets, @@ -1184,7 +1184,7 @@ } static const WindowDesc _player_vehicle_list_train_desc = { - WDP_AUTO, WDP_AUTO, 260, 182, + WDP_AUTO, WDP_AUTO, 260, 182, 260, 182, WC_TRAINS_LIST, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE, _vehicle_list_widgets, @@ -1192,7 +1192,7 @@ }; static const WindowDesc _player_vehicle_list_road_veh_desc = { - WDP_AUTO, WDP_AUTO, 260, 182, + WDP_AUTO, WDP_AUTO, 260, 182, 260, 182, WC_ROADVEH_LIST, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE, _vehicle_list_widgets, @@ -1200,7 +1200,7 @@ }; static const WindowDesc _player_vehicle_list_ship_desc = { - WDP_AUTO, WDP_AUTO, 260, 182, + WDP_AUTO, WDP_AUTO, 260, 182, 260, 182, WC_SHIPS_LIST, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE, _vehicle_list_widgets, @@ -1208,7 +1208,7 @@ }; static const WindowDesc _player_vehicle_list_aircraft_desc = { - WDP_AUTO, WDP_AUTO, 260, 182, + WDP_AUTO, WDP_AUTO, 260, 182, 260, 182, WC_AIRCRAFT_LIST, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE, _vehicle_list_widgets, diff -r 31fcaa5375a1 -r e72987579514 src/video/cocoa_v.mm --- a/src/video/cocoa_v.mm Fri Aug 03 19:16:36 2007 +0000 +++ b/src/video/cocoa_v.mm Fri Aug 03 22:09:42 2007 +0000 @@ -237,8 +237,7 @@ AS(QZ_BACKQUOTE, WKC_BACKQUOTE), // key left of '1' AS(QZ_BACKQUOTE2, WKC_BACKQUOTE), // some keyboards have it on another scancode - // Pageup stuff + up/down - //AM(SDLK_PAGEUP, SDLK_PAGEDOWN, WKC_PAGEUP, WKC_PAGEDOWN), <==== Does this include HOME/END? + /* Pageup stuff + up/down */ AS(QZ_PAGEUP, WKC_PAGEUP), AS(QZ_PAGEDOWN, WKC_PAGEDOWN), @@ -253,7 +252,7 @@ AS(QZ_INSERT, WKC_INSERT), AS(QZ_DELETE, WKC_DELETE), - // Letters. QZ_[a-z] is not in numerical order so we can't use AM(...) + /* Letters. QZ_[a-z] is not in numerical order so we can't use AM(...) */ AS(QZ_a, 'A'), AS(QZ_b, 'B'), AS(QZ_c, 'C'), @@ -280,7 +279,7 @@ AS(QZ_x, 'X'), AS(QZ_y, 'Y'), AS(QZ_z, 'Z'), - // Same thing for digits + /* Same thing for digits */ AS(QZ_0, '0'), AS(QZ_1, '1'), AS(QZ_2, '2'), @@ -300,7 +299,7 @@ AS(QZ_RETURN, WKC_RETURN), AS(QZ_TAB, WKC_TAB), - // Function keys + /* Function keys */ AS(QZ_F1, WKC_F1), AS(QZ_F2, WKC_F2), AS(QZ_F3, WKC_F3), @@ -314,7 +313,7 @@ AS(QZ_F11, WKC_F11), AS(QZ_F12, WKC_F12), - // Numeric part. + /* Numeric part */ AS(QZ_KP0, WKC_NUM_0), AS(QZ_KP1, WKC_NUM_1), AS(QZ_KP2, WKC_NUM_2), @@ -330,7 +329,20 @@ AS(QZ_KP_MINUS, WKC_NUM_MINUS), AS(QZ_KP_PLUS, WKC_NUM_PLUS), AS(QZ_KP_ENTER, WKC_NUM_ENTER), - AS(QZ_KP_PERIOD, WKC_NUM_DECIMAL) + AS(QZ_KP_PERIOD, WKC_NUM_DECIMAL), + + /* Other non-letter keys */ + AS(QZ_SLASH, WKC_SLASH), + AS(QZ_SEMICOLON, WKC_SEMICOLON), + AS(QZ_EQUALS, WKC_EQUALS), + AS(QZ_LEFTBRACKET, WKC_L_BRACKET), + AS(QZ_BACKSLASH, WKC_BACKSLASH), + AS(QZ_RIGHTBRACKET, WKC_R_BRACKET), + + AS(QZ_QUOTE, WKC_SINGLEQUOTE), + AS(QZ_COMMA, WKC_COMMA), + AS(QZ_MINUS, WKC_MINUS), + AS(QZ_PERIOD, WKC_PERIOD) }; diff -r 31fcaa5375a1 -r e72987579514 src/video/sdl_v.cpp --- a/src/video/sdl_v.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/video/sdl_v.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -240,7 +240,7 @@ #define AM(x, y, z, w) {x, y - x, z} static const VkMapping _vk_mapping[] = { - // Pageup stuff + up/down + /* Pageup stuff + up/down */ AM(SDLK_PAGEUP, SDLK_PAGEDOWN, WKC_PAGEUP, WKC_PAGEDOWN), AS(SDLK_UP, WKC_UP), AS(SDLK_DOWN, WKC_DOWN), @@ -253,7 +253,7 @@ AS(SDLK_INSERT, WKC_INSERT), AS(SDLK_DELETE, WKC_DELETE), - // Map letters & digits + /* Map letters & digits */ AM(SDLK_a, SDLK_z, 'A', 'Z'), AM(SDLK_0, SDLK_9, '0', '9'), @@ -265,18 +265,30 @@ AS(SDLK_RETURN, WKC_RETURN), AS(SDLK_TAB, WKC_TAB), - // Function keys + /* Function keys */ AM(SDLK_F1, SDLK_F12, WKC_F1, WKC_F12), - // Numeric part. - // What is the virtual keycode for numeric enter?? + /* Numeric part. */ AM(SDLK_KP0, SDLK_KP9, WKC_NUM_0, WKC_NUM_9), AS(SDLK_KP_DIVIDE, WKC_NUM_DIV), AS(SDLK_KP_MULTIPLY, WKC_NUM_MUL), AS(SDLK_KP_MINUS, WKC_NUM_MINUS), AS(SDLK_KP_PLUS, WKC_NUM_PLUS), AS(SDLK_KP_ENTER, WKC_NUM_ENTER), - AS(SDLK_KP_PERIOD, WKC_NUM_DECIMAL) + AS(SDLK_KP_PERIOD, WKC_NUM_DECIMAL), + + /* Other non-letter keys */ + AS(SDLK_SLASH, WKC_SLASH), + AS(SDLK_SEMICOLON, WKC_SEMICOLON), + AS(SDLK_EQUALS, WKC_EQUALS), + AS(SDLK_LEFTBRACKET, WKC_L_BRACKET), + AS(SDLK_BACKSLASH, WKC_BACKSLASH), + AS(SDLK_RIGHTBRACKET, WKC_R_BRACKET), + + AS(SDLK_QUOTE, WKC_SINGLEQUOTE), + AS(SDLK_COMMA, WKC_COMMA), + AS(SDLK_MINUS, WKC_MINUS), + AS(SDLK_PERIOD, WKC_PERIOD) }; static uint32 ConvertSdlKeyIntoMy(SDL_keysym *sym) diff -r 31fcaa5375a1 -r e72987579514 src/video/win32_v.cpp --- a/src/video/win32_v.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/video/win32_v.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -83,9 +83,9 @@ #define AM(x, y, z, w) {x, y - x, z} static const VkMapping _vk_mapping[] = { - // Pageup stuff + up/down + /* Pageup stuff + up/down */ AM(VK_PRIOR,VK_DOWN, WKC_PAGEUP, WKC_DOWN), - // Map letters & digits + /* Map letters & digits */ AM('A','Z','A','Z'), AM('0','9','0','9'), @@ -98,17 +98,29 @@ AS(VK_RETURN, WKC_RETURN), AS(VK_TAB, WKC_TAB), - // Function keys + /* Function keys */ AM(VK_F1, VK_F12, WKC_F1, WKC_F12), - // Numeric part. - // What is the virtual keycode for numeric enter?? + /* Numeric part */ AM(VK_NUMPAD0, VK_NUMPAD9, WKC_NUM_0, WKC_NUM_9), AS(VK_DIVIDE, WKC_NUM_DIV), AS(VK_MULTIPLY, WKC_NUM_MUL), AS(VK_SUBTRACT, WKC_NUM_MINUS), AS(VK_ADD, WKC_NUM_PLUS), - AS(VK_DECIMAL, WKC_NUM_DECIMAL) + AS(VK_DECIMAL, WKC_NUM_DECIMAL), + + /* Other non-letter keys */ + AS(0xBF, WKC_SLASH), + AS(0xBA, WKC_SEMICOLON), + AS(0xBB, WKC_EQUALS), + AS(0xDB, WKC_L_BRACKET), + AS(0xDC, WKC_BACKSLASH), + AS(0xDD, WKC_R_BRACKET), + + AS(0xDE, WKC_SINGLEQUOTE), + AS(0xBC, WKC_COMMA), + AS(0xBD, WKC_MINUS), + AS(0xBE, WKC_PERIOD) }; static uint MapWindowsKey(uint sym) @@ -137,7 +149,7 @@ if (AllocateDibSection(w, h)) { // mark all palette colors dirty _pal_first_dirty = 0; - _pal_count_dirty = 255; + _pal_count_dirty = 256; GameSizeChanged(); // redraw screen diff -r 31fcaa5375a1 -r e72987579514 src/viewport.cpp --- a/src/viewport.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/viewport.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -134,7 +134,8 @@ return p; } -void InitViewports() { +void InitViewports() +{ memset(_viewports, 0, sizeof(_viewports)); _active_viewports = 0; } @@ -477,8 +478,18 @@ AddChildSpriteScreen(image, pal, pt.x - vd->parent_list[-1]->left, pt.y - vd->parent_list[-1]->top); } - -void AddSortableSpriteToDraw(SpriteID image, SpriteID pal, int x, int y, int w, int h, byte dz, byte z) +/** Draw a (transparent) sprite at given coordinates + * @param image the image to combine and draw, + * @param pal the provided palette, + * @param x position x of the sprite, + * @param y position y of the sprite, + * @param w width of the sprite, + * @param h height of the sprite, + * @param dz delta z, difference of elevation between sprite and parent sprite, + * @param z elevation of the sprite, + * @param transparent if true, switch the palette between the provided palette and the transparent palette + */ +void AddSortableSpriteToDraw(SpriteID image, SpriteID pal, int x, int y, int w, int h, byte dz, byte z, bool transparent) { ViewportDrawer *vd = _cur_vd; ParentSpriteToDraw *ps; @@ -487,6 +498,12 @@ assert((image & SPRITE_MASK) < MAX_SPRITES); + /* make the sprites transparent with the right palette */ + if (transparent) { + SETBIT(image, PALETTE_MODIFIER_TRANSPARENT); + pal = PALETTE_TO_TRANSPARENT; + } + if (vd->combine_sprites == 2) { AddCombinedSprite(image, pal, x, y, z); return; diff -r 31fcaa5375a1 -r e72987579514 src/viewport.h --- a/src/viewport.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/viewport.h Fri Aug 03 22:09:42 2007 +0000 @@ -41,14 +41,14 @@ static inline void MaxZoomInOut(int how, Window *w) { - while (DoZoomInOutWindow(how, w) ) {}; + while (DoZoomInOutWindow(how, w)) {}; } void OffsetGroundSprite(int x, int y); void DrawGroundSprite(SpriteID image, SpriteID pal); void DrawGroundSpriteAt(SpriteID image, SpriteID pal, int32 x, int32 y, byte z); -void AddSortableSpriteToDraw(SpriteID image, SpriteID pal, int x, int y, int w, int h, byte dz, byte z); +void AddSortableSpriteToDraw(SpriteID image, SpriteID pal, int x, int y, int w, int h, byte dz, byte z, bool transparent = false); void *AddStringToDraw(int x, int y, StringID string, uint64 params_1, uint64 params_2); void AddChildSpriteScreen(SpriteID image, SpriteID pal, int x, int y); diff -r 31fcaa5375a1 -r e72987579514 src/water_cmd.cpp --- a/src/water_cmd.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/water_cmd.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -28,6 +28,7 @@ #include "water_map.h" #include "newgrf.h" #include "newgrf_canal.h" +#include "misc/autoptr.hpp" static const SpriteID _water_shore_sprites[] = { 0, @@ -62,7 +63,6 @@ TileIndex tile2; CommandCost cost, ret; - Depot *depot; SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION); @@ -83,17 +83,18 @@ ret = DoCommand(tile2, 0, 0, flags, CMD_LANDSCAPE_CLEAR); if (CmdFailed(ret)) return CMD_ERROR; - depot = AllocateDepot(); + Depot *depot = new Depot(tile); if (depot == NULL) return CMD_ERROR; + AutoPtrT d_auto_delete = depot; if (flags & DC_EXEC) { - depot->xy = tile; depot->town_index = ClosestTownFromTile(tile, (uint)-1)->index; MakeShipDepot(tile, _current_player, DEPOT_NORTH, axis); MakeShipDepot(tile2, _current_player, DEPOT_SOUTH, axis); MarkTileDirtyByTile(tile); MarkTileDirtyByTile(tile2); + d_auto_delete.Detach(); } return cost.AddCost(_price.build_ship_depot); @@ -113,7 +114,7 @@ if (flags & DC_EXEC) { /* Kill the depot, which is registered at the northernmost tile. Use that one */ - DeleteDepot(GetDepotByTile(tile2 < tile ? tile2 : tile)); + delete GetDepotByTile(tile2 < tile ? tile2 : tile); MakeWater(tile); MakeWater(tile2); @@ -441,23 +442,11 @@ DrawGroundSprite(image, PAL_NONE); for (; wdts->delta_x != 0x80; wdts++) { - SpriteID image = wdts->image; - SpriteID pal; - - if (image < 24) image += locks_base; - image += base; - - if (HASBIT(_transparent_opt, TO_BUILDINGS)) { - SETBIT(image, PALETTE_MODIFIER_TRANSPARENT); - pal = PALETTE_TO_TRANSPARENT; - } else { - pal = palette; - } - - AddSortableSpriteToDraw(image, pal, + AddSortableSpriteToDraw(wdts->image + base + ((wdts->image < 24) ? locks_base : 0), palette, ti->x + wdts->delta_x, ti->y + wdts->delta_y, wdts->width, wdts->height, - wdts->unk, ti->z + wdts->delta_z); + wdts->unk, ti->z + wdts->delta_z, + HASBIT(_transparent_opt, TO_BUILDINGS)); } } @@ -512,9 +501,9 @@ return z + GetPartialZ(x & 0xF, y & 0xF, tileh); } -static Slope GetSlopeTileh_Water(TileIndex tile, Slope tileh) +static Foundation GetFoundation_Water(TileIndex tile, Slope tileh) { - return tileh; + return FOUNDATION_NONE; } static void GetAcceptedCargo_Water(TileIndex tile, AcceptedCargo ac) @@ -824,5 +813,5 @@ ChangeTileOwner_Water, /* change_tile_owner_clear */ NULL, /* get_produced_cargo_proc */ VehicleEnter_Water, /* vehicle_enter_tile_proc */ - GetSlopeTileh_Water, /* get_slope_tileh_proc */ + GetFoundation_Water, /* get_foundation_proc */ }; diff -r 31fcaa5375a1 -r e72987579514 src/waypoint.cpp --- a/src/waypoint.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/waypoint.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -26,50 +26,14 @@ #include "newgrf.h" #include "string.h" #include "strings.h" +#include "misc/autoptr.hpp" enum { MAX_WAYPOINTS_PER_TOWN = 64, }; -/** - * Called if a new block is added to the waypoint-pool - */ -static void WaypointPoolNewBlock(uint start_item) -{ - Waypoint *wp; - - /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. - * TODO - This is just a temporary stage, this will be removed. */ - for (wp = GetWaypoint(start_item); wp != NULL; wp = (wp->index + 1U < GetWaypointPoolSize()) ? GetWaypoint(wp->index + 1U) : NULL) wp->index = start_item++; -} - -DEFINE_OLD_POOL(Waypoint, Waypoint, WaypointPoolNewBlock, NULL) +DEFINE_OLD_POOL_GENERIC(Waypoint, Waypoint) -/** - * Create a new waypoint - * @return a pointer to the newly created Waypoint */ -static Waypoint* AllocateWaypoint() -{ - Waypoint *wp; - - /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. - * TODO - This is just a temporary stage, this will be removed. */ - for (wp = GetWaypoint(0); wp != NULL; wp = (wp->index + 1U < GetWaypointPoolSize()) ? GetWaypoint(wp->index + 1U) : NULL) { - if (!IsValidWaypoint(wp)) { - uint index = wp->index; - - memset(wp, 0, sizeof(*wp)); - wp->index = index; - - return wp; - } - } - - /* Check if we can add a block to the pool */ - if (AddBlockToPool(&_Waypoint_pool)) return AllocateWaypoint(); - - return NULL; -} /** * Update the sign for the waypoint @@ -106,19 +70,6 @@ } /** - * Internal handler to delete a waypoint - * @param wp Waypoint to delete - */ -void DestroyWaypoint(Waypoint *wp) -{ - RemoveOrderFromAllVehicles(OT_GOTO_WAYPOINT, wp->index); - - if (wp->string != STR_NULL) DeleteName(wp->string); - - RedrawWaypointSign(wp); -} - -/** * Set the default name for a waypoint * @param wp Waypoint to work on */ @@ -206,6 +157,7 @@ CommandCost CmdBuildTrainWaypoint(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) { Waypoint *wp; + AutoPtrT wp_auto_delete; Slope tileh; Axis axis; @@ -236,9 +188,11 @@ /* Check if there is an already existing, deleted, waypoint close to us that we can reuse. */ wp = FindDeletedWaypointCloseTo(tile); if (wp == NULL) { - wp = AllocateWaypoint(); + wp = new Waypoint(tile); if (wp == NULL) return CMD_ERROR; + wp_auto_delete = wp; + wp->town_index = 0; wp->string = STR_NULL; wp->town_cn = 0; @@ -264,7 +218,6 @@ } wp->deleted = 0; - wp->xy = tile; wp->build_date = _date; if (wp->town_index == 0) MakeDefaultWaypointName(wp); @@ -272,6 +225,7 @@ UpdateWaypointSign(wp); RedrawWaypointSign(wp); YapfNotifyTrackLayoutChange(tile, AxisToTrack(axis)); + wp_auto_delete.Detach(); } return CommandCost(_price.build_train_depot); @@ -443,6 +397,32 @@ } } +Waypoint::Waypoint(TileIndex tile) +{ + this->xy = tile; +} + +Waypoint::~Waypoint() +{ + RemoveOrderFromAllVehicles(OT_GOTO_WAYPOINT, this->index); + + RedrawWaypointSign(this); + this->xy = 0; + + this->QuickFree(); +} + +void Waypoint::QuickFree() +{ + if (this->string != STR_NULL) DeleteName(this->string); +} + +bool Waypoint::IsValid() const +{ + return this->xy != 0; +} + + /** * Fix savegames which stored waypoints in their old format */ @@ -463,8 +443,8 @@ void InitializeWaypoints() { - CleanPool(&_Waypoint_pool); - AddBlockToPool(&_Waypoint_pool); + _Waypoint_pool.CleanPool(); + _Waypoint_pool.AddBlockToPool(); } static const SaveLoad _waypoint_desc[] = { @@ -498,12 +478,7 @@ int index; while ((index = SlIterateArray()) != -1) { - Waypoint *wp; - - if (!AddBlockIfNeeded(&_Waypoint_pool, index)) - error("Waypoints: failed loading savegame: too many waypoints"); - - wp = GetWaypoint(index); + Waypoint *wp = new (index) Waypoint(); SlObject(wp, _waypoint_desc); } } diff -r 31fcaa5375a1 -r e72987579514 src/waypoint.h --- a/src/waypoint.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/waypoint.h Fri Aug 03 22:09:42 2007 +0000 @@ -8,9 +8,11 @@ #include "oldpool.h" #include "rail_map.h" -struct Waypoint { +struct Waypoint; +DECLARE_OLD_POOL(Waypoint, Waypoint, 3, 8000) + +struct Waypoint : PoolItem { TileIndex xy; ///< Tile of waypoint - WaypointID index; ///< Index of waypoint TownID town_index; ///< Town associated with the waypoint byte town_cn; ///< The Nth waypoint for this town (consecutive number) @@ -24,34 +26,26 @@ byte localidx; ///< Index of station within GRF file byte deleted; ///< Delete counter. If greater than 0 then it is decremented until it reaches 0; the waypoint is then is deleted. -}; - -DECLARE_OLD_POOL(Waypoint, Waypoint, 3, 8000) -/** - * Check if a Waypoint really exists. - * @param wp Waypoint to query - * @return the validity of the waypoint - */ -static inline bool IsValidWaypoint(const Waypoint *wp) -{ - return wp->xy != 0; -} + Waypoint(TileIndex tile = 0); + ~Waypoint(); + + void QuickFree(); + + bool IsValid() const; +}; static inline bool IsValidWaypointID(WaypointID index) { - return index < GetWaypointPoolSize() && IsValidWaypoint(GetWaypoint(index)); + return index < GetWaypointPoolSize() && GetWaypoint(index)->IsValid(); } -void DestroyWaypoint(Waypoint *wp); - static inline void DeleteWaypoint(Waypoint *wp) { - DestroyWaypoint(wp); - wp->xy = 0; + wp->~Waypoint(); } -#define FOR_ALL_WAYPOINTS_FROM(wp, start) for (wp = GetWaypoint(start); wp != NULL; wp = (wp->index + 1U < GetWaypointPoolSize()) ? GetWaypoint(wp->index + 1U) : NULL) if (IsValidWaypoint(wp)) +#define FOR_ALL_WAYPOINTS_FROM(wp, start) for (wp = GetWaypoint(start); wp != NULL; wp = (wp->index + 1U < GetWaypointPoolSize()) ? GetWaypoint(wp->index + 1U) : NULL) if (wp->IsValid()) #define FOR_ALL_WAYPOINTS(wp) FOR_ALL_WAYPOINTS_FROM(wp, 0) @@ -69,7 +63,7 @@ CommandCost RemoveTrainWaypoint(TileIndex tile, uint32 flags, bool justremove); Station *ComposeWaypointStation(TileIndex tile); void ShowRenameWaypointWindow(const Waypoint *cp); -void DrawWaypointSprite(int x, int y, int image, RailType railtype); +void DrawWaypointSprite(int x, int y, int stat_id, RailType railtype); void FixOldWaypoints(); void UpdateAllWaypointSigns(); void AfterLoadWaypoints(); diff -r 31fcaa5375a1 -r e72987579514 src/win32.cpp --- a/src/win32.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/win32.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -110,7 +110,8 @@ static uint32 *_crc_table; -static void MakeCRCTable(uint32 *table) { +static void MakeCRCTable(uint32 *table) +{ uint32 crc, poly = 0xEDB88320L; int i; int j; @@ -126,7 +127,8 @@ } } -static uint32 CalcCRC(byte *data, uint size, uint32 crc) { +static uint32 CalcCRC(byte *data, uint size, uint32 crc) +{ for (; size > 0; size--) { crc = ((crc >> 8) & 0x00FFFFFF) ^ _crc_table[(crc ^ *data++) & 0xFF]; } @@ -1014,7 +1016,7 @@ * and append this up to the maximum length (either absolute or screenlength). If maxlength * is zero, we don't care about the screenlength but only about the physical length of the string * @param tb Textbuf type to be changed - * @return true on successfull change of Textbuf, or false otherwise + * @return true on successful change of Textbuf, or false otherwise */ bool InsertTextBufferClipboard(Textbuf *tb) { @@ -1262,3 +1264,17 @@ return E_INVALIDARG; } + +/** Determine the current user's locale. */ +const char *GetCurrentLocale(const char *) +{ + char lang[9], country[9]; + if (GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME, lang, lengthof(lang)) == 0 || + GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SISO3166CTRYNAME, country, lengthof(country)) == 0) { + /* Unable to retrieve the locale. */ + return NULL; + } + /* Format it as 'en_us'. */ + static char retbuf[6] = {lang[0], lang[1], '_', country[0], country[1], 0}; + return retbuf; +} diff -r 31fcaa5375a1 -r e72987579514 src/window.cpp --- a/src/window.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/window.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -590,16 +590,19 @@ * Only addition here is window_number, which is the window_number being assigned to the new window * @param x offset in pixels from the left of the screen * @param y offset in pixels from the top of the screen - * @param width width in pixels of the window - * @param height height in pixels of the window + * @param min_width minimum width in pixels of the window + * @param min_height minimum height in pixels of the window + * @param def_width default width in pixels of the window + * @param def_height default height in pixels of the window * @param *proc see WindowProc function to call when any messages/updates happen to the window * @param cls see WindowClass class of the window, used for identification and grouping * @param *widget see Widget pointer to the window layout and various elements * @param window_number number being assigned to the new window + * @param data the data to be given during the WE_CREATE message * @return Window pointer of the newly created window */ static Window *LocalAllocateWindow( - int x, int y, int width, int height, - WindowProc *proc, WindowClass cls, const Widget *widget, int window_number) + int x, int y, int min_width, int min_height, int def_width, int def_height, + WindowProc *proc, WindowClass cls, const Widget *widget, int window_number, void *data) { Window *w = FindFreeWindow(); @@ -617,12 +620,12 @@ w->caption_color = 0xFF; w->left = x; w->top = y; - w->width = width; - w->height = height; + w->width = min_width; + w->height = min_height; w->wndproc = proc; AssignWidgetToWindow(w, widget); - w->resize.width = width; - w->resize.height = height; + w->resize.width = min_width; + w->resize.height = min_height; w->resize.step_width = 1; w->resize.step_height = 1; w->window_number = window_number; @@ -652,7 +655,50 @@ _last_z_window++; } - CallWindowEventNP(w, WE_CREATE); + WindowEvent e; + e.event = WE_CREATE; + e.we.create.data = data; + w->wndproc(w, &e); + + /* Try to make windows smaller when our window is too small. + * w->(width|height) is normally the same as min_(width|height), + * but this way the GUIs can be made a little more dynamic; + * one can use the same spec for multiple windows and those + * can then determine the real minimum size of the window. */ + if (w->width != def_width || w->height != def_height) { + /* Think about the overlapping toolbars when determining the minimum window size */ + int free_height = _screen.height; + const Window *wt = FindWindowById(WC_STATUS_BAR, 0); + if (wt != NULL) free_height -= wt->height; + wt = FindWindowById(WC_MAIN_TOOLBAR, 0); + if (wt != NULL) free_height -= wt->height; + + int enlarge_x = max(min(def_width - w->width, _screen.width - w->width), 0); + int enlarge_y = max(min(def_height - w->height, free_height - w->height), 0); + + /* X and Y has to go by step.. calculate it. + * The cast to int is necessary else x/y are implicitly casted to + * unsigned int, which won't work. */ + if (w->resize.step_width > 1) enlarge_x -= enlarge_x % (int)w->resize.step_width; + if (w->resize.step_height > 1) enlarge_y -= enlarge_y % (int)w->resize.step_height; + + ResizeWindow(w, enlarge_x, enlarge_y); + + WindowEvent e; + e.event = WE_RESIZE; + e.we.sizing.size.x = w->width; + e.we.sizing.size.y = w->height; + e.we.sizing.diff.x = enlarge_x; + e.we.sizing.diff.y = enlarge_y; + w->wndproc(w, &e); + } + + if (w->left + w->width > _screen.width) w->left -= (w->left + w->width - _screen.width); + + const Window *wt = FindWindowById(WC_MAIN_TOOLBAR, 0); + w->top = max(w->top, (wt == NULL || w == wt || y == 0) ? 0 : wt->height); + w->left = max(w->left, 0); + SetWindowDirty(w); return w; @@ -673,9 +719,9 @@ * @return Window pointer of the newly created window */ Window *AllocateWindow( int x, int y, int width, int height, - WindowProc *proc, WindowClass cls, const Widget *widget) + WindowProc *proc, WindowClass cls, const Widget *widget, void *data) { - return LocalAllocateWindow(x, y, width, height, proc, cls, widget, 0); + return LocalAllocateWindow(x, y, width, height, width, height, proc, cls, widget, 0, data); } struct SizeRect { @@ -787,7 +833,7 @@ } } -static Window *LocalAllocateWindowDesc(const WindowDesc *desc, int window_number) +static Window *LocalAllocateWindowDesc(const WindowDesc *desc, int window_number, void *data) { Point pt; Window *w; @@ -800,24 +846,24 @@ w->left < _screen.width - 20 && w->left > -60 && w->top < _screen.height - 20) { pt.x = w->left + 10; - if (pt.x > _screen.width + 10 - desc->width) { - pt.x = (_screen.width + 10 - desc->width) - 20; + if (pt.x > _screen.width + 10 - desc->default_width) { + pt.x = (_screen.width + 10 - desc->default_width) - 20; } pt.y = w->top + 10; } else { switch (desc->left) { case WDP_ALIGN_TBR: { /* Align the right side with the top toolbar */ w = FindWindowById(WC_MAIN_TOOLBAR, 0); - pt.x = (w->left + w->width) - desc->width; + pt.x = (w->left + w->width) - desc->default_width; } break; case WDP_ALIGN_TBL: /* Align the left side with the top toolbar */ pt.x = FindWindowById(WC_MAIN_TOOLBAR, 0)->left; break; case WDP_AUTO: /* Find a good automatic position for the window */ - pt = GetAutoPlacePosition(desc->width, desc->height); + pt = GetAutoPlacePosition(desc->default_width, desc->default_height); goto allocate_window; case WDP_CENTER: /* Centre the window horizontally */ - pt.x = (_screen.width - desc->width) / 2; + pt.x = (_screen.width - desc->default_width) / 2; break; default: pt.x = desc->left; @@ -826,7 +872,7 @@ switch (desc->top) { case WDP_CENTER: /* Centre the window vertically */ - pt.y = (_screen.height - desc->height) / 2; + pt.y = (_screen.height - desc->default_height) / 2; break; /* WDP_AUTO sets the position at once and is controlled by desc->left. * Both left and top must be set to WDP_AUTO */ @@ -842,7 +888,7 @@ } allocate_window: - w = LocalAllocateWindow(pt.x, pt.y, desc->width, desc->height, desc->proc, desc->cls, desc->widgets, window_number); + w = LocalAllocateWindow(pt.x, pt.y, desc->minimum_width, desc->minimum_height, desc->default_width, desc->default_height, desc->proc, desc->cls, desc->widgets, window_number, data); w->desc_flags = desc->flags; return w; } @@ -850,25 +896,27 @@ /** * Open a new window. * @param *desc The pointer to the WindowDesc to be created + * @param data arbitrary data that is send with the WE_CREATE message * @return Window pointer of the newly created window */ -Window *AllocateWindowDesc(const WindowDesc *desc) +Window *AllocateWindowDesc(const WindowDesc *desc, void *data) { - return LocalAllocateWindowDesc(desc, 0); + return LocalAllocateWindowDesc(desc, 0, data); } /** * Open a new window. * @param *desc The pointer to the WindowDesc to be created * @param window_number the window number of the new window + * @param data arbitrary data that is send with the WE_CREATE message * @return see Window pointer of the newly created window */ -Window *AllocateWindowDescFront(const WindowDesc *desc, int window_number) +Window *AllocateWindowDescFront(const WindowDesc *desc, int window_number, void *data) { Window *w; if (BringWindowToFrontById(desc->cls, window_number)) return NULL; - w = LocalAllocateWindowDesc(desc, window_number); + w = LocalAllocateWindowDesc(desc, window_number, data); return w; } @@ -1619,14 +1667,14 @@ /* here allows scrolling in both x and y axis */ #define scrollspeed 3 if (x - 15 < 0) { - WP(w, vp_d).scrollpos_x += ScaleByZoom((x - 15) * scrollspeed, vp->zoom); + WP(w, vp_d).dest_scrollpos_x += ScaleByZoom((x - 15) * scrollspeed, vp->zoom); } else if (15 - (vp->width - x) > 0) { - WP(w, vp_d).scrollpos_x += ScaleByZoom((15 - (vp->width - x)) * scrollspeed, vp->zoom); + WP(w, vp_d).dest_scrollpos_x += ScaleByZoom((15 - (vp->width - x)) * scrollspeed, vp->zoom); } if (y - 15 < 0) { - WP(w, vp_d).scrollpos_y += ScaleByZoom((y - 15) * scrollspeed, vp->zoom); + WP(w, vp_d).dest_scrollpos_y += ScaleByZoom((y - 15) * scrollspeed, vp->zoom); } else if (15 - (vp->height - y) > 0) { - WP(w,vp_d).scrollpos_y += ScaleByZoom((15 - (vp->height - y)) * scrollspeed, vp->zoom); + WP(w, vp_d).dest_scrollpos_y += ScaleByZoom((15 - (vp->height - y)) * scrollspeed, vp->zoom); } #undef scrollspeed } @@ -2007,6 +2055,18 @@ * in a 'backup'-desc that the window should always be centred. */ switch (w->window_class) { case WC_MAIN_TOOLBAR: + if (neww - w->width != 0) { + ResizeWindow(w, min(neww, 640) - w->width, 0); + + WindowEvent e; + e.event = WE_RESIZE; + e.we.sizing.size.x = w->width; + e.we.sizing.size.y = w->height; + e.we.sizing.diff.x = neww - w->width; + e.we.sizing.diff.y = 0; + w->wndproc(w, &e); + } + top = w->top; left = PositionMainToolbar(w); // changes toolbar orientation break; @@ -2024,11 +2084,13 @@ break; case WC_STATUS_BAR: + ResizeWindow(w, clamp(neww, 320, 640) - w->width, 0); top = newh - w->height; left = (neww - w->width) >> 1; break; case WC_SEND_NETWORK_MSG: + ResizeWindow(w, clamp(neww, 320, 640) - w->width, 0); top = (newh - 26); // 26 = height of status bar + height of chat bar left = (neww - w->width) >> 1; break; diff -r 31fcaa5375a1 -r e72987579514 src/window.h --- a/src/window.h Fri Aug 03 19:16:36 2007 +0000 +++ b/src/window.h Fri Aug 03 22:09:42 2007 +0000 @@ -127,7 +127,11 @@ struct WindowEvent { byte event; union { - struct{ + struct { + void *data; + } create; + + struct { Point pt; int widget; } click; @@ -191,7 +195,7 @@ }; struct WindowDesc { - int16 left, top, width, height; + int16 left, top, minimum_width, minimum_height, default_width, default_height; WindowClass cls; WindowClass parent_cls; uint32 flags; @@ -581,10 +585,11 @@ int height, WindowProc *proc, WindowClass cls, - const Widget *widget); + const Widget *widget, + void *data = NULL); -Window *AllocateWindowDesc(const WindowDesc *desc); -Window *AllocateWindowDescFront(const WindowDesc *desc, int window_number); +Window *AllocateWindowDesc(const WindowDesc *desc, void *data = NULL); +Window *AllocateWindowDescFront(const WindowDesc *desc, int window_number, void *data = NULL); void DrawWindowViewport(const Window *w); void ResizeWindow(Window *w, int x, int y); diff -r 31fcaa5375a1 -r e72987579514 src/yapf/yapf_costrail.hpp --- a/src/yapf/yapf_costrail.hpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/yapf/yapf_costrail.hpp Fri Aug 03 22:09:42 2007 +0000 @@ -112,7 +112,7 @@ if (IsDiagonalTrackdir(trackdir)) { cost += YAPF_TILE_LENGTH; switch (GetTileType(tile)) { - case MP_STREET: + case MP_ROAD: /* Increase the cost for level crossings */ if (IsLevelCrossing(tile)) cost += Yapf().PfGetSettings().rail_crossing_penalty; diff -r 31fcaa5375a1 -r e72987579514 src/yapf/yapf_road.cpp --- a/src/yapf/yapf_road.cpp Fri Aug 03 19:16:36 2007 +0000 +++ b/src/yapf/yapf_road.cpp Fri Aug 03 22:09:42 2007 +0000 @@ -48,7 +48,7 @@ if (IsDiagonalTrackdir(trackdir)) { cost += YAPF_TILE_LENGTH; switch (GetTileType(tile)) { - case MP_STREET: + case MP_ROAD: /* Increase the cost for level crossings */ if (IsLevelCrossing(tile)) cost += Yapf().PfGetSettings().road_crossing_penalty; @@ -442,7 +442,7 @@ return NULL; // handle the case when our vehicle is already in the depot tile - if (IsTileType(tile, MP_STREET) && IsTileDepotType(tile, TRANSPORT_ROAD)) { + if (IsTileType(tile, MP_ROAD) && IsTileDepotType(tile, TRANSPORT_ROAD)) { // only what we need to return is the Depot* return GetDepotByTile(tile); }