From 46bd8ab608784b010bf1072d5fe8b201ef1461fe Mon Sep 17 00:00:00 2001 From: dP Date: Wed, 1 Jul 2020 22:35:30 +0300 Subject: [PATCH] Track income by cargo type in company economy stats --- projects/openttd_vs140.vcxproj | 5 +++++ projects/openttd_vs140.vcxproj.filters | 15 +++++++++++++++ projects/openttd_vs141.vcxproj | 5 +++++ projects/openttd_vs141.vcxproj.filters | 15 +++++++++++++++ projects/openttd_vs142.vcxproj | 5 +++++ projects/openttd_vs142.vcxproj.filters | 15 +++++++++++++++ source.list | 1 + src/citymania/cm_event.hpp | 14 ++++++++++++++ src/citymania/cm_game.cpp | 6 ++++++ src/citymania/extensions/cmext_company.hpp | 18 ++++++++++++++++++ src/company_base.h | 3 +++ src/economy.cpp | 12 ++++++++++++ 12 files changed, 114 insertions(+) create mode 100644 src/citymania/extensions/cmext_company.hpp diff --git a/projects/openttd_vs140.vcxproj b/projects/openttd_vs140.vcxproj index 835d1e8ebd..9c9f909492 100644 --- a/projects/openttd_vs140.vcxproj +++ b/projects/openttd_vs140.vcxproj @@ -1348,13 +1348,18 @@ + + + + + diff --git a/projects/openttd_vs140.vcxproj.filters b/projects/openttd_vs140.vcxproj.filters index f7f90603a6..ac8f9a6b0b 100644 --- a/projects/openttd_vs140.vcxproj.filters +++ b/projects/openttd_vs140.vcxproj.filters @@ -3135,9 +3135,21 @@ Threading + + CityMania + + + CityMania + CityMania + + CityMania + + + CityMania + CityMania @@ -3156,6 +3168,9 @@ CityMania + + CityMania + diff --git a/projects/openttd_vs141.vcxproj b/projects/openttd_vs141.vcxproj index d290f90500..2720c85438 100644 --- a/projects/openttd_vs141.vcxproj +++ b/projects/openttd_vs141.vcxproj @@ -1348,13 +1348,18 @@ + + + + + diff --git a/projects/openttd_vs141.vcxproj.filters b/projects/openttd_vs141.vcxproj.filters index f7f90603a6..ac8f9a6b0b 100644 --- a/projects/openttd_vs141.vcxproj.filters +++ b/projects/openttd_vs141.vcxproj.filters @@ -3135,9 +3135,21 @@ Threading + + CityMania + + + CityMania + CityMania + + CityMania + + + CityMania + CityMania @@ -3156,6 +3168,9 @@ CityMania + + CityMania + diff --git a/projects/openttd_vs142.vcxproj b/projects/openttd_vs142.vcxproj index 3b8e8e34fe..25b3d0b6dd 100644 --- a/projects/openttd_vs142.vcxproj +++ b/projects/openttd_vs142.vcxproj @@ -1348,13 +1348,18 @@ + + + + + diff --git a/projects/openttd_vs142.vcxproj.filters b/projects/openttd_vs142.vcxproj.filters index f7f90603a6..ac8f9a6b0b 100644 --- a/projects/openttd_vs142.vcxproj.filters +++ b/projects/openttd_vs142.vcxproj.filters @@ -3135,9 +3135,21 @@ Threading + + CityMania + + + CityMania + CityMania + + CityMania + + + CityMania + CityMania @@ -3156,6 +3168,9 @@ CityMania + + CityMania + diff --git a/source.list b/source.list index c12ba62391..7aa7e52f5f 100644 --- a/source.list +++ b/source.list @@ -1204,3 +1204,4 @@ citymania/cm_main.hpp citymania/cm_main.cpp citymania/cm_type.hpp citymania/extensions/cmext_town.hpp +citymania/extensions/cmext_company.hpp diff --git a/src/citymania/cm_event.hpp b/src/citymania/cm_event.hpp index 7f8a6d106f..f0b73ccc6c 100644 --- a/src/citymania/cm_event.hpp +++ b/src/citymania/cm_event.hpp @@ -5,6 +5,7 @@ #include "../cargo_type.h" #include "../company_type.h" #include "../economy_type.h" +#include "../industry_type.h" #include "../station_type.h" #include "../town_type.h" @@ -61,6 +62,19 @@ struct CompanyEvent { Company *company; }; +struct CargoDeliveredToIndustry { + Industry *industry; + CargoID cargo_type; + uint amount; + const Station *station; +}; + +struct CargoDeliveredToUnknown { + CargoID cargo_type; + uint amount; + const Station *station; +}; + struct CargoAccepted { Company *company; CargoID cargo_type; diff --git a/src/citymania/cm_game.cpp b/src/citymania/cm_game.cpp index d544ac0d00..fc3891fc0d 100644 --- a/src/citymania/cm_game.cpp +++ b/src/citymania/cm_game.cpp @@ -2,6 +2,8 @@ #include "cm_game.hpp" +#include "../company_base.h" + #include "../safeguards.h" namespace citymania { @@ -78,6 +80,10 @@ Game::Game() { town->cm.real_population += HouseSpec::Get(house_id)->population; } }); + + this->events.listen([this] (const event::CargoAccepted &event) { + event.company->cur_economy.cm.cargo_income[event.cargo_type] += event.profit; + }); } } // namespace citymania \ No newline at end of file diff --git a/src/citymania/extensions/cmext_company.hpp b/src/citymania/extensions/cmext_company.hpp new file mode 100644 index 0000000000..57b73a826c --- /dev/null +++ b/src/citymania/extensions/cmext_company.hpp @@ -0,0 +1,18 @@ +#ifndef CMEXT_COMPANY_HPP +#define CMEXT_COMPANY_HPP + +#include "../../cargo_type.h" + +namespace citymania { + +namespace ext { +class CompanyEconomyEntry { +public: + Money cargo_income[NUM_CARGO]; ///< Cargo income from each cargo type +}; + +} // namespace citymania + +} // namespace citymania + +#endif diff --git a/src/company_base.h b/src/company_base.h index 095f7d9e6c..df5137f74a 100644 --- a/src/company_base.h +++ b/src/company_base.h @@ -17,6 +17,8 @@ #include "settings_type.h" #include "group.h" +#include "citymania/extensions/cmext_company.hpp" + /** Statistics about the economy. */ struct CompanyEconomyEntry { Money income; ///< The amount of income. @@ -24,6 +26,7 @@ struct CompanyEconomyEntry { CargoArray delivered_cargo; ///< The amount of delivered cargo. int32 performance_history; ///< Company score (scale 0-1000) Money company_value; ///< The value of the company. + citymania::ext::CompanyEconomyEntry cm; ///< CityMania extra economy data. }; struct CompanyInfrastructure { diff --git a/src/economy.cpp b/src/economy.cpp index 00bdd6f534..9af0e9e825 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -52,6 +52,8 @@ #include "table/strings.h" #include "table/pricebase.h" +#include "citymania/cm_main.hpp" + #include "safeguards.h" @@ -1053,6 +1055,10 @@ static uint DeliverGoodsToIndustry(const Station *st, CargoID cargo_type, uint n /* Update the cargo monitor. */ AddCargoDelivery(cargo_type, company, amount, ST_INDUSTRY, source, st, ind->index); + + if (amount > 0) + citymania::Emit(citymania::event::CargoDeliveredToIndustry{ind, cargo_type, amount, st}); + } return accepted; @@ -1113,6 +1119,12 @@ static Money DeliverGoods(int num_pieces, CargoID cargo_type, StationID dest, Ti } } + if (accepted_total > 0) { + if (accepted_ind != accepted_total) + citymania::Emit(citymania::event::CargoDeliveredToUnknown{cargo_type, accepted_total - accepted_ind, st}); + citymania::Emit(citymania::event::CargoAccepted{company, cargo_type, accepted_total, st, profit, src_type, src}); + } + return profit; }