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;
}