Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion assets/lua/_meta.lua
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
---@meta

-- META FILES, PROVIDES TYPING HINTS, DO NOT REQUIRE

alice = {}
alice_ui = {}
123 changes: 83 additions & 40 deletions assets/lua/custom_ffi.lua
Original file line number Diff line number Diff line change
Expand Up @@ -18,61 +18,104 @@ ffi.cdef[[
bool alice_at_war(int32_t nation_a, int32_t nation_b);

typedef struct {
int32_t good;
float amount;
} trade_good_container;
int32_t good;
float amount;
} trade_good_container;

typedef struct {
int32_t build_time;
int32_t default_organisation;
float maximum_speed;
float defence_or_hull;
float attack_or_gun_power;
float supply_consumption;
float support;
float siege_or_torpedo_attack;
float reconnaissance_or_fire_range;
float discipline_or_evasion;
float maneuver;
} unit_variable_stats;
typedef struct {
int32_t build_time;
int32_t default_organisation;
float maximum_speed;
float defence_or_hull;
float attack_or_gun_power;
float supply_consumption;
float support;
float siege_or_torpedo_attack;
float reconnaissance_or_fire_range;
float discipline_or_evasion;
float maneuver;
} unit_variable_stats;

unit_variable_stats* alice_get_unit_stats(int32_t unit_id);
unit_variable_stats* alice_get_unit_stats(int32_t unit_id);

void call_daily(const char function_name[]);
void remove_daily(const char function_name[]);
void call_daily(const char function_name[]);
void remove_daily(const char function_name[]);

void call_daily_battle(const char function_name[]);
void remove_daily_battle(const char function_name[]);
void call_daily_battle(const char function_name[]);
void remove_daily_battle(const char function_name[]);

void call_battle_end(const char function_name[]);
void remove_battle_end(const char function_name[]);
void call_battle_end(const char function_name[]);
void remove_battle_end(const char function_name[]);

void set_text(const char text[]);
int32_t local_player_nation();
void set_text(const char text[]);
int32_t local_player_nation();

void console_log(const char text[]);
void console_log(const char text[]);

int32_t lua_get_gamerule_id_by_name(const char gamerule_name[]);
int32_t lua_get_gamerule_id_by_name(const char gamerule_name[]);
int32_t lua_get_gamerule_option_id_by_name(const char gamerule_option_name[]);
bool lua_check_gamerule(int32_t gamerule_id, uint8_t opt_id);
int32_t lua_get_active_gamerule_option(int32_t gamerule_id);




int32_t lua_create_text_key(const char key[]);
void lua_add_rgo_efficiency_commodity(int32_t target, int32_t commodity, float volume);
void lua_add_factory_efficiency_commodity(int32_t target, int32_t commodity, float volume);
void lua_add_factory_input_commodity(int32_t target, int32_t commodity, float volume);
void lua_add_factory_cost_commodity(int32_t target, int32_t commodity, float volume);
]]

TEXT = {}

---comment
---@param key string
---@return text_key
function TEXT.create_key(key)
return ffi.C.lua_create_text_key(key)
end

FACTORY_TYPE_DATA = {}
FACTORY_TYPE_DATA.COST = {}
FACTORY_TYPE_DATA.INPUT = {}
FACTORY_TYPE_DATA.EFFICIENCY = {}

---@param target factory_type_id
---@param commodity commodity_id
---@param volume number
function FACTORY_TYPE_DATA.COST.add(target, commodity, volume)
ffi.C.lua_add_factory_cost_commodity(target, commodity, volume);
end
---@param target factory_type_id
---@param commodity commodity_id
---@param volume number
function FACTORY_TYPE_DATA.INPUT.add(target, commodity, volume)
ffi.C.lua_add_factory_input_commodity(target, commodity, volume);
end
---@param target factory_type_id
---@param commodity commodity_id
---@param volume number
function FACTORY_TYPE_DATA.EFFICIENCY.add(target, commodity, volume)
ffi.C.lua_add_factory_efficiency_commodity(target, commodity, volume);
end

EFFICIENCY = {}
EFFICIENCY.RGO = {}
---comment
---@param target commodity_id
---@param commodity commodity_id
---@param volume number
function EFFICIENCY.RGO.add(target, commodity, volume)
ffi.C.lua_add_rgo_efficiency_commodity(target, commodity, volume);
end

STATE = {}

---@return nation_id
function STATE.player()
return ffi.C.local_player_nation()
return ffi.C.local_player_nation()
end

---@param text string
function STATE.set_text(text)
return ffi.C.set_text(text)
return ffi.C.set_text(text)
end


Expand Down Expand Up @@ -133,29 +176,29 @@ ON_ACTION = {}

---@param name string
function ON_ACTION.add_daily_call(name)
ffi.C.call_daily(name)
ffi.C.call_daily(name)
end
---@param name string
function ON_ACTION.remove_daily_call(name)
ffi.C.remove_daily(name)
ffi.C.remove_daily(name)
end
---@param name string
function ON_ACTION.add_battle_call(name)
ffi.C.call_daily_battle(name)
ffi.C.call_daily_battle(name)
end
---@param name string
function ON_ACTION.remove_battle_call(name)
ffi.C.remove_daily_battle(name)
ffi.C.remove_daily_battle(name)
end
---@param name string
function ON_ACTION.add_battle_end_call(name)
ffi.C.call_battle_end(name)
ffi.C.call_battle_end(name)
end
---@param name string
function ON_ACTION.remove_battle_end_call(name)
ffi.C.remove_battle_end(name)
ffi.C.remove_battle_end(name)
end
---@param name string
function console_log(message)
ffi.C.console_log(message)
ffi.C.console_log(message)
end
156 changes: 156 additions & 0 deletions assets/lua/game_scripts/scenario_load.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
function LOAD_SCENARIO_DATA()

end

--[[
Usage example:
(DO NOT FORGET TO DELETE ORIGINAL BUILDINGS SO YOU DON'T GET DUPLICATES!!!)

---@enum COMMODITY_GROUP
COMMODITY_GROUP = {
MILITARY = 0,
RAW = 1,
INDUSTRY = 2,
CONSUMER = 3,
INDUSTRIAL_CONSUMER = 4
}

---comment
---@param name string
---@param icon number
---@param color number[]
---@return commodity_id
local function load_commodity(name, icon, color)
local item = COMMODITY.create()
local name_key = TEXT.create_key(name)
COMMODITY.set_name(item, name_key)
COMMODITY.set_commodity_group(item, COMMODITY_GROUP.CONSUMER)
COMMODITY.set_cost(item, 1)
COMMODITY.set_median_price(item, 1)
COMMODITY.set_is_available_from_start(item, true)
COMMODITY.set_is_local(item, false)
COMMODITY.set_overseas_penalty(item, false)
COMMODITY.set_uses_potentials(item, false)
COMMODITY.set_money_rgo(item, false)
COMMODITY.set_icon(item, icon)
-- ABGR
COMMODITY.set_color(item, color[3] * (2 ^ 16) + color[2] * (2 ^ 8) + color[1])
return item
end
---@alias Container {[1] : commodity_id, [2] : number}

---@param name string
---@param inputs Container[]
---@param efficiency_inputs Container[]
---@param output Container
---@param construction_cost Container[]
---@param construction_time number?
local function load_factory(name, inputs, efficiency_inputs, output, construction_cost, construction_time)
local item = FACTORY_TYPE.create()
local name_key = TEXT.create_key(name)
local description_key = TEXT.create_key(name .. "_desc")
FACTORY_TYPE.set_name(item, name_key)
FACTORY_TYPE.set_description(item, description_key)
if construction_time == nil then
FACTORY_TYPE.set_construction_time(item, 360)
else
FACTORY_TYPE.set_construction_time(item, construction_time)
end
FACTORY_TYPE.set_is_available_from_start(item, true)
FACTORY_TYPE.set_can_be_built_in_colonies(item, false)
FACTORY_TYPE.set_factory_tier(item, 0)
FACTORY_TYPE.set_is_coastal(item, false)

for _, value in ipairs(construction_cost) do
FACTORY_TYPE_DATA.COST.add(item, value[1], value[2])
end
for _, value in ipairs(inputs) do
FACTORY_TYPE_DATA.INPUT.add(item, value[1], value[2])
end
for _, value in ipairs(efficiency_inputs) do
FACTORY_TYPE_DATA.EFFICIENCY.add(item, value[1], value[2])
end

FACTORY_TYPE.set_output(item, output[1])
FACTORY_TYPE.set_output_amount(item, output[2])
FACTORY_TYPE.set_base_workforce(item, 1000)
end

---comment
---@param goods Container[]
---@return consumption_category_id
local function load_consumption_category(weight, depends_on, scales_with, goods)
local item = CONSUMPTION_CATEGORY.create()
if (depends_on) then
-- Consumption is discouraged unless pop is able to buy this category
CONSUMPTION_CATEGORY.set_buy_after(item, depends_on)
end
if (scales_with) then
-- Consumption is discouraged unless pop is able to buy this good from previously buy_after category
-- For example, it could be automobiles from transportation need which discourage consumption of fuel
CONSUMPTION_CATEGORY.set_scale_with(item, scales_with)
end
for index, value in ipairs(goods) do
CONSUMPTION_CATEGORY.set_weights(item, value[1], value[2])
end
CONSUMPTION_CATEGORY.set_satisfaction_score(item, weight)

-- Pops would prefer to buy goods with actual availability
CONSUMPTION_CATEGORY.set_availability_pressure(item, 1)

-- When negative, pops will try to avoid buying expensive goods from this category
-- When positive, they will be encouraged to buy expensive goods rather than cheap
CONSUMPTION_CATEGORY.set_price_pressure(item, -10)

-- Base pressure to buy goods from this category.
-- Set high to get more uniform weights.
CONSUMPTION_CATEGORY.set_base_pressure(item, 0.3)
return item
end

---comment
---@param item consumption_category_id
local function set_as_luxury(item)
CONSUMPTION_CATEGORY.set_price_pressure(item, 1)
CONSUMPTION_CATEGORY.set_base_pressure(item, 1.0)
end


function LOAD_SCENARIO_DATA()
-- OBLIGATORY FOR NOW
local money = load_commodity("money", 0, {50, 50, 50})

-- Load your goods

local raw_ammunition = load_commodity("raw_ammunition", 2, {100, 100, 100})
local alloys = load_commodity("alloys", 3, {0, 100, 100})
local super_alloys = load_commodity("super_alloys", 4, {100, 0, 100})
local ammunition = load_commodity("ammunition", 1, {200, 200, 100})

-- Create convenience tables
local ammunition_RGO = {raw_ammunition}
local ammunition_needs_desc = {{ammunition, 1}}
local super_alloys_needs_desc = {{super_alloys, 1}}

-- Set RGO data
for _, item in ipairs(ammunition_RGO) do
EFFICIENCY.RGO.add(item, fertilizer, 0.1)
EFFICIENCY.RGO.add(item, steel, 0.1)
EFFICIENCY.RGO.add(item, automobiles, 0.1)
COMMODITY.set_rgo_amount(item, 10)
COMMODITY.set_rgo_efficiency_inputs_are_defined_in_content(item, true)
end

-- Create factories.

local default_efficiency = {{alloys, 0.1}}
local default_cost = {{alloys, 100}, {super_alloys, 100}}

load_factory("ammunition_factory", { {raw_ammunition, 2} }, default_efficiency, {ammunition, 1}, default_cost)

-- Create categories of needs

local basic_food = load_consumption_category(0.05, nil, nil, ammunition_needs_desc)
local cool_food = load_consumption_category(0.1, basic_food, nil, super_alloys_needs_desc)
set_as_luxury(cool_food)
--]]
2 changes: 1 addition & 1 deletion dependencies/DataContainerLuaGenerator/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ message(STATUS "Fetching DataContainerLua...")
FetchContent_Declare(
DataContainerLua
GIT_REPOSITORY https://github.com/ineveraskedforthis/DataContainer-Lua
GIT_TAG main
GIT_TAG allow-creation
GIT_SHALLOW 1
GIT_PROGRESS TRUE
)
Expand Down
Loading
Loading