Open allenhu0912 opened 1 year ago
so true #833
Is this a real bug, though? Or is it just poor design?
RoR should have a 10 turn cooldown no matter what, WoC not an exception
Yes, but they do, don't they? Is WoC a weird exception to this rule? I agree that it feels like WoC get them more frequently, but I always assumed this was because the various WoC factions have overlapping RoR pools without shared cooldowns. I have not tested this thoroughly, though.
Anecdotally I'm pretty sure I've fought the same RoR under the same faction twice in less than 10 turns. It's not just multiple factions spamming the same RoR.
We did fix that new rors could be recruited multiple times, maybe that's why it felt like they always had ror
Wasn't that an issue with the 3.1 RoRs? I'm pretty sure WoC AI spamming RoRs predates this, even in 3.0 you would have Festus recruiting Uncle Furuncle over and over and over etc. every time you defeated him. Not necessarily instant recruit, but maybe after 3 or 4 turns, still well short of the 10 turns I would expect.
PRE 4.1
units to exclusive faction permissions and mercenary pool to groups junctions should lock/allow rors as for Belakor missing RoR tbd
wh_campaign_ror_recruitment.lua, most obvious thing is it doesn't have WoC listed
---- EMPIRE ----
----------------
["wh_main_sc_emp_empire"] = {
"wh_dlc04_emp_art_hammer_of_the_witches_0",
"wh_dlc04_emp_art_sunmaker_0",
"wh_dlc04_emp_cav_royal_altdorf_gryphites_0",
"wh_dlc04_emp_cav_zintlers_reiksguard_0",
"wh_dlc04_emp_inf_sigmars_sons_0",
"wh_dlc04_emp_inf_silver_bullets_0",
"wh_dlc04_emp_inf_stirlands_revenge_0",
"wh_dlc04_emp_inf_tattersouls_0",
"wh_dlc04_emp_veh_templehof_luminark_0",
"wh2_dlc13_emp_inf_halberdiers_ror_0",
"wh2_dlc13_emp_inf_swordsmen_ror_0",
"wh2_dlc13_emp_cav_outriders_ror_0",
"wh2_dlc13_emp_art_mortar_ror_0",
"wh2_dlc13_emp_inf_greatswords_ror_0",
"wh2_dlc13_emp_inf_crossbowmen_ror_0",
"wh2_dlc13_emp_cav_empire_knights_ror_0",
"wh2_dlc13_emp_inf_spearmen_ror_0",
"wh2_dlc13_emp_veh_steam_tank_ror_0",
"wh2_dlc13_emp_cav_empire_knights_ror_1",
"wh2_dlc13_emp_cav_pistoliers_ror_0",
"wh2_dlc13_emp_inf_handgunners_ror_0",
"wh2_dlc13_emp_cav_empire_knights_ror_2",
"wh2_dlc13_emp_inf_archers_ror_0",
"wh2_dlc13_emp_inf_huntsmen_ror_0",
"wh2_dlc13_emp_veh_war_wagon_ror_0",
},
------------------
---- VAMPIRES ----
------------------
["wh_main_sc_vmp_vampire_counts"] = {
"wh_dlc04_vmp_cav_chillgheists_0",
"wh_dlc04_vmp_cav_vereks_reavers_0",
"wh_dlc04_vmp_inf_feasters_in_the_dusk_0",
"wh_dlc04_vmp_inf_konigstein_stalkers_0",
"wh_dlc04_vmp_inf_sternsmen_0",
"wh_dlc04_vmp_inf_tithe_0",
"wh_dlc04_vmp_mon_devils_swartzhafen_0",
"wh_dlc04_vmp_mon_direpack_0",
"wh_dlc04_vmp_veh_claw_of_nagash_0"
},
----------------
---- DWARFS ----
----------------
["wh_main_sc_dwf_dwarfs"] = {
"wh_dlc06_dwf_art_gob_lobber_0",
"wh_dlc06_dwf_inf_dragonback_slayers_0",
"wh_dlc06_dwf_inf_ekrund_miners_0",
"wh_dlc06_dwf_inf_norgrimlings_ironbreakers_0",
"wh_dlc06_dwf_inf_norgrimlings_irondrakes_0",
"wh_dlc06_dwf_inf_old_grumblers_0",
"wh_dlc06_dwf_inf_peak_gate_guard_0",
"wh_dlc06_dwf_inf_ulthars_raiders_0",
"wh_dlc06_dwf_inf_warriors_dragonfire_pass_0",
"wh_dlc06_dwf_veh_skyhammer_0"
},
--------------------
---- GREENSKINS ----
--------------------
["wh_main_sc_grn_greenskins"] = {
"wh_dlc06_grn_art_hammer_of_gork_0",
"wh_dlc06_grn_cav_broken_tusks_mob_0",
"wh_dlc06_grn_cav_deff_creepers_0",
"wh_dlc06_grn_cav_durkits_squigs_0",
"wh_dlc06_grn_cav_mogrubbs_marauders_0",
"wh_dlc06_grn_cav_moon_howlers_0",
"wh_dlc06_grn_cav_teef_robbers_0",
"wh_dlc06_grn_inf_da_eight_peaks_loonies_0",
"wh_dlc06_grn_inf_da_rusty_arrers_0",
"wh_dlc06_grn_inf_da_warlords_boyz_0",
"wh_dlc06_grn_inf_krimson_killerz_0",
"wh_dlc06_grn_mon_venom_queen_0",
"wh2_dlc15_grn_mon_river_trolls_ror_0",
"wh2_dlc15_grn_mon_rogue_idol_ror_0",
"wh2_dlc15_grn_veh_snotling_pump_wagon_ror_0"
},
-------------------
---- BRETONNIA ----
-------------------
["wh_main_sc_brt_bretonnia"] = {
"wh_pro04_brt_cav_knights_errant_ror_0",
"wh_pro04_brt_cav_knights_of_the_realm_ror_0",
"wh_pro04_brt_cav_mounted_yeomen_ror_0",
"wh_pro04_brt_cav_questing_knights_ror_0",
"wh_pro04_brt_inf_battle_pilgrims_ror_0",
"wh_pro04_brt_inf_foot_squires_ror_0"
},
--------------------
---- TOMB KINGS ----
--------------------
["wh2_dlc09_sc_tmb_tomb_kings"] = {
"wh2_dlc09_tmb_inf_skeleton_archers_ror",
"wh2_dlc09_tmb_inf_skeleton_spearmen_ror",
"wh2_dlc09_tmb_inf_tomb_guard_ror",
"wh2_dlc09_tmb_mon_necrosphinx_ror",
"wh2_dlc09_tmb_mon_sepulchral_stalkers_ror",
"wh2_dlc09_tmb_mon_ushabti_ror"
},
--------------------
---- HIGH ELVES ----
--------------------
["wh2_main_sc_hef_high_elves"] = {
"wh2_dlc10_hef_cav_the_fireborn_ror_0",
"wh2_dlc10_hef_cav_the_heralds_of_the_wind_ror_0",
"wh2_dlc10_hef_inf_everqueens_court_guards_ror_0",
"wh2_dlc10_hef_inf_keepers_of_the_flame_ror_0",
"wh2_dlc10_hef_inf_the_grey_ror_0",
"wh2_dlc10_hef_inf_the_scions_of_mathlann_ror_0",
"wh2_dlc10_hef_inf_the_silverpelts_ror_0",
"wh2_dlc10_hef_inf_the_storm_riders_ror_0",
"wh2_dlc15_hef_inf_archers_ror_0",
"wh2_dlc15_hef_mon_arcane_phoenix_ror_0",
"wh2_dlc15_hef_mon_war_lions_of_chrace_ror_0"
},
--------------------
---- DARK ELVES ----
--------------------
["wh2_main_sc_def_dark_elves"] = {
"wh2_dlc10_def_cav_knights_of_the_ebon_claw_ror_0",
"wh2_dlc10_def_cav_raven_heralds_ror_0",
"wh2_dlc10_def_cav_slaanesh_harvesters_ror_0",
"wh2_dlc10_def_inf_blades_of_the_blood_queen_ror_0",
"wh2_dlc10_def_inf_sisters_of_the_singing_doom_ror_0",
"wh2_dlc10_def_inf_the_bolt_fiends_ror_0",
"wh2_dlc10_def_inf_the_hellebronai_ror_0",
"wh2_dlc10_def_mon_chill_of_sontar_ror_0",
"wh2_dlc14_def_cav_scourgerunner_chariot_ror_0",
"wh2_dlc14_def_inf_harpies_ror_0",
"wh2_dlc14_def_mon_bloodwrack_medusa_ror_0"
},
-----------------------
---- VAMPIRE COAST ----
-----------------------
["wh2_dlc11_sc_cst_vampire_coast"] = {
"wh2_dlc11_cst_inf_zombie_deckhands_mob_ror_0",
"wh2_dlc11_cst_inf_zombie_gunnery_mob_ror_0",
"wh2_dlc11_cst_cav_deck_droppers_ror_0",
"wh2_dlc11_cst_mon_mournguls_ror_0",
"wh2_dlc11_cst_mon_rotting_prometheans_gunnery_mob_ror",
"wh2_dlc11_cst_inf_deck_gunners_ror_0",
"wh2_dlc11_cst_inf_depth_guard_ror_0",
"wh2_dlc11_cst_mon_necrofex_colossus_ror_0"
},
-------------------
---- LIZARDMEN ----
-------------------
["wh2_main_sc_lzd_lizardmen"] = {
"wh2_dlc12_lzd_cav_cold_one_spearriders_ror_0",
"wh2_dlc12_lzd_cav_ripperdactyl_riders_ror_0",
"wh2_dlc12_lzd_cav_terradon_riders_ror_0",
"wh2_dlc12_lzd_inf_saurus_warriors_ror_0",
"wh2_dlc12_lzd_inf_skink_red_crested_ror_0",
"wh2_dlc12_lzd_inf_temple_guards_ror_0",
"wh2_dlc12_lzd_mon_ancient_stegadon_ror_0",
"wh2_dlc12_lzd_mon_salamander_pack_ror_0",
"wh2_dlc13_lzd_mon_razordon_pack_ror_0",
"wh2_dlc13_lzd_mon_sacred_kroxigors_ror_0",
"wh2_dlc13_lzd_mon_dread_saurian_ror_0",
"wh2_dlc17_lzd_mon_carnosaur_ror_0",
"wh2_dlc17_lzd_mon_coatl_ror_0",
"wh2_dlc17_lzd_mon_troglodon_ror_0"
},
----------------
---- SKAVEN ----
----------------
["wh2_main_sc_skv_skaven"] = {
"wh2_dlc12_skv_art_warp_lightning_cannon_ror_0",
"wh2_dlc12_skv_inf_clanrats_ror_0",
"wh2_dlc12_skv_inf_plague_monk_censer_bearer_ror_0",
"wh2_dlc12_skv_inf_ratling_gun_ror_0",
"wh2_dlc12_skv_inf_stormvermin_ror_0",
"wh2_dlc12_skv_inf_warplock_jezzails_ror_0",
"wh2_dlc12_skv_veh_doom_flayer_ror_0",
"wh2_dlc12_skv_veh_doomwheel_ror_0",
"wh2_dlc14_skv_inf_death_runners_ror_0",
"wh2_dlc14_skv_inf_eshin_triads_ror_0",
"wh2_dlc14_skv_inf_poison_wind_mortar_ror_0",
"wh2_dlc16_skv_mon_rat_ogres_ror_0",
"wh2_dlc16_skv_mon_rat_ogre_mutant_ror_0",
"wh2_dlc16_skv_mon_hell_pit_abomination_ror_0"
},
------------------
--- WOOD ELVES ---
------------------
["wh_dlc05_sc_wef_wood_elves"] = {
"wh_pro04_wef_inf_eternal_guard_ror_0",
"wh_pro04_wef_inf_wardancers_ror_0",
"wh_pro04_wef_inf_waywatchers_ror_0",
"wh_pro04_wef_cav_wild_riders_ror_0",
"wh_pro04_wef_inf_wildwood_rangers_ror_0",
"wh_pro04_wef_mon_treekin_ror_0",
"wh2_dlc16_wef_inf_dryads_ror_0",
"wh2_dlc16_wef_mon_zoats_ror_0",
"wh2_dlc16_wef_cav_great_stag_knights_ror_0"
},
------------------
---- BEASTMEN ----
------------------
["wh_dlc03_sc_bst_beastmen"] = {
"wh_pro04_bst_inf_bestigor_herd_ror_0",
"wh_pro04_bst_inf_centigors_ror_0",
"wh_pro04_bst_inf_gor_herd_ror_0",
"wh_pro04_bst_inf_minotaurs_ror_0",
"wh_pro04_bst_inf_ungor_spearmen_ror_0",
"wh_pro04_bst_inf_cygor_ror_0",
"wh2_dlc17_bst_inf_centigors_ror_1",
"wh2_dlc17_bst_mon_ghorgon_ror_0",
"wh2_dlc17_bst_mon_jabberslythe_ror_0"
},
----------------
---- NURGLE ----
----------------
["wh3_main_sc_nur_nurgle"] = {
"wh_pro04_chs_inf_forsaken_ror_0",
"wh3_dlc20_chs_mon_giant_mnur_ror",
"wh3_twa06_nur_inf_plaguebearers_ror_0",
"wh3_twa07_nur_cav_pox_riders_of_nurgle_ror_0",
"wh3_twa08_nur_mon_great_unclean_one_0_ror",
"wh3_twa10_nur_inf_nurglings_ror"
},
-----------------------
---- OGRE KINGDOMS ----
-----------------------
["wh3_main_sc_ogr_ogre_kingdoms"] = {
"wh3_twa06_ogr_inf_maneaters_ror_0",
"wh3_twa07_ogr_cav_crushers_ror_0",
"wh3_twa08_ogr_mon_stonehorn_0_ror",
"wh3_twa10_ogr_inf_gnoblars_ror"
},
------------------
---- SLAANESH ----
------------------
["wh3_main_sc_sla_slaanesh"] = {
"wh3_twa06_sla_inf_daemonette_ror_0",
"wh3_twa07_sla_cav_heartseekers_of_slaanesh_ror_0",
"wh3_twa08_sla_mon_keeper_of_secrets_0_ror",
"wh_pro04_chs_inf_chaos_warriors_ror_0",
"wh3_dlc20_chs_cav_chaos_chariot_msla_ror",
"wh3_twa10_sla_inf_marauders_spears_ror"
},
------------------
---- TZEENTCH ----
------------------
["wh3_main_sc_tze_tzeentch"] = {
"wh3_twa06_tze_inf_pink_horrors_ror_0",
"wh3_dlc20_chs_inf_aspiring_champions_mtze_ror",
"wh_pro04_chs_mon_chaos_spawn_ror_0",
"wh3_twa07_tze_cav_doom_knights_ror_0",
"wh3_twa08_tze_mon_lord_of_change_0_ror",
"wh3_twa10_tze_inf_blue_horrors_ror"
},
------------------
---- KHORNE ----
------------------
["wh3_main_sc_kho_khorne"] = {
"wh_pro04_nor_inf_marauder_berserkers_ror_0",
"wh3_twa06_kho_inf_bloodletters_ror_0",
"wh3_twa07_kho_cav_bloodcrushers_ror_0",
"wh3_dlc20_kho_cav_skullcrushers_mkho_ror",
"wh3_twa08_kho_mon_bloodthirster_0_ror",
"wh3_twa10_kho_inf_flesh_hounds_of_khorne_ror"
},
------------------
---- KISLEV ----
------------------
["wh3_main_sc_ksl_kislev"] = {
"wh3_twa06_ksl_inf_tzar_guard_ror_0",
"wh3_twa07_ksl_cav_war_bear_riders_ror_0",
"wh3_twa08_ksl_mon_elemental_bear_0_ror",
"wh3_twa10_ksl_inf_armoured_kossars_ror"
},
------------------
---- CATHAY ----
------------------
["wh3_main_sc_cth_cathay"] = {
"wh3_twa06_cth_inf_dragon_guard_ror_0",
"wh3_twa07_cth_cav_jade_longma_riders_ror_0",
"wh3_twa08_cth_mon_terracotta_sentinel_0_ror",
"wh3_twa10_cth_inf_peasant_archers_ror"
},
------------------
---- CHD ----
------------------
["wh3_dlc23_sc_chd_chaos_dwarfs"] = {
"wh3_dlc23_chd_cav_bull_centaurs_dual_axe_ror",
"wh3_dlc23_chd_cav_hobgoblin_wolf_raiders_ror",
"wh3_dlc23_chd_inf_chaos_dwarf_blunderbusses_ror",
"wh3_dlc23_chd_inf_chaos_dwarf_warriors_ror",
"wh3_dlc23_chd_inf_infernal_ironsworn_ror",
"wh3_dlc23_chd_veh_iron_daemon_ror",
"wh_pro04_chs_art_hellcannon_ror_0"
}
};
core:add_listener( "ROR_ScriptEventGlobalCampaignManagerCreated", "ScriptEventGlobalCampaignManagerCreated", true, function(context) Add_ROR_Locks(); end, false );
function Add_ROR_Locks() output_ror("########## ADDING R.O.R LOCKS ##########");
local human_factions = cm:get_human_factions();
local faction_list = cm:model():world():faction_list();
for subculture, units in pairs(regiments_of_renown) do
output_ror("Checking for subculture: "..subculture);
local human_player = false;
for i = 1, #human_factions do
local faction_key = human_factions[i]
if cm:get_faction(faction_key):subculture() == subculture then
human_player = faction_key;
output_ror("\tFound human player: "..human_player);
break;
end
end
if human_player then
Lock_Units_In_Subculture_For_Everyone_But(subculture, human_player);
else
output_ror("Didn't find human in this subculture, finding another faction...");
local subculture_faction_not_dead = "";
local subculture_faction = "";
for i = 0, faction_list:num_items() - 1 do
local current_faction = faction_list:item_at(i);
if current_faction:is_null_interface() == false and current_faction:subculture() == subculture and current_faction:is_quest_battle_faction() == false then
if subculture_faction == "" then
subculture_faction = current_faction:name();
end
if current_faction:is_dead() == false then
if subculture_faction_not_dead == "" then
subculture_faction_not_dead = current_faction:name();
end
end
end
end
output_ror("\tBest Matches -");
output_ror("\t\tFirst Alive Faction: "..subculture_faction_not_dead);
output_ror("\t\tFirst Existing Faction: "..subculture_faction);
if subculture_faction_not_dead ~= "" then
Lock_Units_In_Subculture_For_Everyone_But(subculture, subculture_faction_not_dead);
elseif subculture_faction ~= "" then
Lock_Units_In_Subculture_For_Everyone_But(subculture, subculture_faction);
else
output_ror("ERROR: Didn't lock ROR for subculture [" .. subculture .. "] with ROR. Is this an old save game where the subculture does not exist?");
end
end
end
tomb_king_ror_locks();
vampire_coast_ror_locks();
output_ror("######################################");
end
function Lock_Units_In_Subculture_For_Everyone_But(subculture, faction) output_ror("---- Locking ROR ----"); output_ror("Selecting '"..faction.."' as the main faction of the '"..subculture.."' subculture!");
local faction_list = cm:model():world():faction_list();
for i = 0, faction_list:num_items() - 1 do
local current_faction = faction_list:item_at(i);
local fac_name = current_faction:name();
local fac_subculture = current_faction:subculture();
if not current_faction:is_human() and not current_faction:is_quest_battle_faction() and fac_name ~= faction and fac_subculture == subculture and regiments_of_renown[subculture] ~= nil then
output_ror("Locking "..#regiments_of_renown[subculture].." ROR units for "..fac_name);
for j = 1, #regiments_of_renown[subculture] do
output_ror("\tLocking Unit: "..regiments_of_renown[subculture][j]);
cm:add_event_restricted_unit_record_for_faction(regiments_of_renown[subculture][j], fac_name);
end
end
end
output_ror("");
end
-- TOMB KINGS function tomb_king_ror_locks() output_ror("tomb_king_ror_locks()"); if cm:is_new_game() then local tk_factions = {"wh2_dlc09_tmb_khemri", "wh2_dlc09_tmb_followers_of_nagash", "wh2_dlc09_tmb_lybaras", "wh2_dlc09_tmb_exiles_of_nehek"};
for i = 1, #tk_factions do
local faction_exists = cm:get_faction(tk_factions[i])
if faction_exists ~= false then
-- Unlocked via Rite
cm:add_event_restricted_unit_record_for_faction("wh2_dlc09_tmb_art_casket_of_souls_0", tk_factions[i], "wh2_dlc09_lock_casket_of_souls");
-- Unlocked via Crafting
cm:add_event_restricted_unit_record_for_faction("wh2_dlc09_tmb_mon_carrion_ror", tk_factions[i], "wh2_dlc09_lock_ror_crafting");
cm:add_event_restricted_unit_record_for_faction("wh2_dlc09_tmb_inf_nehekhara_warriors_ror", tk_factions[i], "wh2_dlc09_lock_ror_crafting");
cm:add_event_restricted_unit_record_for_faction("wh2_dlc09_tmb_cav_nehekhara_horsemen_ror", tk_factions[i], "wh2_dlc09_lock_ror_crafting");
cm:add_event_restricted_unit_record_for_faction("wh2_dlc09_tmb_cav_necropolis_knights_ror", tk_factions[i], "wh2_dlc09_lock_ror_crafting");
end
end
end
core:add_listener(
"tomb_king_ror_unlock",
"RitualCompletedEvent",
function(context)
return context:performing_faction():is_human();
end,
function(context)
local faction_key = context:performing_faction():name();
local ritual_key = context:ritual():ritual_key();
if ritual_key == "wh2_dlc09_ritual_tmb_tahoth" then
cm:remove_event_restricted_unit_record_for_faction("wh2_dlc09_tmb_art_casket_of_souls_0", faction_key);
elseif ritual_key == "wh2_dlc09_ritual_crafting_tmb_carrion" then
cm:remove_event_restricted_unit_record_for_faction("wh2_dlc09_tmb_mon_carrion_ror", faction_key);
elseif ritual_key == "wh2_dlc09_ritual_crafting_tmb_nehekhara_warriors" then
cm:remove_event_restricted_unit_record_for_faction("wh2_dlc09_tmb_inf_nehekhara_warriors_ror", faction_key);
elseif ritual_key == "wh2_dlc09_ritual_crafting_tmb_nehekhara_horsemen" then
cm:remove_event_restricted_unit_record_for_faction("wh2_dlc09_tmb_cav_nehekhara_horsemen_ror", faction_key);
elseif ritual_key == "wh2_dlc09_ritual_crafting_tmb_necropolis_knights" then
cm:remove_event_restricted_unit_record_for_faction("wh2_dlc09_tmb_cav_necropolis_knights_ror", faction_key);
end
end,
true
);
end
-- VAMPIRE COAST function vampire_coast_ror_locks() output_ror("vampire_coast_ror_locks()"); if cm:is_new_game() then local vc_factions = {"wh2_dlc11_cst_the_drowned", "wh2_dlc11_cst_pirates_of_sartosa", "wh2_dlc11_cst_vampire_coast", "wh2_dlc11_cst_noctilus"};
for i = 1, #vc_factions do
local faction_exists = cm:get_faction(vc_factions[i])
if faction_exists ~= false then
-- Unlocked via Rite
cm:add_event_restricted_unit_record_for_faction("wh2_dlc11_cst_art_queen_bess", vc_factions[i], "wh2_dlc11_lock_queen_bess");
end
end
end
core:add_listener(
"vampire_coast_ror_unlock",
"RitualCompletedEvent",
function(context)
return context:performing_faction():is_human() and context:ritual():ritual_key() == "wh2_dlc11_ritual_cst_queens_cannon";
end,
function(context)
cm:remove_event_restricted_unit_record_for_faction("wh2_dlc11_cst_art_queen_bess", context:performing_faction():name());
end,
true
);
end
local show_debug_output_ror = false; function output_ror(text) if show_debug_output_ror then out(text); end end
They added Norsca and WoC to the list and changed a couple lines in 4.1, not sure if that'll do anything though
1222
Mod Edit:
Reports:
1222
1177