From dd3101d2797fe94e47d6718b979e01e109971295 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sat, 20 Jan 2018 09:01:55 +0000 Subject: [PATCH 01/10] Start implementing vehicle update. Label all object array addresss --- src/openloco/objects/objectmgr.cpp | 42 +++++++++++++++++++++++++++++- src/openloco/objects/objectmgr.h | 42 ++++++++++++++++++++++++++++++ src/openloco/things/thing.h | 19 +++++++++----- src/openloco/things/vehicle.cpp | 38 ++++++++++++++++++++++++++- src/openloco/things/vehicle.h | 2 ++ 5 files changed, 135 insertions(+), 8 deletions(-) diff --git a/src/openloco/objects/objectmgr.cpp b/src/openloco/objects/objectmgr.cpp index da6e53b2..7c82b247 100644 --- a/src/openloco/objects/objectmgr.cpp +++ b/src/openloco/objects/objectmgr.cpp @@ -5,7 +5,42 @@ using namespace openloco::interop; namespace openloco::objectmgr { - loco_global_array _cargoObjects; + loco_global_array object_repository; + // Array sizes to be confirmed + loco_global_array _interfaceObjects; + loco_global_array _soundObjects; + loco_global_array _currencyObjects; + loco_global_array _steamObjects; + loco_global_array _rockObjects; + loco_global_array _waterObjects; + loco_global_array _surfaceObjects; + loco_global_array _townNameObjects; + loco_global_array _cargoObjects; + loco_global_array _wallObjects; + loco_global_array _trainSignalObjects; + loco_global_array _levlCrossingObjects; + loco_global_array _streetLightObjects; + loco_global_array _tunnelObjects; + loco_global_array _bridgeObjects; + loco_global_array _trainStationObjects; + loco_global_array _trackExtraObjects; + loco_global_array _trackObjects; + loco_global_array _roadStationObjects; + loco_global_array _roadExtraObjects; + loco_global_array _roadObjects; + loco_global_array _airportObjects; + loco_global_array _dockObjects; + loco_global_array _vehicleObjects; + loco_global_array _treeObjects; + loco_global_array _snowObjects; + loco_global_array _cliamteObjects; + loco_global_array _hillShapeObjects; + loco_global_array _buildingObjects; + loco_global_array _scaffoldingObjects; + loco_global_array _industryObjects; + loco_global_array _regionObjects; + loco_global_array _competitorsObjects; + loco_global_array _scenarioTextObjects; // 0x00470F3C void load_index() @@ -18,6 +53,11 @@ namespace openloco::objectmgr return _cargoObjects[id]; } + vehicle_object * get_vehicle_object(size_t id) + { + return _vehicleObjects[id]; + } + size_t get_max_objects(object_type type) { static size_t counts[] = { diff --git a/src/openloco/objects/objectmgr.h b/src/openloco/objects/objectmgr.h index 40b0c216..8caeb03c 100644 --- a/src/openloco/objects/objectmgr.h +++ b/src/openloco/objects/objectmgr.h @@ -42,7 +42,48 @@ namespace openloco scenario_text, }; + struct object; + struct object_entry_extended; struct cargo_object; + struct interface_object; + struct sound_object; + struct currency_object; + struct steam_object; + struct rocks_object; + struct water_object; + struct surface_object; + struct town_name_object; + struct wall_object; + struct train_signal_object; + struct level_crossing_object; + struct street_light_object; + struct tunnel_object; + struct bridge_object; + struct train_station_object; + struct track_extra_object; + struct track_object; + struct road_station_object; + struct road_extra_object; + struct road_object; + struct airport_object; + struct dock_object; + struct vehicle_object; + struct tree_object; + struct snow_object; + struct climate_object; + struct hill_shapes_object; + struct building_object; + struct scaffolding_object; + struct industry_object; + struct region_object; + struct competitors_object; + struct scenario_text_object; + + struct object_repository_item + { + object * objects; + uint32_t * object_entry_extendeds; + }; } namespace openloco::objectmgr @@ -50,4 +91,5 @@ namespace openloco::objectmgr void load_index(); cargo_object* get_cargo_object(size_t id); size_t get_max_objects(object_type type); + vehicle_object * get_vehicle_object(size_t id); } diff --git a/src/openloco/things/thing.h b/src/openloco/things/thing.h index 06f3da3f..2f53a65e 100644 --- a/src/openloco/things/thing.h +++ b/src/openloco/things/thing.h @@ -36,15 +36,22 @@ namespace openloco uint8_t var_15; uint8_t pad_16[0x28 - 0x16]; uint16_t var_28; - uint8_t pad_2A[0x3A - 0x2A]; - thing_id_t next_car_id; // 0x3A - uint8_t pad_3C[0x4C - 0x3C]; - uint8_t cargo_type; // 0x4C + uint8_t pad_2A[0x38 - 0x2A]; + uint8_t var_38; + uint8_t pad_39; + thing_id_t next_car_id; // 0x3A + uint8_t pad_3C[0x40 - 0x3C]; + uint16_t var_40; + uint8_t var_42; + uint8_t pad_43[0x4C - 0x43]; + uint8_t cargo_type; // 0x4C uint8_t pad_4D; uint16_t cargo_origin; // 0x4E uint8_t pad_50; - uint8_t cargo_quantity; // 0x51 - uint8_t pad_52[0x5D - 0x52]; + uint8_t cargo_quantity; // 0x51 + uint8_t pad_52[0x54 - 0x52]; + uint8_t var_54; + uint8_t pad_55[0x5D - 0x55]; uint8_t var_5D; uint8_t pad_5E; uint8_t var_5F; // 0x5F (bit 1 = can break down) diff --git a/src/openloco/things/vehicle.cpp b/src/openloco/things/vehicle.cpp index 8b1b2c9c..97fc5128 100644 --- a/src/openloco/things/vehicle.cpp +++ b/src/openloco/things/vehicle.cpp @@ -3,11 +3,15 @@ #include "../config.h" #include "../interop/interop.hpp" #include "../openloco.h" +#include "../objects/objectmgr.h" #include "../utility/numeric.hpp" #include "thingmgr.h" using namespace openloco; using namespace openloco::interop; +using namespace openloco::objectmgr; + +loco_global vehicle_1136118; vehicle* vehicle::next_vehicle() { @@ -53,7 +57,7 @@ bool vehicle::update() break; case 4: case 5: - result = call(0x004AA1D0, regs); + result = sub_4AA1D0(); break; case 6: result = call(0x004AA24A, regs); @@ -146,3 +150,35 @@ void vehicle::sub_4BAA76() regs.esi = (int32_t)this; call(0x004BAA76, regs); } + +// 0x004AA1D0 +int32_t openloco::vehicle::sub_4AA1D0() +{ + registers regs; + regs.esi = (int32_t)this; + + if (var_42 == 2 || var_42 == 3) + { + call(0x004AAC4E, regs); + return 0; + } + //0x4AA1DC +} + +void openloco::vehicle::sub_4AAC4E() +{ + if (var_38 & (1 << 4)) + return; + + if ((vehicle_1136118->var_5D == 8) || (vehicle_1136118->var_5D == 9)) + return; + + vehicle_object * vehicleObject = get_vehicle_object(var_40); + + if ((vehicleObject + var_54 * 6 + 41) == 0) + { + call(0x004AB655, regs); + return; + } + //0x4AAC91 +} diff --git a/src/openloco/things/vehicle.h b/src/openloco/things/vehicle.h index 967c5d03..1d0e9224 100644 --- a/src/openloco/things/vehicle.h +++ b/src/openloco/things/vehicle.h @@ -22,6 +22,8 @@ namespace openloco private: bool update(); void sub_4BAA76(); + int32_t sub_4AA1D0(); + void sub_4AAC4E(); }; #pragma pack(pop) } From 36ec0674855cbb9e6d72b34806961f6f052d9ae4 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sat, 20 Jan 2018 18:09:07 +0000 Subject: [PATCH 02/10] Add basic structure of vehicle object. Based off knowledge from LocoTools --- src/openloco/objects/vehicle_object.h | 66 +++++++++++++++++++++++++++ src/openloco/things/vehicle.cpp | 3 +- 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 src/openloco/objects/vehicle_object.h diff --git a/src/openloco/objects/vehicle_object.h b/src/openloco/objects/vehicle_object.h new file mode 100644 index 00000000..3abff739 --- /dev/null +++ b/src/openloco/objects/vehicle_object.h @@ -0,0 +1,66 @@ +#pragma once + +#include "../localisation/stringmgr.h" + +namespace openloco +{ + struct vehicle_object_unk + { + uint8_t length; // 0x00 + uint8_t pad_01[0x04 - 0x01]; + uint8_t sprite_ind; // 0x04 + uint8_t var_05; + }; + + struct vehicle_object_sprite + { + uint8_t num_dir; // 0x00 + uint8_t pad_01[0x03 - 0x01]; + uint8_t vehicle_type; // 0x03 + uint8_t num_units; // 0x04 + uint8_t pad_05; + uint8_t bogey_position; // 0x06 + uint8_t flags; // 0x07 + uint8_t pad_08[0x0E - 0x08]; + uint8_t sprite_num; // 0x0E + uint8_t pad_0F[0x1E - 0xF]; + }; + + struct vehicle_object + { + string_id name; // 0x00 probably not confirmed + uint8_t vehicle_class; // 0x02 + uint8_t type; // 0x03 + uint8_t pad_04[0x6 - 0x4]; + uint8_t num_mods; // 0x06 + uint8_t cost_ind; // 0x07 + int16_t cost_fact; // 0x08 + uint8_t reliability; // 0x0A + uint8_t run_cost_ind; // 0x0B + int16_t run_cost_fact; // 0x0C + uint8_t colour_type; // 0x0E + uint8_t num_compat; // 0x0F + uint8_t pad_10[0x24 - 0x10]; + vehicle_object_unk var_24[4]; + vehicle_object_sprite sprites[4]; // 0x3C + uint8_t pad_B4[0xD8 - 0xB4]; + uint16_t power; // 0xD8 + uint16_t speed; // 0xDA + uint16_t rack_speed; // 0xDC + uint16_t weight; // 0xDE + uint16_t flags; // 0xE0 + uint8_t pad_E1[0x10E - 0xE1]; + uint8_t vis_fx_height; // 0x10E + uint8_t vis_fx_type; // 0x10F + uint8_t pad_110[0x112 - 0x110]; + uint8_t wake_fx_type; // 0x112 + uint8_t pad_113; + uint16_t designed; // 0x114 + uint16_t obsolete; // 0x116 + uint8_t pad_118; + uint8_t startsnd_type; // 0x119 + uint8_t pad_11A[0x15A - 0x11A]; + uint8_t numsnd; // 0x15A + uint8_t pad_15B[0x15E - 0x15B]; + }; +} diff --git a/src/openloco/things/vehicle.cpp b/src/openloco/things/vehicle.cpp index 97fc5128..ecc4d7af 100644 --- a/src/openloco/things/vehicle.cpp +++ b/src/openloco/things/vehicle.cpp @@ -3,6 +3,7 @@ #include "../config.h" #include "../interop/interop.hpp" #include "../openloco.h" +#include "../objects/vehicle_object.h" #include "../objects/objectmgr.h" #include "../utility/numeric.hpp" #include "thingmgr.h" @@ -175,7 +176,7 @@ void openloco::vehicle::sub_4AAC4E() vehicle_object * vehicleObject = get_vehicle_object(var_40); - if ((vehicleObject + var_54 * 6 + 41) == 0) + if (vehicleObject->var_24[var_54].var_05 == 0) { call(0x004AB655, regs); return; From a70a0f0ea4a0cbbe154a2cea0733643edf4c70ae Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 21 Jan 2018 07:35:04 +0000 Subject: [PATCH 03/10] Actually add it to the project --- src/openloco/openloco.vcxproj | 1 + 1 file changed, 1 insertion(+) diff --git a/src/openloco/openloco.vcxproj b/src/openloco/openloco.vcxproj index 74863d44..27d0bfad 100644 --- a/src/openloco/openloco.vcxproj +++ b/src/openloco/openloco.vcxproj @@ -63,6 +63,7 @@ + From d9ed76eccab35ae61bfa273feb19648e47787a17 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 21 Jan 2018 09:10:01 +0000 Subject: [PATCH 04/10] Implement more --- src/openloco/things/thing.h | 6 +-- src/openloco/things/vehicle.cpp | 74 +++++++++++++++++++++++++++++---- 2 files changed, 70 insertions(+), 10 deletions(-) diff --git a/src/openloco/things/thing.h b/src/openloco/things/thing.h index 2f53a65e..97186281 100644 --- a/src/openloco/things/thing.h +++ b/src/openloco/things/thing.h @@ -41,7 +41,7 @@ namespace openloco uint8_t pad_39; thing_id_t next_car_id; // 0x3A uint8_t pad_3C[0x40 - 0x3C]; - uint16_t var_40; + uint16_t object_type; uint8_t var_42; uint8_t pad_43[0x4C - 0x43]; uint8_t cargo_type; // 0x4C @@ -53,8 +53,8 @@ namespace openloco uint8_t var_54; uint8_t pad_55[0x5D - 0x55]; uint8_t var_5D; - uint8_t pad_5E; - uint8_t var_5F; // 0x5F (bit 1 = can break down) + uint8_t var_5E; + uint8_t var_5F; // 0x5F (bit 1 = can break down) uint8_t pad_60[0x6A - 0x60]; uint8_t var_6A; uint8_t pad_6B[0x73 - 0x6B]; diff --git a/src/openloco/things/vehicle.cpp b/src/openloco/things/vehicle.cpp index ecc4d7af..baf8a504 100644 --- a/src/openloco/things/vehicle.cpp +++ b/src/openloco/things/vehicle.cpp @@ -12,7 +12,12 @@ using namespace openloco; using namespace openloco::interop; using namespace openloco::objectmgr; -loco_global vehicle_1136118; +loco_global vehicle_1136118; +loco_global vehicle_1136124; +loco_global vehicle_1136128; +loco_global vehicle_var_1136130; +loco_global vehicle_var_1136237; // var_28 related? +loco_global vehicle_var_1136238; // var_28 related? vehicle* vehicle::next_vehicle() { @@ -160,10 +165,35 @@ int32_t openloco::vehicle::sub_4AA1D0() if (var_42 == 2 || var_42 == 3) { - call(0x004AAC4E, regs); + sub_4AAC4E(); return 0; } - //0x4AA1DC + + if (vehicle_var_1136237 | vehicle_var_1136238) + { + call(0x004CBB01, regs); + vehicle * veh = vehicle_1136124; + regs.ebx = (int32_t)veh; + veh = vehicle_1136128; + regs.edi = (int32_t)veh; + call(0x004AC255, regs); + call(0x004CBB01, regs); + } + uint32_t backup1136130 = vehicle_var_1136130; + if (var_5E != 0) + { + uint32_t var_1136130 = var_5E; + if (var_5E > 32) + { + var_1136130 = 64 - var_1136130; + } + + vehicle_var_1136130 += var_1136130 * 320 + 500; + } + sub_4AAC4E(); + call(0x004AAB0B, regs); + vehicle_var_1136130 = backup1136130; + return 0; } void openloco::vehicle::sub_4AAC4E() @@ -171,15 +201,45 @@ void openloco::vehicle::sub_4AAC4E() if (var_38 & (1 << 4)) return; - if ((vehicle_1136118->var_5D == 8) || (vehicle_1136118->var_5D == 9)) + vehicle * veh = vehicle_1136118; + if ((veh->var_5D == 8) || (veh->var_5D == 9)) return; - vehicle_object * vehicleObject = get_vehicle_object(var_40); - + vehicle_object * vehicleObject = get_vehicle_object(object_type); + registers regs; + regs.esi = (int32_t)this; + regs.bl = vehicleObject->var_24[var_54].var_05; if (vehicleObject->var_24[var_54].var_05 == 0) { call(0x004AB655, regs); return; } - //0x4AAC91 + + regs.ebx -= 0x80; + switch (vehicleObject->vis_fx_type) + { + case 0: + call(0x004AB655, regs); + break; + case 1: + case 2: + case 3: + call(0x004AACA5, regs); + break; + case 4: + call(0x004AAFFA, regs); + break; + case 5: + call(0x004AB3CA, regs); + break; + case 6: + call(0x004AB4E0, regs); + break; + case 7: + call(0x004AB177, regs); + break; + case 8: + call(0x004AB2A7, regs); + break; + } } From 6154117eb9f8e62eb1b1b50f31f14fd99f1165ee Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 21 Jan 2018 19:41:56 +0000 Subject: [PATCH 05/10] Add array sizes. Rename objects to match master --- src/openloco/objects/objectmgr.cpp | 50 +++++++++++++++--------------- src/openloco/objects/objectmgr.h | 6 ++-- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/openloco/objects/objectmgr.cpp b/src/openloco/objects/objectmgr.cpp index 7c82b247..0a92c550 100644 --- a/src/openloco/objects/objectmgr.cpp +++ b/src/openloco/objects/objectmgr.cpp @@ -6,40 +6,40 @@ using namespace openloco::interop; namespace openloco::objectmgr { loco_global_array object_repository; - // Array sizes to be confirmed - loco_global_array _interfaceObjects; - loco_global_array _soundObjects; + + loco_global_array _interfaceObjects; + loco_global_array _soundObjects; loco_global_array _currencyObjects; - loco_global_array _steamObjects; - loco_global_array _rockObjects; + loco_global_array _steamObjects; + loco_global_array _rockObjects; loco_global_array _waterObjects; - loco_global_array _surfaceObjects; + loco_global_array _landObjects; loco_global_array _townNameObjects; loco_global_array _cargoObjects; - loco_global_array _wallObjects; - loco_global_array _trainSignalObjects; - loco_global_array _levlCrossingObjects; + loco_global_array _wallObjects; + loco_global_array _trainSignalObjects; + loco_global_array _levelCrossingObjects; loco_global_array _streetLightObjects; - loco_global_array _tunnelObjects; - loco_global_array _bridgeObjects; - loco_global_array _trainStationObjects; - loco_global_array _trackExtraObjects; - loco_global_array _trackObjects; - loco_global_array _roadStationObjects; - loco_global_array _roadExtraObjects; - loco_global_array _roadObjects; - loco_global_array _airportObjects; - loco_global_array _dockObjects; - loco_global_array _vehicleObjects; - loco_global_array _treeObjects; + loco_global_array _tunnelObjects; + loco_global_array _bridgeObjects; + loco_global_array _trainStationObjects; + loco_global_array _trackExtraObjects; + loco_global_array _trackObjects; + loco_global_array _roadStationObjects; + loco_global_array _roadExtraObjects; + loco_global_array _roadObjects; + loco_global_array _airportObjects; + loco_global_array _dockObjects; + loco_global_array _vehicleObjects; + loco_global_array _treeObjects; loco_global_array _snowObjects; - loco_global_array _cliamteObjects; + loco_global_array _climateObjects; loco_global_array _hillShapeObjects; - loco_global_array _buildingObjects; + loco_global_array _buildingObjects; loco_global_array _scaffoldingObjects; - loco_global_array _industryObjects; + loco_global_array _industryObjects; loco_global_array _regionObjects; - loco_global_array _competitorsObjects; + loco_global_array _competitorsObjects; loco_global_array _scenarioTextObjects; // 0x00470F3C diff --git a/src/openloco/objects/objectmgr.h b/src/openloco/objects/objectmgr.h index 8caeb03c..8f4fe7a5 100644 --- a/src/openloco/objects/objectmgr.h +++ b/src/openloco/objects/objectmgr.h @@ -45,13 +45,13 @@ namespace openloco struct object; struct object_entry_extended; struct cargo_object; - struct interface_object; + struct interface_skin_object; struct sound_object; struct currency_object; struct steam_object; - struct rocks_object; + struct rock_object; struct water_object; - struct surface_object; + struct land_object; struct town_name_object; struct wall_object; struct train_signal_object; From a292391919882a169ee318fdd348add509376bb3 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 21 Jan 2018 21:10:05 +0000 Subject: [PATCH 06/10] Implement invalidate sprite function --- src/openloco/things/thing.h | 6 ++- src/openloco/things/vehicle.cpp | 67 +++++++++++++++++++++++++++++++-- src/openloco/things/vehicle.h | 18 +++++++++ 3 files changed, 87 insertions(+), 4 deletions(-) diff --git a/src/openloco/things/thing.h b/src/openloco/things/thing.h index 97186281..895b24b1 100644 --- a/src/openloco/things/thing.h +++ b/src/openloco/things/thing.h @@ -34,7 +34,11 @@ namespace openloco int16_t z; // 0x12 uint8_t var_14; uint8_t var_15; - uint8_t pad_16[0x28 - 0x16]; + int16_t sprite_left; // 0x16 + int16_t sprite_top; // 0x18 + int16_t sprite_right; // 0x1A + int16_t sprite_bottom; // 0x1C + uint8_t pad_1E[0x28 - 0x1E]; uint16_t var_28; uint8_t pad_2A[0x38 - 0x2A]; uint8_t var_38; diff --git a/src/openloco/things/vehicle.cpp b/src/openloco/things/vehicle.cpp index baf8a504..868ebcfb 100644 --- a/src/openloco/things/vehicle.cpp +++ b/src/openloco/things/vehicle.cpp @@ -1,6 +1,8 @@ #include "vehicle.h" +#include #include "../audio/audio.h" #include "../config.h" +#include "../graphics/gfx.h" #include "../interop/interop.hpp" #include "../openloco.h" #include "../objects/vehicle_object.h" @@ -18,8 +20,10 @@ loco_global vehicle_1136128; loco_global vehicle_var_1136130; loco_global vehicle_var_1136237; // var_28 related? loco_global vehicle_var_1136238; // var_28 related? +loco_global vehicle_var_113D820; +loco_global vehicle_var_50AF25; -vehicle* vehicle::next_vehicle() +vehicle * vehicle::next_vehicle() { return thingmgr::get(next_thing_id); } @@ -171,13 +175,13 @@ int32_t openloco::vehicle::sub_4AA1D0() if (vehicle_var_1136237 | vehicle_var_1136238) { - call(0x004CBB01, regs); + invalidate_sprite(); vehicle * veh = vehicle_1136124; regs.ebx = (int32_t)veh; veh = vehicle_1136128; regs.edi = (int32_t)veh; call(0x004AC255, regs); - call(0x004CBB01, regs); + invalidate_sprite(); } uint32_t backup1136130 = vehicle_var_1136130; if (var_5E != 0) @@ -243,3 +247,60 @@ void openloco::vehicle::sub_4AAC4E() break; } } + +// 0x4CBB01 +void openloco::vehicle::invalidate_sprite() +{ + if (sprite_left == 0x8000) + { + return; + } + + int16_t left = sprite_left; + int16_t top = sprite_top; + int16_t right = sprite_right; + int16_t bottom = sprite_bottom; + for (unk_113D758 * unk = vehicle_var_113D820; + unk != nullptr; + unk++) + { + if (unk->zoom_level > vehicle_var_50AF25) + continue; + + if (sprite_right <= unk->x) + continue; + + if (sprite_bottom <= unk->y) + continue; + + if (sprite_left >= unk->x + unk->width) + continue; + + left = std::max(sprite_left, unk->x); + right = std::min(sprite_right, unk->x + unk->width); + + if (sprite_top >= unk->y + unk->height) + continue; + + bottom = std::max(sprite_bottom, unk->y); + top = std::min(sprite_top, unk->y + unk->height); + + left -= unk->x; + bottom -= unk->y; + right -= unk->x; + top -= unk->y; + + left >>= unk->zoom_level; + bottom >>= unk->zoom_level; + right >>= unk->zoom_level; + top >>= unk->zoom_level; + + left += unk->var_04; + bottom += unk->var_06; + right += unk->var_04; + top += unk->var_06; + + openloco::gfx::set_dirty_blocks(left, top, right, bottom); + } + +} diff --git a/src/openloco/things/vehicle.h b/src/openloco/things/vehicle.h index 1d0e9224..ad460e23 100644 --- a/src/openloco/things/vehicle.h +++ b/src/openloco/things/vehicle.h @@ -24,6 +24,24 @@ namespace openloco void sub_4BAA76(); int32_t sub_4AA1D0(); void sub_4AAC4E(); + void invalidate_sprite(); + }; +#pragma pack(pop) + +#pragma pack(push, 1) + struct unk_113D758 + { + uint16_t var_00; + uint16_t var_02; + int16_t var_04; + int16_t var_06; + int16_t x; // 0x08 + int16_t y; // 0x0A + int16_t width; // 0x0C + int16_t height; // 0x0E + uint8_t zoom_level; + uint8_t pad_11; + uint16_t var_12; }; #pragma pack(pop) } From 7a74de9be51575aa07c17d8d22372f72b3d2efd5 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 21 Jan 2018 21:43:26 +0000 Subject: [PATCH 07/10] Use OpenRCT2 viewport names --- src/openloco/openloco.vcxproj | 4 ++- src/openloco/things/vehicle.cpp | 54 ++++++++++++++++++--------------- src/openloco/viewportmgr.cpp | 20 ++++++++++++ src/openloco/viewportmgr.h | 9 ++++++ src/openloco/window.h | 16 +++++++++- 5 files changed, 77 insertions(+), 26 deletions(-) create mode 100644 src/openloco/viewportmgr.cpp create mode 100644 src/openloco/viewportmgr.h diff --git a/src/openloco/openloco.vcxproj b/src/openloco/openloco.vcxproj index 27d0bfad..1a120ea1 100644 --- a/src/openloco/openloco.vcxproj +++ b/src/openloco/openloco.vcxproj @@ -30,6 +30,7 @@ + @@ -74,6 +75,7 @@ + @@ -107,4 +109,4 @@ - + \ No newline at end of file diff --git a/src/openloco/things/vehicle.cpp b/src/openloco/things/vehicle.cpp index 868ebcfb..907819cb 100644 --- a/src/openloco/things/vehicle.cpp +++ b/src/openloco/things/vehicle.cpp @@ -8,6 +8,7 @@ #include "../objects/vehicle_object.h" #include "../objects/objectmgr.h" #include "../utility/numeric.hpp" +#include "../viewportmgr.h" #include "thingmgr.h" using namespace openloco; @@ -20,8 +21,13 @@ loco_global vehicle_1136128; loco_global vehicle_var_1136130; loco_global vehicle_var_1136237; // var_28 related? loco_global vehicle_var_1136238; // var_28 related? +<<<<<<< a292391919882a169ee318fdd348add509376bb3 loco_global vehicle_var_113D820; loco_global vehicle_var_50AF25; +======= + +loco_global vehicle_zoom_max; +>>>>>>> Use OpenRCT2 viewport names vehicle * vehicle::next_vehicle() { @@ -260,45 +266,45 @@ void openloco::vehicle::invalidate_sprite() int16_t top = sprite_top; int16_t right = sprite_right; int16_t bottom = sprite_bottom; - for (unk_113D758 * unk = vehicle_var_113D820; - unk != nullptr; - unk++) + for (auto viewport = openloco::ui::viewportmgr::begin(); + viewport != nullptr; + viewport++) { - if (unk->zoom_level > vehicle_var_50AF25) + if (viewport->zoom > vehicle_zoom_max) continue; - if (sprite_right <= unk->x) + if (sprite_right <= viewport->view_x) continue; - if (sprite_bottom <= unk->y) + if (sprite_bottom <= viewport->view_y) continue; - if (sprite_left >= unk->x + unk->width) + if (sprite_left >= viewport->view_x + viewport->view_width) continue; - left = std::max(sprite_left, unk->x); - right = std::min(sprite_right, unk->x + unk->width); + left = std::max(sprite_left, viewport->view_x); + right = std::min(sprite_right, viewport->view_x + viewport->view_width); - if (sprite_top >= unk->y + unk->height) + if (sprite_top >= viewport->view_y + viewport->view_height) continue; - bottom = std::max(sprite_bottom, unk->y); - top = std::min(sprite_top, unk->y + unk->height); + bottom = std::max(sprite_bottom, viewport->view_y); + top = std::min(sprite_top, viewport->view_y + viewport->view_height); - left -= unk->x; - bottom -= unk->y; - right -= unk->x; - top -= unk->y; + left -= viewport->view_x; + bottom -= viewport->view_y; + right -= viewport->view_x; + top -= viewport->view_y; - left >>= unk->zoom_level; - bottom >>= unk->zoom_level; - right >>= unk->zoom_level; - top >>= unk->zoom_level; + left >>= viewport->zoom; + bottom >>= viewport->zoom; + right >>= viewport->zoom; + top >>= viewport->zoom; - left += unk->var_04; - bottom += unk->var_06; - right += unk->var_04; - top += unk->var_06; + left += viewport->x; + bottom += viewport->y; + right += viewport->x; + top += viewport->y; openloco::gfx::set_dirty_blocks(left, top, right, bottom); } diff --git a/src/openloco/viewportmgr.cpp b/src/openloco/viewportmgr.cpp new file mode 100644 index 00000000..8fb8a6b8 --- /dev/null +++ b/src/openloco/viewportmgr.cpp @@ -0,0 +1,20 @@ +#include +#include "interop/interop.hpp" +#include "ui.h" +#include "window.h" +#include "viewportmgr.h" + +using namespace openloco::ui; +using namespace openloco::interop; + +loco_global _viewports; + +viewport * openloco::ui::viewportmgr::begin() +{ + return _viewports; +} + +viewport * openloco::ui::viewportmgr::end() +{ + return nullptr; +} diff --git a/src/openloco/viewportmgr.h b/src/openloco/viewportmgr.h new file mode 100644 index 00000000..b831a619 --- /dev/null +++ b/src/openloco/viewportmgr.h @@ -0,0 +1,9 @@ +#pragma once + +#include "window.h" + +namespace openloco::ui::viewportmgr +{ + viewport * begin(); + viewport * end(); +} \ No newline at end of file diff --git a/src/openloco/window.h b/src/openloco/window.h index 1f5f23c5..97035755 100644 --- a/src/openloco/window.h +++ b/src/openloco/window.h @@ -42,5 +42,19 @@ namespace openloco::ui void sub_4CA17F(); }; -#pragma pack(pop) + struct viewport + { + int16_t width; // 0x00 + int16_t height; // 0x02 + int16_t x; // 0x04 + int16_t y; // 0x06 + int16_t view_x; // 0x08 + int16_t view_y; // 0x0A + int16_t view_width; // 0x0C + int16_t view_height; // 0x0E + uint8_t zoom; // 0x10 + uint8_t pad_11; + uint16_t var_12; // 0x12, maybe flags + }; + #pragma pack(pop) } From 30ce2a65edb00203ad0cf9d4ec3fce7ed6feb6a6 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Tue, 23 Jan 2018 18:48:41 +0000 Subject: [PATCH 08/10] Move files about --- src/openloco/objects/objectmgr.cpp | 73 +++++++++++++++--------------- src/openloco/objects/objectmgr.h | 2 +- src/openloco/things/thing.cpp | 64 +++++++++++++++++++++++++- src/openloco/things/thing.h | 1 + src/openloco/things/vehicle.cpp | 64 -------------------------- src/openloco/things/vehicle.h | 18 -------- src/openloco/viewportmgr.cpp | 4 +- src/openloco/viewportmgr.h | 2 +- 8 files changed, 105 insertions(+), 123 deletions(-) diff --git a/src/openloco/objects/objectmgr.cpp b/src/openloco/objects/objectmgr.cpp index 0a92c550..3427b57e 100644 --- a/src/openloco/objects/objectmgr.cpp +++ b/src/openloco/objects/objectmgr.cpp @@ -14,7 +14,7 @@ namespace openloco::objectmgr loco_global_array _rockObjects; loco_global_array _waterObjects; loco_global_array _landObjects; - loco_global_array _townNameObjects; + loco_global_array _townNamesObjects; loco_global_array _cargoObjects; loco_global_array _wallObjects; loco_global_array _trainSignalObjects; @@ -60,41 +60,42 @@ namespace openloco::objectmgr size_t get_max_objects(object_type type) { - static size_t counts[] = { - 1, // interface, - 128, // sound, - 1, // currency, - 32, // steam, - 8, // rock, - 1, // water, - 32, // surface, - 1, // town_name, - 32, // cargo, - 32, // wall, - 16, // train_signal, - 4, // level_crossing, - 1, // street_light, - 16, // tunnel, - 8, // bridge, - 16, // train_station, - 8, // track_extra, - 8, // track, - 16, // road_station, - 4, // road_extra, - 8, // road, - 8, // airport, - 8, // dock, - 224, // vehicle, - 64, // tree, - 1, // snow, - 1, // climate, - 1, // hill_shapes, - 128, // building, - 1, // scaffolding, - 16, // industry, - 1, // region, - 32, // competitors, - 1 // scenario_text, + static size_t counts[] = + { + 1, // interface, + 128, // sound, + 1, // currency, + 32, // steam, + 8, // rock, + 1, // water, + 32, // surface, + 1, // town_names, + 32, // cargo, + 32, // wall, + 16, // train_signal, + 4, // level_crossing, + 1, // street_light, + 16, // tunnel, + 8, // bridge, + 16, // train_station, + 8, // track_extra, + 8, // track, + 16, // road_station, + 4, // road_extra, + 8, // road, + 8, // airport, + 8, // dock, + 224, // vehicle, + 64, // tree, + 1, // snow, + 1, // climate, + 1, // hill_shapes, + 128, // building, + 1, // scaffolding, + 16, // industry, + 1, // region, + 32, // competitors, + 1 // scenario_text, }; return counts[(size_t)type]; }; diff --git a/src/openloco/objects/objectmgr.h b/src/openloco/objects/objectmgr.h index 8f4fe7a5..303e82f7 100644 --- a/src/openloco/objects/objectmgr.h +++ b/src/openloco/objects/objectmgr.h @@ -52,7 +52,7 @@ namespace openloco struct rock_object; struct water_object; struct land_object; - struct town_name_object; + struct town_names_object; struct wall_object; struct train_signal_object; struct level_crossing_object; diff --git a/src/openloco/things/thing.cpp b/src/openloco/things/thing.cpp index 9114f7c6..ec45254a 100644 --- a/src/openloco/things/thing.cpp +++ b/src/openloco/things/thing.cpp @@ -1,9 +1,14 @@ -#include "thing.h" +#include +#include "../graphics/gfx.h" #include "../interop/interop.hpp" +#include "../viewportmgr.h" +#include "thing.h" using namespace openloco; using namespace openloco::interop; +loco_global thing_zoom_max; + // 0x0046FC83 void thing::move_to(loc16 loc) { @@ -14,3 +19,60 @@ void thing::move_to(loc16 loc) regs.esi = (int32_t)this; call(0x0046FC83, regs); } + +// 0x004CBB01 +void openloco::thing::invalidate_sprite() +{ + if (sprite_left == (int16_t)0x8000u) + { + return; + } + + int16_t left = sprite_left; + int16_t top = sprite_top; + int16_t right = sprite_right; + int16_t bottom = sprite_bottom; + for (auto viewport_arr = openloco::ui::viewportmgr::begin(); + *viewport_arr != nullptr; + viewport_arr++) + { + auto viewport = *viewport_arr; + if (viewport->zoom > thing_zoom_max) + continue; + + if (sprite_right <= viewport->view_x) + continue; + + if (sprite_bottom <= viewport->view_y) + continue; + + if (sprite_left >= viewport->view_x + viewport->view_width) + continue; + + left = std::max(sprite_left, viewport->view_x); + right = std::min(sprite_right, viewport->view_x + viewport->view_width); + + if (sprite_top >= viewport->view_y + viewport->view_height) + continue; + + bottom = std::max(sprite_bottom, viewport->view_y); + top = std::min(sprite_top, viewport->view_y + viewport->view_height); + + left -= viewport->view_x; + bottom -= viewport->view_y; + right -= viewport->view_x; + top -= viewport->view_y; + + left >>= viewport->zoom; + bottom >>= viewport->zoom; + right >>= viewport->zoom; + top >>= viewport->zoom; + + left += viewport->x; + bottom += viewport->y; + right += viewport->x; + top += viewport->y; + + openloco::gfx::set_dirty_blocks(left, top, right, bottom); + } +} diff --git a/src/openloco/things/thing.h b/src/openloco/things/thing.h index 895b24b1..e24eac53 100644 --- a/src/openloco/things/thing.h +++ b/src/openloco/things/thing.h @@ -67,6 +67,7 @@ namespace openloco }; void move_to(loc16 loc); + void invalidate_sprite(); }; #pragma pack(pop) } diff --git a/src/openloco/things/vehicle.cpp b/src/openloco/things/vehicle.cpp index 907819cb..a0ec1541 100644 --- a/src/openloco/things/vehicle.cpp +++ b/src/openloco/things/vehicle.cpp @@ -21,13 +21,6 @@ loco_global vehicle_1136128; loco_global vehicle_var_1136130; loco_global vehicle_var_1136237; // var_28 related? loco_global vehicle_var_1136238; // var_28 related? -<<<<<<< a292391919882a169ee318fdd348add509376bb3 -loco_global vehicle_var_113D820; -loco_global vehicle_var_50AF25; -======= - -loco_global vehicle_zoom_max; ->>>>>>> Use OpenRCT2 viewport names vehicle * vehicle::next_vehicle() { @@ -253,60 +246,3 @@ void openloco::vehicle::sub_4AAC4E() break; } } - -// 0x4CBB01 -void openloco::vehicle::invalidate_sprite() -{ - if (sprite_left == 0x8000) - { - return; - } - - int16_t left = sprite_left; - int16_t top = sprite_top; - int16_t right = sprite_right; - int16_t bottom = sprite_bottom; - for (auto viewport = openloco::ui::viewportmgr::begin(); - viewport != nullptr; - viewport++) - { - if (viewport->zoom > vehicle_zoom_max) - continue; - - if (sprite_right <= viewport->view_x) - continue; - - if (sprite_bottom <= viewport->view_y) - continue; - - if (sprite_left >= viewport->view_x + viewport->view_width) - continue; - - left = std::max(sprite_left, viewport->view_x); - right = std::min(sprite_right, viewport->view_x + viewport->view_width); - - if (sprite_top >= viewport->view_y + viewport->view_height) - continue; - - bottom = std::max(sprite_bottom, viewport->view_y); - top = std::min(sprite_top, viewport->view_y + viewport->view_height); - - left -= viewport->view_x; - bottom -= viewport->view_y; - right -= viewport->view_x; - top -= viewport->view_y; - - left >>= viewport->zoom; - bottom >>= viewport->zoom; - right >>= viewport->zoom; - top >>= viewport->zoom; - - left += viewport->x; - bottom += viewport->y; - right += viewport->x; - top += viewport->y; - - openloco::gfx::set_dirty_blocks(left, top, right, bottom); - } - -} diff --git a/src/openloco/things/vehicle.h b/src/openloco/things/vehicle.h index ad460e23..1d0e9224 100644 --- a/src/openloco/things/vehicle.h +++ b/src/openloco/things/vehicle.h @@ -24,24 +24,6 @@ namespace openloco void sub_4BAA76(); int32_t sub_4AA1D0(); void sub_4AAC4E(); - void invalidate_sprite(); - }; -#pragma pack(pop) - -#pragma pack(push, 1) - struct unk_113D758 - { - uint16_t var_00; - uint16_t var_02; - int16_t var_04; - int16_t var_06; - int16_t x; // 0x08 - int16_t y; // 0x0A - int16_t width; // 0x0C - int16_t height; // 0x0E - uint8_t zoom_level; - uint8_t pad_11; - uint16_t var_12; }; #pragma pack(pop) } diff --git a/src/openloco/viewportmgr.cpp b/src/openloco/viewportmgr.cpp index 8fb8a6b8..4c158b60 100644 --- a/src/openloco/viewportmgr.cpp +++ b/src/openloco/viewportmgr.cpp @@ -7,9 +7,9 @@ using namespace openloco::ui; using namespace openloco::interop; -loco_global _viewports; +loco_global_array _viewports; -viewport * openloco::ui::viewportmgr::begin() +viewport ** openloco::ui::viewportmgr::begin() { return _viewports; } diff --git a/src/openloco/viewportmgr.h b/src/openloco/viewportmgr.h index b831a619..b2f3c785 100644 --- a/src/openloco/viewportmgr.h +++ b/src/openloco/viewportmgr.h @@ -4,6 +4,6 @@ namespace openloco::ui::viewportmgr { - viewport * begin(); + viewport ** begin(); viewport * end(); } \ No newline at end of file From fb375d1560ac622e8c9cde899e050a640b100fdd Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Fri, 26 Jan 2018 05:59:18 +0000 Subject: [PATCH 09/10] Refactor viewport code --- src/openloco/objects/objectmgr.h | 1 + src/openloco/things/thing.cpp | 5 +---- src/openloco/viewportmgr.cpp | 15 +++++++-------- src/openloco/viewportmgr.h | 5 +++-- 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/openloco/objects/objectmgr.h b/src/openloco/objects/objectmgr.h index 303e82f7..72c6999f 100644 --- a/src/openloco/objects/objectmgr.h +++ b/src/openloco/objects/objectmgr.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace openloco { diff --git a/src/openloco/things/thing.cpp b/src/openloco/things/thing.cpp index ec45254a..d4448f35 100644 --- a/src/openloco/things/thing.cpp +++ b/src/openloco/things/thing.cpp @@ -32,11 +32,8 @@ void openloco::thing::invalidate_sprite() int16_t top = sprite_top; int16_t right = sprite_right; int16_t bottom = sprite_bottom; - for (auto viewport_arr = openloco::ui::viewportmgr::begin(); - *viewport_arr != nullptr; - viewport_arr++) + for (auto& viewport : openloco::ui::viewportmgr::viewports()) { - auto viewport = *viewport_arr; if (viewport->zoom > thing_zoom_max) continue; diff --git a/src/openloco/viewportmgr.cpp b/src/openloco/viewportmgr.cpp index 4c158b60..fd0ff4bc 100644 --- a/src/openloco/viewportmgr.cpp +++ b/src/openloco/viewportmgr.cpp @@ -7,14 +7,13 @@ using namespace openloco::ui; using namespace openloco::interop; -loco_global_array _viewports; - -viewport ** openloco::ui::viewportmgr::begin() +namespace openloco::ui::viewportmgr { - return _viewports; -} + loco_global_array _viewports; -viewport * openloco::ui::viewportmgr::end() -{ - return nullptr; + std::array viewports() + { + auto arr = (std::array*)_viewports.get(); + return *arr; + } } diff --git a/src/openloco/viewportmgr.h b/src/openloco/viewportmgr.h index b2f3c785..c7211a2b 100644 --- a/src/openloco/viewportmgr.h +++ b/src/openloco/viewportmgr.h @@ -1,9 +1,10 @@ #pragma once #include "window.h" +#include namespace openloco::ui::viewportmgr { - viewport ** begin(); - viewport * end(); + constexpr size_t max_viewports = 10; + std::array viewports(); } \ No newline at end of file From ec41e77a21e65f5196fe8db2e49b527f640e71fe Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Fri, 26 Jan 2018 06:23:06 +0000 Subject: [PATCH 10/10] Apply clang-format --- src/openloco/objects/objectmgr.cpp | 141 +++++++++++++------------- src/openloco/objects/objectmgr.h | 10 +- src/openloco/objects/vehicle_object.h | 60 +++++------ src/openloco/things/thing.cpp | 4 +- src/openloco/things/thing.h | 16 +-- src/openloco/things/vehicle.cpp | 66 ++++++------ src/openloco/viewportmgr.cpp | 6 +- src/openloco/window.h | 22 ++-- 8 files changed, 162 insertions(+), 163 deletions(-) diff --git a/src/openloco/objects/objectmgr.cpp b/src/openloco/objects/objectmgr.cpp index 3427b57e..ce790c01 100644 --- a/src/openloco/objects/objectmgr.cpp +++ b/src/openloco/objects/objectmgr.cpp @@ -7,40 +7,40 @@ namespace openloco::objectmgr { loco_global_array object_repository; - loco_global_array _interfaceObjects; - loco_global_array _soundObjects; - loco_global_array _currencyObjects; - loco_global_array _steamObjects; - loco_global_array _rockObjects; - loco_global_array _waterObjects; - loco_global_array _landObjects; - loco_global_array _townNamesObjects; - loco_global_array _cargoObjects; - loco_global_array _wallObjects; - loco_global_array _trainSignalObjects; - loco_global_array _levelCrossingObjects; - loco_global_array _streetLightObjects; - loco_global_array _tunnelObjects; - loco_global_array _bridgeObjects; - loco_global_array _trainStationObjects; - loco_global_array _trackExtraObjects; - loco_global_array _trackObjects; - loco_global_array _roadStationObjects; - loco_global_array _roadExtraObjects; - loco_global_array _roadObjects; - loco_global_array _airportObjects; - loco_global_array _dockObjects; - loco_global_array _vehicleObjects; - loco_global_array _treeObjects; - loco_global_array _snowObjects; - loco_global_array _climateObjects; - loco_global_array _hillShapeObjects; - loco_global_array _buildingObjects; - loco_global_array _scaffoldingObjects; - loco_global_array _industryObjects; - loco_global_array _regionObjects; - loco_global_array _competitorsObjects; - loco_global_array _scenarioTextObjects; + loco_global_array _interfaceObjects; + loco_global_array _soundObjects; + loco_global_array _currencyObjects; + loco_global_array _steamObjects; + loco_global_array _rockObjects; + loco_global_array _waterObjects; + loco_global_array _landObjects; + loco_global_array _townNamesObjects; + loco_global_array _cargoObjects; + loco_global_array _wallObjects; + loco_global_array _trainSignalObjects; + loco_global_array _levelCrossingObjects; + loco_global_array _streetLightObjects; + loco_global_array _tunnelObjects; + loco_global_array _bridgeObjects; + loco_global_array _trainStationObjects; + loco_global_array _trackExtraObjects; + loco_global_array _trackObjects; + loco_global_array _roadStationObjects; + loco_global_array _roadExtraObjects; + loco_global_array _roadObjects; + loco_global_array _airportObjects; + loco_global_array _dockObjects; + loco_global_array _vehicleObjects; + loco_global_array _treeObjects; + loco_global_array _snowObjects; + loco_global_array _climateObjects; + loco_global_array _hillShapeObjects; + loco_global_array _buildingObjects; + loco_global_array _scaffoldingObjects; + loco_global_array _industryObjects; + loco_global_array _regionObjects; + loco_global_array _competitorsObjects; + loco_global_array _scenarioTextObjects; // 0x00470F3C void load_index() @@ -53,49 +53,48 @@ namespace openloco::objectmgr return _cargoObjects[id]; } - vehicle_object * get_vehicle_object(size_t id) + vehicle_object* get_vehicle_object(size_t id) { return _vehicleObjects[id]; } size_t get_max_objects(object_type type) { - static size_t counts[] = - { - 1, // interface, - 128, // sound, - 1, // currency, - 32, // steam, - 8, // rock, - 1, // water, - 32, // surface, - 1, // town_names, - 32, // cargo, - 32, // wall, - 16, // train_signal, - 4, // level_crossing, - 1, // street_light, - 16, // tunnel, - 8, // bridge, - 16, // train_station, - 8, // track_extra, - 8, // track, - 16, // road_station, - 4, // road_extra, - 8, // road, - 8, // airport, - 8, // dock, - 224, // vehicle, - 64, // tree, - 1, // snow, - 1, // climate, - 1, // hill_shapes, - 128, // building, - 1, // scaffolding, - 16, // industry, - 1, // region, - 32, // competitors, - 1 // scenario_text, + static size_t counts[] = { + 1, // interface, + 128, // sound, + 1, // currency, + 32, // steam, + 8, // rock, + 1, // water, + 32, // surface, + 1, // town_names, + 32, // cargo, + 32, // wall, + 16, // train_signal, + 4, // level_crossing, + 1, // street_light, + 16, // tunnel, + 8, // bridge, + 16, // train_station, + 8, // track_extra, + 8, // track, + 16, // road_station, + 4, // road_extra, + 8, // road, + 8, // airport, + 8, // dock, + 224, // vehicle, + 64, // tree, + 1, // snow, + 1, // climate, + 1, // hill_shapes, + 128, // building, + 1, // scaffolding, + 16, // industry, + 1, // region, + 32, // competitors, + 1 // scenario_text, }; return counts[(size_t)type]; }; diff --git a/src/openloco/objects/objectmgr.h b/src/openloco/objects/objectmgr.h index 72c6999f..c75564a3 100644 --- a/src/openloco/objects/objectmgr.h +++ b/src/openloco/objects/objectmgr.h @@ -1,7 +1,7 @@ #pragma once -#include #include +#include namespace openloco { @@ -54,7 +54,7 @@ namespace openloco struct water_object; struct land_object; struct town_names_object; - struct wall_object; + struct wall_object; struct train_signal_object; struct level_crossing_object; struct street_light_object; @@ -82,8 +82,8 @@ namespace openloco struct object_repository_item { - object * objects; - uint32_t * object_entry_extendeds; + object* objects; + uint32_t* object_entry_extendeds; }; } @@ -92,5 +92,5 @@ namespace openloco::objectmgr void load_index(); cargo_object* get_cargo_object(size_t id); size_t get_max_objects(object_type type); - vehicle_object * get_vehicle_object(size_t id); + vehicle_object* get_vehicle_object(size_t id); } diff --git a/src/openloco/objects/vehicle_object.h b/src/openloco/objects/vehicle_object.h index 3abff739..2139d494 100644 --- a/src/openloco/objects/vehicle_object.h +++ b/src/openloco/objects/vehicle_object.h @@ -6,61 +6,61 @@ namespace openloco { struct vehicle_object_unk { - uint8_t length; // 0x00 + uint8_t length; // 0x00 uint8_t pad_01[0x04 - 0x01]; - uint8_t sprite_ind; // 0x04 + uint8_t sprite_ind; // 0x04 uint8_t var_05; }; struct vehicle_object_sprite { - uint8_t num_dir; // 0x00 + uint8_t num_dir; // 0x00 uint8_t pad_01[0x03 - 0x01]; - uint8_t vehicle_type; // 0x03 - uint8_t num_units; // 0x04 + uint8_t vehicle_type; // 0x03 + uint8_t num_units; // 0x04 uint8_t pad_05; uint8_t bogey_position; // 0x06 uint8_t flags; // 0x07 uint8_t pad_08[0x0E - 0x08]; - uint8_t sprite_num; // 0x0E + uint8_t sprite_num; // 0x0E uint8_t pad_0F[0x1E - 0xF]; }; struct vehicle_object { - string_id name; // 0x00 probably not confirmed - uint8_t vehicle_class; // 0x02 - uint8_t type; // 0x03 + string_id name; // 0x00 probably not confirmed + uint8_t vehicle_class; // 0x02 + uint8_t type; // 0x03 uint8_t pad_04[0x6 - 0x4]; - uint8_t num_mods; // 0x06 - uint8_t cost_ind; // 0x07 - int16_t cost_fact; // 0x08 - uint8_t reliability; // 0x0A - uint8_t run_cost_ind; // 0x0B - int16_t run_cost_fact; // 0x0C - uint8_t colour_type; // 0x0E - uint8_t num_compat; // 0x0F + uint8_t num_mods; // 0x06 + uint8_t cost_ind; // 0x07 + int16_t cost_fact; // 0x08 + uint8_t reliability; // 0x0A + uint8_t run_cost_ind; // 0x0B + int16_t run_cost_fact; // 0x0C + uint8_t colour_type; // 0x0E + uint8_t num_compat; // 0x0F uint8_t pad_10[0x24 - 0x10]; vehicle_object_unk var_24[4]; - vehicle_object_sprite sprites[4]; // 0x3C + vehicle_object_sprite sprites[4]; // 0x3C uint8_t pad_B4[0xD8 - 0xB4]; - uint16_t power; // 0xD8 - uint16_t speed; // 0xDA - uint16_t rack_speed; // 0xDC - uint16_t weight; // 0xDE - uint16_t flags; // 0xE0 + uint16_t power; // 0xD8 + uint16_t speed; // 0xDA + uint16_t rack_speed; // 0xDC + uint16_t weight; // 0xDE + uint16_t flags; // 0xE0 uint8_t pad_E1[0x10E - 0xE1]; - uint8_t vis_fx_height; // 0x10E - uint8_t vis_fx_type; // 0x10F + uint8_t vis_fx_height; // 0x10E + uint8_t vis_fx_type; // 0x10F uint8_t pad_110[0x112 - 0x110]; - uint8_t wake_fx_type; // 0x112 + uint8_t wake_fx_type; // 0x112 uint8_t pad_113; - uint16_t designed; // 0x114 - uint16_t obsolete; // 0x116 + uint16_t designed; // 0x114 + uint16_t obsolete; // 0x116 uint8_t pad_118; - uint8_t startsnd_type; // 0x119 + uint8_t startsnd_type; // 0x119 uint8_t pad_11A[0x15A - 0x11A]; - uint8_t numsnd; // 0x15A + uint8_t numsnd; // 0x15A uint8_t pad_15B[0x15E - 0x15B]; }; } diff --git a/src/openloco/things/thing.cpp b/src/openloco/things/thing.cpp index d4448f35..baa8cecf 100644 --- a/src/openloco/things/thing.cpp +++ b/src/openloco/things/thing.cpp @@ -1,8 +1,8 @@ -#include +#include "thing.h" #include "../graphics/gfx.h" #include "../interop/interop.hpp" #include "../viewportmgr.h" -#include "thing.h" +#include using namespace openloco; using namespace openloco::interop; diff --git a/src/openloco/things/thing.h b/src/openloco/things/thing.h index e24eac53..42cbed9b 100644 --- a/src/openloco/things/thing.h +++ b/src/openloco/things/thing.h @@ -34,31 +34,31 @@ namespace openloco int16_t z; // 0x12 uint8_t var_14; uint8_t var_15; - int16_t sprite_left; // 0x16 - int16_t sprite_top; // 0x18 - int16_t sprite_right; // 0x1A - int16_t sprite_bottom; // 0x1C + int16_t sprite_left; // 0x16 + int16_t sprite_top; // 0x18 + int16_t sprite_right; // 0x1A + int16_t sprite_bottom; // 0x1C uint8_t pad_1E[0x28 - 0x1E]; uint16_t var_28; uint8_t pad_2A[0x38 - 0x2A]; uint8_t var_38; uint8_t pad_39; - thing_id_t next_car_id; // 0x3A + thing_id_t next_car_id; // 0x3A uint8_t pad_3C[0x40 - 0x3C]; uint16_t object_type; uint8_t var_42; uint8_t pad_43[0x4C - 0x43]; - uint8_t cargo_type; // 0x4C + uint8_t cargo_type; // 0x4C uint8_t pad_4D; uint16_t cargo_origin; // 0x4E uint8_t pad_50; - uint8_t cargo_quantity; // 0x51 + uint8_t cargo_quantity; // 0x51 uint8_t pad_52[0x54 - 0x52]; uint8_t var_54; uint8_t pad_55[0x5D - 0x55]; uint8_t var_5D; uint8_t var_5E; - uint8_t var_5F; // 0x5F (bit 1 = can break down) + uint8_t var_5F; // 0x5F (bit 1 = can break down) uint8_t pad_60[0x6A - 0x60]; uint8_t var_6A; uint8_t pad_6B[0x73 - 0x6B]; diff --git a/src/openloco/things/vehicle.cpp b/src/openloco/things/vehicle.cpp index a0ec1541..570e94d5 100644 --- a/src/openloco/things/vehicle.cpp +++ b/src/openloco/things/vehicle.cpp @@ -1,28 +1,28 @@ #include "vehicle.h" -#include #include "../audio/audio.h" #include "../config.h" #include "../graphics/gfx.h" #include "../interop/interop.hpp" -#include "../openloco.h" -#include "../objects/vehicle_object.h" #include "../objects/objectmgr.h" +#include "../objects/vehicle_object.h" +#include "../openloco.h" #include "../utility/numeric.hpp" #include "../viewportmgr.h" #include "thingmgr.h" +#include using namespace openloco; using namespace openloco::interop; using namespace openloco::objectmgr; -loco_global vehicle_1136118; -loco_global vehicle_1136124; -loco_global vehicle_1136128; +loco_global vehicle_1136118; +loco_global vehicle_1136124; +loco_global vehicle_1136128; loco_global vehicle_var_1136130; loco_global vehicle_var_1136237; // var_28 related? loco_global vehicle_var_1136238; // var_28 related? -vehicle * vehicle::next_vehicle() +vehicle* vehicle::next_vehicle() { return thingmgr::get(next_thing_id); } @@ -175,7 +175,7 @@ int32_t openloco::vehicle::sub_4AA1D0() if (vehicle_var_1136237 | vehicle_var_1136238) { invalidate_sprite(); - vehicle * veh = vehicle_1136124; + vehicle* veh = vehicle_1136124; regs.ebx = (int32_t)veh; veh = vehicle_1136128; regs.edi = (int32_t)veh; @@ -204,11 +204,11 @@ void openloco::vehicle::sub_4AAC4E() if (var_38 & (1 << 4)) return; - vehicle * veh = vehicle_1136118; + vehicle* veh = vehicle_1136118; if ((veh->var_5D == 8) || (veh->var_5D == 9)) return; - vehicle_object * vehicleObject = get_vehicle_object(object_type); + vehicle_object* vehicleObject = get_vehicle_object(object_type); registers regs; regs.esi = (int32_t)this; regs.bl = vehicleObject->var_24[var_54].var_05; @@ -221,28 +221,28 @@ void openloco::vehicle::sub_4AAC4E() regs.ebx -= 0x80; switch (vehicleObject->vis_fx_type) { - case 0: - call(0x004AB655, regs); - break; - case 1: - case 2: - case 3: - call(0x004AACA5, regs); - break; - case 4: - call(0x004AAFFA, regs); - break; - case 5: - call(0x004AB3CA, regs); - break; - case 6: - call(0x004AB4E0, regs); - break; - case 7: - call(0x004AB177, regs); - break; - case 8: - call(0x004AB2A7, regs); - break; + case 0: + call(0x004AB655, regs); + break; + case 1: + case 2: + case 3: + call(0x004AACA5, regs); + break; + case 4: + call(0x004AAFFA, regs); + break; + case 5: + call(0x004AB3CA, regs); + break; + case 6: + call(0x004AB4E0, regs); + break; + case 7: + call(0x004AB177, regs); + break; + case 8: + call(0x004AB2A7, regs); + break; } } diff --git a/src/openloco/viewportmgr.cpp b/src/openloco/viewportmgr.cpp index fd0ff4bc..14610528 100644 --- a/src/openloco/viewportmgr.cpp +++ b/src/openloco/viewportmgr.cpp @@ -1,15 +1,15 @@ -#include +#include "viewportmgr.h" #include "interop/interop.hpp" #include "ui.h" #include "window.h" -#include "viewportmgr.h" +#include using namespace openloco::ui; using namespace openloco::interop; namespace openloco::ui::viewportmgr { - loco_global_array _viewports; + loco_global_array _viewports; std::array viewports() { diff --git a/src/openloco/window.h b/src/openloco/window.h index 97035755..a1d44709 100644 --- a/src/openloco/window.h +++ b/src/openloco/window.h @@ -44,17 +44,17 @@ namespace openloco::ui struct viewport { - int16_t width; // 0x00 - int16_t height; // 0x02 - int16_t x; // 0x04 - int16_t y; // 0x06 - int16_t view_x; // 0x08 - int16_t view_y; // 0x0A - int16_t view_width; // 0x0C - int16_t view_height; // 0x0E - uint8_t zoom; // 0x10 + int16_t width; // 0x00 + int16_t height; // 0x02 + int16_t x; // 0x04 + int16_t y; // 0x06 + int16_t view_x; // 0x08 + int16_t view_y; // 0x0A + int16_t view_width; // 0x0C + int16_t view_height; // 0x0E + uint8_t zoom; // 0x10 uint8_t pad_11; - uint16_t var_12; // 0x12, maybe flags + uint16_t var_12; // 0x12, maybe flags }; - #pragma pack(pop) +#pragma pack(pop) }