summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--projects/openttd_vs80.vcproj4
-rw-r--r--projects/openttd_vs90.vcproj4
-rw-r--r--source.list1
-rw-r--r--src/economy.cpp96
-rw-r--r--src/economy_type.h17
-rw-r--r--src/table/pricebase.h55
6 files changed, 107 insertions, 70 deletions
diff --git a/projects/openttd_vs80.vcproj b/projects/openttd_vs80.vcproj
index 26826403a..bf10c3c04 100644
--- a/projects/openttd_vs80.vcproj
+++ b/projects/openttd_vs80.vcproj
@@ -2268,6 +2268,10 @@
>
</File>
<File
+ RelativePath=".\..\src\table\pricebase.h"
+ >
+ </File>
+ <File
RelativePath=".\..\src\table\railtypes.h"
>
</File>
diff --git a/projects/openttd_vs90.vcproj b/projects/openttd_vs90.vcproj
index 903bd692b..0e07feca7 100644
--- a/projects/openttd_vs90.vcproj
+++ b/projects/openttd_vs90.vcproj
@@ -2265,6 +2265,10 @@
>
</File>
<File
+ RelativePath=".\..\src\table\pricebase.h"
+ >
+ </File>
+ <File
RelativePath=".\..\src\table\railtypes.h"
>
</File>
diff --git a/source.list b/source.list
index 4cbe1eb57..4318e4dc4 100644
--- a/source.list
+++ b/source.list
@@ -515,6 +515,7 @@ table/landscape_sprite.h
table/namegen.h
table/palette_convert.h
table/palettes.h
+table/pricebase.h
table/railtypes.h
table/road_land.h
table/roadveh_movement.h
diff --git a/src/economy.cpp b/src/economy.cpp
index 6052c524e..a9cb34aea 100644
--- a/src/economy.cpp
+++ b/src/economy.cpp
@@ -42,6 +42,7 @@
#include "table/strings.h"
#include "table/sprites.h"
+#include "table/pricebase.h"
/* Initialize the cargo payment-pool */
@@ -683,67 +684,6 @@ static void HandleEconomyFluctuations()
}
}
-static byte _price_category[NUM_PRICES] = {
- 0, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 1, 1, 1, 1, 1, 1,
- 2,
-};
-
-static const Money _price_base[NUM_PRICES] = {
- 100, ///< station_value
- 100, ///< build_rail
- 95, ///< build_road
- 65, ///< build_signals
- 275, ///< build_bridge
- 600, ///< build_train_depot
- 500, ///< build_road_depot
- 700, ///< build_ship_depot
- 450, ///< build_tunnel
- 200, ///< train_station_track
- 180, ///< train_station_length
- 600, ///< build_airport
- 200, ///< build_bus_station
- 200, ///< build_truck_station
- 350, ///< build_dock
- 400000, ///< build_railvehicle
- 2000, ///< build_railwagon
- 700000, ///< aircraft_base
- 14000, ///< roadveh_base
- 65000, ///< ship_base
- 20, ///< build_trees
- 250, ///< terraform
- 20, ///< clear_grass
- 40, ///< clear_roughland
- 200, ///< clear_rocks
- 500, ///< clear_fields
- 20, ///< remove_trees
- -70, ///< remove_rail
- 10, ///< remove_signals
- 50, ///< clear_bridge
- 80, ///< remove_train_depot
- 80, ///< remove_road_depot
- 90, ///< remove_ship_depot
- 30, ///< clear_tunnel
- 10000, ///< clear_water
- 50, ///< remove_rail_station
- 30, ///< remove_airport
- 50, ///< remove_bus_station
- 50, ///< remove_truck_station
- 55, ///< remove_dock
- 1600, ///< remove_house
- 40, ///< remove_road
- 5600, ///< running_rail[0] steam
- 5200, ///< running_rail[1] diesel
- 4800, ///< running_rail[2] electric
- 9600, ///< aircraft_running
- 1600, ///< roadveh_running
- 5600, ///< ship_running
- 1000000, ///< build_industry
-};
static byte price_base_multiplier[NUM_PRICES];
@@ -799,21 +739,37 @@ void StartupEconomy()
assert(sizeof(_price) == NUM_PRICES * sizeof(Money));
- for (i = 0; i != NUM_PRICES; i++) {
- Money price = _price_base[i];
- if (_price_category[i] != 0) {
- uint mod = _price_category[i] == 1 ? _settings_game.difficulty.vehicle_costs : _settings_game.difficulty.construction_cost;
- if (mod < 1) {
- price = price * 3 >> 2;
- } else if (mod > 1) {
- price = price * 9 >> 3;
- }
+ /* Setup price bases */
+ for (i = 0; i < NUM_PRICES; i++) {
+ Money price = _price_base_specs[i].start_price;
+
+ /* Apply difficulty settings */
+ uint mod = 1;
+ switch (_price_base_specs[i].category) {
+ case PC_RUNNING:
+ mod = _settings_game.difficulty.vehicle_costs;
+ break;
+
+ case PC_CONSTRUCTION:
+ mod = _settings_game.difficulty.construction_cost;
+ break;
+
+ default: break;
}
+ if (mod < 1) {
+ price = price * 3 >> 2;
+ } else if (mod > 1) {
+ price = price * 9 >> 3;
+ }
+
+ /* Apply newgrf modifiers */
if (price_base_multiplier[i] > 8) {
price <<= price_base_multiplier[i] - 8;
} else {
price >>= 8 - price_base_multiplier[i];
}
+
+ /* Store start value */
((Money*)&_price)[i] = price;
_price_frac[i] = 0;
}
diff --git a/src/economy_type.h b/src/economy_type.h
index c5ae9a0d9..48988bb46 100644
--- a/src/economy_type.h
+++ b/src/economy_type.h
@@ -122,6 +122,23 @@ enum ExpensesType {
INVALID_EXPENSES = 0xFF,
};
+/**
+ * Categories of a price bases.
+ */
+enum PriceCategory {
+ PC_NONE, ///< No category
+ PC_RUNNING, ///< Price is affected by "vehicle running cost" difficulty setting
+ PC_CONSTRUCTION, ///< Price is affected by "construction cost" difficulty setting
+};
+
+/**
+ * Describes properties of price bases.
+ */
+struct PriceBaseSpec {
+ Money start_price; ///< Default value at game start, before adding multipliers.
+ PriceCategory category; ///< Price is affected by certain difficulty settings.
+};
+
/** The "steps" in loan size, in British Pounds! */
static const int LOAN_INTERVAL = 10000;
diff --git a/src/table/pricebase.h b/src/table/pricebase.h
new file mode 100644
index 000000000..1703dd8c0
--- /dev/null
+++ b/src/table/pricebase.h
@@ -0,0 +1,55 @@
+/* $Id$ */
+
+/** @file pricebase.h Price Bases */
+
+static PriceBaseSpec _price_base_specs[NUM_PRICES] = {
+ { 100, PC_NONE }, ///< station_value
+ { 100, PC_CONSTRUCTION}, ///< build_rail
+ { 95, PC_CONSTRUCTION}, ///< build_road
+ { 65, PC_CONSTRUCTION}, ///< build_signals
+ { 275, PC_CONSTRUCTION}, ///< build_bridge
+ { 600, PC_CONSTRUCTION}, ///< build_train_depot
+ { 500, PC_CONSTRUCTION}, ///< build_road_depot
+ { 700, PC_CONSTRUCTION}, ///< build_ship_depot
+ { 450, PC_CONSTRUCTION}, ///< build_tunnel
+ { 200, PC_CONSTRUCTION}, ///< train_station_track
+ { 180, PC_CONSTRUCTION}, ///< train_station_length
+ { 600, PC_CONSTRUCTION}, ///< build_airport
+ { 200, PC_CONSTRUCTION}, ///< build_bus_station
+ { 200, PC_CONSTRUCTION}, ///< build_truck_station
+ { 350, PC_CONSTRUCTION}, ///< build_dock
+ { 400000, PC_CONSTRUCTION}, ///< build_railvehicle
+ { 2000, PC_CONSTRUCTION}, ///< build_railwagon
+ { 700000, PC_CONSTRUCTION}, ///< aircraft_base
+ { 14000, PC_CONSTRUCTION}, ///< roadveh_base
+ { 65000, PC_CONSTRUCTION}, ///< ship_base
+ { 20, PC_CONSTRUCTION}, ///< build_trees
+ { 250, PC_CONSTRUCTION}, ///< terraform
+ { 20, PC_CONSTRUCTION}, ///< clear_grass
+ { 40, PC_CONSTRUCTION}, ///< clear_roughland
+ { 200, PC_CONSTRUCTION}, ///< clear_rocks
+ { 500, PC_CONSTRUCTION}, ///< clear_fields
+ { 20, PC_CONSTRUCTION}, ///< remove_trees
+ { -70, PC_CONSTRUCTION}, ///< remove_rail
+ { 10, PC_CONSTRUCTION}, ///< remove_signals
+ { 50, PC_CONSTRUCTION}, ///< clear_bridge
+ { 80, PC_CONSTRUCTION}, ///< remove_train_depot
+ { 80, PC_CONSTRUCTION}, ///< remove_road_depot
+ { 90, PC_CONSTRUCTION}, ///< remove_ship_depot
+ { 30, PC_CONSTRUCTION}, ///< clear_tunnel
+ { 10000, PC_CONSTRUCTION}, ///< clear_water
+ { 50, PC_CONSTRUCTION}, ///< remove_rail_station
+ { 30, PC_CONSTRUCTION}, ///< remove_airport
+ { 50, PC_CONSTRUCTION}, ///< remove_bus_station
+ { 50, PC_CONSTRUCTION}, ///< remove_truck_station
+ { 55, PC_CONSTRUCTION}, ///< remove_dock
+ { 1600, PC_CONSTRUCTION}, ///< remove_house
+ { 40, PC_CONSTRUCTION}, ///< remove_road
+ { 5600, PC_RUNNING }, ///< running_rail[0] steam
+ { 5200, PC_RUNNING }, ///< running_rail[1] diesel
+ { 4800, PC_RUNNING }, ///< running_rail[2] electric
+ { 9600, PC_RUNNING }, ///< aircraft_running
+ { 1600, PC_RUNNING }, ///< roadveh_running
+ { 5600, PC_RUNNING }, ///< ship_running
+ {1000000, PC_CONSTRUCTION}, ///< build_industry
+};