From b0002fe901e08e4edb7f70b8ff4b4a5d13c73c63 Mon Sep 17 00:00:00 2001 From: fal343 <98967311+fal343@users.noreply.github.com> Date: Sat, 27 Dec 2025 09:53:44 +0000 Subject: [PATCH] feature population and pfd growth --- ChapterMaster.yyp | 6 +- objects/obj_star/Alarm_1.gml | 55 ++-- objects/obj_star/Create_0.gml | 1 + objects/obj_star_select/Draw_64.gml | 253 +++++++++++------- scripts/scr_PlanetData/scr_PlanetData.gml | 2 +- scripts/scr_enemy_ai_c/scr_enemy_ai_c.gml | 2 - .../scr_imperial_manage_fleet_functions.gml | 87 ++++-- .../scr_ork_fleet_functions.gml | 1 - 8 files changed, 264 insertions(+), 143 deletions(-) diff --git a/ChapterMaster.yyp b/ChapterMaster.yyp index 6fd18c028e..bb7699c99d 100644 --- a/ChapterMaster.yyp +++ b/ChapterMaster.yyp @@ -118,7 +118,9 @@ {"$GMFolder":"","%Name":"Tile Sets","folderPath":"folders/Tile Sets.yy","name":"Tile Sets","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"Timelines","folderPath":"folders/Timelines.yy","name":"Timelines","resourceType":"GMFolder","resourceVersion":"2.0",}, ], - "ForcedPrefabProjectReferences":[], + "ForcedPrefabProjectReferences":[ + {"link":"io.gamemaker.sdfshaders-1.0.0","name":"io.gamemaker.sdfshaders-1.0.0","path":"io.gamemaker.sdfshaders-1.0.0.yyp",}, + ], "IncludedFiles":[ {"$GMIncludedFile":"","%Name":"sisters.json","CopyToMask":-1,"filePath":"datafiles/data/dialogue","name":"sisters.json","resourceType":"GMIncludedFile","resourceVersion":"2.0",}, {"$GMIncludedFile":"","%Name":"psychic_disciplines.json","CopyToMask":-1,"filePath":"datafiles/data","name":"psychic_disciplines.json","resourceType":"GMIncludedFile","resourceVersion":"2.0",}, @@ -579,7 +581,7 @@ "isEcma":false, "LibraryEmitters":[], "MetaData":{ - "IDEVersion":"2024.1400.0.901", + "IDEVersion":"2024.14.2.213", }, "name":"ChapterMaster", "resources":[ diff --git a/objects/obj_star/Alarm_1.gml b/objects/obj_star/Alarm_1.gml index 360fc6d552..0662f53139 100644 --- a/objects/obj_star/Alarm_1.gml +++ b/objects/obj_star/Alarm_1.gml @@ -74,32 +74,35 @@ for(var i=1; i<=4; i++){ p_max_population[i] = p_population[i]; break; } - // Sets military on planet - if (p_population[i]>=10000000){ - var military=p_population[i]/470; - p_guardsmen[i]=floor(military*0.25); - p_pdf[i]=floor(military*0.75); - } - if (p_population[i]>=5000000) and (p_population[i]<10000000){ - var military=p_population[i]/200; - p_guardsmen[i]=floor(military*0.25); - p_pdf[i]=floor(military*0.75); - } - if (p_population[i]>=100000) and (p_population[i]<5000000){ - var military=p_population[i]/50; - p_guardsmen[i]=floor(military*0.25); - p_pdf[i]=floor(military*0.75); - } - if (p_population[i]<100000) and (p_population[i]>5) and (p_large[i]==0){ - p_pdf[i]=floor(p_population[i]/25); - } - if (p_population[i]<2000) and (p_population[i]>5) and (p_large[i]==0){ - p_pdf[i]=floor(p_population[i]/10); - } - if (p_large[i]==1){ - p_guardsmen[i]=floor(p_population[i]*1250000); - p_pdf[i]=p_guardsmen[i]*3; - } + + if (p_population[i]>=10000000){ + var military=p_population[i]/470; + p_guardsmen[i]=floor(military*0.25); + p_pdf[i]=floor(military*0.75); + } + if (p_population[i]>=5000000) and (p_population[i]<10000000){ + var military=p_population[i]/200; + p_guardsmen[i]=floor(military*0.25); + p_pdf[i]=floor(military*0.75); + } + if (p_population[i]>=100000) and (p_population[i]<5000000){ + var military=p_population[i]/50; + p_guardsmen[i]=floor(military*0.25); + p_pdf[i]=floor(military*0.75); + } + if (p_population[i]<100000) and (p_population[i]>5) and (p_large[i]==0){ + p_pdf[i]=floor(p_population[i]/25); + } + if (p_population[i]<2000) and (p_population[i]>5) and (p_large[i]==0){ + p_pdf[i]=floor(p_population[i]/10); + } + if (p_large[i]==1){ + p_guardsmen[i]=floor(p_population[i]*1250000); + p_pdf[i]=p_guardsmen[i]*3; + } + + //the pdf on planet gen is set as the target_pdf + p_target_pdf[i] = p_pdf[i]; if (p_population[i]<1000000) and (p_large[i]==0)then p_pop[i]=string(p_population[i]); if (p_population[i]>999999) and (p_large[i]==0)and (p_population[i]<1000000000) then p_pop[i]=string(p_population[i]/1000000)+"M"; diff --git a/objects/obj_star/Create_0.gml b/objects/obj_star/Create_0.gml index a3200bd6ad..57394f9d56 100644 --- a/objects/obj_star/Create_0.gml +++ b/objects/obj_star/Create_0.gml @@ -40,6 +40,7 @@ p_large = array_create(_planet_array_size, 0); p_pop = array_create(_planet_array_size, ""); p_guardsmen = array_create(_planet_array_size, 0); p_pdf = array_create(_planet_array_size, 0); +p_target_pdf = array_create(_planet_array_size, 0); p_fortified = array_create(_planet_array_size, 0); p_station = array_create(_planet_array_size, 0); p_player = array_create(_planet_array_size, 0); diff --git a/objects/obj_star_select/Draw_64.gml b/objects/obj_star_select/Draw_64.gml index 0ee09b3011..c39ffbccd8 100644 --- a/objects/obj_star_select/Draw_64.gml +++ b/objects/obj_star_select/Draw_64.gml @@ -261,109 +261,178 @@ if (obj_controller.selecting_planet!=0){ exit; } } - }else if (garrison!="" && !population){ - if (garrison.garrison_force ){ - draw_set_font(fnt_40k_14); - if (!garrison.garrison_leader){ - garrison.find_leader() - garrison.garrison_disposition_change(target, obj_controller.selecting_planet, true); - garrison_data_slate.sub_title = $"Garrison Leader {garrison.garrison_leader.name_role()}" - garrison_data_slate.body_text = garrison.garrison_report(); - } - garrison_data_slate.inside_method=function(){ - garrison_data_slate.title = "Garrison Report" - draw_set_color(c_gray); - var xx = garrison_data_slate.XX; - var yy = garrison_data_slate.YY; - var cur_planet = obj_controller.selecting_planet; - var half_way = yy+garrison_data_slate.height/2; - draw_set_halign(fa_left); - draw_line(xx+10, half_way, garrison_data_slate.width-10, half_way); - var defence_data = determine_pdf_defence(target.p_pdf[cur_planet], garrison,target.p_fortified[cur_planet]); - var defence_string = $"Planetary Defence : {defence_data[0]}"; - draw_text(xx+20, half_way, defence_string); - if (scr_hit(xx+20, half_way+10, xx+20+string_width(defence_string), half_way+10+20)){ - tooltip_draw(defence_data[1], 400); - } - if (garrison.dispo_change!="none"){ - if (garrison.dispo_change>55){ - draw_text(xx+20, half_way+30, $"Garrison Disposition Effect : Positive"); - } else if (garrison.dispo_change>44){ - draw_text(xx+20, half_way+30, $"Garrison Disposition Effect : Neutral"); - } else{ - draw_text(xx+20, half_way+30, $"Garrison Disposition Effect : Negative"); - } - } - } - garrison_data_slate.draw(340+main_data_slate.width, 160, 0.6, 0.6); - - } - } else if (population){ - garrison_data_slate.title = "Population Report"; - garrison_data_slate.inside_method = function(){ - draw_set_color(c_gray); - var xx = garrison_data_slate.XX; - var yy = garrison_data_slate.YY; - var cur_planet = obj_controller.selecting_planet; - var half_way = garrison_data_slate.height/2; - var spacing_x = 100 - var spacing_y = 65 - draw_set_halign(fa_left); - if (!target.space_hulk) { - if (obj_controller.faction_status[eFACTION.Imperium] != "War" && p_data.current_owner <= 5) || (obj_controller.faction_status[eFACTION.Imperium] == "War") { - colonist_button.update({ - x1:xx+35, - y1:half_way, - allow_click : array_length(potential_doners), - }); - colonist_button.draw(); + } else if (population){ + garrison_data_slate.title = "Population Report"; + garrison_data_slate.inside_method = function(){ + draw_set_color(c_gray); + var xx = garrison_data_slate.XX; + var yy = garrison_data_slate.YY; + var cur_planet = obj_controller.selecting_planet; + var half_way = garrison_data_slate.height/2; + var spacing_x = 100; + var spacing_y = 65; + draw_set_halign(fa_left); + + if (!target.space_hulk) { + if (obj_controller.faction_status[eFACTION.Imperium] != "War" && p_data.current_owner <= 5) || (obj_controller.faction_status[eFACTION.Imperium] == "War") { + colonist_button.update({ + x1:xx+35, + y1:half_way, + allow_click : array_length(potential_doners), + }); + colonist_button.draw(); - recruiting_button.update({ - x1:xx+(spacing_x*2)+15, + recruiting_button.update({ + x1:xx+(spacing_x*2)+15, + y1:half_way, + allow_click : true, + }); + recruiting_button.draw(); + + if (p_data.has_feature(P_features.Recruiting_World)) { + var _recruit_world = p_data.get_features(P_features.Recruiting_World)[0]; + if (_recruit_world.recruit_type == 0) && (obj_controller.faction_status[p_data.current_owner] != "War" && obj_controller.faction_status[p_data.current_owner] != "Antagonism" || p_data.player_disposition >= 50) { + draw_text(xx+(spacing_x*3)+35, half_way-20, "Open: Voluntery"); + } else if (_recruit_world.recruit_type == 0 && p_data.player_disposition <= 50) { + draw_text(xx+(spacing_x*3)+35, half_way-20, "Covert: Voluntery"); + } else { + draw_text(xx+(spacing_x*3)+35, half_way-20, "Abduct"); + } + recruitment_type_button.update({ + x1:xx+(spacing_x*3)+35, y1:half_way, allow_click : true, }); - recruiting_button.draw(); - if (p_data.has_feature(P_features.Recruiting_World)) { - var _recruit_world = p_data.get_features(P_features.Recruiting_World)[0]; - if (_recruit_world.recruit_type == 0) && (obj_controller.faction_status[p_data.current_owner] != "War" && obj_controller.faction_status[p_data.current_owner] != "Antagonism" || p_data.player_disposition >= 50) { - draw_text(xx+(spacing_x*3)+35, half_way-20, "Open: Voluntery"); - } else if (_recruit_world.recruit_type == 0 && p_data.player_disposition <= 50) { - draw_text(xx+(spacing_x*3)+35, half_way-20, "Covert: Voluntery"); - } else { - draw_text(xx+(spacing_x*3)+35, half_way-20, "Abduct"); - } - recruitment_type_button.update({ + recruitment_type_button.draw(); + + draw_text(xx+(spacing_x*3)-15, half_way+(spacing_y)-20, $"Req:{_recruit_world.recruit_cost * 2}"); + if (_recruit_world.recruit_cost > 0) { + recruitment_costdown_button.update({ + x1:xx+(spacing_x*2)+35, + y1:half_way+(spacing_y), + allow_click : true, + }); + recruitment_costdown_button.draw(); + } + if (_recruit_world.recruit_cost < 5) { + recruitment_costup_button.update({ x1:xx+(spacing_x*3)+35, - y1:half_way, + y1:half_way+(spacing_y), allow_click : true, }); - recruitment_type_button.draw(); - - draw_text(xx+(spacing_x*3)-15, half_way+(spacing_y)-20, $"Req:{_recruit_world.recruit_cost * 2}"); - if (_recruit_world.recruit_cost > 0) { - recruitment_costdown_button.update({ - x1:xx+(spacing_x*2)+35, - y1:half_way+(spacing_y), - allow_click : true, - }); - recruitment_costdown_button.draw(); - } - if (_recruit_world.recruit_cost < 5) { - recruitment_costup_button.update({ - x1:xx+(spacing_x*3)+35, - y1:half_way+(spacing_y), - allow_click : true, - }); - recruitment_costup_button.draw(); - } + recruitment_costup_button.draw(); } } } - } - garrison_data_slate.draw(344+main_data_slate.width-4, 160, 0.6, 0.6); - } + +var p = cur_planet; + +function fmt_compact(_n){ + _n = abs(_n); + if (_n >= 1000000000) return string_format(_n / 1000000000, 0, 2) + "B"; + if (_n >= 1000000) return string_format(_n / 1000000, 0, 2) + "M"; + if (_n >= 1000) return string_format(_n / 1000, 0, 1) + "K"; + return string(floor(_n)); +} + +var LARGE_POP_CONVERSION = 1000000000; + +var _supported_pop_stored = target.p_max_population[p]; +var _cur_pop_stored = target.p_population[p]; +var _max_pop_stored = target.p_max_population[p]; + +var _is_large = (target.p_large[p] == 1); + +var _supported_pop_abs = _is_large ? (_supported_pop_stored * LARGE_POP_CONVERSION) : _supported_pop_stored; +var _cur_pop_abs = _is_large ? (_cur_pop_stored * LARGE_POP_CONVERSION) : _cur_pop_stored; +var _max_pop_abs = _is_large ? (_max_pop_stored * LARGE_POP_CONVERSION) : _max_pop_stored; + +draw_set_color(c_white); +draw_set_halign(fa_left); + +var _base_x = xx + 35; +var _base_y = half_way + spacing_y + 60; +var _line_h = 18; + +draw_text( + _base_x, + _base_y, + "Max supported population: " + fmt_compact(_supported_pop_abs) +); + +var POP_GROWTH_RATE = 0.00025; +var _pop_growth_abs = 0; + +if (_cur_pop_abs > 0 && _supported_pop_abs > 0 && _cur_pop_abs < _supported_pop_abs){ + _pop_growth_abs = ceil(_cur_pop_abs * POP_GROWTH_RATE); + _pop_growth_abs = min(_pop_growth_abs, _supported_pop_abs - _cur_pop_abs); +} else if (_cur_pop_abs > 0 && _supported_pop_abs <= 0) { + _pop_growth_abs = ceil(_cur_pop_abs * POP_GROWTH_RATE); +} + +draw_text( + _base_x, + _base_y + _line_h, + "Pop growth/turn (0.025%): +" + fmt_compact(_pop_growth_abs) +); + +var _has_target_pdf = variable_instance_exists(target.id, "p_target_pdf"); +var _target_pdf = _has_target_pdf ? target.p_target_pdf[p] : 0; + +draw_text( + _base_x, + _base_y + (_line_h * 2), + "Target PDF: " + fmt_compact(_target_pdf) +); + +var _pdf_cap = 0; +var _support_pct = 0; + +if (_has_target_pdf && _target_pdf > 0 && _max_pop_abs > 0){ + var _pop_ratio = clamp(_cur_pop_abs / _max_pop_abs, 0, 1); + _pdf_cap = floor(_target_pdf * _pop_ratio); + + if (_pdf_cap > 0){ + _support_pct = (target.p_pdf[p] / _pdf_cap) * 100; + } else if (target.p_pdf[p] > 0){ + _support_pct = 999; + } +} + +draw_text( + _base_x, + _base_y + (_line_h * 3), + "Supported PDF (current pop): " + fmt_compact(_pdf_cap) +); + +var PDF_GROWTH_RATE = 0.01; +var _pdf_growth = 0; + +if (_has_target_pdf && _target_pdf > 0 && _pdf_cap > 0){ + if (target.p_pdf[p] < _pdf_cap){ + _pdf_growth = ceil(_target_pdf * PDF_GROWTH_RATE); + _pdf_growth = min(_pdf_growth, _pdf_cap - target.p_pdf[p]); + } +} + +draw_text( + _base_x, + _base_y + (_line_h * 4), + "PDF growth per turn: +" + fmt_compact(_pdf_growth) +); + +draw_text( + _base_x, + _base_y + (_line_h * 5), + "PDF capacity usage: " + + string_format(_support_pct, 0, 1) + "% (" + + fmt_compact(target.p_pdf[p]) + " of " + fmt_compact(_pdf_cap) + ")" +); + + } + garrison_data_slate.draw(344+main_data_slate.width-4, 160, 0.6, 0.6); +} if (obj_controller.selecting_planet>0){ main_data_slate.draw(344,160, slate_draw_scale, slate_draw_scale+0.1); } diff --git a/scripts/scr_PlanetData/scr_PlanetData.gml b/scripts/scr_PlanetData/scr_PlanetData.gml index 96dc83e039..fc997ecd89 100644 --- a/scripts/scr_PlanetData/scr_PlanetData.gml +++ b/scripts/scr_PlanetData/scr_PlanetData.gml @@ -344,7 +344,7 @@ function PlanetData(planet, system) constructor{ // Check for industrial facilities var fleet_buildable = ((planet_type!="Dead" && planet_type!="Lava") || _has_warboss || _has_stronghold); - if (fleet_buildable && planet_forces[eFACTION.Ork]>=4){// Used to not have Ice either + if (fleet_buildable && planet_forces[eFACTION.Ork]>=4 && pdf < 200000){// Used to not have Ice either if (instance_exists(obj_p_fleet)){ var ppp=instance_nearest(x,y,obj_p_fleet); diff --git a/scripts/scr_enemy_ai_c/scr_enemy_ai_c.gml b/scripts/scr_enemy_ai_c/scr_enemy_ai_c.gml index 33b4d73bf4..06fdee16b8 100644 --- a/scripts/scr_enemy_ai_c/scr_enemy_ai_c.gml +++ b/scripts/scr_enemy_ai_c/scr_enemy_ai_c.gml @@ -9,8 +9,6 @@ function scr_enemy_ai_c() { // Orks spread orks_end_turn_growth(); - - // traitors below here i=0; if array_sum(p_traitors){ diff --git a/scripts/scr_imperial_manage_fleet_functions/scr_imperial_manage_fleet_functions.gml b/scripts/scr_imperial_manage_fleet_functions/scr_imperial_manage_fleet_functions.gml index c8c9c6d565..9076845bcc 100644 --- a/scripts/scr_imperial_manage_fleet_functions/scr_imperial_manage_fleet_functions.gml +++ b/scripts/scr_imperial_manage_fleet_functions/scr_imperial_manage_fleet_functions.gml @@ -72,31 +72,80 @@ function fleet_add_cargo(new_cargo,data,overwrite = false,fleet = "none"){ } } - - //TODO integrate this into PlanetData constructor function deploy_colonisers(star){ var lag=1; var data = cargo_data.colonize; - if (data.target_planet>0){ - var targ_planet = data.target_planet; - if (!star.p_large[targ_planet]){ - star.p_population[targ_planet] += data.colonists; - } else { - star.p_population[targ_planet] += data.colonists/power(10,8); - } - var start_influ = star.p_influence[targ_planet][eFACTION.Tyranids]; - with (star){ - merge_influences(data.colonist_influence,targ_planet); - } - var colony_purpose = data.mission=="new_colony"? "recolonise" : "bolster population" ; - var alert_string = $"Imperial citizens {colony_purpose} {planet_numeral_name(targ_planet, star)} I."; - var player_vision = star.p_player[targ_planet]>0 || star.p_owner[targ_planet] == eFACTION.Player; - if (star.p_influence[targ_planet][eFACTION.Tyranids]>start_influ && (player_vision)){ - alert_string += " They bring with them traces of a Genestelar Cult"; + if (data.target_planet > 0){ + var targ_planet = data.target_planet; + var _pop_add = 0; + + if (!star.p_large[targ_planet]){ + _pop_add = data.colonists; + star.p_population[targ_planet] += _pop_add; + } else { + _pop_add = data.colonists / power(10, 8); + star.p_population[targ_planet] += _pop_add; + } + + if (!variable_instance_exists(star.id, "p_max_population")){ + star.p_max_population = array_create(array_length(star.p_population), 0); + } + + if (!variable_instance_exists(star.id, "p_target_pdf")){ + star.p_target_pdf = array_create(array_length(star.p_population), 0); + for (var _j = 0; _j < array_length(star.p_target_pdf); _j++){ + star.p_target_pdf[_j] = star.p_pdf[_j]; } - scr_alert("green","duhuhuhu",alert_string,star.x,star.y); + } + + var _pop_mult = 0.25; + var _pdf_mult = 1.0; + + switch (star.p_type[targ_planet]){ + case "Lava": _pop_mult = 0.2; _pdf_mult = 0.2; break; + case "Desert": _pop_mult = 0.5; _pdf_mult = 0.5; break; + case "Hive": _pop_mult = 1; _pdf_mult = 1.5; break; + case "Agri": _pop_mult = 1; _pdf_mult = 0.7; break; + case "Temperate": _pop_mult = 1; _pdf_mult = 1; break; + case "Shrine": _pop_mult = 1; _pdf_mult = 1; break; + case "Ice": _pop_mult = 0.5; _pdf_mult = 0.5; break; + case "Feudal": _pop_mult = 1; _pdf_mult = 0.5; break; + case "Forge": _pop_mult = 1; _pdf_mult = 3; break; + case "Death": _pop_mult = 0.10; _pdf_mult = 3; break; + case "Craftworld": _pop_mult = 0.00; _pdf_mult = 0.0; break; + } + + var _target_pop_add = _pop_add * _pop_mult; + star.p_max_population[targ_planet] += _target_pop_add; + + var _pdf_target_add = ceil(_pop_add * 0.001 * _pdf_mult); + star.p_target_pdf[targ_planet] += _pdf_target_add; + + if (star.p_max_population[targ_planet] < 0) star.p_max_population[targ_planet] = 0; + if (star.p_target_pdf[targ_planet] < 0) star.p_target_pdf[targ_planet] = 0; + + var start_influ = star.p_influence[targ_planet][eFACTION.Tyranids]; + with (star){ + merge_influences(data.colonist_influence, targ_planet); + } + + var colony_purpose = data.mission=="new_colony"? "recolonise" : "bolster population"; + var alert_string = $"Imperial citizens {colony_purpose} {planet_numeral_name(targ_planet, star)} I."; + var player_vision = star.p_player[targ_planet]>0 || star.p_owner[targ_planet] == eFACTION.Player; + if (star.p_influence[targ_planet][eFACTION.Tyranids] > start_influ && player_vision){ + alert_string += "They bring with them traces of a Genestealer Cult"; + } + + show_debug_message( + "[COLONISE] " + planet_numeral_name(targ_planet, star) + + " | +pop=" + string(_pop_add) + + " | +target_pop=" + string(_target_pop_add) + + " | +target_pdf=" + string(_pdf_target_add) + ); + + scr_alert("green","duhuhuhu",alert_string,star.x,star.y); } else { for (var r=1;r<=star.planets;r++){ if (data.mission == "new_colony" && star.p_population[r]<=0){ diff --git a/scripts/scr_ork_fleet_functions/scr_ork_fleet_functions.gml b/scripts/scr_ork_fleet_functions/scr_ork_fleet_functions.gml index 566029cad3..cc47b6751c 100644 --- a/scripts/scr_ork_fleet_functions/scr_ork_fleet_functions.gml +++ b/scripts/scr_ork_fleet_functions/scr_ork_fleet_functions.gml @@ -33,7 +33,6 @@ function orks_end_turn_growth(){ } } - function ork_fleet_move(){