(svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
--- 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();
--- 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
--- 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() {
--- 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();
}
/**
--- 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;
--- 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);
}
--- 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
--- 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;
}
--- 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);
}
--- 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,
--- 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,
--- 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;
--- 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,
--- 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;
--- 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 */
--- 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,
--- 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);
}
--- 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);
--- 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];
--- 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);
}
}
--- 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 <list>
+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<CargoPacket, CargoPacketID, &_CargoPacket_pool> {
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"
--- 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
};
--- 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);
--- 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)
--- 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;
}
--- 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);
}
}
--- 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);
}
}
--- 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<Depot, DepotID, &_Depot_pool> {
+ 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);
--- 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,
--- 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<Direction> : MakeEnumPropsT<Direction, byte, DIR_BEGIN, DIR_END, INVALID_DIR> {};
typedef TinyEnumT<Direction> 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<DiagDirection> : MakeEnumPropsT<DiagDirection, byte, DIAGDIR_BEGIN, DIAGDIR_END, INVALID_DIAGDIR> {};
typedef TinyEnumT<DiagDirection> 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;
--- 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++) {
--- 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,
--- 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 <string>
#include <map>
-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:
--- 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 */
};
--- 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)
--- 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);
--- 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;
--- 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 <stdio.h>
#include <string.h>
-/** 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");
--- 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<EngineRenew> 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();
}
--- 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<EngineRenew, EngineRenewID, &_EngineRenew_pool> {
+ 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
--- 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,
--- 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);
}
}
--- 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);
--- 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,
--- 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)
--- 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 {
--- 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,
--- 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<Group, GroupID, &_Group_pool> {
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)
/**
--- 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<Group> 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);
}
}
--- 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;
}
--- 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<Industry, IndustryID, &_Industry_pool> {
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 */
--- 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<Industry> 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},
};
--- 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,
--- 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));
}
--- 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,
--- 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);
}
}
--- 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();
--- 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ó
--- 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
--- 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}
--- 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
--- 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 <typename T>
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 <typename T>
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<typename T> 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<typename T> 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<typename T> 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<typename T> 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)))
--- 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,
--- 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
}
--- 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]);
}
--- 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;
}
--- 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;
}
-
--- 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 */
--- 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,
--- 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*);
--- 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,
--- 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. */
--- 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 */
--- 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,
--- 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
--- 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_<CLASS>_<CALLBACK>
*/
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,
--- 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;
--- 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;
--- 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);
--- 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;
--- 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;
--- 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)
--- 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,
--- 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));
--- 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);
--- 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;
--- 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);
--- 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);
--- 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);
--- 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 */
--- 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;
}
--- 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;
--- 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;
--- 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);
--- 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,
--- 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)) {
--- 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[] = {
--- 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<byte>(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<byte>(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;
--- 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 <typename T>
+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 <typename T, OldMemoryPool<T> *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 <typename T, OldMemoryPool<T> *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 <typename T, typename Tid, OldMemoryPool<T> *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<type> _##name##_pool; \
OLD_POOL_ACCESSORS(name, type)
#define DEFINE_OLD_POOL(name, type, new_block_proc, clean_block_proc) \
- OldMemoryPool _##name##_pool = { \
+ OldMemoryPool<type> _##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<type> _##name##_pool( \
+ #name, name##_POOL_MAX_BLOCKS, name##_POOL_BLOCK_SIZE_BITS, sizeof(type), \
+ PoolNewBlock<type, &_##name##_pool>, PoolCleanBlock<type, &_##name##_pool>);
#define STATIC_OLD_POOL(name, type, block_size_bits, max_blocks, new_block_proc, clean_block_proc) \
--- 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;
--- 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;
};
--- 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, OrderID, &_Order_pool> {
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;
}
--- 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);
}
}
--- 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,
--- 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);
--- 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)
{
--- 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;
--- 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,
--- 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 */
--- 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;
--- 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<RailType> 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<Track> 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<Trackdir> : MakeEnumPropsT<Trackdir, byte, TRACKDIR_BEGIN, TRACKDIR_END, INVALID_TRACKDIR> {};
typedef TinyEnumT<Trackdir> 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
--- 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<Depot> 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 */
};
--- 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,
--- 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
--- 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 */
--- 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<Depot> 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 */
};
--- 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,
--- 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;
}
--- 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;
--- 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;
}
--- 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);
--- 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,
--- 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);
}
--- 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,
--- 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;
}
--- 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<Vehicle> 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);
--- 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,
--- 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<Sign> 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++;
--- 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<Sign, SignID, &_Sign_pool> {
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;
--- 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,
--- 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 */
--- 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;
}
--- 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;
};
/**
--- 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 */
--- 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 <list>
+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<RoadStop, RoadStopID, &_RoadStop_pool> {
/** 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<Station, StationID, &_Station_pool> {
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<Vehicle *> 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)
--- 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<Station> 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[] = {
--- 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,
--- 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)
{
--- 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)) {
--- 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 */
--- 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)
{
--- 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];
--- 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,
--- 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
--- 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),
--- 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
--- 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);
}
}
--- 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();
--- 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;
}
--- 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;
--- 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,
--- 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<Town, TownID, &_Town_pool> {
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;
--- 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<Town> 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++;
--- 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,
--- 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));
}
--- 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;
}
}
--- 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,
--- 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,
--- 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 */
};
--- 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);
}
--- 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 */
};
--- 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 */
};
--- 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];
--- 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 */
--- 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<Vehicle, VehicleID, &_Vehicle_pool> {
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 */
--- 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,
--- 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)
};
--- 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)
--- 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
--- 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;
--- 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);
--- 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<Depot> 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 */
};
--- 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<Waypoint> 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);
}
}
--- 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<Waypoint, WaypointID, &_Waypoint_pool> {
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();
--- 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;
+}
--- 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;
--- 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);
--- 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;
--- 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);
}