aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author wvpm <24685035+wvpm@users.noreply.github.com>2024-10-28 11:07:15 +0100
committer wvpm <24685035+wvpm@users.noreply.github.com>2024-11-15 09:13:31 +0100
commita8ef75c96c579f74ee68789c5879df5262e36220 (patch)
treea10aeb9d4673f8eadf8bb397cf5f7cad3927e288
parente91bd6c3322a73c3ac6707329e81b6f2edc0b8be (diff)
Add market placeholder
-rw-r--r--src/openvic-simulation/InstanceManager.cpp4
-rw-r--r--src/openvic-simulation/InstanceManager.hpp2
-rw-r--r--src/openvic-simulation/economy/GoodInstance.cpp30
-rw-r--r--src/openvic-simulation/economy/GoodInstance.hpp16
-rw-r--r--src/openvic-simulation/economy/production/ResourceGatheringOperation.cpp34
-rw-r--r--src/openvic-simulation/economy/production/ResourceGatheringOperation.hpp4
-rw-r--r--src/openvic-simulation/economy/trading/MarketInstance.cpp28
-rw-r--r--src/openvic-simulation/economy/trading/MarketInstance.hpp15
-rw-r--r--src/openvic-simulation/economy/trading/MarketSellOrder.cpp19
-rw-r--r--src/openvic-simulation/economy/trading/MarketSellOrder.hpp32
-rw-r--r--src/openvic-simulation/economy/trading/SellResult.cpp11
-rw-r--r--src/openvic-simulation/economy/trading/SellResult.hpp16
-rw-r--r--src/openvic-simulation/map/MapInstance.cpp4
-rw-r--r--src/openvic-simulation/map/MapInstance.hpp2
-rw-r--r--src/openvic-simulation/map/ProvinceInstance.cpp3
-rw-r--r--src/openvic-simulation/map/ProvinceInstance.hpp2
16 files changed, 206 insertions, 16 deletions
diff --git a/src/openvic-simulation/InstanceManager.cpp b/src/openvic-simulation/InstanceManager.cpp
index 277b439..ff03aeb 100644
--- a/src/openvic-simulation/InstanceManager.cpp
+++ b/src/openvic-simulation/InstanceManager.cpp
@@ -62,6 +62,7 @@ void InstanceManager::tick() {
// Tick...
map_instance.map_tick(today);
+ market_instance.execute_orders();
set_gamestate_needs_update();
}
@@ -73,8 +74,10 @@ bool InstanceManager::setup() {
}
bool ret = good_instance_manager.setup(definition_manager.get_economy_manager().get_good_definition_manager());
+ ret &= market_instance.setup(good_instance_manager);
ret &= map_instance.setup(
definition_manager.get_economy_manager().get_building_type_manager(),
+ market_instance,
definition_manager.get_modifier_manager().get_modifier_effect_cache(),
definition_manager.get_pop_manager().get_pop_types(),
definition_manager.get_politics_manager().get_ideology_manager().get_ideologies()
@@ -145,6 +148,7 @@ bool InstanceManager::load_bookmark(Bookmark const* new_bookmark) {
today,
definition_manager.get_define_manager()
);
+ market_instance.execute_orders();
}
return ret;
diff --git a/src/openvic-simulation/InstanceManager.hpp b/src/openvic-simulation/InstanceManager.hpp
index 05ae412..418515b 100644
--- a/src/openvic-simulation/InstanceManager.hpp
+++ b/src/openvic-simulation/InstanceManager.hpp
@@ -5,6 +5,7 @@
#include "openvic-simulation/country/CountryInstance.hpp"
#include "openvic-simulation/diplomacy/CountryRelation.hpp"
#include "openvic-simulation/economy/GoodInstance.hpp"
+#include "openvic-simulation/economy/trading/MarketInstance.hpp"
#include "openvic-simulation/map/MapInstance.hpp"
#include "openvic-simulation/map/Mapmode.hpp"
#include "openvic-simulation/military/UnitInstanceGroup.hpp"
@@ -24,6 +25,7 @@ namespace OpenVic {
CountryInstanceManager PROPERTY_REF(country_instance_manager);
CountryRelationManager PROPERTY_REF(country_relation_manager);
GoodInstanceManager PROPERTY_REF(good_instance_manager);
+ MarketInstance PROPERTY_REF(market_instance);
UnitInstanceManager PROPERTY_REF(unit_instance_manager);
/* Near the end so it is freed after other managers that may depend on it,
* e.g. if we want to remove military units from the province they're in when they're destructed. */
diff --git a/src/openvic-simulation/economy/GoodInstance.cpp b/src/openvic-simulation/economy/GoodInstance.cpp
index ac081c9..8844a6f 100644
--- a/src/openvic-simulation/economy/GoodInstance.cpp
+++ b/src/openvic-simulation/economy/GoodInstance.cpp
@@ -3,8 +3,34 @@
using namespace OpenVic;
GoodInstance::GoodInstance(GoodDefinition const& new_good_definition)
- : HasIdentifierAndColour { new_good_definition }, good_definition { new_good_definition },
- price { new_good_definition.get_base_price() }, is_available { new_good_definition.get_is_available_from_start() } {}
+ : HasIdentifierAndColour { new_good_definition },
+ good_definition { new_good_definition },
+ price { new_good_definition.get_base_price() },
+ is_available { new_good_definition.get_is_available_from_start() },
+ total_supply_yesterday { fixed_point_t::_0() },
+ market_sell_orders {}
+ {}
+
+void GoodInstance::add_market_sell_order(const GoodMarketSellOrder market_sell_order) {
+ market_sell_orders.push_back(market_sell_order);
+}
+
+void GoodInstance::execute_orders() {
+ const fixed_point_t price = get_price();
+
+ fixed_point_t supply_running_total = fixed_point_t::_0();
+ for(GoodMarketSellOrder const& market_sell_order : market_sell_orders) {
+ const fixed_point_t market_sell_quantity = market_sell_order.get_quantity();
+ supply_running_total += market_sell_quantity;
+ market_sell_order.get_after_trade()({
+ market_sell_quantity,
+ market_sell_quantity * price
+ });
+ }
+
+ total_supply_yesterday = supply_running_total;
+ market_sell_orders.clear();
+}
bool GoodInstanceManager::setup(GoodDefinitionManager const& good_definition_manager) {
if (good_instances_are_locked()) {
diff --git a/src/openvic-simulation/economy/GoodInstance.hpp b/src/openvic-simulation/economy/GoodInstance.hpp
index 74ec939..dbb533d 100644
--- a/src/openvic-simulation/economy/GoodInstance.hpp
+++ b/src/openvic-simulation/economy/GoodInstance.hpp
@@ -1,6 +1,10 @@
#pragma once
+#include <deque>
+
#include "openvic-simulation/economy/GoodDefinition.hpp"
+#include "openvic-simulation/economy/trading/MarketSellOrder.hpp"
+#include "openvic-simulation/types/fixed_point/FixedPoint.hpp"
#include "openvic-simulation/types/HasIdentifier.hpp"
#include "openvic-simulation/types/IdentifierRegistry.hpp"
#include "openvic-simulation/utility/Getters.hpp"
@@ -15,12 +19,19 @@ namespace OpenVic {
GoodDefinition const& PROPERTY(good_definition);
fixed_point_t PROPERTY(price);
bool PROPERTY(is_available);
- // TODO - supply, demand, actual bought
-
+ fixed_point_t PROPERTY(total_supply_yesterday);
+ std::deque<GoodMarketSellOrder> market_sell_orders;
+
GoodInstance(GoodDefinition const& new_good_definition);
public:
GoodInstance(GoodInstance&&) = default;
+
+ //thread safe
+ void add_market_sell_order(const GoodMarketSellOrder market_sell_order);
+
+ //not thread safe
+ void execute_orders();
};
struct GoodInstanceManager {
@@ -28,6 +39,7 @@ namespace OpenVic {
IdentifierRegistry<GoodInstance> IDENTIFIER_REGISTRY(good_instance);
public:
+ IDENTIFIER_REGISTRY_NON_CONST_ACCESSORS(good_instance);
bool setup(GoodDefinitionManager const& good_definition_manager);
};
}
diff --git a/src/openvic-simulation/economy/production/ResourceGatheringOperation.cpp b/src/openvic-simulation/economy/production/ResourceGatheringOperation.cpp
index 8db74c1..410acf9 100644
--- a/src/openvic-simulation/economy/production/ResourceGatheringOperation.cpp
+++ b/src/openvic-simulation/economy/production/ResourceGatheringOperation.cpp
@@ -4,6 +4,7 @@
#include "openvic-simulation/economy/production/Employee.hpp"
#include "openvic-simulation/economy/production/ProductionType.hpp"
+#include "openvic-simulation/economy/trading/SellResult.hpp"
#include "openvic-simulation/map/ProvinceInstance.hpp"
#include "openvic-simulation/map/State.hpp"
#include "openvic-simulation/modifier/ModifierEffectCache.hpp"
@@ -14,6 +15,7 @@
using namespace OpenVic;
ResourceGatheringOperation::ResourceGatheringOperation(
+ MarketInstance& new_market_instance,
ModifierEffectCache const& new_modifier_effect_cache,
ProductionType const* new_production_type_nullable,
fixed_point_t new_size_multiplier,
@@ -22,7 +24,8 @@ ResourceGatheringOperation::ResourceGatheringOperation(
fixed_point_t new_unsold_quantity_yesterday,
std::vector<Employee>&& new_employees,
decltype(employee_count_per_type_cache)::keys_t const& pop_type_keys
-) : modifier_effect_cache { new_modifier_effect_cache },
+) : market_instance { new_market_instance },
+ modifier_effect_cache { new_modifier_effect_cache },
location_ptr { nullptr },
production_type_nullable { new_production_type_nullable },
revenue_yesterday { new_revenue_yesterday },
@@ -39,9 +42,11 @@ ResourceGatheringOperation::ResourceGatheringOperation(
{ }
ResourceGatheringOperation::ResourceGatheringOperation(
+ MarketInstance& new_market_instance,
ModifierEffectCache const& new_modifier_effect_cache,
decltype(employee_count_per_type_cache)::keys_t const& pop_type_keys
) : ResourceGatheringOperation {
+ new_market_instance,
new_modifier_effect_cache,
nullptr, fixed_point_t::_0(),
fixed_point_t::_0(), fixed_point_t::_0(),
@@ -146,15 +151,24 @@ void ResourceGatheringOperation::rgo_tick() {
owner_pops_cache,
total_owner_count_in_state_cache
);
-
- revenue_yesterday = output_quantity_yesterday * production_type.get_output_good().get_base_price(); //TODO sell on market
-
- pay_employees(
- revenue_yesterday,
- total_worker_count_in_province,
- owner_pops_cache,
- total_owner_count_in_state_cache
- );
+ market_instance.place_market_sell_order({
+ production_type.get_output_good(),
+ output_quantity_yesterday,
+ [
+ this,
+ total_worker_count_in_province,
+ owner_pops_cache = std::move(owner_pops_cache),
+ total_owner_count_in_state_cache
+ ](const SellResult sell_result) mutable -> void {
+ revenue_yesterday = sell_result.get_money_gained();
+ pay_employees(
+ revenue_yesterday,
+ total_worker_count_in_province,
+ owner_pops_cache,
+ total_owner_count_in_state_cache
+ );
+ }
+ });
}
void ResourceGatheringOperation::hire(const Pop::pop_size_t available_worker_count) {
diff --git a/src/openvic-simulation/economy/production/ResourceGatheringOperation.hpp b/src/openvic-simulation/economy/production/ResourceGatheringOperation.hpp
index 878041e..449d41a 100644
--- a/src/openvic-simulation/economy/production/ResourceGatheringOperation.hpp
+++ b/src/openvic-simulation/economy/production/ResourceGatheringOperation.hpp
@@ -2,6 +2,7 @@
#include "openvic-simulation/economy/production/Employee.hpp"
#include "openvic-simulation/economy/production/ProductionType.hpp"
+#include "openvic-simulation/economy/trading/MarketInstance.hpp"
#include "openvic-simulation/modifier/ModifierEffectCache.hpp"
#include "openvic-simulation/pop/Pop.hpp"
#include "openvic-simulation/types/fixed_point/FixedPoint.hpp"
@@ -12,6 +13,7 @@ namespace OpenVic {
struct ResourceGatheringOperation {
private:
+ MarketInstance& market_instance;
ModifierEffectCache const& modifier_effect_cache;
ProvinceInstance* location_ptr;
ProductionType const* PROPERTY_RW(production_type_nullable);
@@ -42,6 +44,7 @@ namespace OpenVic {
public:
ResourceGatheringOperation(
+ MarketInstance& new_market_instance,
ModifierEffectCache const& new_modifier_effect_cache,
ProductionType const* new_production_type_nullable,
fixed_point_t new_size_multiplier,
@@ -53,6 +56,7 @@ namespace OpenVic {
);
ResourceGatheringOperation(
+ MarketInstance& new_market_instance,
ModifierEffectCache const& new_modifier_effect_cache,
decltype(employee_count_per_type_cache)::keys_t const& pop_type_keys
);
diff --git a/src/openvic-simulation/economy/trading/MarketInstance.cpp b/src/openvic-simulation/economy/trading/MarketInstance.cpp
new file mode 100644
index 0000000..06a470b
--- /dev/null
+++ b/src/openvic-simulation/economy/trading/MarketInstance.cpp
@@ -0,0 +1,28 @@
+#include "MarketInstance.hpp"
+
+#include <execution>
+
+using namespace OpenVic;
+
+bool MarketInstance::setup(GoodInstanceManager& new_good_instance_manager) {
+ good_instance_manager = &new_good_instance_manager;
+ return true;
+}
+
+void MarketInstance::place_market_sell_order(const MarketSellOrder market_sell_order) {
+ GoodDefinition const* const good = market_sell_order.get_good();
+ GoodInstance* const good_instance = good_instance_manager->get_good_instance_by_identifier(good->get_identifier());
+ good_instance->add_market_sell_order(market_sell_order);
+}
+
+void MarketInstance::execute_orders() {
+ std::vector<GoodInstance>& good_instances = good_instance_manager->get_good_instances();
+ std::for_each(
+ std::execution::par,
+ good_instances.begin(),
+ good_instances.end(),
+ [](GoodInstance& good_instance) -> void {
+ good_instance.execute_orders();
+ }
+ );
+}
diff --git a/src/openvic-simulation/economy/trading/MarketInstance.hpp b/src/openvic-simulation/economy/trading/MarketInstance.hpp
new file mode 100644
index 0000000..2d8a651
--- /dev/null
+++ b/src/openvic-simulation/economy/trading/MarketInstance.hpp
@@ -0,0 +1,15 @@
+#pragma once
+
+#include "openvic-simulation/economy/GoodInstance.hpp"
+#include "openvic-simulation/economy/trading/MarketSellOrder.hpp"
+
+namespace OpenVic {
+ struct MarketInstance {
+ private:
+ GoodInstanceManager* PROPERTY(good_instance_manager);
+ public:
+ bool setup(GoodInstanceManager& new_good_instance_manager);
+ void place_market_sell_order(const MarketSellOrder market_sell_order);
+ void execute_orders();
+ };
+} \ No newline at end of file
diff --git a/src/openvic-simulation/economy/trading/MarketSellOrder.cpp b/src/openvic-simulation/economy/trading/MarketSellOrder.cpp
new file mode 100644
index 0000000..8522c8c
--- /dev/null
+++ b/src/openvic-simulation/economy/trading/MarketSellOrder.cpp
@@ -0,0 +1,19 @@
+#include "MarketSellOrder.hpp"
+
+using namespace OpenVic;
+
+GoodMarketSellOrder::GoodMarketSellOrder(
+ const fixed_point_t new_quantity,
+ const std::function<void(const SellResult)> new_after_trade
+):
+ quantity { new_quantity },
+ after_trade { new_after_trade }
+ {}
+
+MarketSellOrder::MarketSellOrder(
+ GoodDefinition const& new_good,
+ const fixed_point_t new_quantity,
+ const std::function<void(const SellResult)> new_after_trade
+): GoodMarketSellOrder(new_quantity, new_after_trade),
+ good { &new_good }
+ {} \ No newline at end of file
diff --git a/src/openvic-simulation/economy/trading/MarketSellOrder.hpp b/src/openvic-simulation/economy/trading/MarketSellOrder.hpp
new file mode 100644
index 0000000..21c931d
--- /dev/null
+++ b/src/openvic-simulation/economy/trading/MarketSellOrder.hpp
@@ -0,0 +1,32 @@
+#pragma once
+
+#include "openvic-simulation/economy/GoodDefinition.hpp"
+#include "openvic-simulation/economy/trading/SellResult.hpp"
+#include "openvic-simulation/types/fixed_point/FixedPoint.hpp"
+#include "openvic-simulation/utility/Getters.hpp"
+
+namespace OpenVic {
+ struct GoodMarketSellOrder {
+ private:
+ const fixed_point_t PROPERTY(quantity);
+ const std::function<void(const SellResult)> PROPERTY(after_trade);
+
+ public:
+ GoodMarketSellOrder(
+ const fixed_point_t new_quantity,
+ const std::function<void(const SellResult)> new_after_trade
+ );
+ };
+
+ struct MarketSellOrder : GoodMarketSellOrder {
+ private:
+ GoodDefinition const* const PROPERTY(good);
+
+ public:
+ MarketSellOrder(
+ GoodDefinition const& new_good,
+ const fixed_point_t new_quantity,
+ const std::function<void(const SellResult)> new_after_trade
+ );
+ };
+} \ No newline at end of file
diff --git a/src/openvic-simulation/economy/trading/SellResult.cpp b/src/openvic-simulation/economy/trading/SellResult.cpp
new file mode 100644
index 0000000..91de626
--- /dev/null
+++ b/src/openvic-simulation/economy/trading/SellResult.cpp
@@ -0,0 +1,11 @@
+#include "SellResult.hpp"
+
+using namespace OpenVic;
+
+SellResult::SellResult(
+ const fixed_point_t new_quantity_sold,
+ const fixed_point_t new_money_gained
+) :
+ quantity_sold { new_quantity_sold },
+ money_gained { new_money_gained }
+ {} \ No newline at end of file
diff --git a/src/openvic-simulation/economy/trading/SellResult.hpp b/src/openvic-simulation/economy/trading/SellResult.hpp
new file mode 100644
index 0000000..f3a40ad
--- /dev/null
+++ b/src/openvic-simulation/economy/trading/SellResult.hpp
@@ -0,0 +1,16 @@
+#pragma once
+
+#include "openvic-simulation/types/fixed_point/FixedPoint.hpp"
+
+namespace OpenVic {
+ struct SellResult {
+ private:
+ fixed_point_t PROPERTY(quantity_sold);
+ fixed_point_t PROPERTY(money_gained);
+ public:
+ SellResult(
+ const fixed_point_t new_quantity_sold,
+ const fixed_point_t new_money_gained
+ );
+ };
+} \ No newline at end of file
diff --git a/src/openvic-simulation/map/MapInstance.cpp b/src/openvic-simulation/map/MapInstance.cpp
index 860ec10..28bf189 100644
--- a/src/openvic-simulation/map/MapInstance.cpp
+++ b/src/openvic-simulation/map/MapInstance.cpp
@@ -43,6 +43,7 @@ ProvinceDefinition::index_t MapInstance::get_selected_province_index() const {
bool MapInstance::setup(
BuildingTypeManager const& building_type_manager,
+ MarketInstance& market_instance,
ModifierEffectCache const& modifier_effect_cache,
decltype(ProvinceInstance::pop_type_distribution)::keys_t const& pop_type_keys,
decltype(ProvinceInstance::ideology_distribution)::keys_t const& ideology_keys
@@ -61,7 +62,8 @@ bool MapInstance::setup(
province_instances.reserve(map_definition.get_province_definition_count());
for (ProvinceDefinition const& province : map_definition.get_province_definitions()) {
- ret &= province_instances.add_item({
+ ret &= province_instances.add_item({
+ market_instance,
modifier_effect_cache,
province,
pop_type_keys,
diff --git a/src/openvic-simulation/map/MapInstance.hpp b/src/openvic-simulation/map/MapInstance.hpp
index a498061..b45ff50 100644
--- a/src/openvic-simulation/map/MapInstance.hpp
+++ b/src/openvic-simulation/map/MapInstance.hpp
@@ -1,5 +1,6 @@
#pragma once
+#include "openvic-simulation/economy/trading/MarketInstance.hpp"
#include "openvic-simulation/map/ProvinceDefinition.hpp"
#include "openvic-simulation/map/ProvinceInstance.hpp"
#include "openvic-simulation/map/State.hpp"
@@ -44,6 +45,7 @@ namespace OpenVic {
bool setup(
BuildingTypeManager const& building_type_manager,
+ MarketInstance& market_instance,
ModifierEffectCache const& modifier_effect_cache,
decltype(ProvinceInstance::pop_type_distribution)::keys_t const& pop_type_keys,
decltype(ProvinceInstance::ideology_distribution)::keys_t const& ideology_keys
diff --git a/src/openvic-simulation/map/ProvinceInstance.cpp b/src/openvic-simulation/map/ProvinceInstance.cpp
index b5cca55..0a44faa 100644
--- a/src/openvic-simulation/map/ProvinceInstance.cpp
+++ b/src/openvic-simulation/map/ProvinceInstance.cpp
@@ -18,6 +18,7 @@
using namespace OpenVic;
ProvinceInstance::ProvinceInstance(
+ MarketInstance& new_market_instance,
ModifierEffectCache const& new_modifier_effect_cache,
ProvinceDefinition const& new_province_definition,
decltype(pop_type_distribution)::keys_t const& pop_type_keys,
@@ -35,7 +36,7 @@ ProvinceInstance::ProvinceInstance(
event_modifiers {},
slave { false },
crime { nullptr },
- rgo { new_modifier_effect_cache, pop_type_keys },
+ rgo { new_market_instance, new_modifier_effect_cache, pop_type_keys },
buildings { "buildings", false },
armies {},
navies {},
diff --git a/src/openvic-simulation/map/ProvinceInstance.hpp b/src/openvic-simulation/map/ProvinceInstance.hpp
index 997d025..f21e133 100644
--- a/src/openvic-simulation/map/ProvinceInstance.hpp
+++ b/src/openvic-simulation/map/ProvinceInstance.hpp
@@ -5,6 +5,7 @@
#include "openvic-simulation/economy/BuildingInstance.hpp"
#include "openvic-simulation/economy/production/ProductionType.hpp"
#include "openvic-simulation/economy/production/ResourceGatheringOperation.hpp"
+#include "openvic-simulation/economy/trading/MarketInstance.hpp"
#include "openvic-simulation/military/UnitInstance.hpp"
#include "openvic-simulation/military/UnitType.hpp"
#include "openvic-simulation/modifier/ModifierEffectCache.hpp"
@@ -104,6 +105,7 @@ namespace OpenVic {
size_t PROPERTY(max_supported_regiments);
ProvinceInstance(
+ MarketInstance& new_market_instance,
ModifierEffectCache const& new_modifier_effect_cache,
ProvinceDefinition const& new_province_definition,
decltype(pop_type_distribution)::keys_t const& pop_type_keys,