Added, Updated and Removed Mods; Removed Backups

This commit is contained in:
2024-04-05 05:57:24 -04:00
parent 5caee9fba5
commit 6f19f2c70f
1209 changed files with 27057 additions and 41484 deletions
@@ -0,0 +1,683 @@
[bar_dolg_bunker]
bar_dolg_leader_squad
[bar_dolg_general];mlr
bar_dolg_general_petrenko_stalker_squad
bar_dolg_general_zoneguard_stalker_squad
dolg_medic_squad
[bar_visitors];mlr
bar_visitors_barman_stalker_trader_squad
bar_visitors_cardan_tech_squad
bar_visitors_garik_stalker_guard_squad
bar_visitors_garik_stalker_guard_squad
bar_visitors_zhorik_stalker_guard2_squad
[bar_zastava]
bar_duty_security_squad_leader_squad
[bar_zastava_2]
bar_zastava_2_commander_squad
[bar_zastava_dogs_lair]
[bar_zastava_dogs_lair_2]
[bun_krovosos_nest]
[cit_bandits]
[cit_bandits_2]
[cit_kanaliz1]
[cit_kanaliz2]
[cit_killers];mlr
[cit_killers_2]
[cit_killers_vs_bandits]
[dar_angar]
[dar_control_poltergeist]
[dar_poltergeist_tele]
[dar_poltergeist_tele_round]
[ds2_domik_st]
[ds2_lager_st]
[ds2_st_dogs]
[ds2_st_hoofs]
[ds_boars_nest]
[ds_deb1]
[ds_grverfer2]
[ds_kem1]
[ds_kem2]
[ds_kem3]
[ds_ptr]
[ds_ptr2]
[ds_ptr3]
[ds_ptr4]
[esc_smart_terrain_1_11]
[esc_smart_terrain_2_12];mlr
[esc_smart_terrain_2_14]
[esc_smart_terrain_3_16];mlr
[esc_smart_terrain_3_7]
[esc_smart_terrain_4_11]
[esc_smart_terrain_4_13]
[esc_smart_terrain_4_9]
[esc_smart_terrain_5_12]
[esc_smart_terrain_5_2]
[esc_smart_terrain_5_4]
[esc_smart_terrain_5_6]
[esc_smart_terrain_5_7];mlr
[esc_smart_terrain_5_9]
[esc_smart_terrain_6_6]
[esc_smart_terrain_6_8]
[esc_smart_terrain_7_11]
[esc_smart_terrain_8_10]
[esc_smart_terrain_8_9]
[esc_smart_terrain_9_7]
[gar_smart_terrain_1_5]
[gar_smart_terrain_1_7]
[gar_smart_terrain_2_4]
[gar_smart_terrain_3_5];mlr
[gar_smart_terrain_3_7]
[gar_smart_terrain_4_2]
[gar_smart_terrain_4_5]
[gar_smart_terrain_5_2]
[gar_smart_terrain_5_4]
[gar_smart_terrain_5_5]
[gar_smart_terrain_5_6]
[gar_smart_terrain_6_1]
[gar_smart_terrain_6_3];mlr
;;stalker_sim_baraholka_trader_day_squad
;;stalker_sim_baraholka_trader_night_squad
[gar_smart_terrain_6_6]
[gar_smart_terrain_6_7]
[gar_smart_terrain_7_4]
[gar_smart_terrain_8_5]
[gen_smart_terrain_cemetery]
[gen_smart_terrain_forest]
[gen_smart_terrain_junk]
[gen_smart_terrain_lab_entrance]
[gen_smart_terrain_lab_entrance_2]
[gen_smart_terrain_military]
[gen_smart_terrain_urod]
[jup_a12]
[jup_a6];mlr
[jup_b19]
[jup_b200_tushkan_smart_terrain]
[jup_b203]
[jup_b204]
[jup_b205_smart_terrain]
[jup_b205_smart_terrain_tushkano]
[jup_b208]
[jup_b211]
[jup_b41]
[jup_b47]
[jup_b8_smart_terrain]
[jup_sim_1]
[jup_sim_10]
[jup_sim_11]
[jup_sim_12]
[jup_sim_13]
[jup_sim_14]
[jup_sim_15]
[jup_sim_16]
[jup_sim_17]
[jup_sim_18]
[jup_sim_19]
[jup_sim_2]
[jup_sim_20]
[jup_sim_21]
[jup_sim_3]
[jup_sim_4]
[jup_sim_5]
[jup_sim_6]
[jup_sim_7]
[jup_sim_8]
[jup_sim_9]
[katacomb_smart_terrain]
[lim_smart_terrain_1]
[lim_smart_terrain_10]
[lim_smart_terrain_3]
[lim_smart_terrain_4]
[lim_smart_terrain_5]
[lim_smart_terrain_6]
[lim_smart_terrain_8]
[lim_smart_terrain_9]
[lx8_smart_terrain]
lx8_burers_squad
lx8_snork_down_squad
lx8_snork_up_squad
lx8_toilet_burer_squad
lx8_tushkano_1_squad
lx8_tushkano_2_squad
[mar_smart_terrain_10_10]
[mar_smart_terrain_10_5]
[mar_smart_terrain_10_7]
[mar_smart_terrain_11_11]
[mar_smart_terrain_11_3]
[mar_smart_terrain_12_2]
[mar_smart_terrain_3_10]
[mar_smart_terrain_3_3]
[mar_smart_terrain_3_7]
[mar_smart_terrain_4_5]
[mar_smart_terrain_4_7]
[mar_smart_terrain_5_12]
[mar_smart_terrain_5_8]
[mar_smart_terrain_6_10]
[mar_smart_terrain_6_11]
[mar_smart_terrain_6_4]
[mar_smart_terrain_6_7]
[mar_smart_terrain_6_8]
[mar_smart_terrain_7_3]
[mar_smart_terrain_7_7]
[mar_smart_terrain_8_11]
[mar_smart_terrain_8_4]
[mar_smart_terrain_8_8]
[mar_smart_terrain_8_9]
[mar_smart_terrain_base];mlr
[mar_smart_terrain_doc]
[mil_smart_terrain_2_1]
[mil_smart_terrain_2_10]
[mil_smart_terrain_2_2]
[mil_smart_terrain_2_4]
[mil_smart_terrain_2_6]
[mil_smart_terrain_3_8]
[mil_smart_terrain_4_2]
[mil_smart_terrain_4_3]
[mil_smart_terrain_4_5]
[mil_smart_terrain_4_7]
[mil_smart_terrain_4_8]
[mil_smart_terrain_7_10]
[mil_smart_terrain_7_12]
[mil_smart_terrain_7_4]
[mil_smart_terrain_7_7];mlr
[mil_smart_terrain_7_8]
[mil_smart_terrain_8_3]
[pas_b400_canalisation]
[pas_b400_downstairs]
[pas_b400_elevator]
[pas_b400_hall]
[pas_b400_track]
[pas_b400_tunnel]
[pri_b303]
[pri_b304_monsters_smart_terrain]
[pri_b306]
[pri_b36_smart_terrain]
[pri_depot]
[pri_monolith];mlr
[pri_sim_1]
[pri_sim_10]
[pri_sim_11]
[pri_sim_12]
[pri_sim_2]
[pri_sim_3]
[pri_sim_4]
[pri_sim_5]
[pri_sim_6]
[pri_sim_7]
[pri_sim_8]
[pri_sim_9]
[pri_smart_bloodsucker_lair1]
[pri_smart_controler_lair1]
[pri_smart_controler_lair2]
[pri_smart_giant_lair1]
[pri_smart_monolith_stalker2]
[pri_smart_monolith_stalker3]
[pri_smart_monolith_stalker4]
[pri_smart_monolith_stalker6]
[pri_smart_monster_lair1]
[pri_smart_neutral_stalker1]
[pri_smart_pseudodog_lair1]
[pri_smart_snork_lair1]
[pri_smart_snork_lair2]
[pri_smart_tushkano_lair1]
[rad2_loner_0000]
[rad2_loner_0001]
[rad2_loner_0002]
[rad2_prip_teleport]
[rad_after_valley]
[rad_antenna_camper]
[rad_antenna_monolith]
[rad_antenna_patrol]
[rad_bloodsucker]
[rad_entrance]
[rad_pseudodogs]
[rad_snork1]
[rad_snork2]
[rad_valley]
[rad_valley_dogs]
[rad_zombied1]
[rad_zombied2]
[red_smart_terrain_3_1]
[red_smart_terrain_3_2]
[red_smart_terrain_3_3]
[red_smart_terrain_4_3]
[red_smart_terrain_4_5]
[red_smart_terrain_5_5]
[red_smart_terrain_5_6]
[red_smart_terrain_6_3]
[red_smart_terrain_6_6]
[red_smart_terrain_monsters]
[red_smart_terrain_monsters_2]
[red_smart_terrain_monsters_3]
[ros_smart_killers1]
[ros_smart_monster4]
[ros_smart_monster5]
[ros_smart_monster7]
[ros_smart_poltergeist2]
[ros_smart_snork1]
[ros_smart_stalker1]
[ros_smart_stalker_killers1]
[sar_monolith_general]
[sar_monolith_sklad]
[trc_sim_1]
[trc_sim_10]
[trc_sim_11]
[trc_sim_12]
[trc_sim_13]
[trc_sim_14]
[trc_sim_15]
[trc_sim_16]
[trc_sim_17]
[trc_sim_18]
[trc_sim_19]
[trc_sim_2]
[trc_sim_20];mlr
[trc_sim_21]
[trc_sim_3]
[trc_sim_4]
[trc_sim_5]
[trc_sim_6]
[trc_sim_7]
[trc_sim_8]
[trc_sim_9]
[val_smart_terrain_1_2]
[val_smart_terrain_3_0]
[val_smart_terrain_4_0]
[val_smart_terrain_5_10]
[val_smart_terrain_6_4]
[val_smart_terrain_6_5]
[val_smart_terrain_7_3]
[val_smart_terrain_7_4]
[val_smart_terrain_7_5];mlr
[val_smart_terrain_8_6]
[val_smart_terrain_8_7]
[val_smart_terrain_8_9]
[val_smart_terrain_9_10]
[val_smart_terrain_9_2]
[val_smart_terrain_9_4]
[val_smart_terrain_9_6]
[warlab_common_consciousness_smart_terrain]
[yan_smart_terrain_2_4]
[yan_smart_terrain_2_5]
[yan_smart_terrain_3_4]
[yan_smart_terrain_3_6]
[yan_smart_terrain_4_5]
[yan_smart_terrain_5_5]
[yan_smart_terrain_6_2]
[yan_smart_terrain_6_4];mlr
mechanic_army_yan_mlr_squad
yan_povar_army_mlr_squad
yan_stalker_sakharov_squad
[yan_smart_terrain_zombi_spawn]
[zat_b100]
[zat_b104_zombied]
[zat_b18]
[zat_b28]
[zat_b33]
[zat_b38]
[zat_b39]
[zat_b40_smart_terrain];mlr
[zat_b42_smart_terrain]
[zat_b7]
[zat_sim_1]
[zat_sim_10]
[zat_sim_11]
[zat_sim_12]
[zat_sim_13]
[zat_sim_14]
[zat_sim_15]
[zat_sim_16]
[zat_sim_17]
[zat_sim_18]
[zat_sim_19]
[zat_sim_2]
[zat_sim_20]
[zat_sim_21]
[zat_sim_22]
[zat_sim_23]
[zat_sim_24]
[zat_sim_25]
[zat_sim_26]
[zat_sim_27]
[zat_sim_28]
[zat_sim_29]
[zat_sim_3]
[zat_sim_30]
[zat_sim_4]
[zat_sim_5]
[zat_sim_6]
[zat_sim_7]
[zat_sim_8]
[zat_sim_9]
[zat_stalker_base_smart]
zat_tech_mlr_squad
zat_b22_barmen
zat_b22_medic
zat_b30_owl_stalker_trader_squad
@@ -0,0 +1,993 @@
;--============= Edited by Tronex ==================
;--Last Edit: 2018/1/26
; Starting spawns
; [smart_section]
; squad_section = spawn_count
[aes2_monolith_camp1]
monolith_sim_squad_advanced = 1
[aes2_monolith_camp2]
monolith_sim_squad_advanced = 1
monolith_sim_squad_veteran = 1
[aes2_monolith_camp3]
monolith_sim_squad_advanced = 1
monolith_sim_squad_veteran = 1
[aes2_monolith_camp4]
monolith_sim_squad_advanced = 1
monolith_sim_squad_veteran = 1
[aes2_monolith_snipers_1]
monolith_sim_squad_sniper = 1
monolith_sim_squad_veteran = 1
[aes2_monolith_snipers_2]
monolith_sim_squad_sniper = 1
monolith_sim_squad_veteran = 1
[aes2_monolith_snipers_3]
monolith_sim_squad_sniper = 1
monolith_sim_squad_veteran = 1
[aes2_monsters1]
simulation_chimera = 1
simulation_poltergeist_tele = 1
[aes2_monsters2]
simulation_gigant = 1
simulation_psy_dog = 1
[aes_smart_terrain_monolit_blockpost]
monolith_sim_squad_advanced = 1
monolith_sim_squad_novice = 1
monolith_sim_squad_veteran = 1
[aes_smart_terrain_monolit_blockpost2]
monolith_sim_squad_advanced = 1
monolith_sim_squad_veteran = 1
[aes_smart_terrain_monolit_blockpost4]
monolith_sim_squad_advanced = 1
monolith_sim_squad_sniper = 1
[aes_smart_terrain_monsters1]
simulation_bloodsucker = 1
simulation_chimera = 1
[aes_smart_terrain_monsters2]
simulation_controller = 1
simulation_gigant = 1
[aes_smart_terrain_monsters3]
simulation_chimera = 1
simulation_psy_dog = 1
[aes_smart_terrain_monsters4]
simulation_gigant = 1
simulation_snork = 1
[aes_smart_terran_soldier]
monolith_sim_squad_veteran = 1
[aes_smart_terran_soldier2]
monolith_sim_squad_veteran = 1
;;----------<< Agroprom >>----------|
[agr_smart_terrain_1_2]
[agr_smart_terrain_1_3]
[agr_smart_terrain_1_6];mlr
[agr_smart_terrain_1_6_near_1]
[agr_smart_terrain_1_6_near_2]
[agr_smart_terrain_2_2]
[agr_smart_terrain_4_4]
ecolog_sim_squad_veteran = 1
stalker_sim_squad_advanced = 1
[agr_smart_terrain_4_4_near_1]
stalker_sim_squad_novice = 1
ecolog_sim_squad_advanced = 1
[agr_smart_terrain_4_4_near_2]
csky_sim_squad_advanced = 1
[agr_u_bandits]
bandit_sim_squad_advanced = 1
;;----------<< Rostok/Bar >>----------|
[bar_dolg_bunker]
[bar_dolg_general];mlr
[bar_visitors];mlr
ecolog_sim_squad_advanced = 1
stalker_sim_squad_novice = 1
duty_sim_squad_veteran = 1
[bar_zastava_dogs_lair_2]
simulation_mix_dogs = 1
simulation_pseudodog = 1
[bun_krovosos_nest]
;;----------<< Dead City >>----------|
[cit_bandits]
[cit_bandits_2]
[cit_kanaliz1]
[cit_kanaliz2]
[cit_killers];mlr
;merc_sim_squad_advanced = 1
merc_sim_squad_veteran = 1
[cit_killers_2]
merc_sim_squad_advanced = 1
[cit_killers_vs_bandits]
merc_sim_squad_novice = 1
[zombie_smart_ds_mlr_1]
[zombie_smart_ds_mlr_2]
;-------------------------------------|
[mlr_terrain];mlr
[dar_angar]
simulation_fracture = 1
[dar_control_poltergeist]
;simulation_fracture = 1
;dar_control_poltergeist_squad
[dar_poltergeist_tele]
;simulation_fracture = 1
[dar_poltergeist_tele_round]
;simulation_fracture = 1
;;----------<< Darkscape >>----------|
[ds2_domik_st]
stalker_sim_squad_advanced = 1
stalker_sim_squad_novice = 1
[ds2_lager_st]
bandit_sim_squad_advanced = 1
bandit_sim_squad_novice = 1
[ds2_st_dogs]
[ds2_st_hoofs]
[ds_boars_nest]
[ds_deb1]
[ds_grverfer2]
[ds_kem1]
[ds_kem2]
army_sim_squad_advanced = 1
army_sim_squad_novice = 1
army_sim_squad_veteran = 1
[ds_kem3]
[ds_ptr]
[ds_ptr2]
[ds_ptr3]
[ds_ptr4]
;;----------<< Escape (Cordon) >>----------|
[esc_smart_terrain_1_11]
[esc_smart_terrain_2_12]
[esc_smart_terrain_2_14]
[esc_smart_terrain_3_16];mlr
[esc_smart_terrain_3_7]
[esc_smart_terrain_4_11]
[esc_smart_terrain_4_13]
[esc_smart_terrain_4_9]
[esc_smart_terrain_5_12]
[esc_smart_terrain_5_2]
[esc_smart_terrain_5_4]
[esc_smart_terrain_5_6]
[esc_smart_terrain_5_7];mlr
stalker_sim_squad_novice = 1
stalker_sim_squad_advanced = 1
[esc_smart_terrain_5_9]
;fabr_tushk_esc_smart_terrain_5_9 = 1
[esc_smart_terrain_6_6]
[esc_smart_terrain_6_8]
[esc_smart_terrain_7_11]
bandit_sim_squad_novice = 1
[esc_smart_terrain_8_10]
[esc_smart_terrain_8_9]
[esc_smart_terrain_9_7]
;;----------<< Garbage >>----------|
[gar_smart_terrain_1_5]
[gar_smart_terrain_1_7]
[gar_smart_terrain_2_4]
[gar_smart_terrain_3_5];mlr
stalker_sim_squad_novice = 2
[gar_smart_terrain_3_7]
stalker_sim_squad_advanced = 1
ecolog_sim_squad_advanced = 1
[gar_smart_terrain_4_2]
[gar_smart_terrain_4_5]
[gar_smart_terrain_5_2]
[gar_smart_terrain_5_4]
[gar_smart_terrain_5_5]
[gar_smart_terrain_5_6]
[gar_smart_terrain_6_1]
[gar_smart_terrain_6_3];mlr
[gar_smart_terrain_6_6]
[gar_smart_terrain_6_7]
[gar_smart_terrain_7_4]
[gar_smart_terrain_8_5]
;-----------< Generators >------------|
[gen_smart_terrain_cemetery]
[gen_smart_terrain_forest]
[gen_smart_terrain_junk]
[gen_smart_terrain_lab_entrance]
monolith_sim_squad_advanced = 1
monolith_sim_squad_sniper = 1
monolith_sim_squad_veteran = 1
[gen_smart_terrain_lab_entrance_2]
simulation_controller_psy = 1
[gen_smart_terrain_military]
monolith_sim_squad_veteran = 1
[gen_smart_terrain_urod]
;-----------< Jupiter >------------|
[jup_a12];mlr
[jup_a6];mlr
stalker_sim_squad_veteran = 1
[jup_b19]
[jup_b200_tushkan_smart_terrain]
[jup_b203]
[jup_b204]
[jup_b205_smart_terrain]
[jup_b205_smart_terrain_tushkano]
[jup_b208];mlr
;monolith_jup_mechanic_squad
;monolith_jup_trader_mlr_squad
;monolith_base_jupiter_squad = 1
[depo_terrain];mlr
;monolith_base_jupiter2_squad = 1
[kbo_terrain];mlr
[jup_b211]
[jup_b41]
[jup_b47]
[jup_a10_smart_terrain]
simulation_bloodsucker_red = 2
[jup_b8_smart_terrain]
[jup_sim_1]
[jup_sim_10]
[jup_sim_11]
[jup_sim_12]
[jup_sim_13]
[jup_sim_14]
[jup_sim_15]
[jup_sim_16]
[jup_sim_17]
[jup_sim_18]
[jup_sim_19]
[jup_sim_2]
[jup_sim_20]
[jup_sim_21]
[jup_sim_3]
[jup_sim_4]
[jup_sim_5]
[jup_sim_6]
[jup_sim_7]
[jup_sim_8]
[jup_sim_9]
;Госпиталь
[katacomb_smart_terrain]
monolith_sim_squad_advanced = 1
monolith_sim_squad_novice = 1
monolith_sim_squad_veteran = 1
;;----------<< Limansk >>----------|
[lim_smart_terrain_1]
[lim_smart_terrain_10]
monolith_sim_squad_advanced = 1
monolith_sim_squad_novice = 1
monolith_sim_squad_veteran = 1
[lim_smart_terrain_3]
merc_sim_squad_advanced = 1
merc_sim_squad_veteran = 1
[lim_smart_terrain_4]
merc_sim_squad_advanced = 1
[lim_smart_terrain_5]
[lim_smart_terrain_6]
monolith_sim_squad_advanced = 1
[lim_smart_terrain_7]
[lim_smart_terrain_8]
[lim_smart_terrain_9]
monolith_sim_squad_novice = 1
;;-----------< Lab x8 >-----------|
[lx8_smart_terrain]
;;-----------< Great Swamps >-----------|
[mar_smart_terrain_10_10]
[mar_smart_terrain_10_5]
army_sim_squad_advanced = 1
army_sim_squad_sniper = 1
[mar_smart_terrain_10_7]
[mar_smart_terrain_11_11]
renegade_sim_squad_advanced = 1
renegade_sim_squad_novice = 1
[mar_smart_terrain_11_3]
[mar_smart_terrain_12_2]
csky_sim_squad_advanced = 1
csky_sim_squad_novice = 1
stalker_sim_squad_novice = 1
[mar_smart_terrain_3_10]
[mar_smart_terrain_3_3]
renegade_sim_squad_advanced = 1
renegade_sim_squad_novice = 1
[mar_smart_terrain_3_7]
[mar_smart_terrain_4_5]
[mar_smart_terrain_4_7]
[mar_smart_terrain_5_12]
csky_sim_squad_advanced = 1
csky_sim_squad_novice = 1
[mar_smart_terrain_5_8]
csky_sim_squad_novice = 1
csky_sim_squad_veteran = 1
[mar_smart_terrain_6_10]
[mar_smart_terrain_6_11]
csky_sim_squad_advanced = 1
csky_sim_squad_novice = 1
[mar_smart_terrain_6_4]
[mar_smart_terrain_6_7]
[mar_smart_terrain_6_8]
[mar_smart_terrain_7_3]
[mar_smart_terrain_7_7]
[mar_smart_terrain_8_11]
renegade_sim_squad_advanced = 1
renegade_sim_squad_novice = 1
;renegade_sim_squad_veteran = 1
[mar_smart_terrain_8_4]
[mar_smart_terrain_8_8]
[mar_smart_terrain_8_9]
[mar_smart_terrain_base];mlr
csky_sim_squad_veteran = 1
csky_sim_squad_novice = 1
[mar_smart_terrain_doc]
;;----------<< Army Warehouses >>----------|
[mil_smart_terrain_2_1]
[mil_smart_terrain_2_10]
freedom_sim_squad_novice = 1
[mil_smart_terrain_2_2]
merc_sim_squad_advanced = 1
merc_sim_squad_novice = 1
merc_sim_squad_veteran = 1
[mil_smart_terrain_2_4]
bandit_sim_squad_advanced = 1
[mil_smart_terrain_2_6]
[mil_smart_terrain_3_8]
freedom_sim_squad_novice = 1
[mil_smart_terrain_4_2]
[mil_smart_terrain_4_3]
[mil_smart_terrain_4_5]
stalker_sim_squad_advanced = 1
[mil_smart_terrain_4_7]
[mil_smart_terrain_4_8]
freedom_sim_squad_veteran = 1
[mil_smart_terrain_7_10]
freedom_sim_squad_novice = 1
[mil_smart_terrain_7_12]
freedom_sim_squad_veteran = 1
[mil_smart_terrain_7_4]
duty_sim_squad_novice = 1
duty_sim_squad_veteran = 1
[mil_smart_terrain_7_7]
;mil_freedom_barman_mlr_squad
;mil_7_7_protect_mlr_squad2
freedom_sim_squad_novice = 1
[mil_smart_terrain_7_8]
;mil_smart_terrain_7_8_squad
freedom_sim_squad_veteran = 1
[mil_smart_terrain_8_3]
;;-------------------------------------------|
[pri_a15];mlr
[pri_a16_mlr_copy];mlr
[pri_a16];mlr
[pri_a17]
[pri_a18_smart_terrain];mlr
[pas_b400_canalisation]
[pas_b400_downstairs]
[pas_b400_elevator]
[pas_b400_hall]
[pas_b400_track]
[pas_b400_tunnel]
[pri_b303]
[pri_b304_monsters_smart_terrain]
[pri_b306]
[pri_b36_smart_terrain]
monolith_sim_squad_advanced = 1
monolith_sim_squad_novice = 1
monolith_sim_squad_veteran = 1
[pri_depot]
monolith_sim_squad_advanced = 1
monolith_sim_squad_novice = 1
monolith_sim_squad_veteran = 1
[pri_monolith]
monolith_sim_squad_advanced = 1
monolith_sim_squad_novice = 1
monolith_sim_squad_veteran = 1
[pri_sim_1]
;monolith_sim_squad_advanced = 1
[pri_sim_10]
[pri_sim_11]
[pri_sim_12]
[pri_sim_2]
[pri_sim_3]
[pri_sim_4]
[pri_sim_5]
[pri_sim_6]
[pri_sim_7]
[pri_sim_8]
[pri_sim_9]
[pri_smart_bloodsucker_lair1]
[pri_smart_controler_lair1]
[pri_smart_controler_lair2]
[pri_smart_giant_lair1]
[pri_smart_monolith_stalker2]
monolith_sim_squad_advanced = 1
[pri_smart_monolith_stalker3]
monolith_sim_squad_advanced = 1
[pri_smart_monolith_stalker4]
monolith_sim_squad_veteran = 1
[pri_smart_monolith_stalker6]
monolith_sim_squad_novice = 1
monolith_sim_squad_sniper = 1
monolith_sim_squad_veteran = 1
[pri_smart_monster_lair1]
[pri_smart_neutral_stalker1]
monolith_sim_squad_veteran = 1
[pri_smart_pseudodog_lair1]
[pri_smart_snork_lair1]
[pri_smart_snork_lair2]
[pri_smart_tushkano_lair1]
;;----------<< Radar >>----------|
[rad2_loner_0000]
[rad2_loner_0001]
[rad2_loner_0002]
[rad2_prip_teleport]
monolith_sim_squad_veteran = 1
[rad_after_valley]
[rad_antenna_camper]
monolith_sim_squad_advanced = 1
[rad_antenna_monolith]
monolith_sim_squad_advanced = 1
monolith_sim_squad_novice = 1
[rad_antenna_patrol]
monolith_sim_squad_veteran = 1
[rad_bloodsucker]
[rad_entrance]
monolith_sim_squad_advanced = 1
monolith_sim_squad_novice = 1
[rad_pseudodogs]
[rad_snork1]
[rad_snork2]
[rad_valley]
[rad_valley_dogs]
[rad_zombied1]
[rad_zombied2]
;;----------<< Red Forest >>----------|
[red_smart_terrain_4_2];mlr
[red_bridge_bandit_smart_skirmish];mlr
;protectors_red_bridge_bandit_smart_skirmish_squad = 1
;monolith_bridge_trader_mlr_squad
monolith_sim_squad_advanced = 1
[red_smart_terrain_3_1]
[red_smart_terrain_3_2]
;simulation_contr_3sn_3gzomb = 1
[red_smart_terrain_3_3]
[red_smart_terrain_4_3]
[red_smart_terrain_4_5]
[red_smart_terrain_5_5]
[red_smart_terrain_5_6]
simulation_chimera = 1
[red_smart_terrain_6_3]
[red_smart_terrain_6_6]
[red_smart_terrain_monsters]
[red_smart_terrain_monsters_2]
[red_smart_terrain_monsters_3]
;;----------<< Wild Territory >>----------|
[ros_smart_killers1]
bandit_sim_squad_advanced = 1
bandit_sim_squad_novice = 1
[ros_smart_monster4]
[ros_smart_monster5]
[ros_smart_monster7]
[ros_smart_poltergeist2]
simulation_poltergeist_tele = 1
simulation_snork = 1
[ros_smart_snork1]
[ros_smart_stalker1]
stalker_sim_squad_advanced = 1
stalker_sim_squad_veteran = 1
[ros_smart_stalker_killers1]
merc_sim_squad_advanced = 1
merc_sim_squad_novice = 1
merc_sim_squad_veteran = 1
[sar_monolith_general]
[sar_monolith_sklad]
;;----------<< Truck Cemetery >>----------|
[trc_sim_1]
bandit_sim_squad_veteran = 1
[trc_sim_10]
duty_sim_squad_veteran = 1
[trc_sim_11]
[trc_sim_12]
bandit_sim_squad_veteran = 1
[trc_sim_13]
[trc_sim_14]
[trc_sim_15]
[trc_sim_16]
[trc_sim_17]
freedom_sim_squad_veteran = 1
[trc_sim_18]
army_sim_squad_advanced = 1
army_sim_squad_veteran = 1
[trc_sim_19]
[trc_sim_2]
bandit_sim_squad_veteran = 1
[trc_sim_20];mlr
bandit_sim_squad_advanced = 1
[trc_sim_21]
[trc_sim_3]
[trc_sim_4]
army_sim_squad_advanced = 1
[trc_sim_5]
[trc_sim_6]
[trc_sim_7]
[trc_sim_8]
[trc_sim_9]
;;----------<< Dark Valley >>----------|
[val_smart_terrain_1_2]
army_sim_squad_advanced = 1
army_sim_squad_sniper = 1
[val_smart_terrain_3_0]
[val_smart_terrain_4_0]
stalker_sim_squad_advanced = 1
stalker_sim_squad_novice = 1
[val_smart_terrain_5_10]
[val_smart_terrain_6_4]
[val_smart_terrain_6_5]
[val_smart_terrain_7_3]
[val_smart_terrain_7_4]
bandit_sim_squad_advanced = 1
[val_smart_terrain_7_5];mlr
bandit_sim_squad_veteran = 1
[val_smart_terrain_8_6]
bandit_sim_squad_novice = 1
[val_smart_terrain_8_7]
[val_smart_terrain_8_9]
[val_smart_terrain_9_10]
[val_smart_terrain_9_2]
[val_smart_terrain_9_4]
bandit_sim_squad_novice = 1
[val_smart_terrain_9_6]
[warlab_common_consciousness_smart_terrain]
;;----------<< Yanter >>----------|
[yan_smart_terrain_2_4]
zombied_sim_squad_advanced = 1
zombied_sim_squad_veteran = 1
[yan_smart_terrain_2_5]
zombied_sim_squad_advanced = 1
[yan_smart_terrain_3_4]
zombied_sim_squad_novice = 1
[yan_smart_terrain_3_6]
ecolog_sim_squad_advanced = 1
[yan_smart_terrain_4_5]
simulation_snork_2_5 = 1
[yan_smart_terrain_5_5]
ecolog_sim_squad_veteran = 1
[yan_smart_terrain_6_2]
[yan_smart_terrain_6_4];mlr
ecolog_sim_squad_novice = 1
ecolog_sim_squad_veteran = 1
[yan_smart_terrain_zombi_spawn]
simulation_contr_3sn_3gzomb = 1
;;----------<< Zaton >>----------|
[zat_b100]
[zat_b104_zombied]
[zat_b18]
[zat_b28]
[zat_b33]
[zat_b38]
[zat_b39]
[zat_b40_smart_terrain];mlr
[zat_b42_smart_terrain]
simulation_mix_boar_flesh = 1
[zat_b7]
[zat_sim_1]
[zat_sim_10]
[zat_sim_11]
[zat_sim_12]
[zat_sim_13]
[zat_sim_14]
[zat_sim_15]
[zat_sim_16]
[zat_sim_17]
[zat_sim_18]
[zat_sim_19]
[zat_sim_2]
[zat_sim_20]
[zat_sim_21]
[zat_sim_22]
[zat_sim_23]
[zat_sim_24]
[zat_sim_25]
[zat_sim_26]
[zat_sim_27]
[zat_sim_28]
[zat_sim_29]
[zat_sim_3]
[zat_sim_30]
[zat_sim_4]
[zat_sim_5]
[zat_sim_6]
[zat_sim_7]
[zat_sim_8]
[zat_sim_9]
[zat_stalker_base_smart];mlr
[pol_smart_terrain_1_1]
[pol_smart_terrain_1_3]
[pol_smart_terrain_2_2]
simulation_burer = 1
[pol_smart_terrain_2_1]
simulation_poltergeist_tele = 1
@@ -0,0 +1,896 @@
[red_bridge_bandit_smart_skirmish];mlr
;;killer_bridge_trader_mlr_squad
[pri_a18_smart_terrain];mlr
pri_special_trader_mlr_squad
merc_pri_grifon_mlr_squad
merc_pri_a18_mech_mlr_squad
[aes2_monolith_camp1]
[aes2_monolith_camp2]
[aes2_monolith_camp3]
[aes2_monolith_camp4]
[aes2_monolith_snipers_1]
[aes2_monolith_snipers_2]
[aes2_monolith_snipers_3]
[aes2_monsters1]
[aes2_monsters2]
[aes_smart_terrain_monolit_blockpost]
[aes_smart_terrain_monolit_blockpost2]
[aes_smart_terrain_monolit_blockpost4]
[aes_smart_terrain_monsters1]
[aes_smart_terrain_monsters2]
[aes_smart_terrain_monsters3]
[aes_smart_terrain_monsters4]
[aes_smart_terran_soldier]
[aes_smart_terran_soldier2]
[agr_smart_terrain_1_2]
[agr_smart_terrain_1_3]
[agr_smart_terrain_1_6];mlr
agr_1_6_medic_army_mlr_squad
agr_1_6_barman_army_mlr_squad
agr_smart_terrain_1_6_army_mechanic_stalker_squad
agr_smart_terrain_1_6_army_trader_stalker_squad
[agr_smart_terrain_1_6_near_1]
[agr_smart_terrain_1_6_near_2]
agr_smart_terrain_1_6_near_2_military_colonel_kovalski_squad
[agr_smart_terrain_2_2]
[agr_smart_terrain_4_4]
[agr_smart_terrain_4_4_near_1]
[agr_smart_terrain_4_4_near_2]
[agr_smart_terrain_4_4_near_3]
[agr_smart_terrain_4_6]
[agr_smart_terrain_5_2]
[agr_smart_terrain_5_3]
[agr_smart_terrain_5_7]
[agr_smart_terrain_6_4]
[agr_smart_terrain_7_5]
[agr_u_bandits]
agr_u_bandits_squad
[agr_u_soldiers]
agr_u_soldiers_squad
[bar_dolg_bunker]
bar_dolg_leader_squad
[bar_dolg_general];mlr
bar_dolg_general_petrenko_stalker_squad
bar_dolg_general_zoneguard_stalker_squad
dolg_medic_squad
[bar_visitors];mlr
bar_arena_guard_squad
bar_arena_manager_squad
bar_visitors_barman_stalker_trader_squad
bar_visitors_cardan_tech_squad
bar_visitors_garik_stalker_guard_squad
bar_visitors_zhorik_stalker_guard2_squad
guid_bar_stalker_navigator_squad
bar_informator_mlr_squad
[bar_zastava]
bar_duty_security_squad_leader_squad
[bar_zastava_2]
bar_zastava_2_commander_squad
[bar_zastava_dogs_lair]
[bar_zastava_dogs_lair_2]
[bun_krovosos_nest]
bun_krovosos_nest_squad
[cit_bandits]
[cit_bandits_2]
[cit_kanaliz1]
[cit_kanaliz2]
[cit_killers];mlr
cit_killers_merc_mechanic_stalker_squad
cit_killers_merc_trader_stalker_squad
cit_killers_merc_stalker_aslan_squad
ds_killer_guide_main_base_squad
ds_killer_medic_mlr_squad
[cit_killers_2]
[cit_killers_vs_bandits]
[dar_angar]
dar_angar_gigant_squad
[dar_control_poltergeist]
dar_control_poltergeist_squad
[dar_poltergeist_tele]
dar_poltergeist_tele_squad
[dar_poltergeist_tele_round]
dar_poltergeist_tele_round_squad
[ds2_domik_st]
[ds2_lager_st]
[ds2_st_dogs]
[ds2_st_hoofs]
[ds_boars_nest]
[ds_deb1]
[ds_grverfer2]
[ds_kem1]
[ds_kem2]
[ds_kem3]
[ds_ptr]
[ds_ptr2]
[ds_ptr3]
[ds_ptr4]
[esc_smart_terrain_1_11]
[esc_smart_terrain_2_12];mlr
esc_2_12_stalker_fanat_squad
esc_smart_terrain_5_7_loner_mechanic_stalker_squad
[esc_smart_terrain_2_14]
[esc_smart_terrain_3_16];mlr
esc_3_16_military_trader_squad
army_south_mechan_mlr_squad
[esc_smart_terrain_3_7]
[esc_smart_terrain_4_11]
[esc_smart_terrain_4_13]
[esc_smart_terrain_4_9]
[esc_smart_terrain_5_12]
[esc_smart_terrain_5_2]
[esc_smart_terrain_5_4]
[esc_smart_terrain_5_6]
[esc_smart_terrain_5_7];mlr
[esc_smart_terrain_5_9]
[esc_smart_terrain_6_6]
[esc_smart_terrain_6_8]
[esc_smart_terrain_7_11]
[esc_smart_terrain_8_10]
[esc_smart_terrain_8_9]
[esc_smart_terrain_9_7]
[gar_smart_terrain_1_5]
[gar_smart_terrain_1_7]
[gar_smart_terrain_2_4]
[gar_smart_terrain_3_5];mlr
hunter_gar_trader_squad
[gar_smart_terrain_3_7]
[gar_smart_terrain_4_2]
[gar_smart_terrain_4_5]
[gar_smart_terrain_5_2]
[gar_smart_terrain_5_4]
[gar_smart_terrain_5_5]
[gar_smart_terrain_5_6]
[gar_smart_terrain_6_1]
[gar_smart_terrain_6_3];mlr
;;stalker_sim_baraholka_trader_day_squad
;;stalker_sim_baraholka_trader_night_squad
[gar_smart_terrain_6_6]
[gar_smart_terrain_6_7]
[gar_smart_terrain_7_4]
[gar_smart_terrain_8_5]
[gen_smart_terrain_cemetery]
[gen_smart_terrain_forest]
[gen_smart_terrain_junk]
[gen_smart_terrain_lab_entrance]
[gen_smart_terrain_lab_entrance_2]
[gen_smart_terrain_military]
[gen_smart_terrain_urod]
[jup_a12]
jup_a12_bandit_cashier_squad
jup_a12_bandit_chief_squad
jup_a12_bandit_guard_squad
[jup_a6];mlr
guid_jup_stalker_garik_squad
jup_a6_freedom_leader_squad
jup_a6_freedom_trader_ashot_squad
jup_a6_stalker_barmen_squad
jup_a6_stalker_medik_squad
jup_b10_stalker_drunk_squad
jup_b19_freedom_yar_squad
jup_b25_alex_squad
[jup_b19]
jup_b19_kopatci_zombied_squad
[jup_b200_tushkan_smart_terrain]
jup_b200_tushkano_squad
[jup_b203]
jup_b203_tushkano
jup_b203_zombied_squad
[jup_b204]
jup_b204_squad
[jup_b205_smart_terrain]
jup_b205_monster_01_squad
jup_b205_monster_04_squad
jup_b205_zombie_01_squad
jup_b205_zombie_02_squad
[jup_b205_smart_terrain_tushkano]
jup_b205_monster_02_squad
[jup_b208]
;jup_b208_burers_squad
[jup_b211]
jup_b6_swamp_hunters
[jup_b41]
jup_b1_stalker_squad
jup_b47_merc_guard_squad
jup_b6_scientist_group
[jup_b47]
jup_a9_dogs_normal
[jup_b8_smart_terrain]
jup_b8_psy_dog_squad
[jup_sim_1]
[jup_sim_10]
[jup_sim_11]
[jup_sim_12]
[jup_sim_13]
[jup_sim_14]
[jup_sim_15]
[jup_sim_16]
[jup_sim_17]
[jup_sim_18]
[jup_sim_19]
[jup_sim_2]
[jup_sim_20]
[jup_sim_21]
[jup_sim_3]
[jup_sim_4]
[jup_sim_5]
[jup_sim_6]
[jup_sim_7]
[jup_sim_8]
[jup_sim_9]
[katacomb_smart_terrain]
[lim_smart_terrain_1]
[lim_smart_terrain_10]
[lim_smart_terrain_3]
[lim_smart_terrain_4]
[lim_smart_terrain_5]
[lim_smart_terrain_6]
[lim_smart_terrain_8]
[lim_smart_terrain_9]
[lx8_smart_terrain]
lx8_burers_squad
lx8_snork_down_squad
lx8_snork_up_squad
lx8_toilet_burer_squad
lx8_tushkano_1_squad
lx8_tushkano_2_squad
[mar_smart_terrain_10_10]
[mar_smart_terrain_10_5]
[mar_smart_terrain_10_7]
[mar_smart_terrain_11_11]
[mar_smart_terrain_11_3]
[mar_smart_terrain_12_2]
[mar_smart_terrain_3_10]
[mar_smart_terrain_3_3]
[mar_smart_terrain_3_7]
[mar_smart_terrain_4_5]
[mar_smart_terrain_4_7]
[mar_smart_terrain_5_12]
[mar_smart_terrain_5_8]
[mar_smart_terrain_6_10]
[mar_smart_terrain_6_11]
[mar_smart_terrain_6_4]
[mar_smart_terrain_6_7]
[mar_smart_terrain_6_8]
[mar_smart_terrain_7_3]
[mar_smart_terrain_7_7]
[mar_smart_terrain_8_11]
[mar_smart_terrain_8_4]
[mar_smart_terrain_8_8]
[mar_smart_terrain_8_9]
[mar_smart_terrain_base];mlr
guid_marsh_mlr_squad
mar_base_owl_stalker_trader_squad
mar_base_stalker_barmen_squad
mar_base_stalker_tech_squad
mar_doctor_squad
mar_smart_terrain_base_dog_doctor_squad
mar_smart_terrain_base_lager_squad
mar_smart_terrain_base_stalker_leader_marsh_squad
[mar_smart_terrain_doc]
mar_smart_terrain_doc_dog_squad
mar_smart_terrain_doc_squad
[mil_smart_terrain_2_1]
[mil_smart_terrain_2_10]
[mil_smart_terrain_2_2]
[mil_smart_terrain_2_4]
[mil_smart_terrain_2_6]
[mil_smart_terrain_3_8]
[mil_smart_terrain_4_2]
[mil_smart_terrain_4_3]
[mil_smart_terrain_4_5]
[mil_smart_terrain_4_7]
[mil_smart_terrain_4_8]
[mil_smart_terrain_7_10]
mil_smart_terrain_7_10_freedom_trader_stalker_squad
[mil_smart_terrain_7_12]
[mil_smart_terrain_7_4]
[mil_smart_terrain_7_7];mlr
mil_freedom_guid_squad
;;mil_freedom_medic_squad
mil_smart_terrain_7_7_freedom_leader_stalker_squad
mil_smart_terrain_7_7_freedom_mechanic_stalker_squad
[mil_smart_terrain_7_8]
[mil_smart_terrain_8_3]
[pas_b400_canalisation]
pas_b400_canalisation_1_zombied
pas_b400_canalisation_3_zombied
pas_b400_canalisation_5_zombied
pas_b400_canalisation_snork_2
pas_b400_canalisation_tushkano
[pas_b400_downstairs]
pas_b400_downstairs_tushkano
[pas_b400_elevator]
pas_b400_elevator_tushkano
pas_b400_snork_elevator_4
[pas_b400_hall]
pas_b400_hall_tushkano
pas_b400_snork_tunnel_5
[pas_b400_track]
pas_b400_snork_track_2
pas_b400_track_tushkano
[pas_b400_tunnel]
pas_b400_snork_tunnel_2
pas_b400_snork_tunnel_3
pas_b400_tunnel_tushkano
[pri_b303]
pri_b303_burer_squad
[pri_b304_monsters_smart_terrain]
pri_b304_dogs
[pri_b306]
pri_b306_1_floor_zombied
pri_b306_1_floor_zombied_2
pri_b306_2_floor_monolith
pri_b306_2_floor_zombied
pri_b306_3_floor_monolith
pri_b306_3_floor_zombied
pri_b306_4_floor_monolith
pri_b306_4_floor_monolith_2
[pri_b36_smart_terrain]
pri_b36_monolith_guard_squad
pri_b36_monolith_marine_squad
pri_b36_monolith_sniper_squad
pri_b36_zombied_squad
[pri_depot]
[pri_monolith];mlr
lider_monolith_haron_squad
pri_monolith_monolith_mechanic_stalker_squad
pri_monolith_monolith_trader_stalker_squad
[pri_sim_1]
[pri_sim_10]
[pri_sim_11]
[pri_sim_12]
[pri_sim_2]
[pri_sim_3]
[pri_sim_4]
[pri_sim_5]
[pri_sim_6]
[pri_sim_7]
[pri_sim_8]
[pri_sim_9]
[pri_smart_bloodsucker_lair1]
[pri_smart_controler_lair1]
[pri_smart_controler_lair2]
[pri_smart_giant_lair1]
[pri_smart_monolith_stalker2]
[pri_smart_monolith_stalker3]
[pri_smart_monolith_stalker4]
[pri_smart_monolith_stalker6]
[pri_smart_monster_lair1]
[pri_smart_neutral_stalker1]
[pri_smart_pseudodog_lair1]
[pri_smart_snork_lair1]
[pri_smart_snork_lair2]
[pri_smart_tushkano_lair1]
[rad2_loner_0000]
[rad2_loner_0001]
[rad2_loner_0002]
[rad2_prip_teleport]
[rad_after_valley]
[rad_antenna_camper]
[rad_antenna_monolith]
[rad_antenna_patrol]
[rad_bloodsucker]
[rad_entrance]
[rad_pseudodogs]
[rad_snork1]
[rad_snork2]
[rad_valley]
[rad_valley_dogs]
[rad_zombied1]
[rad_zombied2]
[red_smart_terrain_3_1]
[red_smart_terrain_3_2]
[red_smart_terrain_3_3]
[red_smart_terrain_4_3]
[red_smart_terrain_4_5]
[red_smart_terrain_5_5]
[red_smart_terrain_5_6]
[red_smart_terrain_6_3]
[red_smart_terrain_6_6]
[red_smart_terrain_monsters]
[red_smart_terrain_monsters_2]
[red_smart_terrain_monsters_3]
[ros_smart_killers1]
[ros_smart_monster4]
[ros_smart_monster5]
[ros_smart_monster7]
[ros_smart_poltergeist2]
[ros_smart_snork1]
[ros_smart_stalker1]
[ros_smart_stalker_killers1]
[sar_monolith_general]
sar_monolith_general_squad
[sar_monolith_sklad]
sar_monolith_sklad_squad
[trc_sim_1]
[trc_sim_10]
[trc_sim_11]
[trc_sim_12]
[trc_sim_13]
[trc_sim_14]
[trc_sim_15]
[trc_sim_16]
[trc_sim_17]
[trc_sim_18]
[trc_sim_19]
[trc_sim_2]
[trc_sim_20];mlr
trucks_cemetery_bandit_mechanic_squad
trucks_cemetery_bandit_trader_squad
[trc_sim_21]
[trc_sim_3]
[trc_sim_4]
[trc_sim_5]
[trc_sim_6]
[trc_sim_7]
[trc_sim_8]
[trc_sim_9]
[val_smart_terrain_1_2]
[val_smart_terrain_3_0]
[val_smart_terrain_4_0]
[val_smart_terrain_5_10]
[val_smart_terrain_6_4]
[val_smart_terrain_6_5]
[val_smart_terrain_7_3]
val_smart_terrain_7_3_bandit_mechanic_stalker_squad
[val_smart_terrain_7_4]
val_smart_terrain_7_4_bandit_trader_stalker_squad
[val_smart_terrain_7_5];mlr
zat_b7_bandit_boss_sultan_squad
guid_dv_mal_mlr_squad
;;bandit_main_base_medic_mlr_squad
[val_smart_terrain_8_6]
[val_smart_terrain_8_7]
[val_smart_terrain_8_9]
[val_smart_terrain_9_10]
[val_smart_terrain_9_2]
[val_smart_terrain_9_4]
[val_smart_terrain_9_6]
[warlab_common_consciousness_smart_terrain]
warlab_pod_stalker_squad
[yan_smart_terrain_2_4]
[yan_smart_terrain_2_5]
[yan_smart_terrain_3_4]
[yan_smart_terrain_3_6]
[yan_smart_terrain_4_5]
[yan_smart_terrain_5_5]
[yan_smart_terrain_6_2]
[yan_smart_terrain_6_4];mlr
mechanic_army_yan_mlr_squad
yan_povar_army_mlr_squad
yan_bunker_guards_squad
yan_stalker_sakharov_squad
[yan_smart_terrain_zombi_spawn]
[zat_b100]
zat_b100_poltergeist_squad_01
[zat_b104_zombied]
zat_b104_zombied_1
zat_b104_zombied_2
zat_b104_zombied_3
[zat_b18]
zat_b18_dog_noah_squad
zat_b18_noah_squad
[zat_b28]
zat_b28_snork_squad
[zat_b33]
zat_b33_snork_first_wave
[zat_b38]
zat_b38_default_bloodsucker
[zat_b39]
zat_b39_dogs_squad
[zat_b40_smart_terrain];mlr
zat_stancia_trader_merc_squad
zat_stancia_mech_merc_squad
;zaton_killer_guide_station_squad
zat_b40_merc_squad
[zat_b42_smart_terrain]
zat_b42_controller_squad
[zat_b7]
zat_b7_stalkers_victims_1
[zat_sim_1]
[zat_sim_10]
[zat_sim_11]
[zat_sim_12]
[zat_sim_13]
[zat_sim_14]
[zat_sim_15]
[zat_sim_16]
[zat_sim_17]
[zat_sim_18]
[zat_sim_19]
[zat_sim_2]
[zat_sim_20]
[zat_sim_21]
[zat_sim_22]
[zat_sim_23]
[zat_sim_24]
[zat_sim_25]
[zat_sim_26]
[zat_sim_27]
[zat_sim_28]
[zat_sim_29]
[zat_sim_3]
[zat_sim_30]
[zat_sim_4]
[zat_sim_5]
[zat_sim_6]
[zat_sim_7]
[zat_sim_8]
[zat_sim_9]
[zat_stalker_base_smart]
zat_tech_mlr_squad
zat_a2_stalker_nimble_squad
guid_zan_stalker_locman_squad
;zat_a2_stalker_mechanic_squad
zat_b106_stalker_crab_squad
zat_b106_stalker_gonta_squad
zat_b22_barmen
zat_b22_medic
zat_b30_owl_stalker_trader_squad
zat_stalker_base_smart_mlr_squad
@@ -0,0 +1,767 @@
[l04_darkvalley]
simulation_boar = 6
simulation_bloodsucker = 4
simulation_karlik = 2
simulation_psysucker = 2.2
simulation_zombie = 3.5
simulation_poltergeist = 4.2
simulation_cat = 6
simulation_dog = 7
simulation_tushkano = 5
simulation_gigant = 1.8
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 3
simulation_burer = 2.4
simulation_flesh = 7
simulation_snork = 5
simulation_fracture = 3
simulation_dog = 6
simulation_lurker = 6
simulation_chimera = 2.3
simulation_psy_dog = 3.5
simulation_controller = 3
[k02_trucks_cemetery]
simulation_boar = 6
simulation_bloodsucker = 2
simulation_karlik = 2
simulation_psysucker = 1.5
simulation_zombie = 3.5
simulation_poltergeist = 3.2
simulation_cat = 6.5
simulation_dog = 6
simulation_tushkano = 8
simulation_gigant = 2.2
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 2
simulation_burer = 1.8
simulation_flesh = 5.5
simulation_snork = 4
simulation_fracture = 3
simulation_dog = 5
simulation_lurker = 5
simulation_chimera = 2.2
simulation_psy_dog = 2.5
simulation_controller = 3
[zaton]
simulation_boar = 7
simulation_bloodsucker = 4.2
simulation_karlik = 1.7
simulation_psysucker = 2
simulation_zombie = 4
simulation_poltergeist = 4.5
simulation_cat = 7.5
simulation_dog = 7
simulation_tushkano = 4
simulation_gigant = 1.8
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 2
simulation_burer = 1.5
simulation_flesh = 8.5
simulation_snork = 2.5
simulation_fracture = 3.2
simulation_dog = 8
simulation_lurker = 4
simulation_chimera = 2
simulation_psy_dog = 4.5
simulation_controller = 3
[labx8]
simulation_boar = 0.5
simulation_bloodsucker = 2.5
simulation_karlik = 2.5
simulation_psysucker = 2
simulation_zombie = 1.5
simulation_poltergeist = 3.5
simulation_cat = 0.7
simulation_dog = 0.8
simulation_tushkano = 2.2
simulation_gigant = 0.8
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 1
simulation_burer = 4
simulation_flesh = 0.5
simulation_snork = 4.5
simulation_fracture = 1.1
simulation_dog = 0.7
simulation_lurker = 0.5
simulation_chimera = 0.7
simulation_psy_dog = 0.8
simulation_controller = 4
[pripyat]
simulation_boar = 1.5
simulation_bloodsucker = 2.5
simulation_karlik = 1.7
simulation_psysucker = 3
simulation_zombie = 6
simulation_poltergeist = 3.5
simulation_cat = 7
simulation_dog = 5.5
simulation_tushkano = 7
simulation_gigant = 3
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 1
simulation_burer = 2.5
simulation_flesh = 1.7
simulation_snork = 3
simulation_fracture = 5
simulation_dog = 5
simulation_lurker = 3
simulation_chimera = 3
simulation_psy_dog = 5.5
simulation_controller = 3.5
[k01_darkscape]
simulation_boar = 6
simulation_bloodsucker = 4.2
simulation_karlik = 3
simulation_psysucker = 1.7
simulation_zombie = 5
simulation_poltergeist = 5
simulation_cat = 7.5
simulation_dog = 7
simulation_tushkano = 4
simulation_gigant = 2
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 1
simulation_burer = 1.5
simulation_flesh = 6
simulation_snork = 4
simulation_fracture = 5
simulation_dog = 6
simulation_lurker = 4.5
simulation_chimera = 2
simulation_psy_dog = 4
simulation_controller = 3.5
[jupiter_underground]
simulation_boar = 0.5
simulation_bloodsucker = 2.5
simulation_karlik = 2.2
simulation_psysucker = 1
simulation_zombie = 3.5
simulation_poltergeist = 2.7
simulation_cat = 2.5
simulation_dog = 0.8
simulation_tushkano = 4
simulation_gigant = 0.7
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 7
simulation_burer = 3.2
simulation_flesh = 0.5
simulation_snork = 3.5
simulation_fracture = 1.5
simulation_dog = 0.7
simulation_lurker = 2
simulation_chimera = 0.5
simulation_psy_dog = 1.2
simulation_controller = 1.7
[l12u_sarcofag]
simulation_boar = 0.5
simulation_bloodsucker = 2.5
simulation_karlik = 2.5
simulation_psysucker = 2
simulation_zombie = 1.5
simulation_poltergeist = 3.5
simulation_cat = 0.7
simulation_dog = 0.8
simulation_tushkano = 2.2
simulation_gigant = 0.8
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 1
simulation_burer = 4
simulation_flesh = 0.5
simulation_snork = 4.5
simulation_fracture = 1.1
simulation_dog = 0.7
simulation_lurker = 0.5
simulation_chimera = 0.7
simulation_psy_dog = 0.8
simulation_controller = 4
[l07_military]
simulation_boar = 5
simulation_bloodsucker = 6
simulation_karlik = 3
simulation_psysucker = 4
simulation_zombie = 5
simulation_poltergeist = 4.5
simulation_cat = 4
simulation_dog = 6
simulation_tushkano = 5
simulation_gigant = 2.5
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 1
simulation_burer = 2.3
simulation_flesh = 5
simulation_snork = 4
simulation_fracture = 3.5
simulation_dog = 4
simulation_lurker = 3.5
simulation_chimera = 2.5
simulation_psy_dog = 5
simulation_controller = 3.2
[l11_pripyat]
simulation_boar = 1.5
simulation_bloodsucker = 5
simulation_karlik = 4
simulation_psysucker = 4
simulation_zombie = 2.5
simulation_poltergeist = 4.5
simulation_cat = 5.5
simulation_dog = 1.8
simulation_tushkano = 3
simulation_gigant = 3.2
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 1.5
simulation_burer = 2.5
simulation_flesh = 1
simulation_snork = 4.5
simulation_fracture = 2.5
simulation_dog = 1.5
simulation_lurker = 2
simulation_chimera = 3
simulation_psy_dog = 2.5
simulation_controller = 4
[l03_agroprom]
simulation_boar = 8
simulation_bloodsucker = 5
simulation_karlik = 2.5
simulation_psysucker = 2.6
simulation_zombie = 3.5
simulation_poltergeist = 4.5
simulation_cat = 5
simulation_dog = 7
simulation_tushkano = 8
simulation_gigant = 1.8
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 2
simulation_burer = 2.7
simulation_flesh = 7
simulation_snork = 4.5
simulation_fracture = 3.2
simulation_dog = 6
simulation_lurker = 5
simulation_chimera = 2
simulation_psy_dog = 4
simulation_controller = 3.7
[jupiter]
simulation_boar = 7
simulation_bloodsucker = 6
simulation_karlik = 5
simulation_psysucker = 5
simulation_zombie = 5
simulation_poltergeist = 6
simulation_cat = 7
simulation_dog = 7
simulation_tushkano = 6
simulation_gigant = 5
simulation_borya = 5
simulation_bibliotekar = 1.5
simulation_rats = 1
simulation_burer = 5
simulation_flesh = 7
simulation_snork = 5
simulation_fracture = 5
simulation_dog = 7
simulation_lurker = 6
simulation_chimera = 5
simulation_psy_dog = 6
simulation_controller = 6
[l05_bar]
simulation_boar = 8
simulation_bloodsucker = 2.5
simulation_karlik = 1.5
simulation_psysucker = 1.5
simulation_zombie = 4
simulation_poltergeist = 2
simulation_cat = 6
simulation_dog = 8
simulation_tushkano = 5
simulation_gigant = 2.5
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 3
simulation_burer = 1.2
simulation_flesh = 8
simulation_snork = 3.5
simulation_fracture = 2
simulation_dog = 7
simulation_lurker = 2.5
simulation_chimera = 1.5
simulation_psy_dog = 4
simulation_controller = 2
[l10_radar]
simulation_boar = 2
simulation_bloodsucker = 3.5
simulation_karlik = 4.5
simulation_psysucker = 5
simulation_zombie = 6
simulation_poltergeist = 4
simulation_cat = 2
simulation_dog = 2.5
simulation_tushkano = 1.5
simulation_gigant = 2.7
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 1
simulation_burer = 3
simulation_flesh = 1.5
simulation_snork = 4
simulation_fracture = 3.5
simulation_dog = 2
simulation_lurker = 2.3
simulation_chimera = 3
simulation_psy_dog = 4.5
simulation_controller = 5
[l12_stancia_2]
simulation_boar = 2
simulation_bloodsucker = 4.5
simulation_karlik = 3
simulation_psysucker = 5
simulation_zombie = 4
simulation_poltergeist = 4
simulation_cat = 1.7
simulation_dog = 2.5
simulation_tushkano = 1.5
simulation_gigant = 3.5
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 1
simulation_burer = 2.7
simulation_flesh = 1.5
simulation_snork = 4.5
simulation_fracture = 2.5
simulation_dog = 1.8
simulation_lurker = 1.5
simulation_chimera = 3
simulation_psy_dog = 2.5
simulation_controller = 5
[l08u_brainlab]
simulation_boar = 0.5
simulation_bloodsucker = 2.2
simulation_karlik = 4
simulation_psysucker = 4.5
simulation_zombie = 5.5
simulation_poltergeist = 3.5
simulation_cat = 1.4
simulation_dog = 0.8
simulation_tushkano = 3
simulation_gigant = 0.8
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 1
simulation_burer = 2.5
simulation_flesh = 0.5
simulation_snork = 3.5
simulation_fracture = 4.5
simulation_dog = 0.7
simulation_lurker = 2.6
simulation_chimera = 0.7
simulation_psy_dog = 2
simulation_controller = 4
[l09_deadcity]
simulation_boar = 2.5
simulation_bloodsucker = 3
simulation_karlik = 3
simulation_psysucker = 3.5
simulation_zombie = 6
simulation_poltergeist = 3
simulation_cat = 2
simulation_dog = 3.5
simulation_tushkano = 3
simulation_gigant = 2.5
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 3
simulation_burer = 2.5
simulation_flesh = 1.5
simulation_snork = 5
simulation_fracture = 5
simulation_dog = 2
simulation_lurker = 2
simulation_chimera = 2.5
simulation_psy_dog = 3.5
simulation_controller = 4.5
[l10u_bunker]
simulation_boar = 0.5
simulation_bloodsucker = 4.5
simulation_karlik = 2.8
simulation_psysucker = 4.5
simulation_zombie = 3.5
simulation_poltergeist = 3.5
simulation_cat = 1.2
simulation_dog = 0.8
simulation_tushkano = 3
simulation_gigant = 0.8
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 1
simulation_burer = 4
simulation_flesh = 0.5
simulation_snork = 3.5
simulation_fracture = 2.5
simulation_dog = 0.7
simulation_lurker = 2
simulation_chimera = 2
simulation_psy_dog = 3.2
simulation_controller = 6
[l02_garbage]
simulation_boar = 8
simulation_bloodsucker = 4
simulation_karlik = 2.5
simulation_psysucker = 2
simulation_zombie = 4
simulation_poltergeist = 4
simulation_cat = 6
simulation_dog = 7
simulation_tushkano = 8
simulation_gigant = 1.6
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 6
simulation_burer = 2
simulation_flesh = 7
simulation_snork = 4
simulation_fracture = 4
simulation_dog = 7
simulation_lurker = 4
simulation_chimera = 1.8
simulation_psy_dog = 3.5
simulation_controller = 3
[l10_limansk]
simulation_boar = 2
simulation_bloodsucker = 5
simulation_karlik = 3
simulation_psysucker = 3.5
simulation_zombie = 3.5
simulation_poltergeist = 3.5
simulation_cat = 2
simulation_dog = 4
simulation_tushkano = 3
simulation_gigant = 1.7
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 2
simulation_burer = 2.5
simulation_flesh = 1.5
simulation_snork = 4.5
simulation_fracture = 3
simulation_dog = 2
simulation_lurker = 2
simulation_chimera = 3
simulation_psy_dog = 4
simulation_controller = 4
[l13_generators]
simulation_boar = 2
simulation_bloodsucker = 4.5
simulation_karlik = 3
simulation_psysucker = 5
simulation_zombie = 4
simulation_poltergeist = 4
simulation_cat = 1.7
simulation_dog = 2.5
simulation_tushkano = 1.5
simulation_gigant = 3.5
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 1
simulation_burer = 2.7
simulation_flesh = 1.5
simulation_snork = 4.5
simulation_fracture = 2.5
simulation_dog = 1.8
simulation_lurker = 1.5
simulation_chimera = 3
simulation_psy_dog = 2.5
simulation_controller = 5
[l11_hospital]
simulation_boar = 1
simulation_bloodsucker = 5
simulation_karlik = 4.5
simulation_psysucker = 3.5
simulation_zombie = 2.5
simulation_poltergeist = 2.7
simulation_cat = 1.8
simulation_dog = 1.3
simulation_tushkano = 6
simulation_gigant = 1
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 1.5
simulation_burer = 2.5
simulation_flesh = 1
simulation_snork = 6.5
simulation_fracture = 3
simulation_dog = 1.5
simulation_lurker = 1
simulation_chimera = 2
simulation_psy_dog = 2.5
simulation_controller = 4
[l10_red_forest]
simulation_boar = 1.5
simulation_bloodsucker = 6
simulation_karlik = 1.2
simulation_psysucker = 4
simulation_zombie = 2
simulation_poltergeist = 3
simulation_cat = 2
simulation_dog = 2.5
simulation_tushkano = 2
simulation_gigant = 1.5
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 1
simulation_burer = 2
simulation_flesh = 1
simulation_snork = 2
simulation_fracture = 1.5
simulation_dog = 1.5
simulation_lurker = 3
simulation_chimera = 3.5
simulation_psy_dog = 3
simulation_controller = 4
[l04u_labx18]
simulation_boar = 0.5
simulation_bloodsucker = 3.3
simulation_karlik = 1.7
simulation_psysucker = 0.8
simulation_zombie = 2.5
simulation_poltergeist = 5.5
simulation_cat = 1.6
simulation_dog = 0.8
simulation_tushkano = 3
simulation_gigant = 0.7
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 1
simulation_burer = 2.5
simulation_flesh = 0.5
simulation_snork = 4.5
simulation_fracture = 2.2
simulation_dog = 0.7
simulation_lurker = 4.5
simulation_chimera = 0.5
simulation_psy_dog = 1
simulation_controller = 2.2
[l01_escape]
simulation_boar = 8
simulation_bloodsucker = 3
simulation_karlik = 2
simulation_psysucker = 1.5
simulation_zombie = 5
simulation_poltergeist = 3.5
simulation_cat = 8
simulation_dog = 8
simulation_tushkano = 6
simulation_gigant = 1.2
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 3
simulation_burer = 1.2
simulation_flesh = 7
simulation_snork = 4
simulation_fracture = 5
simulation_dog = 9
simulation_lurker = 5
simulation_chimera = 1.3
simulation_psy_dog = 3
simulation_controller = 2.5
[l03u_agr_underground]
simulation_boar = 0.5
simulation_bloodsucker = 3.5
simulation_karlik = 3
simulation_psysucker = 0.5
simulation_zombie = 3.3
simulation_poltergeist = 1.5
simulation_cat = 1.9
simulation_dog = 0.8
simulation_tushkano = 5
simulation_gigant = 0.4
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 1
simulation_burer = 1.8
simulation_flesh = 0.5
simulation_snork = 4.5
simulation_fracture = 3
simulation_dog = 1
simulation_lurker = 1.1
simulation_chimera = 0.5
simulation_psy_dog = 1
simulation_controller = 1.8
[l12u_control_monolith]
simulation_boar = 0.5
simulation_bloodsucker = 2.5
simulation_karlik = 2.5
simulation_psysucker = 2
simulation_zombie = 1.5
simulation_poltergeist = 3.5
simulation_cat = 0.7
simulation_dog = 0.8
simulation_tushkano = 2.2
simulation_gigant = 0.8
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 1
simulation_burer = 4
simulation_flesh = 0.5
simulation_snork = 4.5
simulation_fracture = 1.1
simulation_dog = 0.7
simulation_lurker = 0.5
simulation_chimera = 0.7
simulation_psy_dog = 0.8
simulation_controller = 4
[l13u_warlab]
simulation_boar = 0.5
simulation_bloodsucker = 1
simulation_karlik = 3
simulation_psysucker = 4.5
simulation_zombie = 3.2
simulation_poltergeist = 6
simulation_cat = 0.7
simulation_dog = 0.8
simulation_tushkano = 1.2
simulation_gigant = 0.8
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 0.5
simulation_burer = 4
simulation_flesh = 0.5
simulation_snork = 1.8
simulation_fracture = 1.1
simulation_dog = 0.7
simulation_lurker = 0.5
simulation_chimera = 0.7
simulation_psy_dog = 0.8
simulation_controller = 3.5
[l06_rostok]
simulation_boar = 4
simulation_bloodsucker = 5
simulation_karlik = 2.5
simulation_psysucker = 4
simulation_zombie = 4.5
simulation_poltergeist = 5.5
simulation_cat = 5
simulation_dog = 4
simulation_tushkano = 6
simulation_gigant = 1.7
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 2
simulation_burer = 2.5
simulation_flesh = 4
simulation_snork = 5.5
simulation_fracture = 3
simulation_dog = 4.5
simulation_lurker = 2
simulation_chimera = 2
simulation_psy_dog = 4
simulation_controller = 2.7
[l08_yantar]
simulation_boar = 3
simulation_bloodsucker = 3.5
simulation_karlik = 3.5
simulation_psysucker = 4.5
simulation_zombie = 5
simulation_poltergeist = 5.5
simulation_cat = 2.2
simulation_dog = 4
simulation_tushkano = 5
simulation_gigant = 2.5
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 1.5
simulation_burer = 3
simulation_flesh = 3.5
simulation_snork = 5.5
simulation_fracture = 5.5
simulation_dog = 3
simulation_lurker = 3.5
simulation_chimera = 2.3
simulation_psy_dog = 5
simulation_controller = 4.5
[k00_marsh]
simulation_boar = 8
simulation_bloodsucker = 5
simulation_karlik = 2
simulation_psysucker = 2.5
simulation_zombie = 4
simulation_poltergeist = 5
simulation_cat = 9
simulation_dog = 8
simulation_tushkano = 7
simulation_gigant = 1
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 4
simulation_burer = 1.2
simulation_flesh = 10
simulation_snork = 3
simulation_fracture = 4
simulation_dog = 9
simulation_lurker = 7
simulation_chimera = 1.7
simulation_psy_dog = 4
simulation_controller = 2
[l12_stancia]
simulation_boar = 2
simulation_bloodsucker = 4.5
simulation_karlik = 3
simulation_psysucker = 5
simulation_zombie = 4
simulation_poltergeist = 4
simulation_cat = 1.7
simulation_dog = 2.5
simulation_tushkano = 1.5
simulation_gigant = 3.5
simulation_borya = 2.5
simulation_bibliotekar = 1
simulation_rats = 1
simulation_burer = 2.7
simulation_flesh = 1.5
simulation_snork = 4.5
simulation_fracture = 2.5
simulation_dog = 1.8
simulation_lurker = 1.5
simulation_chimera = 3
simulation_psy_dog = 2.5
simulation_controller = 5
@@ -0,0 +1,77 @@
[all_tier1]
zombied_sim_squad_novice
zombied_sim_squad_mix
simulation_zombie
simulation_zombie_blind
simulation_tushkano
simulation_boar
simulation_flesh
simulation_mix_boar_flesh
simulation_dog
simulation_mix_dogs
simulation_pseudodog
simulation_cat
simulation_fracture
simulation_snork
simulation_lurker_blue
simulation_lurker_brown
simulation_lurker_black
simulation_lurker
simulation_psysucker
[all_tier2]
zombied_sim_squad_advanced
simulation_zombie_3_6
simulation_mix_zombie
simulation_zombie_blind_3zomb
simulation_zombie_blind_3zomb_civ
simulation_tushkano_7_10
simulation_boar_3_5
simulation_dog_5_7
simulation_cat_3_5
simulation_snork_2_3
simulation_lurker_1_2
simulation_bloodsucker
simulation_bloodsucker_2weak
simulation_psysucker_white
simulation_psysucker_brown
simulation_psysucker_black
simulation_psysucker_1_2
simulation_psy_dog
simulation_karlik
simulation_burer
simulation_burer_1_2_day
simulation_bur_5rat_day
simulation_controller
simulation_contr_5rat_3tush
simulation_poltergeist_tele
simulation_poltergeist
simulation_borya
[all_tier3]
zombied_sim_squad_veteran
simulation_snork_2_5
simulation_bloodsucker_green
simulation_bloodsucker_red
simulation_bloodsucker_black
simulation_bloodsucker_1_2
simulation_psy_dog_squad
simulation_burer_2_3
simulation_contr_5dog
simulation_contr_3dog_4tush
simulation_contr_3sn_3gzomb
simulation_contr_6gzomb
simulation_contr_2sn_4zomb
simulation_contr_4tush_3sn
simulation_contr_5zomb_weak
simulation_contr_4zomb_norm
simulation_contr_4zomb_str
simulation_contr_5sn
simulation_poltergeist_flame
simulation_poltergeist_black
simulation_controller_psy
simulation_chimera
simulation_chimera_2weak
simulation_gigant
simulation_gigant_2weak
simulation_bibliotekar
@@ -0,0 +1,328 @@
;; MARSH
[k00_marsh_tier1_monsters]
*default*all_tier1
[k00_marsh_tier2_monsters]
*default*all_tier2
[k00_marsh_tier3_monsters]
*default*all_tier3
;; ESCAPE
[l01_escape_tier1_monsters]
*default*all_tier1
[l01_escape_tier2_monsters]
*default*all_tier2
[l01_escape_tier3_monsters]
*default*all_tier3
;; GARBAGE
[l02_garbage_tier1_monsters]
*default*all_tier1
[l02_garbage_tier2_monsters]
*default*all_tier2
[l02_garbage_tier3_monsters]
*default*all_tier3
;; AGROPROM
[l03_agroprom_tier1_monsters]
*default*all_tier1
[l03_agroprom_tier2_monsters]
*default*all_tier2
[l03_agroprom_tier3_monsters]
*default*all_tier3
;; DARKSCAPE
[k01_darkscape_tier1_monsters]
*default*all_tier1
[k01_darkscape_tier2_monsters]
*default*all_tier2
[k01_darkscape_tier3_monsters]
*default*all_tier3
;; DARK VALLEY
[l04_darkvalley_tier1_monsters]
*default*all_tier1
[l04_darkvalley_tier2_monsters]
*default*all_tier2
[l04_darkvalley_tier3_monsters]
*default*all_tier3
;; BAR
;; l05_bar
;; ROSTOK
[l06_rostok_tier1_monsters]
*default*all_tier1
[l06_rostok_tier2_monsters]
*default*all_tier2
[l06_rostok_tier3_monsters]
*default*all_tier3
;; MILITARY WAREHOUSES
[l07_military_tier1_monsters]
*default*all_tier1
[l07_military_tier2_monsters]
*default*all_tier2
[l07_military_tier3_monsters]
*default*all_tier3
;; YANTAR
[l08_yantar_tier1_monsters]
*default*all_tier1
[l08_yantar_tier2_monsters]
*default*all_tier2
[l08_yantar_tier3_monsters]
*default*all_tier3
;; DEAD CITY
[l09_deadcity_tier1_monsters]
*default*all_tier1
[l09_deadcity_tier2_monsters]
*default*all_tier2
[l09_deadcity_tier3_monsters]
*default*all_tier3
;; LIMANSK
[l10_limansk_tier1_monsters]
*default*all_tier1
[l10_limansk_tier2_monsters]
*default*all_tier2
[l10_limansk_tier3_monsters]
*default*all_tier3
;; RADAR
[l10_radar_tier1_monsters]
*default*all_tier1
[l10_radar_tier2_monsters]
*default*all_tier2
[l10_radar_tier3_monsters]
*default*all_tier3
;; RED FOREST
[l10_red_forest_tier1_monsters]
*default*all_tier1
[l10_red_forest_tier2_monsters]
*default*all_tier2
[l10_red_forest_tier3_monsters]
*default*all_tier3
;; HOSPITAL
;;l11_hospital
;; Pripyat
[l11_pripyat_tier1_monsters]
*default*all_tier1
[l11_pripyat_tier2_monsters]
*default*all_tier2
[l11_pripyat_tier3_monsters]
*default*all_tier3
;; Chernobyl NPP North
[l12_stancia_tier1_monsters]
*default*all_tier1
[l12_stancia_tier2_monsters]
*default*all_tier2
[l12_stancia_tier3_monsters]
*default*all_tier3
;; Chernobyl NPP South
[l12_stancia_2_tier1_monsters]
*default*all_tier1
[l12_stancia_2_tier2_monsters]
*default*all_tier2
[l12_stancia_2_tier3_monsters]
*default*all_tier3
;; GENERATORS
[l13_generators_tier1_monsters]
*default*all_tier1
[l13_generators_tier2_monsters]
*default*all_tier2
[l13_generators_tier3_monsters]
*default*all_tier3
;; AGROPROM UNDERGROUND
[l03u_agr_underground_tier1_monsters]
*default*all_tier1
[l03u_agr_underground_tier2_monsters]
*default*all_tier2
[l03u_agr_underground_tier3_monsters]
*default*all_tier3
;; LAB X18
[l04u_labx18_tier1_monsters]
*default*all_tier1
[l04u_labx18_tier2_monsters]
*default*all_tier2
[l04u_labx18_tier3_monsters]
*default*all_tier3
;; LAB X16
[l08u_brainlab_tier1_monsters]
*default*all_tier1
[l08u_brainlab_tier2_monsters]
*default*all_tier2
[l08u_brainlab_tier3_monsters]
*default*all_tier3
;; LAB X19
[l10u_bunker_tier1_monsters]
*default*all_tier1
[l10u_bunker_tier2_monsters]
*default*all_tier2
[l10u_bunker_tier3_monsters]
*default*all_tier3
;; SARCOFAG
[l12u_sarcofag_tier1_monsters]
*default*all_tier1
[l12u_sarcofag_tier2_monsters]
*default*all_tier2
[l12u_sarcofag_tier3_monsters]
*default*all_tier3
;; MONOLITH CONTROL CENTER
[l12u_control_monolith_tier1_monsters]
*default*all_tier1
[l12u_control_monolith_tier2_monsters]
*default*all_tier2
[l12u_control_monolith_tier3_monsters]
*default*all_tier3
;; WAR LAB
;; l13u_warlab
;; ZATON
[zaton_tier1_monsters]
*default*all_tier1
[zaton_tier2_monsters]
*default*all_tier2
[zaton_tier3_monsters]
*default*all_tier3
;; JUPITER
[jupiter_tier1_monsters]
*default*all_tier1
[jupiter_tier2_monsters]
*default*all_tier2
[jupiter_tier3_monsters]
*default*all_tier3
;; JUPITER UNDERGROUND
[jupiter_underground_tier1_monsters]
*default*all_tier1
[jupiter_underground_tier2_monsters]
*default*all_tier2
[jupiter_underground_tier3_monsters]
*default*all_tier3
;; OUTSKIRTS
[pripyat_tier1_monsters]
*default*all_tier1
[pripyat_tier2_monsters]
*default*all_tier2
[pripyat_tier3_monsters]
*default*all_tier3
;; LAB X8
[labx8_tier1_monsters]
*default*all_tier1
[labx8_tier2_monsters]
*default*all_tier2
[labx8_tier3_monsters]
*default*all_tier3
;; TRUCK CEMETERY
[k02_trucks_cemetery_tier1_monsters]
*default*all_tier1
[k02_trucks_cemetery_tier2_monsters]
*default*all_tier2
[k02_trucks_cemetery_tier3_monsters]
*default*all_tier3
@@ -0,0 +1,330 @@
;; Adapted from TheMrDemonized's "ZCP Kinda Balanced Spawns" (https://www.moddb.com/mods/stalker-anomaly/addons/zcp-balanced-spawns/)
;; MARSH
[k00_marsh_tier1_monsters]
*balanced*k00_marsh
[k00_marsh_tier2_monsters]
*balanced*k00_marsh
[k00_marsh_tier3_monsters]
*balanced*k00_marsh
;; ESCAPE
[l01_escape_tier1_monsters]
*balanced*l01_escape
[l01_escape_tier2_monsters]
*balanced*l01_escape
[l01_escape_tier3_monsters]
*balanced*l01_escape
;; GARBAGE
[l02_garbage_tier1_monsters]
*balanced*l02_garbage
[l02_garbage_tier2_monsters]
*balanced*l02_garbage
[l02_garbage_tier3_monsters]
*balanced*l02_garbage
;; AGROPROM
[l03_agroprom_tier1_monsters]
*balanced*l03_agroprom
[l03_agroprom_tier2_monsters]
*balanced*l03_agroprom
[l03_agroprom_tier3_monsters]
*balanced*l03_agroprom
;; DARKSCAPE
[k01_darkscape_tier1_monsters]
*balanced*k01_darkscape
[k01_darkscape_tier2_monsters]
*balanced*k01_darkscape
[k01_darkscape_tier3_monsters]
*balanced*k01_darkscape
;; DARK VALLEY
[l04_darkvalley_tier1_monsters]
*balanced*l04_darkvalley
[l04_darkvalley_tier2_monsters]
*balanced*l04_darkvalley
[l04_darkvalley_tier3_monsters]
*balanced*l04_darkvalley
;; BAR
;; l05_bar
;; ROSTOK
[l06_rostok_tier1_monsters]
*balanced*l06_rostok
[l06_rostok_tier2_monsters]
*balanced*l06_rostok
[l06_rostok_tier3_monsters]
*balanced*l06_rostok
;; MILITARY WAREHOUSES
[l07_military_tier1_monsters]
*balanced*l07_military
[l07_military_tier2_monsters]
*balanced*l07_military
[l07_military_tier3_monsters]
*balanced*l07_military
;; YANTAR
[l08_yantar_tier1_monsters]
*balanced*l08_yantar
[l08_yantar_tier2_monsters]
*balanced*l08_yantar
[l08_yantar_tier3_monsters]
*balanced*l08_yantar
;; DEAD CITY
[l09_deadcity_tier1_monsters]
*balanced*l09_deadcity
[l09_deadcity_tier2_monsters]
*balanced*l09_deadcity
[l09_deadcity_tier3_monsters]
*balanced*l09_deadcity
;; LIMANSK
[l10_limansk_tier1_monsters]
*balanced*l10_limansk
[l10_limansk_tier2_monsters]
*balanced*l10_limansk
[l10_limansk_tier3_monsters]
*balanced*l10_limansk
;; RADAR
[l10_radar_tier1_monsters]
*balanced*l10_radar
[l10_radar_tier2_monsters]
*balanced*l10_radar
[l10_radar_tier3_monsters]
*balanced*l10_radar
;; RED FOREST
[l10_red_forest_tier1_monsters]
*balanced*l10_red_forest
[l10_red_forest_tier2_monsters]
*balanced*l10_red_forest
[l10_red_forest_tier3_monsters]
*balanced*l10_red_forest
;; HOSPITAL
;;l11_hospital
;; Pripyat
[l11_pripyat_tier1_monsters]
*balanced*l11_pripyat
[l11_pripyat_tier2_monsters]
*balanced*l11_pripyat
[l11_pripyat_tier3_monsters]
*balanced*l11_pripyat
;; Chernobyl NPP North
[l12_stancia_tier1_monsters]
*balanced*l12_stancia
[l12_stancia_tier2_monsters]
*balanced*l12_stancia
[l12_stancia_tier3_monsters]
*balanced*l12_stancia
;; Chernobyl NPP South
[l12_stancia_2_tier1_monsters]
*balanced*l12_stancia_2
[l12_stancia_2_tier2_monsters]
*balanced*l12_stancia_2
[l12_stancia_2_tier3_monsters]
*balanced*l12_stancia_2
;; GENERATORS
[l13_generators_tier1_monsters]
*balanced*l13_generators
[l13_generators_tier2_monsters]
*balanced*l13_generators
[l13_generators_tier3_monsters]
*balanced*l13_generators
;; AGROPROM UNDERGROUND
[l03u_agr_underground_tier1_monsters]
*balanced*l03u_agr_underground
[l03u_agr_underground_tier2_monsters]
*balanced*l03u_agr_underground
[l03u_agr_underground_tier3_monsters]
*balanced*l03u_agr_underground
;; LAB X18
[l04u_labx18_tier1_monsters]
*balanced*l04u_labx18
[l04u_labx18_tier2_monsters]
*balanced*l04u_labx18
[l04u_labx18_tier3_monsters]
*balanced*l04u_labx18
;; LAB X16
[l08u_brainlab_tier1_monsters]
*balanced*l08u_brainlab
[l08u_brainlab_tier2_monsters]
*balanced*l08u_brainlab
[l08u_brainlab_tier3_monsters]
*balanced*l08u_brainlab
;; LAB X19
[l10u_bunker_tier1_monsters]
*balanced*l10u_bunker
[l10u_bunker_tier2_monsters]
*balanced*l10u_bunker
[l10u_bunker_tier3_monsters]
*balanced*l10u_bunker
;; SARCOFAG
[l12u_sarcofag_tier1_monsters]
*balanced*l12u_sarcofag
[l12u_sarcofag_tier2_monsters]
*balanced*l12u_sarcofag
[l12u_sarcofag_tier3_monsters]
*balanced*l12u_sarcofag
;; MONOLITH CONTROL CENTER
[l12u_control_monolith_tier1_monsters]
*balanced*l12u_control_monolith
[l12u_control_monolith_tier2_monsters]
*balanced*l12u_control_monolith
[l12u_control_monolith_tier3_monsters]
*balanced*l12u_control_monolith
;; WAR LAB
;; l13u_warlab
;; ZATON
[zaton_tier1_monsters]
*balanced*zaton
[zaton_tier2_monsters]
*balanced*zaton
[zaton_tier3_monsters]
*balanced*zaton
;; JUPITER
[jupiter_tier1_monsters]
*balanced*jupiter
[jupiter_tier2_monsters]
*balanced*jupiter
[jupiter_tier3_monsters]
*balanced*jupiter
;; JUPITER UNDERGROUND
[jupiter_underground_tier1_monsters]
*balanced*jupiter_underground
[jupiter_underground_tier2_monsters]
*balanced*jupiter_underground
[jupiter_underground_tier3_monsters]
*balanced*jupiter_underground
;; OUTSKIRTS
[pripyat_tier1_monsters]
*balanced*pripyat
[pripyat_tier2_monsters]
*balanced*pripyat
[pripyat_tier3_monsters]
*balanced*pripyat
;; LAB X8
[labx8_tier1_monsters]
*balanced*labx8
[labx8_tier2_monsters]
*balanced*labx8
[labx8_tier3_monsters]
*balanced*labx8
;; TRUCK CEMETERY
[k02_trucks_cemetery_tier1_monsters]
*balanced*k02_trucks_cemetery
[k02_trucks_cemetery_tier2_monsters]
*balanced*k02_trucks_cemetery
[k02_trucks_cemetery_tier3_monsters]
*balanced*k02_trucks_cemetery
@@ -0,0 +1,129 @@
[dogp]
simulation_dog
simulation_mix_dogs
simulation_pseudodog
simulation_dog_5_7
simulation_contr_5dog
simulation_contr_3dog_4tush
[psydogp]
simulation_psy_dog
simulation_psy_dog_squad
[ratp]
simulation_bur_5rat_day
simulation_contr_5rat_3tush
[tushkanop]
simulation_tushkano
simulation_tushkano_7_10
simulation_contr_5rat_3tush
simulation_contr_3dog_4tush
simulation_contr_4tush_3sn
[zombiep]
simulation_zombie
simulation_zombie_blind
simulation_zombie_3_6
simulation_mix_zombie
simulation_zombie_blind_3zomb
simulation_zombie_blind_3zomb_civ
simulation_contr_3sn_3gzomb
simulation_contr_6gzomb
simulation_contr_2sn_4zomb
[fracturep]
simulation_fracture
[catp]
simulation_cat
simulation_cat_3_5
[fleshp]
simulation_flesh
simulation_mix_boar_flesh
[boarp]
simulation_boar
simulation_mix_boar_flesh
simulation_boar_3_5
[snorkp]
simulation_snork
simulation_snork_2_3
simulation_snork_2_5
simulation_contr_3sn_3gzomb
simulation_contr_2sn_4zomb
simulation_contr_4tush_3sn
[psysuckerp]
simulation_psysucker
simulation_psysucker_white
simulation_psysucker_brown
simulation_psysucker_black
simulation_psysucker_1_2
[bloodsuckerp]
simulation_bloodsucker
simulation_bloodsucker_2weak
simulation_bloodsucker_green
simulation_bloodsucker_red
simulation_bloodsucker_black
simulation_bloodsucker_1_2
[lurkerp]
simulation_lurker_blue
simulation_lurker_brown
simulation_lurker_black
simulation_lurker
simulation_lurker_1_2
[karlikp]
simulation_karlik
[burerp]
simulation_burer
simulation_burer_1_2_day
simulation_bur_5rat_day
simulation_burer_2_3
[poltergeistp]
simulation_poltergeist_tele
simulation_poltergeist
simulation_poltergeist_flame
simulation_poltergeist_black
[controllerp]
simulation_controller
simulation_contr_5rat_3tush
simulation_contr_5dog
simulation_contr_3dog_4tush
simulation_contr_3sn_3gzomb
simulation_contr_6gzomb
simulation_contr_2sn_4zomb
simulation_contr_4tush_3sn
simulation_contr_5zomb_weak
simulation_contr_4zomb_norm
simulation_contr_4zomb_str
simulation_contr_5sn
simulation_controller_psy
[chimerap]
simulation_chimera
simulation_chimera_2weak
[gigantp]
simulation_gigant
simulation_gigant_2weak
[bibliotekarp]
simulation_bibliotekar
[boryap]
simulation_borya
[zombiedp]
zombied_sim_squad_novice
zombied_sim_squad_mix
zombied_sim_squad_advanced
zombied_sim_squad_veteran
@@ -0,0 +1,85 @@
<string_table>
<string id="ui_mcm_menu_SMR">
<text>ZCP</text>
</string>
<string id="ui_mcm_menu_smr_amain">
<text>Main</text>
</string>
<string id="ui_mcm_SMR_smr_amain_persist_info_mm">
<text>You're not in-game. Any changes made now will apply when starting a new game, but will be overwritten if a savefile you load has a saved configuration.</text>
</string>
<string id="ui_mcm_SMR_smr_amain_persist_info_level">
<text>You're in-game. Any changes made now will be saved and loaded together with your savefile.</text>
</string>
<string id="ui_mcm_SMR_smr_amain_tooltip_info">
<text>Most options have tooltips. If you're unsure what an option does hover your mouse over its name for a description.</text>
</string>
<!-- GENERAL -->
<string id="st_smr_glitched_pda_text">
<text>FATAL ERROR: INTERNAL MEMORY CORRUPTION DETECTED</text>
</string>
<string id="ui_mcm_SMR_smr_amain_smr_enabled">
<text>Enable ZCP</text>
</string>
<string id="ui_mcm_SMR_smr_amain_smr_debug_log">
<text>Debug Logging</text>
</string>
<string id="ui_mcm_SMR_smr_amain_smr_debug_log_desc">
<text>Enables debug logging. WARNING: This will very quickly inflate your logfile as well as the seperate logfile "dph_zcp.log".</text>
</string>
<string id="ui_mcm_SMR_smr_amain_smr_persist_override">
<text>Don't load configuration from savefile</text>
</string>
<string id="ui_mcm_SMR_smr_amain_smr_persist_override_desc">
<text>Overrides loading configuration from savefile. Useful if you suspect the stored data is corrupted or otherwise invalid.</text>
</string>
<string id="ui_mcm_SMR_smr_amain_respawn_idle">
<text>Respawn time</text>
</string>
<string id="ui_mcm_lst_smr_amain_respawn_idle_10800">
<text>3 Hours</text>
</string>
<string id="ui_mcm_lst_smr_amain_respawn_idle_21600">
<text>6 Hours</text>
</string>
<string id="ui_mcm_lst_smr_amain_respawn_idle_43200">
<text>12 Hours</text>
</string>
<string id="ui_mcm_lst_smr_amain_respawn_idle_86400">
<text>1 Day (default)</text>
</string>
<string id="ui_mcm_lst_smr_amain_respawn_idle_172800">
<text>2 Days</text>
</string>
<string id="ui_mcm_lst_smr_amain_respawn_idle_345600">
<text>4 Days</text>
</string>
<string id="ui_mcm_lst_smr_amain_respawn_idle_604800">
<text>1 Week</text>
</string>
<string id="ui_mcm_lst_smr_amain_respawn_idle_1209600">
<text>2 Weeks</text>
</string>
<string id="ui_mcm_lst_smr_amain_respawn_idle_1">
<text>Never</text>
</string>
<string id="ui_mcm_SMR_smr_amain_pop_factor_info">
<text>These population factor settings will override the Anomaly built-in ones whenever ZCP is enabled.</text>
</string>
<string id="ui_mcm_SMR_smr_amain_monster_pop_factor">
<text>Mutants population factor</text>
</string>
<string id="ui_mcm_SMR_smr_amain_stalker_pop_factor">
<text>Stalkers population factor</text>
</string>
<string id="ui_mcm_SMR_smr_amain_respawn_idle_desc">
<text>Changes the respawn timer for all stalker, mutant and zombie spawns.</text>
</string>
<string id="ui_mcm_SMR_smr_amain_glitched_pda">
<text>Broken PDAs</text>
</string>
<string id="ui_mcm_SMR_smr_amain_glitched_pda_desc">
<text>Turns your helpful PDA into a paperweight, complete with lovely error message.</text>
</string>
</string_table>
@@ -0,0 +1,42 @@
<string_table>
<string id="ui_mcm_menu_SMR">
<text>ZCP</text>
</string>
<string id="ui_mcm_menu_smr_anomalies">
<text>Anomalies</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_dyn_ano_chance">
<text>Amount of dynamic anomalies</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_dyn_ano_chance_desc">
<text>If dynamic anomalies are enabled, this will increase/decrease the chance of them to appear. Without ZCP the game always uses 35%.</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_pulse">
<text>Enable "Pulse" Anomaly</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_pulse_desc">
<text>"Pulse" is the anomaly that appears as light above you sometimes and causes thunder and a lightning bolt to hit the ground.</text>
</string>
<string id="ui_mcm_smr_anomalies_anomalies_types_title">
<text>Anomaly types</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_anomalies_types_info">
<text>Below you can control which types of dynamic anomalies will spawn.</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_electric">
<text>Electric</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_chemical">
<text>Chemical</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_thermal">
<text>Thermal</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_gravitational">
<text>Gravitational</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_radioactive">
<text>Radioactive</text>
</string>
</string_table>
@@ -0,0 +1,137 @@
<string_table>
<string id="ui_mcm_menu_smr_loot">
<text>Loot</text>
</string>
<!-- GENERAL -->
<string id="ui_mcm_SMR_smr_loot_random_items">
<text>Scattered loot</text>
</string>
<string id="ui_mcm_SMR_smr_loot_random_items_desc">
<text>Changes the amount of items found lying around in the world. This will only have an effect when starting a new game.</text>
</string>
<string id="ui_mcm_SMR_smr_loot_general_info">
<text>The options below add a chance to find some extra items in stash boxes and on dead NPCs. Very helpful if you're playing with the "None" base population preset.</text>
</string>
<!-- PDA MESSAGES -->
<string id="ui_mcm_SMR_smr_loot_send_message">
<text>Show PDA notification</text>
</string>
<string id="ui_mcm_SMR_smr_loot_send_message_desc">
<text>Shows a notification whenever the player finds an extra item.</text>
</string>
<string id="st_smr_loot_found_repair">
<text>Found a repair kit</text>
</string>
<string id="st_smr_loot_found_ammo">
<text>Found some ammo</text>
</string>
<string id="st_smr_loot_found_useful">
<text>Found an useful item</text>
</string>
<string id="st_smr_loot_found_meds">
<text>Found a medical item</text>
</string>
<string id="st_smr_loot_found_mags">
<text>Found a magazine for your weapon</text>
</string>
<string id="st_smr_loot_found_lootbox">
<text>Found a lootbox</text>
</string>
<string id="ui_mcm_SMR_smr_loot_npc_spawn">
<text>Find extra items on NPCs</text>
</string>
<string id="ui_mcm_SMR_smr_loot_npc_chance">
<text>NPC item spawn chance</text>
</string>
<string id="ui_mcm_SMR_smr_loot_npc_chance_desc">
<text>Chance to find extra items on NPCs. If sucessful there will be a second roll using the regular chance to find items in stash boxes.</text>
</string>
<!-- ITEMS -->
<string id="ui_mcm_SMR_smr_loot_items_title">
<text>Extra item spawns in stash boxes.</text>
</string>
<string id="ui_mcm_SMR_smr_loot_repair_spawn">
<text>Spawn repair kits</text>
</string>
<string id="ui_mcm_SMR_smr_loot_repair_spawn_desc">
<text>Adds a chance to find repair kits in stash boxes.</text>
</string>
<string id="ui_mcm_SMR_smr_loot_repair_parts_spawn">
<text>Spawn parts repair items</text>
</string>
<string id="ui_mcm_SMR_smr_loot_repair_parts_spawn_desc">
<text>Enables/disables part repair items as minor repair kits. If you don't want to bother with repairing/replacing weapon and outfit parts, you can disable spawns for related items.</text>
</string>
<string id="ui_mcm_SMR_smr_loot_repair_chance">
<text>Repair kit chance</text>
</string>
<string id="ui_mcm_SMR_smr_loot_repair_chance_desc">
<text>Chance to find repair kits in stash boxes.</text>
</string>
<string id="ui_mcm_SMR_smr_loot_repair_minor_spawn">
<text>Spawn minor repair kits</text>
</string>
<string id="ui_mcm_SMR_smr_loot_repair_minor_spawn_desc">
<text>Adds a chance to find minor repair kits such as glue tubes and part kits in stash boxes.</text>
</string>
<string id="ui_mcm_SMR_smr_loot_repair_minor_chance">
<text>Minor repair kit chance</text>
</string>
<string id="ui_mcm_SMR_smr_loot_repair_minor_chance_desc">
<text>Spawn chance of minor repair kits, such as glue tubes and part kits.</text>
</string>
<!-- AMMO -->
<string id="ui_mcm_SMR_smr_loot_ammo_spawn">
<text>Spawn extra ammo</text>
</string>
<string id="ui_mcm_SMR_smr_loot_ammo_spawn_desc">
<text>Adds a chance to find ammo in stash boxes.</text>
</string>
<string id="ui_mcm_SMR_smr_loot_ammo_chance">
<text>Ammo chance</text>
</string>
<string id="ui_mcm_SMR_smr_loot_ammo_chance_desc">
<text>Percentage chance to find ammo in stash boxes.</text>
</string>
<string id="ui_mcm_SMR_smr_loot_ammo_bad_spawn">
<text>Spawn old ammo</text>
</string>
<string id="ui_mcm_SMR_smr_loot_ammo_bad_chance">
<text>Old ammo chance</text>
</string>
<string id="ui_mcm_SMR_smr_loot_ammo_bad_chance_desc">
<text>Percentage chance that the found ammo is old.</text>
</string>
<string id="ui_mcm_SMR_smr_loot_ammo_amount">
<text>Ammo amount</text>
</string>
<string id="ui_mcm_SMR_smr_loot_ammo_amount_desc">
<text>Amount multiplier of ammo found.</text>
</string>
<!-- USEFUL -->
<string id="ui_mcm_SMR_smr_loot_useful_spawn">
<text>Spawn useful items</text>
</string>
<string id="ui_mcm_SMR_smr_loot_useful_spawn_desc">
<text>Adds a chance to find items that are difficult to come by without traders in stash boxes. Includes knifes, backpacks, detectors, headlamps and such.</text>
</string>
<string id="ui_mcm_SMR_smr_loot_useful_chance">
<text>Useful item chance</text>
</string>
<string id="ui_mcm_SMR_smr_loot_useful_chance_desc">
<text>Percentage chance to find useful items in stash boxes.</text>
</string>
<!-- MEDS -->
<string id="ui_mcm_SMR_smr_loot_meds_spawn">
<text>Spawn medical items</text>
</string>
<string id="ui_mcm_SMR_smr_loot_meds_spawn_desc">
<text>Adds a chance to find medical items in stash boxes</text>
</string>
<string id="ui_mcm_SMR_smr_loot_meds_chance">
<text>Medical item chance</text>
</string>
<string id="ui_mcm_SMR_smr_loot_meds_chance_desc">
<text>Percentage chance to find medical items in stash boxes.</text>
</string>
</string_table>
@@ -0,0 +1,148 @@
<string_table>
<string id="ui_mcm_menu_smr_mutants">
<text>Mutants</text>
</string>
<string id="ui_mcm_smr_mutants_types_title">
<text>Mutant Types</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_squad_size">
<text>Mutant squad size</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_squad_size_variance">
<text>Squad size variance</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_squad_size_variance_desc">
<text>The higher this is, the more random the size of mutant squads will be.</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_random_mutants">
<text>Spawn random mutant squads</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_random_mutants_desc">
<text>Replaces mutant squads with other, random mutant squads. This means you may find certain mutants where you previously didn't expect them.</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_random_mutants_chance">
<text>Random mutant squads chance</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_types_info">
<text>Below you can enable or disable mutant types. Disabled mutants will not appear in the Zone.</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_types_replace_squads">
<text>Replace removed squads</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_types_replace_squads_desc">
<text>Replaces squads only containing disabled mutants with squads containing enabled mutants.</text>
</string>
<!-- TYPES -->
<string id="ui_mcm_SMR_smr_mutants_dogp">
<text>Dogs</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_psydogp">
<text>Psy-Dogs</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_tushkanop">
<text>Tushkanos</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_fracturep">
<text>Fractures</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_catp">
<text>Cats</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_fleshp">
<text>Fleshes</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_boarp">
<text>Boars</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_snorkp">
<text>Snorks</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_psysuckerp">
<text>Psysuckers</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_bloodsuckerp">
<text>Bloodsuckers</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_lurkerp">
<text>Lurkers</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_karlikp">
<text>Karliks</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_burerp">
<text>Burers</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_poltergeistp">
<text>Poltergeists</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_controllerp">
<text>Controllers</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_chimerap">
<text>Chimeras</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_gigantp">
<text>Pseudogiants</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_ratp">
<text>Rats</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_zombiep">
<text>Zombies</text>
</string>
<!-- UNUSED -->
<string id="ui_mcm_smr_mutants_unused_title">
<text>Unused Mutants</text>
</string>
<string id="ui_mcm_smr_mutants_unused_info">
<text>Below you can enable mutants which are present in the game files but not used anywhere. They will then appar in the Zone as random mutant squads.</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_bibliotekarp">
<text>Bibliotekars</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_boryap">
<text>Boryas</text>
</string>
<string id="ui_mcm_smr_mutants_unused_types_info">
<text>Below you can enable mutant variations which are present in the game files but not used anywhere. They will then spawn together with the used variations.</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_unused_types_chance">
<text>Unused mutant type chance</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_unused_types_chance_desc">
<text>This is the percent chance that normal variations of a mutant will be replaced with unused ones.</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_bloodsucker_strong_bigp">
<text>Big Bloodsuckers</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_burer_electrap">
<text>Electro Burers</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_burer_firerp">
<text>Fire Burers</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_flesh_bolotp">
<text>Bolot Fleshes</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_gigant_jumperp">
<text>Pseudogiant Jumpers</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_snork_no_maskp">
<text>Maskless Snorks</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_zombie_babkap">
<text>Female Zombies</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_zombie_gholp">
<text>Ghoul Zombies</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_zombie_ghostp">
<text>Ghost Zombies</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_zombie_tetap">
<text>Teta Zombies</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_zombie_wichp">
<text>Witch Zombies</text>
</string>
</string_table>
@@ -0,0 +1,80 @@
<string_table>
<string id="ui_mcm_menu_SMR">
<text>ZCP</text>
</string>
<string id="ui_mcm_menu_smr_spawns">
<text>Spawn Templates</text>
</string>
<string id="ui_mcm_SMR_smr_spawns_preset_desc">
<text>Spawn templates allow more control over random mutant spawns. With them you can adjust which mutants spawn in which levels, and how long it takes for stronger mutants to appear in the zone.</text>
</string>
<string id="ui_mcm_SMR_smr_spawns_preset_file">
<text>Template file</text>
</string>
<string id="ui_mcm_SMR_smr_spawns_preset_file_desc">
<text>
The following template files are included:\n
- Default: Similar to vanilla spawns, you will mostly see mutants in each level that spawn there in the base game.\n
- All: All mutants can spawn in all levels but are still sorted into tiers.\n
- Balanced: A port of the values used in TheMrDemonized's. "ZCP Kinda Balanced Spawns" mod for ZCP 1.4.\n
If you add your own spawn template it will automatically appear alongside the included ones.</text>
</string>
<string id="ui_mcm_SMR_smr_spawns_preset_apply_random">
<text>Apply to random mutant spawns</text>
</string>
<string id="ui_mcm_SMR_smr_spawns_preset_apply_replaced">
<text>Apply to replaced disabled mutant spawns</text>
</string>
<!-- WEEK 0 -->
<string id="ui_mcm_smr_spawns_preset_week0_title">
<text>First week</text>
</string>
<string id="ui_mcm_SMR_smr_spawns_preset_week0_tier1">
<text>Tier 1 chance</text>
</string>
<string id="ui_mcm_SMR_smr_spawns_preset_week0_tier2">
<text>Tier 2 chance</text>
</string>
<string id="ui_mcm_SMR_smr_spawns_preset_week0_tier3">
<text>Tier 3 chance</text>
</string>
<!-- WEEK 1 -->
<string id="ui_mcm_smr_spawns_preset_week1_title">
<text>Second week</text>
</string>
<string id="ui_mcm_SMR_smr_spawns_preset_week1_tier1">
<text>Tier 1 chance</text>
</string>
<string id="ui_mcm_SMR_smr_spawns_preset_week1_tier2">
<text>Tier 2 chance</text>
</string>
<string id="ui_mcm_SMR_smr_spawns_preset_week1_tier3">
<text>Tier 3 chance</text>
</string>
<!-- WEEK 2 -->
<string id="ui_mcm_smr_spawns_preset_week2_title">
<text>Third week</text>
</string>
<string id="ui_mcm_SMR_smr_spawns_preset_week2_tier1">
<text>Tier 1 chance</text>
</string>
<string id="ui_mcm_SMR_smr_spawns_preset_week2_tier2">
<text>Tier 2 chance</text>
</string>
<string id="ui_mcm_SMR_smr_spawns_preset_week2_tier3">
<text>Tier 3 chance</text>
</string>
<!-- WEEK 3 -->
<string id="ui_mcm_smr_spawns_preset_week3_title">
<text>Fourth week and beyond</text>
</string>
<string id="ui_mcm_SMR_smr_spawns_preset_week3_tier1">
<text>Tier 1 chance</text>
</string>
<string id="ui_mcm_SMR_smr_spawns_preset_week3_tier2">
<text>Tier 2 chance</text>
</string>
<string id="ui_mcm_SMR_smr_spawns_preset_week3_tier3">
<text>Tier 3 chance</text>
</string>
</string_table>
@@ -0,0 +1,135 @@
<string_table>
<!-- STALKERS -->
<string id="ui_mcm_menu_smr_stalkers">
<text>Stalkers</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_squad_size">
<text>Stalker squad size</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_squad_size_variance">
<text>Squad size variance</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_squad_size_variance_desc">
<text>The higher this is, the more random the size of stalker squads will be.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_civil_war">
<text>Civil War</text>
</string>
<string id="ui_mcm_lst_smr_stalkers_civilwar_disabled">
<text>Disabled</text>
</string>
<string id="ui_mcm_lst_smr_stalkers_civilwar_stalkers">
<text>Stalkers</text>
</string>
<string id="ui_mcm_lst_smr_stalkers_civilwar_squads">
<text>Squads</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_civil_war_desc">
<text>If enabled all stalkers or stalker squads are hostile to each other.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_civil_war_base_population">
<text>Civil War affects base population</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_civil_war_base_population_desc">
<text>If enabled, Stalkers belonging to base populations are affected by civil war settings.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_civil_war_monolith_allied">
<text>Monolith allied (Civil War)</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_civil_war_monolith_allied_desc">
<text>Keeps Monolith stalkers allied to each other, regardless of Civil War preset.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_base_population">
<text>Stalker bases population</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_base_population_desc">
<text>Population of stalkers in bases.</text>
</string>
<string id="ui_mcm_lst_smr_stalkers_base_population_default">
<text>Default</text>
</string>
<string id="ui_mcm_lst_smr_stalkers_base_population_survival">
<text>Survival</text>
</string>
<string id="ui_mcm_lst_smr_stalkers_base_population_minimal">
<text>Minimal</text>
</string>
<string id="ui_mcm_lst_smr_stalkers_base_population_none">
<text>None</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_base_population_default">
<text>The default Anomaly preset.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_base_population_survival">
<text>The default Anomaly Survival preset.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_base_population_minimal">
<text>Removes almost all bases. Of those remaining, Rostok is the only safe one, with base guards. Spawns outside of bases are unaffected.
If you don't start as Loner, you might need to make use of the disguise system.
</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_base_population_none">
<text>Removes all stalker spawns inside bases, inspired by Dead Airs "Last Stand" mode.
This means there won't be any traders, mechanics or guards. Spawns outside of bases are unaffected.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_random_stalkers">
<text>Spawn random Stalker squads</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_random_stalkers_desc">
<text>Replaces Stalker squads with squads from a random faction. This means you may find factions where you previously didn't expect them.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_random_stalkers_chance">
<text>Random Stalker squads chance</text>
</string>
<string id="ui_mcm_smr_stalkers_factions_title">
<text>Factions</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_factions_info">
<text>Below you can enable or disable factions. Disabled factions will not appear in the Zone.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_factions_replace_squads">
<text>Replace removed squads</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_factions_replace_squads_desc">
<text>Replaces squads from disabled factions with squads from enabled factions.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_stalker">
<text>Loner</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_bandit">
<text>Bandit</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_csky">
<text>Clear Sky</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_duty">
<text>Duty</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_freedom">
<text>Freedom</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_merc">
<text>Mercenary</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_army">
<text>Military</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_ecolog">
<text>Ecologist</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_monolith">
<text>Monolith</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_renegade">
<text>Renegade</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_greh">
<text>Sin</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_isg">
<text>UNISG</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_zombied">
<text>Zombified</text>
</string>
</string_table>
@@ -0,0 +1,32 @@
<string_table>
<string id="ui_mcm_menu_smr_zzintegration">
<text>Integration</text>
</string>
<string id="ui_mcm_SMR_smr_zzintegration_integration_info">
<text>The options here allow ZCP to work nicely together with other addons. This is similar to compatibility patches, just a lot more convenient.</text>
</string>
<string id="ui_mcm_SMR_smr_zzintegration_glowsticks">
<text>Glowsticks</text>
</string>
<string id="ui_mcm_SMR_smr_zzintegration_glowsticks_info">
<text>For https://www.moddb.com/mods/stalker-anomaly/addons/glowsticks. Enables glowsticks to spawn as useful items.</text>
</string>
<string id="ui_mcm_SMR_smr_zzintegration_mags_redux">
<text>Anomaly Magazines Redux</text>
</string>
<string id="ui_mcm_SMR_smr_zzintegration_mags_redux_chance">
<text>Magazine spawn chance</text>
</string>
<string id="ui_mcm_SMR_smr_zzintegration_mags_redux_info">
<text>For https://www.moddb.com/mods/stalker-anomaly/addons/anomaly-magazines-redux. Enables spawns of magazines for currently equipped weapons as extra-item in stash boxes.</text>
</string>
<string id="ui_mcm_SMR_smr_zzintegration_lootboxes">
<text>Anomaly Lootboxes</text>
</string>
<string id="ui_mcm_SMR_smr_zzintegration_lootboxes_chance">
<text>Lootbox spawn chance</text>
</string>
<string id="ui_mcm_SMR_smr_zzintegration_lootboxes_info">
<text>For https://www.moddb.com/mods/stalker-anomaly/addons/anomaly-lootboxes. Enables lockpicks to spawn as useful items, as well as lootboxes in their own category.</text>
</string>
</string_table>
@@ -0,0 +1,57 @@
<string_table>
<string id="ui_mcm_menu_smr_zombies">
<text>Zombies</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_zombie_spawn">
<text>Enable zombie spawns</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_zombie_chance">
<text>Zombie spawn chance</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_zombie_chance_desc">
<text>Chance (in percent) for stalker/mutant spawns to be replaced by zombies.</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_seek_enabled">
<text>Zombies seek player</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_seek_enabled_desc">
<text>In Survival mode zombies will travel towards the player when inside a specific radius (even if they haven't been alerted). This will replicate that behavior.</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_seek_distance">
<text>Enemy seek distance</text>
</string>
<!-- ZOMBIE TYPES -->
<string id="ui_mcm_smr_zombies_zombie_types_title">
<text>Zombie Variants</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_zombie_types_info">
<text>Below you can control which zombie variants will spawn.</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_zombiesp">
<text>Basic Zombies</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_zombies_amount">
<text>Amount of basic Zombies</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_zombies_amount_desc">
<text>Factor by which basic zombie spawns (if enabled) are multiplied, compared to the other variants.</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_blindp">
<text>Blind (Psy) Zombies</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_zombifiedp">
<text>Zombified Stalkers</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_fracturep">
<text>Fractures</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_snorkp">
<text>Snorks</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_bloodsuckerp">
<text>Bloodsuckers</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_psysuckerp">
<text>Psysuckers</text>
</string>
</string_table>
@@ -0,0 +1,85 @@
<string_table>
<string id="ui_mcm_menu_SMR">
<text>ZCP</text>
</string>
<string id="ui_mcm_menu_smr_amain">
<text>Ãëàâíûå</text>
</string>
<string id="ui_mcm_SMR_smr_amain_persist_info_mm">
<text>Âû íå â èãðå. Ëþáûå ñäåëàííûå ñåé÷àñ èçìåíåíèÿ áóäóò ïðèìåíåíû ïðè çàïóñêå íîâîé èãðû, íî áóäóò ïåðåçàïèñàíû, åñëè â çàãðóæàåìîì âàìè ôàéëå ñîõðàíåíèÿ áóäåò ñîõðàí¸ííàÿ êîíôèãóðàöèÿ.</text>
</string>
<string id="ui_mcm_SMR_smr_amain_persist_info_level">
<text>Âû â èãðå. Ëþáûå ñäåëàííûå ñåé÷àñ èçìåíåíèÿ áóäóò çàïèñàíû â áóäóùåì ôàéëå ñîõðàíåíèÿ è âîññòàíîâëåíû èç íåãî, ïîñëå åãî çàðóçêè.</text>
</string>
<string id="ui_mcm_SMR_smr_amain_tooltip_info">
<text>Ó áîëüøèíñòâà îïöèé åñòü âñïëûâàþùèå ïîäñêàçêè. Åñëè âàì âñ¸-æå íå ïîíÿòíî, ÷òî èìåííî âûïîëíÿåò âûáèðàåìàÿ îïöèÿ, íàâåäèòå óêàçàòåëü ìûøè íà å¸ íàçâàíèå, ÷òîáû óâèäåòü îïèñàíèå.</text>
</string>
<!-- GENERAL -->
<string id="st_smr_glitched_pda_text">
<text>ÔÀÒÀËÜÍÀß ÎØÈÁÊÀ: ÎÁÍÀÐÓÆÅÍÀ ÏÎÂÐÅÆÄÅÍÈÅ ÂÍÓÒÐÅÍÍÅÉ ÏÀÌßÒÈ</text>
</string>
<string id="ui_mcm_SMR_smr_amain_smr_enabled">
<text>Âêëþ÷èòü ZCP</text>
</string>
<string id="ui_mcm_SMR_smr_amain_smr_debug_log">
<text>Æóðíàë îòëàäêè</text>
</string>
<string id="ui_mcm_SMR_smr_amain_smr_debug_log_desc">
<text>Âêëþ÷àåò âåäåíèå æóðíàëà îòëàäêè. ÂÍÈÌÀÍÈÅ: ýòî î÷åíü áûñòðî óâåëè÷èò ðàçìåð ôàéëà æóðíàëà, à òàêæå ñîçäàñò îòäåëüíûé ôàéë æóðíàë "dph_zcp.log".</text>
</string>
<string id="ui_mcm_SMR_smr_amain_smr_persist_override">
<text>Íå çàãðóæàòü íàñòðîéêè èç ôàéëà ñîõðàíåíèÿ</text>
</string>
<string id="ui_mcm_SMR_smr_amain_smr_persist_override_desc">
<text>Îòìåíÿåò çàãðóçêó íàñòðîåê êîíôèãóðàöèè èç ôàéëà ñîõðàíåíèÿ. Ïîëåçíî, åñëè âû ïîäîçðåâàåòå, ÷òî ñîõðàí¸ííûå äàííûå ïîâðåæäåíû èëè íå ïðàâèëüíû.</text>
</string>
<string id="ui_mcm_SMR_smr_amain_respawn_idle">
<text>Èíòåðâàë ìåæäó âîçðîæäåíèÿìè</text>
</string>
<string id="ui_mcm_lst_smr_amain_respawn_idle_10800">
<text>3 ×àñà</text>
</string>
<string id="ui_mcm_lst_smr_amain_respawn_idle_21600">
<text>6 ×àñîâ</text>
</string>
<string id="ui_mcm_lst_smr_amain_respawn_idle_43200">
<text>12 ×àñîâ</text>
</string>
<string id="ui_mcm_lst_smr_amain_respawn_idle_86400">
<text>1 Äåíü (ïîóìîë÷àíèþ)</text>
</string>
<string id="ui_mcm_lst_smr_amain_respawn_idle_172800">
<text>2 Äíÿ</text>
</string>
<string id="ui_mcm_lst_smr_amain_respawn_idle_345600">
<text>4 Äíÿ</text>
</string>
<string id="ui_mcm_lst_smr_amain_respawn_idle_604800">
<text>1 Íåäåëÿ</text>
</string>
<string id="ui_mcm_lst_smr_amain_respawn_idle_1209600">
<text>2 Íåäåëè</text>
</string>
<string id="ui_mcm_lst_smr_amain_respawn_idle_1">
<text>Íèêîãäà</text>
</string>
<string id="ui_mcm_SMR_smr_amain_pop_factor_info">
<text>Ýòè íàñòðîéêè ìíîæèòåëÿ ïîïóëÿöèè, áóäóò èìåòü ïðèîðèòåò íàä èãðîâûìè íàñòðîéêàìè, åñëè âêëþ÷¸í ZCP.</text>
</string>
<string id="ui_mcm_SMR_smr_amain_monster_pop_factor">
<text>Ìíîæèòåëü ïîïóëÿöèè ìóòàíòîâ</text>
</string>
<string id="ui_mcm_SMR_smr_amain_stalker_pop_factor">
<text>Ìíîæèòåëü ïîïóëÿöèè ñòàëêåðîâ</text>
</string>
<string id="ui_mcm_SMR_smr_amain_respawn_idle_desc">
<text>Èçìåíÿåò èíòåðâàë ìåæäó âîçðîæäåíèÿìè äëÿ âñåõ ñòàëêåðîâ, ìóòàíòîâ è çîìáè.</text>
</string>
<string id="ui_mcm_SMR_smr_amain_glitched_pda">
<text>Ñëîìàííûé ÊÏÊ</text>
</string>
<string id="ui_mcm_SMR_smr_amain_glitched_pda_desc">
<text>Ïðåâðàùàåò âàø ïîëåçíûé ÊÏÊ â ïðåññ-ïàïüå ñ ïðåêðàñíûì ñîîáùåíèåì îá îøèáêå.</text>
</string>
</string_table>
@@ -0,0 +1,42 @@
<string_table>
<string id="ui_mcm_menu_SMR">
<text>ZCP</text>
</string>
<string id="ui_mcm_menu_smr_anomalies">
<text>Àíîìàëèè</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_dyn_ano_chance">
<text>Êîëè÷åñòâî äèíàìè÷åñêèõ àíîìàëèé</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_dyn_ano_chance_desc">
<text>Åñëè äèíàìè÷åñêèå àíîìàëèè âêëþ÷åíû, äàííàÿ îïöèÿ ïîâûñèò/ïîíèçèò øàíñ íà èõ ïîÿâëåíèå. Áåç ZCP øàíñ íà ñïàóí ðàâåí 35%</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_pulse">
<text>Âêëþ÷èòü àíîìàëèþ "Ïóëüñ"</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_pulse_desc">
<text>"Ïóëüñ" - àíîìàëèÿ, êîòîðàÿ ïðåäñòàâëÿåò ñîáîé ãðîçîâîé ðàçðÿä, âîçíèêàþùèé íàä ìåñòíîñòüþ è íàíîñÿùèé óðîí ïðè ðàçðÿäêå</text>
</string>
<string id="ui_mcm_smr_anomalies_anomalies_types_title">
<text>Òèïû àíîìàëèé</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_anomalies_types_info">
<text>Íèæå âû ìîæåòå âûáðàòü, êàêèå äèíàìè÷åñêèå àíîìàëèè áóäóò ïîÿâëÿòüñÿ</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_electric">
<text>Ýëåêòðà</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_chemical">
<text>Êèñåëü</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_thermal">
<text>Æàðêà</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_gravitational">
<text>Ãðàâèòàöèîííûå àíîìàëèè</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_radioactive">
<text>Î÷àãè ðàäèàöèè</text>
</string>
</string_table>
@@ -0,0 +1,36 @@
<string_table>
<string id="ui_mcm_menu_SMR">
<text>ZCP</text>
</string>
<string id="ui_mcm_menu_smr_anomalies">
<text>Àíîìàëèè</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_dyn_ano_chance">
<text>Êîëè÷åñòâî äèíàìè÷åñêèõ àíîìàëèé</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_dyn_ano_chance_desc">
<text>Åñëè äèíàìè÷åñêèå àíîìàëèè âêëþ÷åíû, äàííàÿ îïöèÿ ïîâûñèò/ïîíèçèò øàíñ íà èõ ïîÿâëåíèå. Áåç ZCP øàíñ íà ñïàóí ðàâåí 35%</text>
</string>
<string id="ui_mcm_smr_anomalies_anomalies_types_title">
<text>Òèïû àíîìàëèé</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_anomalies_types_info">
<text>Íèæå âû ìîæåòå âûáðàòü, êàêèå äèíàìè÷åñêèå àíîìàëèè áóäóò ïîÿâëÿòüñÿ</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_electric">
<text>Ýëåêòðà</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_chemical">
<text>Êèñåëü</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_thermal">
<text>Æàðêà</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_gravitational">
<text>Ãðàâèòàöèîííûå àíîìàëèè</text>
</string>
<string id="ui_mcm_SMR_smr_anomalies_radioactive">
<text>Î÷àãè ðàäèàöèè</text>
</string>
</string_table>
@@ -0,0 +1,134 @@
<string_table>
<string id="ui_mcm_menu_smr_loot">
<text>Äîáû÷à</text>
</string>
<!-- GENERAL -->
<string id="ui_mcm_SMR_smr_loot_random_items">
<text>Ðàçáðîñàííûå ïðåäìåòû</text>
</string>
<string id="ui_mcm_SMR_smr_loot_random_items_desc">
<text>Ìåíÿåò êîëè÷åñòâî ðàçáðîñàííûõ ïî Çîíå ïðåäìåòîâ. Íîâàÿ èãðà íåîáõîäèìà äëÿ äåéñòâèÿ ýôôåêòà</text>
</string>
<string id="ui_mcm_SMR_smr_loot_general_info">
<text>Ýòè íàñòðîéêè äàþò øàíñ íàéòè ðåäêèå ïðåäìåòû â òàéíèêàõ è íà ìåðòâûõ NPC. Î÷åíü ïîëåçíî, åñëè âû èãðàåòå ñ ïðåäóñòàíîâêîé íàñåëåíèÿ íà áàçàõ "Íåò".</text>
</string>
<!-- PDA MESSAGES -->
<string id="ui_mcm_SMR_smr_loot_send_message">
<text>Ïîêàçàòü óâåäîìëåíèå ÊÏÊ</text>
</string>
<string id="ui_mcm_SMR_smr_loot_send_message_desc">
<text>Ïîêàçûâàåò óâåäîìëåíèå, êîãäà èãðîê íàõîäèò ðåäêèé ïðåäìåò.</text>
</string>
<string id="st_smr_loot_found_repair">
<text>Íàéäåí ðåìêîìïëåêò</text>
</string>
<string id="st_smr_loot_found_ammo">
<text>Íàéäåíû ïàòðîíû</text>
</string>
<string id="st_smr_loot_found_useful">
<text>Íàéäåí ïîëåçíûé ïðåäìåò</text>
</string>
<string id="st_smr_loot_found_meds">
<text>Íàéäåí ìåäèöèíñêèé ïðåäìåò</text>
</string>
<string id="st_smr_loot_found_mags">
<text>Íàéäåí ìàãàçèí äëÿ âàøåãî îðóæèÿ</text>
</string>
<string id="ui_mcm_SMR_smr_loot_npc_spawn">
<text>Íàõîäèòü ðåäêèå ïðåäìåòû ó NPC</text>
</string>
<string id="ui_mcm_SMR_smr_loot_npc_chance">
<text>Âåðîÿòíîñòü ïîÿâëåíèÿ ïðåäìåòà ó NPC</text>
</string>
<string id="ui_mcm_SMR_smr_loot_npc_chance_desc">
<text>Øàíñ íàéòè ðåäêèå ïðåäìåòû ó NPC.  ñëó÷àå óñïåõà áóäåò âòîðîé áðîñîê, èñïîëüçóþùèé îáû÷íûé øàíñ íàéòè ïðåäìåòû â òàéíèêàõ.</text>
</string>
<!-- ITEMS -->
<string id="ui_mcm_SMR_smr_loot_items_title">
<text>Ðåäêèå ïðåäìåòû ïîÿâëÿþòñÿ â òàéíèêàõ.</text>
</string>
<string id="ui_mcm_SMR_smr_loot_repair_spawn">
<text>Íàõîäèòü ðåìêîìïëåêòû</text>
</string>
<string id="ui_mcm_SMR_smr_loot_repair_spawn_desc">
<text>Âåðîÿòíîñòü ïîÿâëåíèÿ ðåìêîìïëåêòîâ â òàéíèêàõ.</text>
</string>
<string id="ui_mcm_SMR_smr_loot_repair_parts_spawn">
<text>Íàõîäèòü çàï÷àñòè äëÿ ðåìîíòà</text>
</string>
<string id="ui_mcm_SMR_smr_loot_repair_parts_spawn_desc">
<text>Âêëþ÷àåò / Îòêëþ÷àåò ïîÿâëåíèå çàï÷àñòåé äëÿ ðåìîíòà. Åñëè âû íå õîòèòå âîçèòüñÿ ñ ðåìîíòîì / çàìåíîé äåòàëåé îðóæèÿ è ýêèïèðîâêè, âû ìîæåòå îòêëþ÷èòü ïîÿâëåíèå çàï÷àñòåé ñâÿçàííûõ ñ ïðåäìåòàìè.</text>
</string>
<string id="ui_mcm_SMR_smr_loot_repair_chance">
<text>Âåðîÿòíîñòü ïîÿâëåíèÿ ðåìêîìïëåêòà</text>
</string>
<string id="ui_mcm_SMR_smr_loot_repair_chance_desc">
<text>Øàíñ íàéòè ðåìêîìïëåêòû â òàéíèêàõ.</text>
</string>
<string id="ui_mcm_SMR_smr_loot_repair_minor_spawn">
<text>Íàõîäèòü ìåëêèå ðåìêîìïëåêòû</text>
</string>
<string id="ui_mcm_SMR_smr_loot_repair_minor_spawn_desc">
<text>Âåðîÿòíîñòü íàéòè ìåëêèå ðåìêîìïëåêòû â òàéíèêàõ, òàêèå êàê òþáèêè ñ êëååì è êîìïëåêòû äëÿ çàï÷àñòåé.</text>
</string>
<string id="ui_mcm_SMR_smr_loot_repair_minor_chance">
<text>Âåðîÿòíîñòü ïîÿâëåíèÿ ìåëêèõ ðåìêîìïëåêòîâ</text>
</string>
<string id="ui_mcm_SMR_smr_loot_repair_minor_chance_desc">
<text>Øàíñ ïîÿâëåíèÿ ìåëêèõ ðåìêîìïëåêòîâ, òàêèõ êàê òþáèêè ñ êëååì è êîìïëåêòû äëÿ çàï÷àñòåé.</text>
</string>
<!-- AMMO -->
<string id="ui_mcm_SMR_smr_loot_ammo_spawn">
<text>Íàõîäèòü ðåäêèå áîåïðèïàñû</text>
</string>
<string id="ui_mcm_SMR_smr_loot_ammo_spawn_desc">
<text>Âåðîÿòíîñòü íàéòè áîåïðèïàñû â òàéíèêàõ.</text>
</string>
<string id="ui_mcm_SMR_smr_loot_ammo_chance">
<text>Âåðîÿòíîñòü ïîÿâëåíèÿ áîåïðèïàñîâ</text>
</string>
<string id="ui_mcm_SMR_smr_loot_ammo_chance_desc">
<text>Øàíñ íàéòè áîåïðèïàñû â òàéíèêàõ.</text>
</string>
<string id="ui_mcm_SMR_smr_loot_ammo_bad_spawn">
<text>Íàõîäèòü ñòàðûå áîåïðèïàñû</text>
</string>
<string id="ui_mcm_SMR_smr_loot_ammo_bad_chance">
<text>Âåðîÿòíîñòü ïîÿâëåíèÿ ñòàðûõ áîåïðèïàñîâ</text>
</string>
<string id="ui_mcm_SMR_smr_loot_ammo_bad_chance_desc">
<text>Øàíñ íàéòè ñòàðûå áîåïðèïàñû â òàéíèêàõ.</text>
</string>
<string id="ui_mcm_SMR_smr_loot_ammo_amount">
<text>Êîëè÷åñòâî áîåïðèïàñîâ</text>
</string>
<string id="ui_mcm_SMR_smr_loot_ammo_amount_desc">
<text>Ìíîæèòåëü êîëè÷åñòâà íàéäåííûõ áîåïðèïàñîâ.</text>
</string>
<!-- USEFUL -->
<string id="ui_mcm_SMR_smr_loot_useful_spawn">
<text>Íàõîäèòü ïîëåçíûå ïðåäìåòû</text>
</string>
<string id="ui_mcm_SMR_smr_loot_useful_spawn_desc">
<text>Âåðîÿòíîñòü íàéòè â òàéíèêàõ ïðåäìåòû, êîòîðûå ñëîæíî äîñòàòü áåç òîðãîâöåâ. Íàïðèìåð íîæè, ðþêçàêè, äåòåêòîðû, íàëîáíûå ôîíàðè è ò.ä.</text>
</string>
<string id="ui_mcm_SMR_smr_loot_useful_chance">
<text>Âåðîÿòíîñòü ïîÿâëåíèÿ ïîëåçíûõ ïðåäìåòîâ</text>
</string>
<string id="ui_mcm_SMR_smr_loot_useful_chance_desc">
<text>Øàíñ íàéòè ïîëåçíûå ïðåäìåòû â òàéíèêàõ.</text>
</string>
<!-- MEDS -->
<string id="ui_mcm_SMR_smr_loot_meds_spawn">
<text>Íàõîäèòü ìåäèöèíñêèå ïðåäìåòû</text>
</string>
<string id="ui_mcm_SMR_smr_loot_meds_spawn_desc">
<text>Âåðîÿòíîñòü íàéòè ìåäèöèíñêèå ïðåäìåòû â òàéíèêàõ.</text>
</string>
<string id="ui_mcm_SMR_smr_loot_meds_chance">
<text>Âåðîÿòíîñòü ïîÿâëåíèÿ ìåäèöèíñêèõ ïðåäìåòîâ</text>
</string>
<string id="ui_mcm_SMR_smr_loot_meds_chance_desc">
<text>Øàíñ íàéòè ìåäèöèíñêèå ïðåäìåòû â òàéíèêàõ.</text>
</string>
</string_table>
@@ -0,0 +1,147 @@
<string_table>
<string id="ui_mcm_menu_smr_mutants">
<text>Ìóòàíòû</text>
</string>
<string id="ui_mcm_smr_mutants_types_title">
<text>Âèäû ìóòàíòîâ</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_squad_size">
<text>Ðàçìåð îòðÿäà ìóòàíòîâ</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_squad_size_variance">
<text>Ñëó÷àéíîñòü ðàçìåðà îòðÿäà</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_squad_size_variance_desc">
<text>×åì âûøå ýòî çíà÷åíèå, òåì áîëåå ñëó÷àéíûì áóäåò êîëè÷åñòâî ìóòàíòîâ â îòðÿäå.</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_random_mutants">
<text>Ïîÿâëåíèå ñëó÷àéíûõ îòðÿäîâ ìóòàíòîâ</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_random_mutants_desc">
<text>Çàìåíÿåò îòðÿäû ìóòàíòîâ ïîóìîë÷àíèþ, äðóãèìè ñëó÷àéíûìè îòðÿäàìè ìóòàíòîâ. Ýòî îçíà÷àåò, ÷òî âû ìîæåòå âñòðåòèòü îïðåäåëåííûõ ìóòàíòîâ òàì, ãäå èõ ðàíüøå íå îæèäàëè óâèäåòü.</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_random_mutants_chance">
<text>Âåðîÿòíîñòü ïîÿâëåíèÿ ñëó÷àéíûõ îòðÿäîâ ìóòàíòîâ</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_types_info">
<text>Íèæå âû ìîæåòå âêëþ÷èòü èëè îòêëþ÷èòü îïðåäåë¸ííûõ ìóòàíòîâ. Îòêëþ÷åííûå ìóòàíòû íå ïîÿâÿòñÿ â Çîíå.</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_types_replace_squads">
<text>Çàìåíèòü óäàë¸ííûå îòðÿäû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_types_replace_squads_desc">
<text>Çàìåíÿåò îòðÿäû îòêëþ÷åííûõ ìóòàíòîâ, îòðÿäàìè âêëþ÷åííûõ ìóòàíòîâ.</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_dogp">
<text>Ñëåïûå ïñû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_psydogp">
<text>Ïñè-ñîáàêè</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_tushkanop">
<text>Òóøêàíû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_fracturep">
<text>Èçëîìû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_catp">
<text>Êîòû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_fleshp">
<text>Ïëîòè</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_boarp">
<text>Êàáàíû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_snorkp">
<text>Ñíîðêè</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_psysuckerp">
<text>Ïñè-êðîâîñîñû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_bloodsuckerp">
<text>Êðîâîñîñû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_lurkerp">
<text>Êèêèìîðû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_karlikp">
<text>Êàðëèêè</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_burerp">
<text>Áþðåðû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_poltergeistp">
<text>Ïîëòåðãåéñòû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_controllerp">
<text>Êîíòðîë¸ðû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_chimerap">
<text>Õèìåðû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_gigantp">
<text>Ïñåâäîãèãàíòû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_ratp">
<text>Êðûñû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_zombiep">
<text>Çîìáè</text>
</string>
<!-- UNUSED -->
<string id="ui_mcm_smr_mutants_unused_title">
<text>Íåèñïîëüçóåìûå ìóòàíòû</text>
</string>
<string id="ui_mcm_smr_mutants_unused_info">
<text>Íèæå âû ìîæåòå âêëþ÷èòü ìóòàíòîâ, êîòîðûå åñòü â èãðîâûõ ôàéëàõ, íî êîòîðûå íå çàäåéñòâîâàíû â èãðå. Îíè áóäóò ïîÿâëÿòüñÿ â Çîíå êàê ñëó÷àéíûé îòðÿä ìóòàíòîâ</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_bibliotekarp">
<text>Áèáëèîòåêàðè</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_boryap">
<text>Áîðÿ</text>
</string>
<string id="ui_mcm_smr_mutants_unused_types_info">
<text>Íèæå âû ìîæåòå âêëþ÷èòü âàðèàöèè èìåþùèõñÿ ìóòàíòîâ, êîòîðûå åñòü â èãðîâûõ ôàéëàõ, íî êîòîðûå íå çàäåéñòâîâàíû â èãðå. Îíè áóäóò ïîÿâëÿòüñÿ â Çîíå â îòðÿäàõ èñïîëüçóåìûõ ìóòàíòîâ</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_unused_types_chance">
<text>Øàíñ ïîÿâëåíèÿ íåèñïîëüçóåìûõ ìóòàíòîâ</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_unused_types_chance_desc">
<text>Øàíñ òîãî, òî îáû÷íûå ìóòàíòû áóäóò çàìåíåíû íà íåèñïîëüçóåìûé âàðèàíò</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_bloodsucker_strong_bigp">
<text>Áîëüøîé êðîâîñîñ</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_burer_electrap">
<text>Ýëåêòðî-áþðåð</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_burer_firerp">
<text>Îãíåííûé áþðåð</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_flesh_bolotp">
<text>Áîëîòíàÿ ïëîòü</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_gigant_jumperp">
<text>Ïñåâäîãèãàíò-ïðûãóí</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_snork_no_maskp">
<text>Áåçìàñî÷íûé ñíîðê</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_zombie_babkap">
<text>Æåíñêèå çîìáè</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_zombie_gholp">
<text>Çîìáè-ãóëè</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_zombie_ghostp">
<text>Çîìáè-ïðèçðàêè</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_zombie_tetap">
<text>Çîìáè-òåòà</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_zombie_wichp">
<text>Çîìáè-âåäüìû</text>
</string>
</string_table>
@@ -0,0 +1,92 @@
<string_table>
<string id="ui_mcm_menu_smr_mutants">
<text>Ìóòàíòû</text>
</string>
<string id="ui_mcm_smr_mutants_types_title">
<text>Âèäû ìóòàíòîâ</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_squad_size">
<text>Ðàçìåð îòðÿäà ìóòàíòîâ</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_squad_size_variance">
<text>Ñëó÷àéíîñòü ðàçìåðà îòðÿäà</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_squad_size_variance_desc">
<text>×åì âûøå ýòî çíà÷åíèå, òåì áîëåå ñëó÷àéíûì áóäåò êîëè÷åñòâî ìóòàíòîâ â îòðÿäå.</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_random_mutants">
<text>Ïîÿâëåíèå ñëó÷àéíûõ îòðÿäîâ ìóòàíòîâ</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_random_mutants_desc">
<text>Çàìåíÿåò îòðÿäû ìóòàíòîâ ïîóìîë÷àíèþ, äðóãèìè ñëó÷àéíûìè îòðÿäàìè ìóòàíòîâ. Ýòî îçíà÷àåò, ÷òî âû ìîæåòå âñòðåòèòü îïðåäåëåííûõ ìóòàíòîâ òàì, ãäå èõ ðàíüøå íå îæèäàëè óâèäåòü.</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_random_mutants_chance">
<text>Âåðîÿòíîñòü ïîÿâëåíèÿ ñëó÷àéíûõ îòðÿäîâ ìóòàíòîâ</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_types_info">
<text>Íèæå âû ìîæåòå âêëþ÷èòü èëè îòêëþ÷èòü îïðåäåë¸ííûõ ìóòàíòîâ. Îòêëþ÷åííûå ìóòàíòû íå ïîÿâÿòñÿ â Çîíå.</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_types_replace_squads">
<text>Çàìåíèòü óäàë¸ííûå îòðÿäû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_types_replace_squads_desc">
<text>Çàìåíÿåò îòðÿäû îòêëþ÷åííûõ ìóòàíòîâ, îòðÿäàìè âêëþ÷åííûõ ìóòàíòîâ.</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_dogp">
<text>Ñëåïûå ïñû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_psydogp">
<text>Ïñè-ñîáàêè</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_tushkanop">
<text>Òóøêàíû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_fracturep">
<text>Èçëîìû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_catp">
<text>Êîòû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_fleshp">
<text>Ïëîòè</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_boarp">
<text>Êàáàíû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_snorkp">
<text>Ñíîðêè</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_psysuckerp">
<text>Ïñè-êðîâîñîñû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_bloodsuckerp">
<text>Êðîâîñîñû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_lurkerp">
<text>Êèêèìîðû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_karlikp">
<text>Êàðëèêè</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_burerp">
<text>Áþðåðû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_poltergeistp">
<text>Ïîëòåðãåéñòû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_controllerp">
<text>Êîíòðîë¸ðû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_chimerap">
<text>Õèìåðû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_gigantp">
<text>Ïñåâäîãèãàíòû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_ratp">
<text>Êðûñû</text>
</string>
<string id="ui_mcm_SMR_smr_mutants_zombiep">
<text>Çîìáè</text>
</string>
</string_table>
@@ -0,0 +1,135 @@
<string_table>
<!-- STALKERS -->
<string id="ui_mcm_menu_smr_stalkers">
<text>Ñòàëêåðû</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_squad_size">
<text>Ðàçìåð îòðÿäà ñòàëêåðîâ</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_squad_size_variance">
<text>Âàðèàòèâíîñòü ðàçìåðà îòðÿäîâ</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_squad_size_variance_desc">
<text>×åì áîëüøå çíà÷åíèå, òåì áîëåå ñëó÷àéíûé áóäåò ðàçìåð îòðÿäîâ ñòàëêåðîâ</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_civil_war">
<text>Ãðàæäàíñêàÿ âîéíà</text>
</string>
<string id="ui_mcm_lst_smr_stalkers_civilwar_disabled">
<text>Îòêëþ÷åíà</text>
</string>
<string id="ui_mcm_lst_smr_stalkers_civilwar_stalkers">
<text>Ñòàëêåðû</text>
</string>
<string id="ui_mcm_lst_smr_stalkers_civilwar_squads">
<text>Îòðÿäû</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_civil_war_desc">
<text>Åñëè âêëþ÷åíî, òî âñå ñòàëêåðû èëè îòðÿäû ñòàëêåðîâ áóäóò âðàæäåáíû äðóã äðóãó.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_civil_war_base_population">
<text>Ãðàæäàíñêàÿ âîéíà âëèÿåò íà íàñåëåíèå íà áàçàõ</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_civil_war_base_population_desc">
<text>Åñëè âêëþ÷åíî, òî íà ñòàëêåðîâ, îòíîñÿùèõñÿ ê íàñåëåíèþ íà áàçàõ, äåéñòâóþò íàñòðîéêè ãðàæäàíñêîé âîéíû.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_civil_war_monolith_allied">
<text>Ñîþçíûé Ìîíîëèò (Ãðàæäàíñêàÿ âîéíà)</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_civil_war_monolith_allied_desc">
<text>Äåëàåò ÷ëåíîâ ãðóïïèðîâêè Ìîíîëèò ñîþçíèêîì äðóã äðóãó, íåçàâèñèìî îò ïðåäóñòàíîâêè ãðàæäàíñêîé âîéíû.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_base_population">
<text>Íàñåëåíèå áàç ñòàëêåðîâ</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_base_population_desc">
<text>Íàñåëåíèå ñòàëêåðîâ íà áàçàõ.</text>
</string>
<string id="ui_mcm_lst_smr_stalkers_base_population_default">
<text>Ïîóìîë÷àíèþ</text>
</string>
<string id="ui_mcm_lst_smr_stalkers_base_population_survival">
<text>Âûæèâàíèå</text>
</string>
<string id="ui_mcm_lst_smr_stalkers_base_population_minimal">
<text>Ìèíèìóì</text>
</string>
<string id="ui_mcm_lst_smr_stalkers_base_population_none">
<text>Íåò</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_base_population_default">
<text>Ïðåäóñòàíîâêà - ïîóìîë÷àíèþ.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_base_population_survival">
<text>Ïðåäóñòàíîâêà - âûæèâàíèå.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_base_population_minimal">
<text>Óäàëÿåò ïî÷òè âñåõ ñòàëêåðîâ íà áàçàõ. Èç îñòàâøèõñÿ Ðîñòîê - åäèíñòâåííûé áåçîïàñíûé è îõðàíÿåìûé îáúåêò. Íà âîçðîæäåíèå âíå áàç íå âëèÿåò.
Åñëè âû íå èãðàåòå çà ãðóïïèðîâêó Îäèíî÷êà, âîçìîæíî, âàì ïðèäåòñÿ âîñïîëüçîâàòüñÿ ñèñòåìîé ìàñêèðîâêè.
</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_base_population_none">
<text>Óäàëÿåò âñå òî÷êè âîçðîæäåíèÿ ñòàëêåðîâ íà áàçàõ, âäîõíîâëåííûé ðåæèìîì Dead Air "Ïîñëåäíèé âûæèâøèé".
Ýòî îçíà÷àåò, ÷òî íå áóäåò íè òîðãîâöåâ, íè ìåõàíèêîâ, íè îõðàííèêîâ. Íà âîçðîæäåíèå âíå áàç íå âëèÿåò.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_random_stalkers">
<text>Ïîÿâëåíèå ñëó÷àéíûõ îòðÿäîâ ñòàëêåðîâ</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_random_stalkers_desc">
<text>Çàìåíÿåò îòðÿäû ñòàëêåðîâ ïîóìîë÷àíèþ, îòðÿäàìè ñëó÷àéíîé ãðóïïèðîâêè. Ýòî îçíà÷àåò, ÷òî âû ìîæåòå âñòðåòèòü ÷ëåíîâ ãðóïïèðîâîê, êîòîðûõ ðàíüøå íå îæèäàëè óâèäåòü â îïðåäåë¸ííîì ìåñòå.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_random_stalkers_chance">
<text>Âåðîÿòíîñòü ïîÿâëåíèÿ ñëó÷àéíûõ îòðÿäîâ ñòàëêåðîâ</text>
</string>
<string id="ui_mcm_smr_stalkers_factions_title">
<text>Ãðóïïèðîâêè</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_factions_info">
<text>Íèæå âû ìîæåòå âêëþ÷èòü èëè îòêëþ÷èòü ãðóïïèðîâêè. Îòêëþ÷åííûå ãðóïïèðîâêè íå ïîÿâÿòñÿ â Çîíå.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_factions_replace_squads">
<text>Çàìåíèòü óäàë¸ííûå îòðÿäû</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_factions_replace_squads_desc">
<text>Çàìåíÿåò îòðÿäû îòêëþ÷åííûõ ãðóïïèðîâîê, îòðÿäàìè âêëþ÷åííûõ ãðóïïèðîâîê.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_stalker">
<text>Îäèíî÷êè</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_bandit">
<text>Áàíäèòû</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_csky">
<text>×èñòîå íåáî</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_duty">
<text>Äîëã</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_freedom">
<text>Ñâîáîäà</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_merc">
<text>Íà¸ìíèêè</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_army">
<text>Âîåííûå</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_ecolog">
<text>Ó÷¸íûå</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_monolith">
<text>Ìîíîëèò</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_renegade">
<text>Ðåíåãàòû</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_greh">
<text>Ãðåõ</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_isg">
<text>ÈÈÃ</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_zombied">
<text>Çîìáèðîâàííûå</text>
</string>
</string_table>
@@ -0,0 +1,126 @@
<string_table>
<!-- STALKERS -->
<string id="ui_mcm_menu_smr_stalkers">
<text>Ñòàëêåðû</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_civil_war">
<text>Ãðàæäàíñêàÿ âîéíà</text>
</string>
<string id="ui_mcm_lst_smr_stalkers_civilwar_disabled">
<text>Îòêëþ÷åíà</text>
</string>
<string id="ui_mcm_lst_smr_stalkers_civilwar_stalkers">
<text>Ñòàëêåðû</text>
</string>
<string id="ui_mcm_lst_smr_stalkers_civilwar_squads">
<text>Îòðÿäû</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_civil_war_desc">
<text>Åñëè âêëþ÷åíî, òî âñå ñòàëêåðû èëè îòðÿäû ñòàëêåðîâ áóäóò âðàæäåáíû äðóã äðóãó.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_civil_war_base_population">
<text>Ãðàæäàíñêàÿ âîéíà âëèÿåò íà íàñåëåíèå íà áàçàõ</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_civil_war_base_population_desc">
<text>Åñëè âêëþ÷åíî, òî íà ñòàëêåðîâ, îòíîñÿùèõñÿ ê íàñåëåíèþ íà áàçàõ, äåéñòâóþò íàñòðîéêè ãðàæäàíñêîé âîéíû.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_civil_war_monolith_allied">
<text>Ñîþçíûé Ìîíîëèò (Ãðàæäàíñêàÿ âîéíà)</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_civil_war_monolith_allied_desc">
<text>Äåëàåò ÷ëåíîâ ãðóïïèðîâêè Ìîíîëèò ñîþçíèêîì äðóã äðóãó, íåçàâèñèìî îò ïðåäóñòàíîâêè ãðàæäàíñêîé âîéíû.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_base_population">
<text>Íàñåëåíèå áàç ñòàëêåðîâ</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_base_population_desc">
<text>Íàñåëåíèå ñòàëêåðîâ íà áàçàõ.</text>
</string>
<string id="ui_mcm_lst_smr_stalkers_base_population_default">
<text>Ïîóìîë÷àíèþ</text>
</string>
<string id="ui_mcm_lst_smr_stalkers_base_population_survival">
<text>Âûæèâàíèå</text>
</string>
<string id="ui_mcm_lst_smr_stalkers_base_population_minimal">
<text>Ìèíèìóì</text>
</string>
<string id="ui_mcm_lst_smr_stalkers_base_population_none">
<text>Íåò</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_base_population_default">
<text>Ïðåäóñòàíîâêà - ïîóìîë÷àíèþ.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_base_population_survival">
<text>Ïðåäóñòàíîâêà - âûæèâàíèå.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_base_population_minimal">
<text>Óäàëÿåò ïî÷òè âñåõ ñòàëêåðîâ íà áàçàõ. Èç îñòàâøèõñÿ Ðîñòîê - åäèíñòâåííûé áåçîïàñíûé è îõðàíÿåìûé îáúåêò. Íà âîçðîæäåíèå âíå áàç íå âëèÿåò.
Åñëè âû íå èãðàåòå çà ãðóïïèðîâêó Îäèíî÷êà, âîçìîæíî, âàì ïðèäåòñÿ âîñïîëüçîâàòüñÿ ñèñòåìîé ìàñêèðîâêè.
</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_base_population_none">
<text>Óäàëÿåò âñå òî÷êè âîçðîæäåíèÿ ñòàëêåðîâ íà áàçàõ, âäîõíîâëåííûé ðåæèìîì Dead Air "Ïîñëåäíèé âûæèâøèé".
Ýòî îçíà÷àåò, ÷òî íå áóäåò íè òîðãîâöåâ, íè ìåõàíèêîâ, íè îõðàííèêîâ. Íà âîçðîæäåíèå âíå áàç íå âëèÿåò.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_random_stalkers">
<text>Ïîÿâëåíèå ñëó÷àéíûõ îòðÿäîâ ñòàëêåðîâ</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_random_stalkers_desc">
<text>Çàìåíÿåò îòðÿäû ñòàëêåðîâ ïîóìîë÷àíèþ, îòðÿäàìè ñëó÷àéíîé ãðóïïèðîâêè. Ýòî îçíà÷àåò, ÷òî âû ìîæåòå âñòðåòèòü ÷ëåíîâ ãðóïïèðîâîê, êîòîðûõ ðàíüøå íå îæèäàëè óâèäåòü â îïðåäåë¸ííîì ìåñòå.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_random_stalkers_chance">
<text>Âåðîÿòíîñòü ïîÿâëåíèÿ ñëó÷àéíûõ îòðÿäîâ ñòàëêåðîâ</text>
</string>
<string id="ui_mcm_smr_stalkers_factions_title">
<text>Ãðóïïèðîâêè</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_factions_info">
<text>Íèæå âû ìîæåòå âêëþ÷èòü èëè îòêëþ÷èòü ãðóïïèðîâêè. Îòêëþ÷åííûå ãðóïïèðîâêè íå ïîÿâÿòñÿ â Çîíå.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_factions_replace_squads">
<text>Çàìåíèòü óäàë¸ííûå îòðÿäû</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_factions_replace_squads_desc">
<text>Çàìåíÿåò îòðÿäû îòêëþ÷åííûõ ãðóïïèðîâîê, îòðÿäàìè âêëþ÷åííûõ ãðóïïèðîâîê.</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_stalker">
<text>Îäèíî÷êè</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_bandit">
<text>Áàíäèòû</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_csky">
<text>×èñòîå íåáî</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_duty">
<text>Äîëã</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_freedom">
<text>Ñâîáîäà</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_merc">
<text>Íà¸ìíèêè</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_army">
<text>Âîåííûå</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_ecolog">
<text>Ó÷¸íûå</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_monolith">
<text>Ìîíîëèò</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_renegade">
<text>Ðåíåãàòû</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_greh">
<text>Ãðåõ</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_isg">
<text>ÈÈÃ</text>
</string>
<string id="ui_mcm_SMR_smr_stalkers_zombied">
<text>Çîìáèðîâàííûå</text>
</string>
</string_table>
@@ -0,0 +1,23 @@
<string_table>
<string id="ui_mcm_menu_smr_zzintegration">
<text>Èíòåãðàöèÿ</text>
</string>
<string id="ui_mcm_SMR_smr_zzintegration_integration_info">
<text>Ýòè ïàðàìåòðû ïîçâîëÿþò ZCP ïðåêðàñíî ðàáîòàòü âìåñòå ñ äðóãèìè íàäñòðîéêàìè. Ýòî ïîõîæå íà ïàò÷è ñîâìåñòèìîñòè, òîëüêî íàìíîãî óäîáíåå.</text>
</string>
<string id="ui_mcm_SMR_smr_zzintegration_glowsticks">
<text>Glowsticks</text>
</string>
<string id="ui_mcm_SMR_smr_zzintegration_glowsticks_info">
<text>For https://www.moddb.com/mods/stalker-anomaly/addons/glowsticks. Âêëþ÷àåò ñâåòÿùèåñÿ ïàëî÷êè â ñïèñîê ïîÿâëåíèé ïîëåçíûõ ïðåäìåòîâ.</text>
</string>
<string id="ui_mcm_SMR_smr_zzintegration_mags_redux">
<text>Anomaly Magazines Redux</text>
</string>
<string id="ui_mcm_SMR_smr_zzintegration_mags_redux_chance">
<text>Øàíñ ñïàóíà ìàãàçèíîâ</text>
</string>
<string id="ui_mcm_SMR_smr_zzintegration_mags_redux_info">
<text>For https://www.moddb.com/mods/stalker-anomaly/addons/anomaly-magazines-redux. Âêëþ÷àåò ñïàóí ìàãàçèíîâ äëÿ òåêóùåãî îðóæèÿ â ðóêàõ êàê äîï. ïðåäìåòû â òàéíèêàõ</text>
</string>
</string_table>
@@ -0,0 +1,57 @@
<string_table>
<string id="ui_mcm_menu_smr_zombies">
<text>Çîìáè</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_zombie_spawn">
<text>Âêëþ÷èòü ïîÿâëåíèå çîìáè</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_zombie_chance">
<text>Âåðîÿòíîñòü ïîÿâëåíèÿ çîìáè</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_zombie_chance_desc">
<text>Âåðîÿòíîñòü (â ïðîöåíòàõ) òîãî, ÷òî ñòàëêåðû / ìóòàíòû áóäóò çàìåíåíû íà çîìáè.</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_seek_enabled">
<text>Çîìáè èùóò èãðîêà</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_seek_enabled_desc">
<text> ðåæèìå âûæèâàíèÿ çîìáè áóäóò äâèãàòüñÿ ê èãðîêó, åñëè íàõîäÿòñÿ îò íåãî íà îïðåäåë¸ííîì ðàññòîÿíèè, äàæå åñëè îíè íå áûëè ïðåäóïðåæäåíû.</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_seek_distance">
<text>Ðàññòîÿíèå ïîèñêà èãðîêà</text>
</string>
<!-- ZOMBIE TYPES -->
<string id="ui_mcm_smr_zombies_zombie_types_title">
<text>Âàðèàíòû çîìáè</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_zombie_types_info">
<text>Íèæå âû ìîæåòå óêàçàòü, êàêèå âàðèàíòû çîìáè áóäóò ïîÿâëÿòüñÿ.</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_zombiesp">
<text>Îáû÷íûå çîìáè</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_zombies_amount">
<text>Êîëè÷åñòâî îáû÷íûõ çîìáè</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_zombies_amount_desc">
<text>Ôàêòîð, íà êîòîðûé óìíîæàåòñÿ êîëè÷åñòâî îáû÷íûõ çîìáè (åñëè âêëþ÷åíî) ïî ñðàâíåíèþ ñ äðóãèìè âàðèàíòàìè.</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_blindp">
<text>Ñëåïûå ïñè-çîìáè</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_zombifiedp">
<text>Çîìáèðîâàííûå ñòàëêåðû</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_fracturep">
<text>Èçëîìû</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_snorkp">
<text>Ñíîðêè</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_bloodsuckerp">
<text>Êðîâîñîñû</text>
</string>
<string id="ui_mcm_SMR_smr_zombies_psysuckerp">
<text>Ïñè-êðîâîñîñû</text>
</string>
</string_table>
@@ -0,0 +1 @@
#include "ui\pda_glitched_16.xml"
@@ -0,0 +1,7 @@
<w>
<glitched_pda x="0" y="0" width="819" height="768" stretch="1">
<state x="0" y="0" width="819" height="768" stretch="1">
<text complex_mode="1" r="200" g="200" b="200" vert_align="c" align="c" font="letterica16"/>
</state>
</glitched_pda>
</w>
@@ -0,0 +1,639 @@
--[[
Tronex
set enable_debug to true, for debugging and map markers
----------------------------------------------------------
- Dynamic Anomalies
2019/6/14
used ini:
plugins\dynamic_anomalies.ltx
1. Script will read the list of anomalies and their position/types from the config (you can recorded custom pos for your anomalies)
2. Then spawn all anomalies on new game, then disable a random number of them.
3. When an enmission happen, anomalies will shuffle between off/on state (the dynamic factor)
----------------------------------------------------------
- The Pulse
A concept of electro-psy anomaly that forms in the sky and discharge into the ground like a thunderbolt, killing any stalkers nearby
--]]
local enable_debug = false
function print_debug(...)
if enable_debug then
printf(...)
end
end
-------------------------------
-- Dynamic anomalies
-------------------------------
local ini_ano
local dyn_ano_init = false
local current_level
local dyn_ano_chance = 35 -- [0 - 100] chance of activating a dynamic anomaly
local dyn_ano_safe_dist = 15 -- [m] don't activate anomalies within the safe distance to player
local dyn_ano_type = {} -- [type] = {}
local dyn_ano_info = {} -- [level][name] = info
local dyn_anomalies_dbg = {} -- [id] = name
dyn_anomalies = {} -- [level][id] = name
-- ZCP
if smr_amain_mcm.get_config("smr_enabled") then
dyn_ano_chance = smr_anomalies_mcm.get_config("dyn_ano_chance")
end
-- ZCP END
-- Prepare
function ini_settings()
if (dyn_ano_init) then return end
dyn_ano_init = true
ini_ano = ini_file("plugins\\dynamic_anomalies.ltx")
local n,m = 0,0
local result, id, value = "","",""
local name, info = "","",""
-- Gather anomaly types
n = ini_ano:line_count("categories") or 0
for i=0,n-1 do
result, id, value = ini_ano:r_line_ex("categories",i,"","")
-- ZCP
if smr_amain_mcm.get_config("smr_enabled") and (smr_anomalies_mcm.get_config(id) == false) then
smr_debug.get_log().info("anomalies/types", "skipping disabled anomaly type %s", id)
goto continue
end
-- ZCP END
dyn_ano_type[id] = {}
m = ini_ano:line_count(id) or 0
for ii=0,m-1 do
result, name, info = ini_ano:r_line_ex(id,ii,"","")
if name and info then
for j=1,tonumber(info) do
local size = #dyn_ano_type[id] + 1
dyn_ano_type[id][size] = name
print_debug("- Dynamic Anomalies | dyn_ano_type[%s][%s] = %s", id, size, name)
end
end
end
::continue::
end
-- Gather anomaly coordinates in all levels
n = ini_ano:line_count("levels") or 0
for i=0,n-1 do
result, id, value = ini_ano:r_line_ex("levels",i,"","")
m = ini_ano:line_count(id) or 0
dyn_ano_info[id] = {}
for ii=0,m-1 do
result, name, info = ini_ano:r_line_ex(id,ii,"","")
if name and info then
local t = str_explode(info,",")
if (#t == 6) and (t[1] ~= "NA") then
dyn_ano_info[id][name] = {
typ = t[1],
x = tonumber(t[2]),
y = tonumber(t[3]),
z = tonumber(t[4]),
lvl_id = tonumber(t[5]),
gm_id = tonumber(t[6]),
}
end
end
end
end
end
local marker_by_type = {
["electric"] = "anomaly_electric",
["chemical"] = "anomaly_chemical",
["thermal"] = "anomaly_thermal",
["gravitational"] = "anomaly_gravitational",
["radioactive"] = "anomaly_radioactive",
["disabled"] = "anomaly_disabled",
}
function add_marker(lvl, section, id, state)
if enable_debug then
ini_settings()
if lvl and dyn_ano_info[lvl] then
local name = dyn_anomalies_dbg[id]
if name then
local info = dyn_ano_info[lvl][name]
if info then
for k,v in pairs(marker_by_type) do
if (level.map_has_object_spot(id, v) ~= 0) then
level.map_remove_object_spot(id, v)
end
end
local typ = info.typ
local spot = marker_by_type[typ] or marker_by_type["gravitational"]
if (state == false) then
spot = marker_by_type["disabled"]
end
level.map_add_object_spot_ser(id, spot, "Name: " .. name .. " \\nType: " .. typ .. " \\nSection: " .. section)
else
print_debug("! Dynamic Anomalies | Marker - no info is found for name {%s}", name)
end
else
print_debug("! Dynamic Anomalies | Marker - no name is found for id (%s)", id)
end
else
print_debug("! Dynamic Anomalies | Marker - level %s is not stored in dyn_ano_info table", lvl)
end
end
end
-- Operation
function dyn_anomalies_spawn()
-- Iterate through all anomalies info for all levels
for lvl,v in pairs(dyn_ano_info) do
dyn_anomalies[lvl] = {}
for name,info in pairs(v) do
-- Get random anomaly section
local anom_type = dyn_ano_type[info.typ]
local section = anom_type and anom_type[math.random(#anom_type)]
if (not section) then
print_debug("! Dynamic Anomalies | Anomaly section not found for type: %s", info.typ)
return
end
-- Info check
if not (info.x and info.y and info.z and info.lvl_id and info.gm_id and true) then
print_debug("! Dynamic Anomalies | Anomaly {%s} has wrong or incomplete info", name)
return
end
-- Spawn
local se_obj = alife_create( section, vector():set(info.x , info.y , info.z), info.lvl_id, info.gm_id )
if ( not se_obj ) then
print_debug("! Dynamic Anomalies | Unable to spawn dynamic anomaly")
return
end
-- Set anomaly properties:
local data = utils_stpk.get_anom_zone_data( se_obj )
if ( not data ) then
print_debug("! Dynamic Anomalies | Unable to set dynamic anomaly properties" )
return
end
data.shapes[1] = {}
data.shapes[1].shtype = 0
data.shapes[1].offset = vector():set( 0, 0, 0 ) -- Leave for compatibility with CoC 1.4.22, delete later
data.shapes[1].center = vector():set( 0, 0, 0 )
data.shapes[1].radius = 3
utils_stpk.set_anom_zone_data( data, se_obj )
-- Save data
dyn_anomalies[lvl][se_obj.id] = true
if enable_debug then
dyn_anomalies_dbg[se_obj.id] = name
end
print_debug("- Dynamic Anomalies | %s | Spawned anomaly [%s](%s){%s}", lvl, section, se_obj.id, name)
end
end
end
function dyn_anomalies_suffle()
for lvl,v in pairs(dyn_anomalies) do
for id, state in pairs(v) do
if (math.random(100) < dyn_ano_chance) then
dyn_anomalies[lvl][id] = true
print_debug("/ Dynamic Anomalies | Shuffle - dyn_anomalies[%s][%s] = %s", lvl, id, true)
else
dyn_anomalies[lvl][id] = false
print_debug("/ Dynamic Anomalies | Shuffle - dyn_anomalies[%s][%s] = %s", lvl, id, false)
end
end
end
end
function dyn_anomalies_update()
if (not dyn_anomalies[current_level]) then
print_debug("! Dynamic Anomalies | Can't update anomalies because current level (%s) has no anomalies recorded", current_level)
return true
end
local actor_pos = db.actor:position()
for id,state in pairs(dyn_anomalies[current_level]) do
local obj = level.object_by_id(id)
if obj then
if (actor_pos:distance_to(obj:position()) > dyn_ano_safe_dist) then
obj:enable_anomaly()
if (state == false) then
obj:disable_anomaly()
end
add_marker(current_level, obj:section(), id, state)
print_debug("- Dynamic Anomalies | %s | Anomaly (%s) is set to state: %s", current_level, id, state)
else
print_debug("! Dynamic Anomalies | %s | Anomaly (%s) is close to player, no process", current_level, id)
end
else
print_debug("! Dynamic Anomalies | %s | Couldn't get online object for id (%s)", current_level, id)
end
end
return true
end
function dyn_anomalies_refresh(force)
-- Prepare anomalies for the first time
if (not has_alife_info("dynamic_anomalies_spawned")) and is_empty(dyn_anomalies) then
give_info("dynamic_anomalies_spawned")
ini_settings()
dyn_anomalies_spawn()
dyn_anomalies_suffle()
-- shuffle state of all anomalies after emission
elseif force then
dyn_anomalies_suffle()
end
-- enable/disable online anomalies
-- NOTE: it's important to use timer because online objects don't register instantly after creating the server objects, so we need to wait for a bit.
-- Guess there's a delay in engine to set things up completely
local n = has_alife_info("dynamic_anomalies_spawned") and 1 or 10
CreateTimeEvent(0, "update_dynamic_anomalies", n, dyn_anomalies_update)
end
-------------------------------
-- Pulse anomalies
-------------------------------
local pAno_first = true
local pAno_tg = time_global()
local pAno_light = nil
local pAno_pfx = particles_object("generator\\generator_accum_thunderbolt")
local pAno_snd_close = sound_object("anomaly\\emi_blowout")
local pAno_snd_far = sound_object("anomaly\\emi_blowout_01")
local pAno_snd_distance = 150 -- [m] (max distance between player and anomaly where close sound effect can be heard)
local pAno_snd_delay = 5.5 -- [sec] (time delay between anomaly's spawn and sound effect)
local pAno_p_hit_distance = 10 -- [m] (max distance between player and anomaly to recieve psy damage)
local pAno_e_hit_distance = 20 -- [m] (max distance between player and anomaly to recieve shock damage)
local pAno_hit_delay = 11.5 -- [sec] (time delay between anomaly's spawn and player hit)
local pAno_article_distance = 50 -- [m] (max distance between player and anomaly to trigger related article )
local pAno_max_distance = 150 -- [m] (max distance between player and anomaly's spawn)
local pAno_delay = 2 * 60 * 1000 -- [millie sec] (smallest time delay between pulse anomalies to spawn)
local pAno_chance = {
["clear"] = 0,
["partly"] = 0,
["cloudy"] = 10,
["rain"] = 15,
["storm"] = 25,
["foggy"] = 0,
}
local pAno_maps = {
["k00_marsh"] = 0.5,
["k01_darkscape"] = 1,
["k02_trucks_cemetery"] = 1,
["l01_escape"] = 0.2,
["l02_garbage"] = 0.7,
["l03_agroprom"] = 0.5,
["l04_darkvalley"] = 0.5,
["l06_rostok"] = 1,
["l07_military"] = 0.5,
["l08_yantar"] = 0.7,
["l09_deadcity"] = 0.5,
["l10_red_forest"] = 1,
["jupiter"] = 1,
["pripyat"] = 1,
["zaton"] = 1,
["l13_generators"] = 1.5,
["l12_stancia_2"] = 1.5,
["l12_stancia"] = 1.5,
["l11_pripyat"] = 0.2,
["l10_radar"] = 1,
["y04_pole"] = 0.7,
}
local function pulse_anomaly_sound(sound_pos)
local distance = distance_2d(db.actor:position(), sound_pos)
local pAno_snd = (distance > pAno_snd_distance) and pAno_snd_far or pAno_snd_close
if pAno_snd and pAno_snd:playing() then
pAno_snd:stop()
end
if pAno_snd ~= nil then
pAno_snd:play_at_pos(db.actor, sound_pos)
pAno_snd.volume = 1
end
pAno_light:set_position(sound_pos)
pAno_light.enabled = true
pAno_light:update()
return true
end
local function pulse_anomaly_hit(particle_pos)
pAno_light.lanim_brightness = 0.2
pAno_light.volumetric_distance = 1
pAno_light.volumetric_intensity = 0.1
if GetEvent("current_safe_cover") then
return true
end
local hit_power = 0
local distance = distance_2d(db.actor:position(), particle_pos)
-- Article
if distance < pAno_article_distance then
SendScriptCallback("actor_on_interaction", "anomalies", nil, "pulse")
end
-- Psi hit
if distance < pAno_p_hit_distance then
hit_power = math.cos(distance * math.pi / pAno_p_hit_distance) + 1
local h = hit()
h.type = hit.telepatic
if (level_environment.is_actor_immune() or dialogs_yantar.actor_has_psi_helmet()) then
h.power = 0
else
h.power = surge_manager.SurgeManager:hit_power(hit_power, h.type)
end
h.impulse = 0
h.direction = VEC_Z
h.draftsman = db.actor
db.actor:hit(h)
level.remove_pp_effector(666)
level.add_pp_effector("psi_fade.ppe", 666, false)
level.set_pp_effector_factor(666,h.power)
end
-- Electric hit
if distance < pAno_e_hit_distance then
hit_power = math.cos(distance * math.pi / pAno_e_hit_distance) + 1
local h = hit()
h.type = hit.shock
if (level_environment.is_actor_immune()) then
h.power = 0
else
h.power = surge_manager.SurgeManager:hit_power(hit_power, h.type)
end
h.impulse = 0
h.direction = VEC_Z
h.draftsman = db.actor
db.actor:hit(h)
level.remove_pp_effector(667)
level.add_pp_effector("electro_fade.ppe", 667, false)
level.set_pp_effector_factor(667,h.power)
end
return true
end
local function pulse_anomaly_light()
pAno_light.lanim_brightness = 0.025
pAno_light.volumetric_distance = 0.25
pAno_light.volumetric_intensity = 0.05
pAno_light.enabled = false
return true
end
function pulse_anomaly_update()
local tg = time_global()
if pAno_first then
pAno_tg = tg + pAno_delay
pAno_first = false
return
end
if (pAno_light and pAno_light.enabled) then
pAno_light:update()
end
if bLevelUnderground or (tg < pAno_tg) then
return
end
pAno_tg = tg + pAno_delay
local lvl_factor = pAno_maps[level.name()] or 0
local wthr = level_weathers.get_weather_manager():get_curr_weather()
local weather_chance = pAno_chance[wthr] or 1
if (math.random(100) > (weather_chance * lvl_factor)) then
return
end
local pos = db.actor:position()
local angle_dec = math.random(0,359)
local angle_rad = math.rad(angle_dec)
local ano_distance = math.random(0,pAno_max_distance)
local pos_x = math.cos(angle_rad)*ano_distance
local pos_z = math.sin(angle_rad)*ano_distance
local particle_pos = vector():set(pos.x+pos_x, pos.y+60, pos.z+pos_z)
pAno_pfx:play_at_pos(particle_pos)
if (not pAno_light) then
--local color = fcolor()
--color:set(0,0,100,50)
pAno_light = script_light()
pAno_light.range = 100
--pAno_light.type = 0 --light_type.Direct)
--pAno_light:set_direction(vector():set(0,-1.5,0))
--pAno_light.shadow = true
pAno_light.lanim = "koster_01_electra"
pAno_light.lanim_brightness = 0.025
pAno_light.volumetric = true
pAno_light.volumetric_quality = 1
pAno_light.volumetric_distance = 0.25
pAno_light.volumetric_intensity = 0.05
--pAno_light.color = color
end
CreateTimeEvent(0, "pulse_anomaly_sound", pAno_snd_delay, pulse_anomaly_sound, particle_pos)
CreateTimeEvent(0, "pulse_anomaly_hit", pAno_hit_delay, pulse_anomaly_hit, particle_pos)
CreateTimeEvent(0, "pulse_anomaly_light", pAno_hit_delay + 0.5, pulse_anomaly_light)
end
-------------------------------
-- Callbacks
-------------------------------
local function actor_on_first_update()
current_level = level.name()
local enabled = ui_options.get("alife/general/dynamic_anomalies")
if enabled and (not IsTestMode()) then
dyn_anomalies_refresh()
end
end
local function actor_on_update()
-- ZCP
if smr_anomalies_mcm.get_config("pulse") then
pulse_anomaly_update()
end
end
local function actor_on_interaction(typ, obj, name)
if (typ == "anomalies") and (name == "emission_end") and ui_options.get("alife/general/dynamic_anomalies") then
dyn_anomalies_refresh(true)
end
end
local function save_state(m_data)
m_data.dyn_anomalies = dyn_anomalies
if enable_debug then
m_data.dyn_anomalies_dbg = dyn_anomalies_dbg
end
end
local function load_state(m_data)
dyn_anomalies = m_data.dyn_anomalies or {}
if enable_debug then
dyn_anomalies_dbg = m_data.dyn_anomalies_dbg or {}
end
end
local function anomaly_on_before_activate(zone, obj, flags)
if (not obj or not zone) then
return
end
if (IsStalker(obj) or IsMonster(obj)) then
if (not obj:alive()) then
flags.ret_value = false
end
return
end
if not (obj:clsid() == clsid.obj_bolt) then
flags.ret_value = false
end
end
function on_game_start()
RegisterScriptCallback("actor_on_first_update",actor_on_first_update)
RegisterScriptCallback("actor_on_update",actor_on_update)
RegisterScriptCallback("actor_on_interaction",actor_on_interaction)
RegisterScriptCallback("anomaly_on_before_activate",anomaly_on_before_activate)
RegisterScriptCallback("save_state",save_state)
RegisterScriptCallback("load_state",load_state)
end
-------------------------------
-- Anomaly field binder
-------------------------------
fields_by_names = {}
function bind(obj)
obj:bind_object(anomaly_field_binder(obj))
end
class "anomaly_field_binder" (object_binder)
function anomaly_field_binder:__init(obj) super(obj)
end
function anomaly_field_binder:reload(section)
object_binder.reload(self, section)
end
function anomaly_field_binder:reinit()
object_binder.reinit(self)
db.storage[self.object:id()] = {}
self.st = db.storage[self.object:id()]
end
function anomaly_field_binder:net_spawn(se_abstract)
if not object_binder.net_spawn(self, se_abstract) then
return false
end
db.add_zone(self.object)
db.add_obj(self.object)
fields_by_names[self.object:name()] = self
--[[
eDefaultRestrictorTypeNone = u8(0),
eDefaultRestrictorTypeOut = u8(1),
eDefaultRestrictorTypeIn = u8(2),
eRestrictorTypeNone = u8(3),
eRestrictorTypeIn = u8(4),
eRestrictorTypeOut = u8(5),
--]]
-- don't enable unless you realize that engine AI schemes to deal with anomalies is stupid and will not be supported
-- MAY CAUSE HUGE FPS DROP ON COP MAPS
--[[
if (get_console_cmd(1,"ai_die_in_anomaly") == true) then
-- It causes HUGE fps drop on COP maps which is why it was probably cut
local ignore = {
["zaton"] = true,
["jupiter"] = true,
["pripyat"] = true
}
if not (ignore[level.name()]) then
self.object:set_restrictor_type(3)
end
end
--]]
return true
end
function anomaly_field_binder:net_destroy()
db.del_zone( self.object )
db.del_obj(self.object)
db.storage[self.object:id()] = nil
fields_by_names[self.object:name()] = nil
object_binder.net_destroy(self)
end
function anomaly_field_binder:set_enable(bEnable)
if(bEnable) then
self.object:enable_anomaly()
else
self.object:disable_anomaly()
end
end
function anomaly_field_binder:update(delta)
object_binder.update(self, delta)
--[[ testing
local itr = function(id)
local obj = id and alife_object(id)
printf("%s touch_feel id=%s obj=%s",self.object:name(),id,obj and obj:name())
end
self.object:iterate_feel_touch(itr)
--]]
end
-- Standart function for save
function anomaly_field_binder:net_save_relevant()
return true
end
@@ -0,0 +1,501 @@
--------------------------------------------------------------------
-- Reworked by Tonex
-- Last edit: 2019/5/18
-- Adapted new changes for the system
-- Cleaned a lot of bloated code that was previously used for updating vice meshes
--------------------------------------------------------------------
local MDATA = {}
local settings_list = {}
local angles_t = {}
local mech_list_key = {}
local debug_mode = false
local debug_show_tables = false
local ini_manager, settings, mesh_list, delay, ui
-- Cache vice and their lamps in table to reuse
local vice_id = {}
local lamp_id = {}
function access(obj) --| Access to a vice, taking into account possible death of the mechanic
if not (obj) then
return
end
--// You should be able to use any workshop in Warfare mode
if _G.WARFARE or (smr_amain_mcm.get_config("smr_enabled") and smr_stalkers_mcm.get_config("base_population") == "sim_smr_none") then
return true
end
local name = obj:name()
dout(nil, "Request access for %s", name)
--// Mechanic is dead - access is unlimited
if angles_t[name] then
if angles_t[name][3] == 'dead' then
dout(nil, "Mechanic is dead. Full access")
return true
end
end
--// Access was granted by a mechanic.
if db.actor:has_info(string.format("awr_%s_access",angles_t[name][1])) then
dout(nil, "Mechanic gave access")
return true
end
--// Debugging
local npc = get_story_object(angles_t[name][1])
if npc then
if npc:alive() then
dout(nil, "Access not granted. NPC %s by id %s is alive", angles_t[name][1], npc:id())
else
dout(nil, "![ERROR] NPC %s by id %s bugged, because he is online and is not alive, but function OnDeath was not called", angles_t[name][1], npc:id())
end
end
end
function OnDeath(npc) --| Callback at the death of a mechanic
dout(nil, "Called for NPC, %s", npc:section())
if IsStalker(npc) and (not npc:alive()) then
local npc_s = npc:section()
dout(nil, "NPC %s exist and dead", npc:section())
for key, val in pairs(angles_t) do
if angles_t[key][1] == npc_s then
local story_obj = get_story_object(angles_t[key][1])
if story_obj then
level.map_remove_object_spot(story_obj:id(), "ui_pda2_mechanic_location")
end
--// Add a marker
SetMarker(key)
full_access(key,npc_s)
break
end
end
end
end
function SetMarker(name) --| The function of adding a marker to the map
local id = name and vice_id[name]
local s_obj = id and alife_object(id)
if s_obj then
dout(nil, "Add marker on parent object %s with ID %s", name, s_obj.id)
level.map_add_object_spot_ser(s_obj.id, "ui_pda2_mechanic_location", "st_mech_tiski")
end
end
function CloseDl() -- The closing function of the UI AWR at the end of time (provided that the UI is called and the actor is within 2 meters of the mesh)
if (ui) and ui:IsShown() then
dout(nil, "UI exist and already open")
ui:Close()
end
end
--=======================================< Callbacks >=======================================--
function physic_object_on_use_callback(_obj,who) -- Binder function using vise mesh
if not (_obj) or not (string.match(_obj:name(), "awr")) then
return
end
--// The condition for the "parent" vise, spawn through all.spawn
if access(_obj) and string.match(_obj:name(), "awr_tiski") and _obj:position():distance_to(db.actor:position()) < 1.5 then
--// Checking the table for "empty"
r_unused()
--// Gather mechanic info
local flag_1,flag_2,flag_3,flag_4 = false,false,false,false
local name = _obj:name()
local mechanic = name and angles_t[name] and angles_t[name][1]
if mechanic then
flag_1 = db.actor:has_info(mechanic .. "_upgrade_tier_1")
flag_2 = db.actor:has_info(mechanic .. "_upgrade_tier_2")
flag_3 = db.actor:has_info(mechanic .. "_upgrade_tier_3")
local drugkit_done = ini_manager:r_string_ex("drugkit_access",mechanic)
if drugkit_done and db.actor:has_info(drugkit_done) then
flag_4 = true
end
end
local function start_ui()
--// Call UI
local hud = get_hud()
--if ui then
--ui:HideDialog()
--end
ui = ui_workshop and ui_workshop.get_workshop_ui(hud, mechanic, {flag_1,flag_2,flag_3,flag_4,false})
if (ui) then
dout(nil, "call UI")
ui:ShowDialog(true)
end
return true
end
local delay = actor_effects.is_animations_on() and 2 or 0
actor_effects.play_item_fx("workshop_dummy")
CreateTimeEvent(0,"delay_workshop",delay,start_ui)
end
end
function actor_on_first_update() --| Callback of the first Update actor. It is executed one-time after loading, _after_ spawn of all objects from all.spawn, unlike on_game_load
local smatch = string.match
local sim = alife()
for i=1, 65534 do
local s_obj = sim:object(i)
if s_obj then
local name = s_obj:name()
--// If the vise is spawned all.spawn - save their values in the store
if smatch(name, '%w+%_awr%_tiski%_%d+') then
--// Cache vice id
vice_id[name] = i
angles_t[name] = l_v(name, angles_t[name])
if debug_mode then
printf("/ Registered vice [%s] = %s", name, i)
end
--// Cache vice lamps IDs
elseif smatch(name, '_awr_lamp') then
lamp_id[name] = i
if debug_mode then
printf("/ Registered vice lamp [%s] = %s", name, i)
end
end
end
end
--// Turn on lamps for all mechanics with a dead flag, otherwise it should be off
for key, val in pairs(angles_t) do
--// Mechanic is dead -> grant full acces + turn on lamp
if angles_t[key][3] == 'dead' then
dout('actor_on_first_update', "%s is dead. Enable lamp(s) which assigned for %s", angles_t[key][1], key)
Lamp(angles_t[key][1], true)
full_access(key,npc_s)
--// Mechanic is unmarked for death -> turn off lamp
else
dout('actor_on_first_update', "%s is alive. Disable lamp(s) which assigned for %s", angles_t[key][1], key)
Lamp(angles_t[key][1], false)
--[[
// If Mechanic isn't around, grant unlimited access
local npc_s = angles_t[key][1]
local se_npc = get_story_se_object(npc_s)
if (not se_npc) then
full_access(key,npc_s)
end
--]]
end
if db.actor:has_info(string.format('awr_%s_access', angles_t[key][1])) then
dout('actor_on_first_update', "%s gave access. Enable lamp(s) which assigned for %s", angles_t[key][1], key)
Lamp(angles_t[key][1], true)
end
end
--// Remove extra tables for weapons whose parts have not been replaced.
r_unused()
end
function npc_on_death_callback(victim, who) -- Callback, NPC caused by death
if not (victim and who) then
return
end
local name = victim:section()
local killer_name
if mech_list_key[name] then
dout('npc_on_death_callback', "NPC %s was killed by %s", victim:name(), who:name())
OnDeath(victim)
if IsStalker(who) then
killer_name = who:character_name()
else
killer_name = nil
end
if who:id() == AC_ID then
local alife = alife()
local se_actor = alife:actor()
killer_name = se_actor:character_name()
end
actor_menu.set_item_news('success', 'npc', "st_awr_dead_mechanic", victim:character_name(), killer_name or game.translate_string("st_by_unknown"))
else
-- if IsStalker(victim) then
-- awr_sf.dout('npc_on_death_callback', "NPC %s is not in list -> return", victim:name()) -- Отрабатывает для всех смертей, включать при необходимости
-- end
return
end
end
function save_state(m_data)
m_data.workshop = MDATA
end
function load_state(m_data)
MDATA = m_data.workshop or {}
end
function on_game_start()
ini_manager = itms_manager.ini_manager
settings = utils_data.collect_section(ini_manager,"workshop_settings")
mesh_list = utils_data.collect_section(ini_manager,"workshop_angles")
--for _, k in ipairs(settings) do
--settings_list[k] = ini_manager:r_float_ex("workshop_settings", k)
--end
for _, k in ipairs(mesh_list) do
local t = parse_list(ini_manager,"workshop_angles", k)
angles_t[k] = {}
for _, v in ipairs(t) do
table.insert(angles_t[k], v)
end
end
--// We enter data into the table keys for quick indexing by key, without using a loop
for key, val in pairs(angles_t) do
mech_list_key[val[1]] = 0
end
RegisterScriptCallback("physic_object_on_use_callback", physic_object_on_use_callback)
RegisterScriptCallback("actor_on_first_update", actor_on_first_update)
RegisterScriptCallback("npc_on_death_callback", npc_on_death_callback)
RegisterScriptCallback("save_state", save_state)
RegisterScriptCallback("load_state", load_state)
end
--=======================================< Utility >=======================================--
function Lamp(npc_name, state) --| Toggle online workshop lamps on/off
for lamp_name,id in pairs(lamp_id) do
if string.match(lamp_name, string.format('_awr_lamp_%s', npc_name)) then
local se_lamp = alife_object(id)
if se_lamp then
local lamp = level.object_by_id(id)
if lamp then
if (state == true) then
lamp:get_hanging_lamp():turn_on()
dout(nil, "Lamp %s was turned on", lamp_name)
elseif (state == false) then
lamp:get_hanging_lamp():turn_off()
dout(nil, "Lamp %s was turned off", lamp_name)
end
end
end
end
end
end
function full_access(vice,npc_s) --| Give unlimited access to a workshop
--// 'Dead' flag in the table
angles_t[vice][3] = 'dead'
--// Delete information if, before the death of a mechanic, he had access
if db.actor:has_info(string.format('awr_%s_access', npc_s)) then
db.actor:disable_info_portion(string.format('awr_%s_access', npc_s))
dout(nil, 'NPC is dead. Infoportion awr_%s_access has been removed', npc_s)
end
--// Issuance of information
db.actor:give_info_portion(string.format("awr_%s_dead", npc_s))
--// Turn on the lamps
Lamp(npc_s, true)
--// Store data
s_v(vice, angles_t[vice])
end
function s_v(name,val) --|
--// Функция сохранения данных в Store
dout(nil, "Save data to Store, table %s on value %s", name, val)
MDATA[name] = val
if debug_show_tables then print_table(MDATA, 'On Save') end
end
function l_v(name, def) --|
--// Функция загрузки данных из Store
local function len(t)
local i = 0
for _ in pairs(t) do i = i + 1 end
return i
end
dout(nil, 'Trying to load %s from Store', name)
local m_data = alife_storage_manager.get_state()
if MDATA[name] and len(MDATA[name]) > 0 then
dout(nil, "Table %s with %s keys was loaded", name, len(MDATA[name]))
if debug_show_tables then print_table(MDATA, 'On Load') end
return MDATA[name] or def
else
dout(nil, 'Table %s does not exist or is empty. Skipped', name)
end
return def or nil
end
function r_unused() --|
--// Функция удаления "пустых" таблиц с замененными деталями для оружия и флагами
local chk = 0
dout(nil, 'Searching unused tables in AWR Store table...')
if MDATA then
for k, _ in pairs(MDATA) do
if k:match('_upg') then
dout(nil, 'Checking %s table...', k)
local count = 0
for key, val in pairs(MDATA[k]) do
count = count + val
end
if count == 5 then
local flags = string.format('%s%s', k:gsub('[^%d+]', ''), '_flags')
dout(nil, '%s table have default values, tables %s and %s will be removed', k, k, flags)
MDATA[k] = nil
MDATA[flags] = nil
chk = chk + 2
else
dout(nil, 'Data in table %s is used. Skipped', k)
end
end
end
if chk == 0 then
dout(nil, 'AWR Store table have no unused tables')
else
dout(nil, 'Removed %s tables', chk)
end
else
dout(nil, 'AWR table does not exist')
end
if debug_show_tables then print_table(MDATA, 'On Remove Unused') end
end
function dout(call,fmt,...) --|
--// Функция отладочного вывода (включен при debug_mode = true в awr_settings.ltx)
if not (debug_mode) then return end
if not (fmt) then return end
local fmt = tostring(fmt)
--// Пытаемся определить из какой функции произошел вызов целевой функции
local caller_n = debug.getinfo(3, "n") and debug.getinfo(3, "n").name or "not specified"
local f_name = debug.getinfo(2, "n") and debug.getinfo(2, "n").name or "not specified"
if call then
caller_n = tostring(call)
end
if (select('#',...) >= 1) then
local i = 0
local p = {...}
local function sr(a)
i = i + 1
if (type(p[i]) == 'userdata') then
if (p[i].x and p[i].y) then
return vec_to_str(p[i])
end
return 'userdata'
end
return tostring(p[i])
end
fmt = string.gsub(fmt,"%%s",sr)
end
if (log) then
local str = string.format('[AWR]{%s->%s} %s', caller_n, f_name, fmt)
log(str)
--exec_console_cmd("flush")
else
exec_console_cmd("load ~#debug msg:"..str)
end
end
function print_table(tbl,header,format_only) --|
--// Функция для вывода содержимого таблицы в строковом виде
local txt = header and ("-- " .. tostring(header) .. "\n{\n\n") or "{\n\n"
local depth = 1
local function tab(amt)
local str = ""
for i=1,amt, 1 do
str = str .. "\t"
end
return str
end
local function table_to_string(tbl)
local size = 0
for k,v in pairs(tbl) do
size = size + 1
end
local key
local i = 1
for k,v in pairs(tbl) do
if (type(k) == "number") then
key = "[" .. k .. "]"
elseif (type(k) == "function" or type(k) == "string" or type(k) == "boolean" or type(k) == "table") then
key = "[\""..tostring(k) .. "\"]"
else
key = "[____unknown_type]"
end
if (type(v) == "table") then
txt = txt .. tab(depth) .. key .. " =\n"..tab(depth).."{\n"
depth = depth + 1
table_to_string(v,tab(depth))
depth = depth - 1
txt = txt .. tab(depth) .. "}"
elseif (type(v) == "number" or type(v) == "boolean") then
txt = txt .. tab(depth) .. key .. " = " .. tostring(v)
elseif (type(v) == "userdata") then
if (v.diffSec) then
local Y, M, D, h, m, s, ms = 0,0,0,0,0,0,0
Y, M, D, h, m, s, ms = v:get(Y, M, D, h, m, s, ms)
txt = strformat("%s%s%s = { Y=%s, M=%s, D=%s, h=%s, m=%s, s=%s, ms=%s } ",txt,tab(depth),key,Y, M, D, h, m, s, ms)
else
txt = txt .. tab(depth) .. key .. " = \"userdata\""
end
elseif (type(v) == "function") then
txt = txt .. tab(depth) .. key .. " = \"" .. tostring(v) .. "\""
elseif (type(v) == "string") then
txt = txt .. tab(depth) .. key .. " = '" .. v .. "'"
else
txt = txt .. tab(depth) .. key
end
if (i == size) then
txt = txt .. "\n"
else
txt = txt .. ",\n"
end
i = i + 1
end
end
table_to_string(tbl)
txt = txt .. "\n}"
if (format_only) then
return txt
end
printf(txt)
local file = io.open("gamedata\\awr_table.txt","a+")
file:write(txt.."\n\n")
file:close()
end
@@ -0,0 +1,187 @@
--[[
------------------------------------------------------------
-- DPHs debug logger
------------------------------------------------------------
-- You may distribute this together with your addon as long as you keep this header intact.
-- Latest version available from: https://www.moddb.com/mods/stalker-anomaly/addons/dphs-debug-logger
--
-- by dph-hcl
------------------------------------------------------------
]]--
LOG_LEVEL_INFO = 1
LOG_LEVEL_WARNING = 2
LOG_LEVEL_ERROR = 3
log_levels = {
[LOG_LEVEL_INFO] = "INFO",
[LOG_LEVEL_WARNING] = "WARNING",
[LOG_LEVEL_ERROR] = "ERROR"
}
local default_cfg = {
["file"] = "dph.log",
["targets"] = {
["log"] = 1,
["gamelog"] = 2,
["pda"] = 3,
}
}
function new(cfg, mods)
-- setup private properties
local private = {}
private.modules = {}
private.enabled = false
local public = {}
public.config = default_cfg
for k, v in pairs(cfg) do
public.config[k] = v
end
private.targets = {
["log"] = function(mod, level, entry, ...)
local ln = public.format_entry(mod, level, entry, ...)
local file = io.open(public.config.file,"a+")
if not file then
printe(public.format_entry("dph_debug_log/log", LOG_LEVEL_ERROR, "Unable to open logfile %s! Entry logged on the following line.", public.config.file))
printf(public.format_entry(mod, level, entry, ...))
end
file:write(ln .. "\n")
file:close()
end,
["gamelog"] = function (mod, level, entry, ...)
local ln = public.format_entry(mod, level, entry, ...)
if level >= 3 then
printe(ln)
else
printf(ln)
end
end,
["pda"] = function (mod, level, entry, ...)
local ln = entry
if (select('#',...) >= 1) then
ln = string.format(entry, ...)
end
if (db) and (db.actor) then
db.actor:give_game_news("[" .. log_levels[level] .. "] " .. mod, ln, "", 5000, 10000)
else
printe(public.format_entry("dph_debug_log/pda", LOG_LEVEL_ERROR, "Could not send message to PDA: Actor does not exist! Entry logged on the following line."))
printf(public.format_entry(mod, level, entry, ...))
end
end,
}
private.compare_paths = function(pt, mt)
m = tostring(mt)
p = tostring(pt)
if (not m) or (not p) then
return false
end
local mm = str_explode(m, "/")
local pp = str_explode(p, "/")
for i, seg in ipairs(mm) do
if (not pp[i]) or (seg ~= pp[i]) then
return false
end
end
return true
end
private.module_enabled = function(mod)
for i, m in ipairs(private.modules) do
if private.compare_paths(mod, m) then
return true
end
end
return false
end
private.log_entry = function(mod, level, entry, ...)
if (private.enabled) and private.module_enabled(mod) then
for t, l in pairs(public.config.targets) do
if level >= l then public.log_to_target(t, mod, level, entry, ...) end
end
end
end
-- public interface
public.enable = function()
private.enabled = true
public.info("dph_debug_log", "DPHs DEBUG LOGGER VERSION %s | Log instance started", public.version())
return private.enabled
end
public.disable = function()
private.enabled = false
return private.enabled
end
public.register_module = function(m)
table.insert(private.modules, m)
end
public.unregister_module = function(mod)
for i, m in ipairs(private.modules) do
if mod == m then private.modules[i] = nil end
end
end
public.define_target = function(name, log_function)
private.targets[name] = log_function
end
public.log_to_target = function(target, mod, level, entry, ...)
local status, err = pcall(private.targets[target], mod, level, entry, ...)
if err then
printe(public.format_entry("dph_debug_log", LOG_LEVEL_ERROR, "Target %s threw an exception while logging <%s> %s", target, mod, entry))
printe("ERROR: %s", err)
printf(public.format_entry(mod, level, entry, ...))
end
end
public.format_entry = function(mod, level, entry, ...)
local strf = entry
if (select('#',...) >= 1) then
strf = string.format(entry, ...)
end
local n1 = "[" .. log_levels[level] .. "]" .. string.rep(" ", 8 - #log_levels[level])
local n2 = "<" .. mod .. ">" .. string.rep(" ", 28 - #mod)
return (n1 .. n2 .. strf)
end
public.info = function(mod, entry, ...)
return private.log_entry(mod, LOG_LEVEL_INFO, entry, ...)
end
public.warn = function(mod, entry, ...)
return private.log_entry(mod, LOG_LEVEL_WARNING, entry, ...)
end
public.error = function(mod, entry, ...)
return private.log_entry(mod, LOG_LEVEL_ERROR, entry, ...)
end
public.pda = function(mod, entry, ...)
return public.log_to_target("pda", mod, LOG_LEVEL_INFO, entry, ...)
end
public.log_table = function(mod, name, tbl)
local ts = utils_data.print_table(tbl, false, true)
public.info(mod, "TABLE %s \n%s", name, ts)
end
public.version = function()
return 1
end
-- constructor
for i, m in ipairs(mods) do
public.register_module(m)
end
public.register_module("dph_debug_log")
return public
end
@@ -0,0 +1,242 @@
--[[
Made by werejew for Warfare
Modified by Tronex for factions profiles
Last edit: 2019/5/15
--]]
-- Profiles
faction = {}
level = {}
mutant = {}
mutant_tier_by_clsid = {
[clsid.bloodsucker_s] = 2,
[clsid.boar_s] = 1,
[clsid.burer_s] = 4,
[clsid.cat_s] = 1,
[clsid.chimera_s] = 3,
[clsid.controller_s] = 4,
[clsid.dog_s] = 1,
[clsid.flesh_s] = 1,
[clsid.fracture_s] = 2,
[clsid.gigant_s] = 3,
[clsid.poltergeist_s] = 4,
[clsid.pseudodog_s] = 1,
[clsid.psy_dog_phantom_s] = 4,
[clsid.psy_dog_s] = 4,
[clsid.rat_s] = 0,
[clsid.snork_s] = 2,
[clsid.tushkano_s] = 0,
[clsid.zombie_s] = 1
}
-- Warfare
local faction_list = { -- List of factions to get correct squad section from
["stalker"] = "stalker",
["monolith"] = "monolith",
["csky"] = "csky",
["army"] = "army",
["killer"] = "merc",
["ecolog"] = "ecolog",
["dolg"] = "duty",
["freedom"] = "freedom",
["bandit"] = "bandit",
["greh"] = "greh",
["isg"] = "isg",
["renegade"] = "renegade",
["zombied"] = "zombied",
}
local random_mutants = {
"simulation_bloodsucker",
"simulation_bloodsucker",
"simulation_boar",
"simulation_boar",
"simulation_boar",
"simulation_dog",
"simulation_dog",
"simulation_dog",
"simulation_pseudodog",
"simulation_pseudodog",
"simulation_flesh",
"simulation_flesh",
"simulation_flesh",
"simulation_snork",
"simulation_snork",
"simulation_mix_dogs",
"simulation_mix_dogs",
"simulation_mix_dogs",
"simulation_mix_boar_flesh",
"simulation_mix_boar_flesh",
"simulation_tushkano",
"simulation_tushkano",
"simulation_tushkano",
"simulation_cat",
"simulation_cat",
"simulation_zombie",
}
local random_rare = {
"simulation_gigant",
"simulation_controller",
"simulation_controller",
"simulation_burer",
"simulation_burer",
"simulation_chimera",
"simulation_chimera",
"simulation_bloodsucker",
"simulation_bloodsucker",
"simulation_bloodsucker",
"simulation_snork",
"simulation_snork",
"simulation_snork",
}
local random_zombies = {
"simulation_zombie",
"simulation_zombie",
"simulation_zombie",
"simulation_zombie",
"simulation_zombie",
"simulation_zombie",
"simulation_zombie",
"simulation_snork",
"simulation_snork",
"simulation_zombie",
"simulation_zombie",
"simulation_zombie",
"simulation_zombie",
"simulation_zombie",
"simulation_zombie",
"simulation_bloodsucker",
"simulation_chimera",
}
function get_advanced_chance(resource)
return -1 * (100 * (1 / math.pow(warfare.resource_count / 2, 2))) * math.pow((resource - (warfare.resource_count / 2)), 2) + 100
end
function get_veteran_chance(resource)
return -100 + (100 / (warfare.resource_count / 2)) * resource
end
function get_spawn_section(faction, resource)
local advanced = get_advanced_chance(resource)
local veteran = get_veteran_chance(resource)
return get_section(faction, advanced, veteran)
end
function get_section(faction, advanced_chance, veteran_chance)
local r = math.random(100)
local name = faction_list[faction]
if name then
if r <= veteran_chance then
return (name .. "_sim_squad_veteran")
elseif r <= advanced_chance then
return (name .. "_sim_squad_advanced")
else
return (name .. "_sim_squad_novice")
end
elseif faction == "monster" then
if math.random(100) >= 98 then
return random_rare[math.random(#random_rare)]
else
return random_mutants[math.random(#random_mutants)]
end
else
return random_zombies[math.random(#random_zombies)]
end
return nil
end
function get_faction_squad(faction, typ)
local name = faction_list[faction]
if (typ == "novice") then
return name.."_sim_squad_novice"
elseif (typ == "advanced") then
return name.."_sim_squad_advanced"
elseif (typ == "veteran") then
return name.."_sim_squad_veteran"
elseif (typ == "sniper") then
if (name == "monolith" or name == "army") then
return name.."_sim_squad_sniper"
end
end
end
-----------------------
function on_game_start()
local ini_fact = ini_file("plugins\\faction_profile.ltx")
-- Collect faction profiles
local factions_list = {
["stalker"] = true,
["dolg"] = true,
["freedom"] = true,
["csky"] = true,
["ecolog"] = true,
["killer"] = true,
["army"] = true,
["bandit"] = true,
["monolith"] = true,
}
for k,v in pairs(factions_list) do
faction[k] = {}
faction[k]["type"] = ini_fact:r_string_ex(k,"type") or "group"
local color = parse_list(ini_fact,k,"color")
faction[k]["color"] = strformat("%c[%s,%s,%s,%s]",color[1],color[2],color[3],color[4])
faction[k]["territory"] = ini_fact:r_string_ex(k,"territory")
faction[k]["level_presence"] = parse_list(ini_fact,k,"level_presence",true)
faction[k]["pda_topic"] = {}
local pda_topics = parse_list(ini_fact,k,"pda_topic")
for i=1,#pda_topics do
for k1,v1 in string.gmatch(pda_topics[i], "([%w_%-%s%.]+)=([%w_%-%s%.]+)") do
faction[k]["pda_topic"][k1] = tonumber(v1)
end
end
faction[k]["pda_topic_mission"] = parse_list(ini_fact,k,"pda_topic_mission")
faction[k]["weapon"] = ini_fact:r_string_ex(k,"weapon")
faction[k]["leader"] = ini_fact:r_string_ex(k,"leader")
faction[k]["trader"] = ini_fact:r_string_ex(k,"trader")
faction[k]["mechanic"] = ini_fact:r_string_ex(k,"mechanic")
faction[k]["medic"] = ini_fact:r_string_ex(k,"medic")
faction[k]["barman"] = ini_fact:r_string_ex(k,"barman")
faction[k]["guide"] = ini_fact:r_string_ex(k,"guide")
faction[k]["leader_name"] = ini_fact:r_string_ex(k,"leader_name")
faction[k]["trader_name"] = ini_fact:r_string_ex(k,"trader_name")
faction[k]["mechanic_name"] = ini_fact:r_string_ex(k,"mechanic_name")
faction[k]["medic_name"] = ini_fact:r_string_ex(k,"medic_name")
faction[k]["barman_name"] = ini_fact:r_string_ex(k,"barman_name")
faction[k]["guide_name"] = ini_fact:r_string_ex(k,"guide_name")
end
local n = 0
n = ini_fact:line_count("news_levels")
for i=0,n-1 do
local result, id, value = ini_fact:r_line_ex("news_levels",i,"","")
if level[id] == nil then
level[id] = true
end
end
n = ini_fact:line_count("mutant_tier")
for i=0,n-1 do
local result, id, value = ini_fact:r_line_ex("mutant_tier",i,"","")
if mutant[id] == nil then
mutant[id] = {}
mutant[id]["tier"] = tonumber(value)
end
end
--utils_data.print_table(faction,"faction_profiles")
--utils_data.print_table(level,"news_levels")
--utils_data.print_table(mutant,"mutant_tiers")
end
@@ -0,0 +1,557 @@
--[[
- Created by tdef
- Updated by Tronex
- Randomized world items on new game
- Released blacklisted objects on new game
- Created: 2018/10/27
- 2019/31/3 script now read from config to set up
- 2019/4/25 objects to release are now handled by another config
- 2019/5/20 improved the way suffled consumables uses are set
used ini:
items\settings\dynamic_item_spawn.ltx
plugins\new_game_setup.ltx
set enable_debug to true, for debugging and map markers
--]]
-- these vehicles are supposed to shoot at you but call of misery broke them so they don't
-- also you can board them, turn them on and drive around so should remove them?
local ini_dyn
local enable_debug = false
local inited = false
local sfind = string.find
local world_itm_info = {} -- [name] = {}
local world_itm_off = {} -- [name] = true
local world_itm_num = {} -- [name] = num
local world_itm_on = {} -- [id] = name
local itm_list = {}
local limited_uses = {}
function get_itm_type(name)
if sfind(name,"kolbasa")
or sfind(name,"conserva")
or sfind(name,"bread")
then
return "food"
end
if sfind(name,"energy")
or sfind(name,"vodka")
or sfind(name,"drink")
then
return "drink"
end
if sfind(name,"drug")
or sfind(name,"antirad")
or sfind(name,"bandage")
or sfind(name,"medkit")
then
return "medical"
end
--if sfind(name,"repair") then
--return "tool"
--end
if sfind(name,"ammo") then
return "ammo"
end
if sfind(name,"misc")
then
return "misc"
end
return "NA"
end
function print_debug(...)
if enable_debug then
printf(...)
end
end
local marker_by_type = {
["kit"] = "item_kit",
["medical"] = "item_medical",
["food"] = "item_food",
["drink"] = "item_drink",
["ammo"] = "item_ammo",
["misc"] = "item_misc",
}
function add_marker(name, section, id, typ)
if enable_debug then
local spot = marker_by_type[typ] or marker_by_type["misc"]
level.map_add_object_spot_ser(id, spot, "Name: " .. name .. " \\nType: " .. typ .. " \\nSection: " .. section)
end
end
function remove_marker(id, typ)
if enable_debug then
local spot = marker_by_type[typ] or marker_by_type["misc"]
if (level.map_has_object_spot(id, spot) ~= 0) then
level.map_remove_object_spot(id, spot)
end
end
end
function init_settings()
if (inited) then return end
inited = true
ini_dyn = ini_file("items\\settings\\dynamic_item_spawn.ltx")
local n,m = 0,0
local result, id, value = "","",""
local name, info = "","",""
-- Gather items list
n = ini_dyn:line_count("categories") or 0
for i=0,n-1 do
result, id, value = ini_dyn:r_line_ex("categories",i,"","")
itm_list[id] = {}
m = ini_dyn:line_count(id) or 0
for ii=0,m-1 do
result, name, info = ini_dyn:r_line_ex(id,ii,"","")
if name and info then
for j=1,tonumber(info) do
local size = #itm_list[id] + 1
itm_list[id][size] = name
print_debug("- Game Setup | itm_list[%s][%s] = %s", id, size, name)
end
end
end
end
-- Gather recorded items pos
n = ini_dyn:line_count("levels") or 0
for i=0,n-1 do
result, id, value = ini_dyn:r_line_ex("levels",i,"","")
m = ini_dyn:line_count(id) or 0
for ii=0,m-1 do
result, name, info = ini_dyn:r_line_ex(id,ii,"","")
if name and info then
local t = str_explode(info,",")
if (#t == 6) and (t[1] ~= "NA") then
world_itm_info[name] = {
typ = t[1],
x = tonumber(t[2]),
y = tonumber(t[3]),
z = tonumber(t[4]),
lvl_id = tonumber(t[5]),
gm_id = tonumber(t[6]),
}
end
end
end
end
-- Gather uses
n = ini_dyn:line_count("possible_uses") or 0
for i=0,n-1 do
result, id, value = ini_dyn:r_line_ex("possible_uses",i,"","")
if id and value then
local t = str_explode(value,",")
limited_uses[id] = { tonumber(t[1]) or 1 , tonumber(t[2]) or 1 }
end
end
-- Make list of non-spawned items
for name,info in pairs(world_itm_info) do
world_itm_off[name] = true
end
for id,name in pairs(world_itm_on) do
world_itm_off[name] = nil
end
print_debug("- Game Setup | world_itm_info: %s - world_itm_on: %s - world_itm_off: %s", size_table(world_itm_info), size_table(world_itm_on), size_table(world_itm_off))
end
function try_spawn_world_item(ignore)
-- Get spawn place name
local _name
if ignore then
_name = random_key_table(world_itm_off)
else
local lvl_short = txr_routes.get_map(level.name())
local t = {}
-- Gather validated item places to spawn at
for name,_ in pairs(world_itm_off) do
if (not sfind(name,lvl_short)) then
t[#t+1] = name
end
end
_name = (#t > 0) and t[math.random(#t)]
end
-- Return if not available place has been found
if (not _name) then
print_debug("! Game Setup | can't find available item place", _name)
return
end
-- Return if place already has spawned item
for id,name in pairs(world_itm_on) do
if (name == _name) then
print_debug("! Game Setup | place {%s} is already occupied", _name)
return
end
end
-- Get info
local info = world_itm_info[_name]
if (not info) then
print_debug("! Game Setup | no info is found for {%s}", _name)
return
end
-- Get section
local itm_type = info.typ and itm_list[info.typ]
local section = itm_type and itm_type[math.random(#itm_type)]
if (not section) then
print_debug("! Game Setup | couldn't get section [%s] for type (%s)", section, info.typ)
return
end
if (not ini_sys:section_exist(section)) then
print_debug("! Game Setup | section [%s] doesn't exist", section)
return
end
-- Info check
if not (info.x and info.y and info.z and info.lvl_id and info.gm_id and true) then
print_debug("! Game Setup | item {%s} has wrong or incomplete info", name)
return
end
-- Spawn and adjust uses/condition/ammo size
if IsItem("ammo",section) then
local pos = vector():set(info.x, info.y, info.z)
local se_obj = alife_create_item(section, {pos, info.lvl_id, info.gm_id})
if se_obj then
add_marker(_name, section, se_obj.id, info.typ)
world_itm_on[se_obj.id] = _name
world_itm_off[_name] = nil
local box_size = ini_sys:r_u32(section, "box_size")
world_itm_num[_name] = math.random( math.ceil(box_size * 0.25) , math.ceil(box_size * 0.75) )
print_debug("/ Game Setup | created ammo [%s](%s) - place: %s - size = %s", section, se_obj.id, _name, world_itm_num[_name])
else
print_debug("! Game Setup | ammo [%s] couldn't be created", section)
end
else
local pos = vector():set(info.x, info.y, info.z)
local se_obj = alife_create_item(section, {pos, info.lvl_id, info.gm_id})
if se_obj then
add_marker(_name, section, se_obj.id, info.typ)
world_itm_on[se_obj.id] = _name
world_itm_off[_name] = nil
-- Multi-use
if limited_uses[section] then
world_itm_num[_name] = math.random(limited_uses[section][1], limited_uses[section][2])
print_debug("/ Game Setup | created multiuse item [%s](%s) - place: %s - uses = %s", section, se_obj.id, _name, world_itm_num[_name])
else
local is_using_con = utils_item.is_degradable(nil, section)
if is_using_con then
-- Parts
if IsItem("part",section) then
world_itm_num[_name] = random_choice(0.5,0.75,1)
print_debug("/ Game Setup | created degraded item [%s](%s) - place: %s - con = %s", section, se_obj.id, _name, world_itm_num[_name])
-- Degradable items
else
world_itm_num[_name] = (math.random(30,70)/100)
print_debug("/ Game Setup | created degraded item [%s](%s) - place: %s - con = %s", section, se_obj.id, _name, world_itm_num[_name])
end
else
print_debug("/ Game Setup | created item [%s](%s)", section, se_obj.id)
end
end
else
print_debug("! Game Setup | item [%s] couldn't be created", section)
end
end
end
function is_world_item(id)
if id and world_itm_on[id] then
--print_debug("! Game Setup | is_world_item[%s]", id)
return true
end
--print_debug("/ Game Setup | is_world_item[%s]", id)
return false
end
-- TODO IN 1.6 OR WHENEVER WE CAN EDIT ALL.SPAWN
-- remove these 2 objects because vetham is making new office for medic and they get in the way
function bar_medic_remove_stuff()
if not alife_storage_manager.get_state().duty_medic_fix then
alife_storage_manager.get_state().duty_medic_fix = true
for i=1,65534 do
local se = alife():object(i)
if se and (se:name() == 'bar_physic_object_mlr_0002' or se:name() == 'bar_physic_object_mlr_0003') then
alife():release(se)
end
end
end
end
-- TODO IN 1.6 OR WHENEVER WE CAN EDIT ALL.SPAWN
-- remove these 4 objects because they're stuck in the train and physics impulse makes them jitter around at 5 fps
function darkscape_remove_physics_objects()
if not alife_storage_manager.get_state().darkscape_phys_fix then
alife_storage_manager.get_state().darkscape_phys_fix = true
for i=1,65534 do
local se = alife():object(i)
if se and (se:name() == 'ds_physic_destroyable_object_0046' or se:name() == 'ds_physic_object_0009' or se:name() == 'ds_physic_object_0010' or se:name() == 'ds_physic_object_0002') then
alife():release(se)
end
end
end
end
-- TODO IN 1.6 OR WHENEVER WE CAN EDIT ALL.SPAWN
-- delete the chair and move smart cover in this new position
-- OR
-- make the chair part of level geometry and delete the object
-- OR
-- find a way to make that specific object not react to physics
function freedom_medic_fix()
if not alife_storage_manager.get_state().freedom_medic_fix then
alife_storage_manager.get_state().freedom_medic_fix = true
for i=1,65534 do
local se = alife():object(i)
if se then
if se:name() == 'mil_physic_object_0048' then
alife():release(se)
elseif se:name() == 'sc_freedom_medic_mlr' then
alife():teleport_object(i, 2165, 315401, vector():set(27.681089401245, -6.9381303787231, 17.38550567627))
end
end
end
end
end
-------------------------------
-- CALLBACKS
-------------------------------
local function actor_on_first_update()
init_settings()
freedom_medic_fix()
bar_medic_remove_stuff()
darkscape_remove_physics_objects()
if alife_storage_manager.get_state().item_removal_done or IsTestMode() then
UnregisterScriptCallback("actor_on_first_update",actor_on_first_update)
return
end
alife_storage_manager.get_state().item_removal_done = true
print_debug("- Game Setup | create dynamic items")
local ini_setup = ini_file("plugins\\new_game_setup.ltx")
local enabled = true --ini_dyn:r_bool_ex("settings","enabled") or false
if (not enabled) then
return
end
-- Release static items and mines
local sim = alife()
local boxes = {}
for i=1, 65534 do
local se_obj = sim:object(i)
if se_obj then
local name = se_obj:name()
local cls = se_obj:clsid()
if cls == clsid.inventory_box_s then
--print_debug('%s_%s is a box', i, name)
boxes[i] = true
elseif ini_dyn:line_exist("replace_items",name) then
--print_debug('releasing %s', name)
--sim:release(se_obj, true)
alife_release(se_obj)
end
if ini_setup:line_exist("remove_objects",name) then
print_debug('/ Game Setup | Releasing object (%s)', name)
-- Clear inventory boxes from their manager
if (cls == clsid.inventory_box_s) then
treasure_manager.release_stash_by_id(se_obj.id)
end
safe_release_manager.release(se_obj)
end
end
end
-- Clear stashes
for i=1, 65534 do
local se_obj = sim:object(i)
if se_obj then
local name = se_obj:name()
if boxes[se_obj.parent_id] and (not sfind(name, 'mlr_strelok_item')) then
print_debug('/ Game Setup | Releasing {%s} from box', name)
--sim:release(se_obj, true)
alife_release(se_obj)
end
end
end
-- Setup items
local multi = game_difficulties.get_eco_factor("random_items") or 0.5
-- ZCP
if smr_amain_mcm.get_config("smr_enabled") then
multi = smr_loot_mcm.get_config("random_items")
end
-- ZCP END
multi = (multi < 1) and multi or 1
local num = math.ceil(size_table(world_itm_off) * multi)
for i=1,num do
try_spawn_world_item(true)
end
print_debug("- Game Setup | world_itm_info: %s - world_itm_on: %s - world_itm_off: %s", size_table(world_itm_info), size_table(world_itm_on), size_table(world_itm_off))
end
local tg_stkr = 0
local function actor_on_update()
if time_global() < tg_stkr then
return
end
-- No need to process if actor is outside cordon / visited more levels / not a loner / Warfare is active
if (level.name() ~= "l01_escape")
or IsWarfare()
or (game_statistics.get_statistic_count("level_changes") > 1)
or (get_actor_true_community() ~= "stalker")
then
UnregisterScriptCallback("actor_on_update",actor_on_update)
return
end
-- Remove common military or mutant squads
local on_act_lvl = simulation_objects.is_on_the_actor_level
for id,v in pairs( SIMBOARD.squads ) do
local squad = alife_object(id)
if squad and squad.common and (squad.player_id == "army") and on_act_lvl(squad) then
squad:remove_squad()
break
end
end
tg_stkr = time_global() + 10000
end
local function actor_on_item_take(obj)
local id = obj:id()
if world_itm_on[id] then
local name = world_itm_on[id]
local section = obj:section()
local info = world_itm_info[name]
if (not info) then
print_debug("! Game Setup | can't get info for {%s}", name)
end
-- Spawn a new world item
try_spawn_world_item()
-- Switch state
world_itm_on[id] = nil
world_itm_off[name] = true
-- Read info
local num = world_itm_num[name]
if num then
-- Ammo
if IsItem("ammo",section) then
obj:ammo_set_count(num)
print_debug("- Game Setup | taken world ammo [%s](%s) is set to %s ammo - info name: %s", section, id, num, name)
world_itm_num[name] = nil
-- Multi-use
elseif limited_uses[section] then
alife_process_item( section, id , {uses = num} )
print_debug("- Game Setup | taken world consumable [%s](%s) is set to %s uses - info name: %s", section, id, num, name)
world_itm_num[name] = nil
-- Condition
elseif utils_item.is_degradable(nil, section) then
alife_process_item( section, id , {cond = num} )
print_debug("- Game Setup | taken world degraded item [%s](%s) is set to %s condition - info name: %s", section, id, num, name)
world_itm_num[name] = nil
end
-- Normal
else
print_debug("- Game Setup | taken world item [%s](%s) - info name: %s", section, id, uses, name)
end
-- Send message
itms_manager.send_itm_msg(section)
remove_marker(id, info.typ)
end
-- Ammo aggregation (it's important to start ammo aggregation after sorting taken world ammo size first, to prevent issues)
if IsAmmo(obj) then
item_weapon.ammo_aggregation(obj)
end
end
local function save_state(m_data)
m_data.world_itm_on = world_itm_on
m_data.world_itm_num = world_itm_num
print_debug("# SAVING: world_itm_on [%s] - world_itm_num [%s]", size_table(world_itm_on), size_table(world_itm_num))
end
local function load_state(m_data)
world_itm_on = m_data.world_itm_on or {}
world_itm_num = m_data.world_itm_num or {}
print_debug("# LOADING: world_itm_on [%s] - world_itm_num [%s]", size_table(world_itm_on), size_table(world_itm_num))
end
function on_game_start()
RegisterScriptCallback("actor_on_first_update",actor_on_first_update)
RegisterScriptCallback("actor_on_update",actor_on_update)
RegisterScriptCallback("actor_on_item_take",actor_on_item_take)
RegisterScriptCallback("save_state",save_state)
RegisterScriptCallback("load_state",load_state)
end
@@ -0,0 +1,662 @@
local coc_ranking_array_size = 100 -- Top100
local coc_ranking_list = {}
local actor_rank_place
dialog_closed = true
----------------------------------------------------------------------------
-- Engine->lua function calls
----------------------------------------------------------------------------
-- PDA Tabs
-- It's now possible to add new button tabs to pda*.xml.
-- You can use ActorMenu.get_pda_menu():GetActiveSection() to find out active pda tab
-- UI returned must be CUIScriptWnd
function set_active_subdialog(section)
--printf("set_active_subdialog | section=%s",section)
-- SMR
if smr_amain_mcm.get_config("smr_enabled") and smr_amain_mcm.get_config("glitched_pda") then
return ui_pda_glitched_tab.get_ui()
end
-- For NPCs PDA
local obj = db.actor:item_in_slot(8)
local sec = obj and obj:section()
if item_device.device_npc_pda[sec] then
return ui_pda_npc_tab.get_ui( se_load_var(obj:id(), obj:name(), "info") )
end
-- For Actor PDA
if (section == "eptTasks") then
elseif (section == "eptRanking") then
elseif (section == "eptLogs") then
elseif (section == "eptRelations") then
return ui_pda_relations_tab.get_ui()
elseif (section == "eptContacts") then
if _G.WARFARE then
return ui_pda_warfare_tab.get_ui()
else
return ui_pda_contacts_tab.get_ui()
end
elseif (section == "eptEncyclopedia") then
return ui_pda_encyclopedia_tab.get_ui()
elseif (section == "eptRadio") then
return ui_pda_radio_tab.get_ui()
end
end
function pda_use() -- from engine?
return item_device.is_pda_charged()
end
function on_low_battery() -- from engine
end
local map_spot_property = {}
function property_box_clicked(property_ui)
local list_item = property_ui:GetSelectedItem()
if not (list_item) then
return
end
local textControl = list_item:GetTextItem()
local prop = textControl:GetText()
--printf("prop=%s",prop)
SendScriptCallback("map_spot_menu_property_clicked",property_ui,map_spot_property.id,map_spot_property.level_name,prop)
end
function property_box_add_properties(property_ui,id,level_name,hint)
map_spot_property.id = id
map_spot_property.level_name = level_name
-- if (hint and hint ~= "") then
-- property_ui:AddItem(hint)
-- end
SendScriptCallback("map_spot_menu_add_property",property_ui,id,level_name,hint)
end
-- use actor_menu for other modes
-- 10 = Talk dialog show
-- 11 = Talk dialog hide
function actor_menu_mode(mode)
if(mode==10) then
dialog_closed = false
for k,st in pairs(db.storage) do
if (st.object and st.object:is_talking() and st.object:id() ~= AC_ID) then
local id = st.object:id()
SetEvent("used_npc_id", id) -- stupid hack since sidorovich and forester don't have use_callback
local sound_theme = xr_sound.sound_table[id]
if sound_theme and sound_theme.reset then
sound_theme:reset(id)
end
local m_data = alife_storage_manager.get_state()
if not (m_data.actor_contacts) then
m_data.actor_contacts = {}
end
m_data.actor_contacts[id] = true
break
end
end
Register_UI("Dialog")
--printf("---:>Talk Dialog show")
elseif(mode==11) then
--printf("---:>Talk Dialog hide")
SendScriptCallback("actor_on_leave_dialog",GetEvent("used_npc_id"))
SetEvent("used_npc_id", nil)
dialog_closed = true
Unregister_UI("Dialog")
end
end
function get_time_elapsed()
local s_time = level.get_start_time()
local seconds = tonumber(game.get_game_time():diffSec(s_time))
if (seconds < 60) then
return string.format("%d %s",seconds,game.translate_string("ui_st_secs"))
elseif (seconds < 3600) then
return string.format("%d %s",seconds/60,game.translate_string("ui_st_mins"))
elseif (seconds < 86400) then
return string.format("%d %s",seconds/60/60,game.translate_string("ui_st_hours"))
end
return string.format("%d %s",seconds/60/60/24,game.translate_string("ui_st_days"))
end
function get_stat(index) -- index= int return string
if(index==0) then
return get_time_elapsed()
elseif(index==1) then
return tostring(game_statistics.get_statistic_count("emissions"))
elseif(index==2) then
return tostring(game_statistics.get_statistic_count("tasks_completed"))
elseif(index==3) then
return tostring(game_statistics.get_statistic_count("killed_monsters"))
elseif(index==4) then
return tostring(game_statistics.get_statistic_count("killed_stalkers"))
elseif(index==5) then
return tostring(game_statistics.get_statistic_count("boxes_smashed"))
elseif(index==6) then
return tostring(game_statistics.get_statistic_count("stashes_found"))
elseif(index==7) then
return tostring(game_statistics.get_statistic_count("psi_storms"))
elseif(index==8) then
return tostring(game_statistics.get_statistic_count("pdas_delivered"))
elseif(index==9) then
return tostring(game_statistics.get_statistic_count("helicopters_downed"))
elseif(index==10) then
return tostring(game_statistics.get_statistic_count("artefacts_detected"))
elseif(index==11) then
return tostring(game_statistics.get_statistic_count("wounded_helped"))
elseif(index==12) then
return tostring(game_statistics.get_statistic_count("level_changes"))
elseif(index==13) then
return tostring(game_statistics.get_statistic_count("enemies_surrendered"))
elseif(index==14) then
return tostring(game_statistics.get_statistic_count("field_dressings"))
elseif(index==15) then
return (ui_pda_encyclopedia_tab.get_articles_unlocked_count() .. "/" .. ui_pda_encyclopedia_tab.get_articles_count())
elseif(index==16) then
return (game_achievements.get_achievements_unlocked_count() .. "/" .. game_achievements.get_achievements_count())
elseif(index==17) then
return (game_statistics.get_actor_visited_levels_count() .. "/33")
elseif(index==18) then
return (db.actor:money() .. " RU")
end
return ""
end
----------------------------------------------------------------------------
-- Engine->lua function calls
----------------------------------------------------------------------------
local primary_objects_tbl = {
{target="mar_2c_01_anomaly_spot", hint="st_mar_2c_01_anomaly_spot_name"},
{target="mar_2c_02_anomaly_spot", hint="st_mar_2c_02_anomaly_spot_name"},
{target="ds_2c_01_anomaly_spot", hint="st_ds_2c_01_anomaly_spot_name"},
{target="ds_2c_02_anomaly_spot", hint="st_ds_2c_02_anomaly_spot_name"},
{target="ds_2c_03_anomaly_spot", hint="st_ds_2c_03_anomaly_spot_name"},
{target="ds_2c_04_anomaly_spot", hint="st_ds_2c_04_anomaly_spot_name"},
{target="trc_2c_01_rift_anom_spot", hint="st_trc_2c_01_rift_anom_spot_name"},
{target="trc_2c_02_chem_anom_spot", hint="st_trc_2c_02_chem_anom_spot_name"},
{target="trc_2c_03_desolation_anom_spot", hint="st_trc_2c_03_desolation_anom_spot_name"},
{target="esc_2c_01_high_hopes_anomaly_spot", hint="st_esc_2c_01_high_hopes_anomaly_spot_name"},
{target="gar_2c_01_nwi_anomaly_spot", hint="st_gar_2c_01_nwi_anomaly_spot_name"},
{target="gar_2c_02_toaster_anomaly_spot", hint="st_gar_2c_02_toaster_anomaly_spot_name"},
{target="agr_2c_01_hg_anomaly_spot", hint="st_agr_2c_01_hg_anomaly_spot_name"},
-- Undergound anomalies are commented out until we can have underground minimaps.
--{target="labx18_2c_01_deep_burn_anomaly_spot", hint="st_labx18_2c_01_deep_burn_anomaly_spot_name"},
--{target="labx18_2c_02_ff_anomaly_spot", hint="st_labx18_2c_02_ff_anomaly_spot_name"},
--{target="labx18_2c_03_elders_anomaly_spot", hint="st_labx18_2c_03_elders_anomaly_spot_name"},
--{target="labx18_2c_04_bioh_anomaly_spot", hint="st_labx18_2c_04_bioh_anomaly_spot_name"},
{target="bar_2c_01_grant_anomaly_spot", hint="st_bar_2c_01_grant_anomaly_spot_name"},
{target="ros_2c_01_tunnel_anomaly_spot", hint="st_ros_2c_01_tunnel_anomaly_spot_name"},
{target="ros_2c_02_crispy_train_anomaly_spot", hint="st_ros_2c_02_crispy_train_anomaly_spot_name"},
{target="ros_2c_03_yc_anomaly_spot", hint="st_ros_2c_03_yc_anomaly_spot_name"},
{target="mil_2c_01_hw_anomaly_spot", hint="st_mil_2c_01_hw_anomaly_spot_name"},
{target="yan_2c_01_cd_anomaly_spot", hint="st_yan_2c_01_cd_anomaly_spot_name"},
--{target="x16_lab_2c_01_fb_anomy_spot", hint="st_x16_lab_2c_01_fb_anomy_spot_name"},
{target="cit_2c_01_ch_anomaly_spot", hint="st_cit_2c_01_ch_anomaly_spot_name"},
{target="cit_2c_02_pg_anomaly_spot", hint="st_cit_2c_02_pg_anomaly_spot_name"},
{target="lim_2c_01_ls_anomaly_spot", hint="st_lim_2c_01_ls_anomaly_spot_name"},
{target="lim_2c_02_ib_anomaly_spot", hint="st_lim_2c_02_ib_anomaly_spot_name"},
{target="rad_2c_01_bl_anomaly_spot", hint="st_rad_2c_01_bl_anomaly_spot_name"},
{target="rad_2c_02_pp_anomaly_spot", hint="st_rad_2c_02_pp_anomaly_spot_name"},
--{target="bun_2c_01_f_anomaly_spot", hint="st_bun_2c_01_f_anomaly_spot_name"},
--{target="bun_2c_02_gp_anomaly_spot", hint="st_bun_2c_02_gp_anomaly_spot_name"},
{target="pri_2c_01_pp_anomaly_spot", hint="st_pri_2c_01_pp_anomaly_spot_name"},
{target="pri_2c_02_gt_anomaly_spot", hint="st_pri_2c_02_gt_anomaly_spot_name"},
{target="pri_2c_03_wr_anomaly_spot", hint="st_pri_2c_03_wr_anomaly_spot_name"},
{target="pri_2c_04_o_anomaly_spot", hint="st_pri_2c_04_o_anomaly_spot_name"},
{target="aes_2c_01_ce_anomaly_spot", hint="st_aes_2c_01_ce_anomaly_spot_name"},
{target="aes_2c_02_p_anomaly_spot", hint="st_aes_2c_02_p_anomaly_spot_name"},
{target="aes2_2c_01_bo_anomaly_spot", hint="st_aes2_2c_01_bo_anomaly_spot_name"},
{target="aes2_2c_02_at_anomaly_spot", hint="st_aes2_2c_02_at_anomaly_spot_name"},
--{target="sar_2c_01_r_anomaly_spot", hint="st_sar_2c_01_r_anomaly_spot_name"},
{target="gen_2c_01_ss_anomaly_spot", hint="st_gen_2c_01_ss_anomaly_spot_name"},
{target="mar_smart_terrain_11_3_anomaly_spot", hint="st_mar_smart_terrain_11_3_anomaly_spot_name"},
{target="mar_smart_terrain_10_10_anomaly_spot", hint="st_mar_smart_terrain_10_10_anomaly_spot_name"},
{target="mar_smart_terrain_base_anomaly_spot", hint="st_mar_smart_terrain_base_anomaly_spot_name"},
{target="mar_smart_terrain_8_8_anomaly_spot", hint="st_mar_smart_terrain_8_8_anomaly_spot_name"},
{target="mar_smart_terrain_12_2_anomaly_spot", hint="st_mar_smart_terrain_12_2_anomaly_spot_name"},
{target="mar_smart_terrain_3_7_anomaly_spot", hint="st_mar_smart_terrain_3_7_anomaly_spot_name"},
{target="mar_smart_terrain_3_3_anomaly_spot", hint="st_mar_smart_terrain_3_3_anomaly_spot_name"},
{target="esc_smart_terrain_1_11_anomaly_spot", hint="st_esc_smart_terrain_1_11_anomaly_spot_name"},
{target="esc_smart_terrain_8_9_anomaly_spot", hint="st_esc_smart_terrain_8_9_anomaly_spot_name"},
{target="esc_smart_terrain_5_4_anomaly_spot", hint="st_esc_smart_terrain_5_4_anomaly_spot_name"},
{target="gar_smart_terrain_3_7_anomaly_spot", hint="st_gar_smart_terrain_3_7_anomaly_spot_name"},
{target="gar_smart_terrain_3_7_anomaly_spot_2", hint="st_gar_smart_terrain_3_7_anomaly_spot_2_name"},
{target="gar_smart_terrain_2_4_anomaly_spot", hint="st_gar_smart_terrain_2_4_anomaly_spot_name"},
{target="gar_smart_terrain_6_7_anomaly_spot", hint="st_gar_smart_terrain_6_7_anomaly_spot_name"},
{target="gar_smart_terrain_5_6_anomaly_spot", hint="st_gar_smart_terrain_5_6_anomaly_spot_name"},
{target="gar_smart_terrain_1_7_anomaly_spot", hint="st_gar_smart_terrain_1_7_anomaly_spot_name"},
{target="agr_smart_terrain_1_3_anomaly_spot", hint="st_agr_smart_terrain_1_3_anomaly_spot_name"},
{target="agr_smart_terrain_4_4_near_3_anomaly_spot", hint="st_agr_smart_terrain_4_4_near_3_anomaly_spot_name"},
{target="agr_smart_terrain_5_7_anomaly_spot", hint="st_agr_smart_terrain_5_7_anomaly_spot_name"},
{target="agr_smart_terrain_5_2_anomaly_spot", hint="st_agr_smart_terrain_5_2_anomaly_spot_name"},
{target="agr_smart_terrain_1_2_anomaly_spot", hint="st_agr_smart_terrain_1_2_anomaly_spot_name"},
{target="val_smart_terrain_9_10_anomaly_spot", hint="st_val_smart_terrain_9_10_anomaly_spot_name"},
{target="val_smart_terrain_6_4_anomaly_spot", hint="st_val_smart_terrain_6_4_anomaly_spot_name"},
{target="val_smart_terrain_8_6_anomaly_spot", hint="st_val_smart_terrain_8_6_anomaly_spot_name"},
{target="val_smart_terrain_9_4_anomaly_spot", hint="st_val_smart_terrain_9_4_anomaly_spot_name"},
{target="val_smart_terrain_8_9_anomaly_spot", hint="st_val_smart_terrain_8_9_anomaly_spot_name"},
{target="mil_smart_terrain_4_7_anomaly_spot", hint="st_mil_smart_terrain_4_7_anomaly_spot_name"},
{target="mil_smart_terrain_2_1_anomaly_spot", hint="st_mil_smart_terrain_2_1_anomaly_spot_name"},
{target="mil_smart_terrain_2_6_anomaly_spot", hint="st_mil_smart_terrain_2_6_anomaly_spot_name"},
{target="mil_smart_terrain_7_4_anomaly_spot", hint="st_mil_smart_terrain_7_4_anomaly_spot_name"},
{target="mil_smart_terrain_8_3_anomaly_spot", hint="st_mil_smart_terrain_8_3_anomaly_spot_name"},
{target="yan_smart_terrain_2_5_anomaly_spot", hint="st_yan_smart_terrain_2_5_anomaly_spot_name"},
{target="yan_smart_terrain_zombi_spawn_anomaly_spot", hint="st_yan_smart_terrain_zombi_spawn_anomaly_spot_name"},
{target="yan_smart_terrain_5_3_anomaly_spot", hint="st_yan_smart_terrain_5_3_anomaly_spot_name"},
{target="yan_smart_terrain_4_2_anomaly_spot", hint="st_yan_smart_terrain_4_2_anomaly_spot_name"},
{target="red_smart_terrain_6_3_anomaly_spot", hint="st_red_smart_terrain_6_3_anomaly_spot_name"},
{target="red_smart_terrain_4_5_anomaly_spot", hint="st_red_smart_terrain_4_5_anomaly_spot_name"},
{target="red_smart_terrain_monsters_anomaly_spot", hint="st_red_smart_terrain_monsters_anomaly_spot_name"},
{target="red_smart_terrain_3_2_anomaly_spot", hint="st_red_smart_terrain_3_2_anomaly_spot_name"},
{target="red_smart_terrain_6_6_anomaly_spot", hint="st_red_smart_terrain_6_6_anomaly_spot_name"},
{target="red_smart_terrain_3_1_anomaly_spot", hint="st_red_smart_terrain_3_1_anomaly_spot_name"},
{target="gen_smart_terrain_urod_anomaly_spot", hint="st_gen_smart_terrain_urod_anomaly_spot_name"},
{target="trc_sim_13_anomal_zone_spot", hint="st_trc_sim_13_anomal_zone_spot_name"},
-- POLE
{target="pol_smart_terrain_1_2_anomaly_spot", hint="st_pol_smart_terrain_1_2_anomaly_spot_name"},
-- MLR
{target="dasc_treesucker_state_spot", hint="st_dasc_treesucker_state_name"},
{target="tc_smart_terrain_bandit_base_spot", hint="st_tc_bandit_base_name"},
{target="rad_smart_terrain_kpp_spot", hint="st_tc_kpp_name"},
{target="rad_smart_terrain_vert_spot", hint="st_tc_vert_name"},
{target="radar_smart_terrain_first_zastava_spot", hint="st_radar_first_zastava_name"},
{target="rad_smart_terrain_bunker_spot", hint="st_rad_bunker_name"},
{target="red_smart_terrain_dark_yar_spot", hint="st_red_dark_yar_name"},
{target="red_smart_terrain_central_mine_spot", hint="st_red_central_mine_name"},
{target="red_smart_terrain_crap_spot", hint="st_red_crap_name"},
{target="agr_smart_terrai_SRI_spot", hint="st_agr_SRI_name"},
{target="mar_smart_terrain_post_spot", hint="st_lim_post_vishka_name"},
{target="mar_smart_terrain_old_church_spot", hint="st_lim_old_church_name"},
{target="mar_smart_terrain_village_csky_spot", hint="st_lim_village_csky_name"},
{target="mar_smart_terrain_water_pump_station_spot", hint="st_lim_water_pump_station_name"},
{target="mar_smart_terrain_mechanic_yard_spot", hint="st_lim_mechanic_yard_name"},
{target="red_smart_terrain_bridge_spot", hint="st_lim_bridge_name"},
{target="red_smart_terrain_house_lesnik_spot", hint="st_lim_house_lesnik_name"},
{target="lim_smart_first_zastava_spot", hint="st_lim_zastava_name"},
{target="lim_smart_bubbles_spot", hint="st_lim_bubbles_name"},
{target="lim_smart_nonbuild_spot", hint="st_lim_nonbuild_name"},
{target="lim_smart_dyga_spot", hint="st_lim_dyga_name"},
{target="ds_smart_administration_spot", hint="st_ds_administration_name"},
{target="ds_smart_market_spot", hint="st_ds_market_name"},
{target="ds_smart_house_of_culture_spot", hint="st_ds_HoC_name"},
{target="esc_smart_terrain_novice_village_spot", hint="st_novice_village_name"},
{target="esc_smart_terrain_south_blokpost_spot", hint="st_south_blokpost_name"},
{target="esc_smart_terrain_ATP_spot", hint="st_ATP_name"},
{target="esc_smart_terrain_elevator_spot", hint="st_elevator_name"},
{target="esc_smart_terrain_tunnel_electr_spot", hint="st_tunnel_electr_name"},
{target="esc_smart_terrain_neut_base_spot", hint="st_neut_base_name"},
{target="esc_smart_terrain_north_blockpost_spot", hint="st_north_blockpost_name"},
{target="dar_smart_terrain_farm_spot", hint="st_dar_farm_name"},
{target="dar_smart_terrain_complex_proizv_spot", hint="st_dar_complex_name"},
{target="mil_smart_terrain_bs_village_spot", hint="st_bs_village_name"},
{target="mil_smart_terrain_base_freedom_spot", hint="st_base_freedom_name"},
{target="mil_smart_terrain_border_spot", hint="st_border_name"},
{target="pri_smart_terrain_mon_base_spot", hint="st_mon_base_name"},
{target="pri_smart_terrain_hotel_poless_spot", hint="st_hotel_poless_name"},
{target="pri_smart_terrain_big_bus_station_spot", hint="st_big_bus_station_name"},
{target="gar_smart_terrain_6_3_baraholka_spot", hint="st_gar_baraholka_name"},
{target="gar_smart_terrain_dolg_outpost_spot", hint="st_gar_outpost_name"},
{target="gar_smart_terrain_3_5_angar_spot", hint="st_gar_angar_name"},
{target="bar_smart_terrain_bar100rent_spot", hint="st_bar100rent_name"},
{target="yan_smart_terrain_6_4_bunker_spot", hint="st_yanbunker_name"},
{target="yan_smart_terrain_proizvcomplex_spot", hint="st_yancomplex_name"},
{target="zat_b55_spot", hint="st_zat_b55_name_land"},
{target="zat_b100_spot", hint="st_zat_b100_name_land"},
{target="zat_b104_spot", hint="st_zat_b104_name_land"},
{target="zat_b38_spot", hint="st_zat_b38_name_land"},
{target="zat_b40_spot", hint="st_zat_b40_name_land"},
{target="zat_b56_spot", hint="st_zat_b56_name_land"},
{target="zat_b5_spot", hint="st_zat_b5_name_land"},
{target="zat_a2_spot", hint="st_zat_a2_name_land"},
{target="zat_b20_spot", hint="st_zat_b20_name_land"},
{target="zat_b20_spot", hint="st_zat_fire_name_land"},
{target="zat_b53_spot", hint="st_zat_b53_name_land"},
{target="zat_b101_spot", hint="st_zat_b101_name_land"},
{target="zat_b101_spot", hint="st_zat_waste_name_land"},
{target="zat_b106_spot", hint="st_zat_b106_name_land"},
{target="zat_b7_spot", hint="st_zat_b7_name_land"},
{target="zat_b14_spot", hint="st_zat_b14_name_land"},
{target="zat_b14_spot", hint="st_zat_tide_name_land"},
{target="zat_b52_spot", hint="st_zat_b52_name_land"},
{target="zat_b39_spot", hint="st_zat_b39_name_land"},
{target="zat_b33_spot", hint="st_zat_b33_name_land"},
{target="zat_b18_spot", hint="st_zat_b18_name_land"},
{target="zat_b54_spot", hint="st_zat_b54_name_land"},
{target="zat_b12_spot", hint="st_zat_b12_name_land"},
{target="zat_b28_spot", hint="st_zat_b28_name_land"},
{target="zat_b103_spot", hint="st_zat_b103_name_land"},
{target="jup_b1_spot", hint="st_jup_b1_name_land"},
{target="jup_b46_spot", hint="st_jup_b46_name_land"},
{target="jup_b202_spot", hint="st_jup_b202_name_land"},
{target="jup_b211_spot", hint="st_jup_b211_name_land"},
{target="jup_b200_spot", hint="st_jup_b200_name_land"},
{target="jup_b19_spot", hint="st_jup_b19_name_land"},
{target="jup_a6_spot", hint="st_jup_a6_name_land"},
{target="jup_b25_spot", hint="st_jup_b25_name_land"},
{target="jup_b25_spot", hint="st_jup_earth_name_land"},
{target="jup_b6_spot", hint="st_jup_b6_name_land"},
{target="jup_b205_spot", hint="st_jup_b205_name_land"},
{target="jup_b206_spot", hint="st_jup_b206_name_land"},
{target="jup_b206_spot", hint="st_jup_grove_name_land"},
{target="jup_b32_spot", hint="st_jup_b32_name_land"},
{target="jup_a10_spot", hint="st_jup_a10_name_land"},
{target="jup_b209_spot", hint="st_jup_b209_name_land"},
{target="jup_b208_spot", hint="st_jup_b208_name_land"},
{target="jup_a12_spot", hint="st_jup_a12_name_land"},
{target="jup_b212_spot", hint="st_jup_b212_name_land"},
{target="jup_b9_spot", hint="st_jup_b9_name_land"},
{target="jup_b201_spot", hint="st_jup_b201_name_land"},
{target="jup_a9_spot", hint="st_jup_a9_name_land"},
{target="pri_a28_spot", hint="st_pri_a28_name_land"},
{target="pri_b36_spot", hint="st_pri_b36_name_land"},
{target="pri_b303_spot", hint="st_pri_b303_name_land"},
{target="pri_b301_spot", hint="st_pri_b301_name_land"},
{target="pri_a17_spot", hint="st_pri_a17_name_land"},
{target="pri_b306_spot", hint="st_pri_b306_name_land"},
{target="pri_b306_spot", hint="st_pri_plug_name_land"},
{target="pri_a16_spot", hint="st_pri_a16_name_land"},
{target="pri_a25_spot", hint="st_pri_a25_name_land"},
{target="pri_b35_spot", hint="st_pri_b35_name_land"},
{target="pri_a21_spot", hint="st_pri_a21_name_land"},
{target="pri_b304_spot", hint="st_pri_b304_name_land"},
{target="pri_b304_spot", hint="st_pri_bath_name_land"},
{target="pri_a18_spot", hint="st_pri_a18_name_land"},
{target="pri_anomal_vulkan_spot", hint="st_pri_b307_name_land"},
{target="pri_anomal_loza_spot", hint="st_pri_b302_name_land"}
}
function fill_primary_objects()
for k,v in pairs(primary_objects_tbl) do
local obj_id = get_story_object_id(v.target)
--/ SGM in
if obj_id and (level.map_has_object_spot(obj_id,"primary_object") == 0) and has_alife_info(v.target) then
level.map_add_object_spot(obj_id, "primary_object", v.hint)
end
--/ SGM out
end
local sleep_zones_tbl =
{ "mar_a3_sr_sleep_id",
"agr_sr_sleep_wagon_id",
"agr_sr_sleep_tunnel_id",
"agr_army_sleep_id",
"esc_basement_sleep_area_id",
"esc_secret_sleep_id",
"ds_farmhouse_sleep_id",
"val_abandoned_house_sleep_id",
"val_vagon_sleep_id",
"gar_dolg_sleep_id",
"gar_angar_sleep_id",
"bar_actor_sleep_zone_id",
"yan_bunker_sleep_restrictor_id",
"ros_vagon_sleep_id",
"mil_freedom_sleep_id",
"mil_smart_terran_2_4_sleep_id",
"rad_sleep_room_id",
"cit_merc_sleep_id",
"pri_monolith_sleep_id",
"pri_room27_sleep_id",
"zat_a2_sr_sleep_id",
"jup_a6_sr_sleep_id",
"pri_a16_sr_sleep_id",
"pol_secret_sleep_id"
}
for i=1,#sleep_zones_tbl do
local obj_id = get_story_object_id(sleep_zones_tbl[i])
if (level.map_has_object_spot(obj_id, "ui_pda2_actor_sleep_location")==0) then
level.map_add_object_spot_ser(obj_id, "ui_pda2_actor_sleep_location", "st_ui_pda_sleep_place")
end
end
end
function add_quick_slot_items_on_game_start()
for i=0,3 do
exec_console_cmd( strformat("slot_%s %s",i, ini_sys:r_string_ex("actor","quick_item_"..tostring(i+1)) or "") )
end
end
----------------------------------------------------------------------------
-- Scripted Callback Register
----------------------------------------------------------------------------
local function npc_on_net_spawn(npc,se_obj)
se_save_var(se_obj.id,se_obj:name(),"last_seen_level",level.name())
se_save_var(se_obj.id,se_obj:name(),"last_seen_time",game.get_game_time())
end
function on_game_start()
local function on_game_load()
if (not alife_storage_manager.get_state().enable_warfare_mode) then
CreateTimeEvent(0, "ScanForSpots", 2, discover_spots)
end
end
RegisterScriptCallback("npc_on_net_spawn",npc_on_net_spawn)
RegisterScriptCallback("on_game_load",on_game_load)
end
-- mlr
----------------------------------------------------------------------------
-- Character Ranking
----------------------------------------------------------------------------
function get_coc_ranking_list()
for i=1,10 do
printf("- get_coc_ranking_list | id [%s] = %s", i , coc_ranking_list[i])
end
return coc_ranking_list
end
-- called from info_portions.script
function calculate_rankings()
local t = {}
local sim = alife()
-- add actor to list
t[0] = sim:actor():rank()
-- check all stalker server objects
for i=1,65534 do
local se_obj = sim:object(i)
if (se_obj and IsStalker(nil,se_obj:clsid()) and se_obj:alive() and se_obj:community() ~= "zombied" and se_obj:community() ~= "trader") then
-- Check if object has a story id, if it does they are probably unique
local sid = story_objects.story_id_by_object_id[se_obj.id]
if not (sid) then
t[se_obj.id] = se_obj:rank()
end
end
end
coc_ranking_list = iempty_table(coc_ranking_list)
local size_t = 0
-- sort by highest rank first
for id,rank in spairs(t, function(t,a,b) return t[a] > t[b] end) do
size_t = size_t + 1
coc_ranking_list[size_t] = id
if (id == AC_ID) then
actor_rank_place = size_t
end
end
-- force actor into last visible slot + 1 on ranking list
coc_ranking_list[coc_ranking_array_size+1] = 0
end
-- called from engine! It's how many character rankings to display! u8 (max 255)
function get_rankings_array_size()
return coc_ranking_array_size
end
-- called from engine! must return bool!
function coc_rankings_can_show(index)
if (has_alife_info("ui_pda_hide")) then
return false
end
local se_obj = coc_ranking_list[index] ~= nil and alife_object(coc_ranking_list[index])
if (se_obj) then
return true
end
return false
end
-- called from engine! must return string!
function coc_rankings_set_name(index)
local se_obj = coc_ranking_list[index] ~= nil and alife_object(coc_ranking_list[index])
if (se_obj) then
return strformat("%s. %s",se_obj.id == AC_ID and actor_rank_place or index,se_obj:character_name())
end
return ""
end
-- called from engine! must return string!
function coc_rankings_set_hint(index)
local se_obj = coc_ranking_list[index] ~= nil and alife_object(coc_ranking_list[index])
if (se_obj) then
if (se_obj.id == AC_ID) then
--TODO: Maybe some stats for player, like rank points per minute; if such a thing is possible.
return ""
else
local return_str = ""
-- DEBUG REMOVE ME LATER
if(DEV_DEBUG and ui_options.get("other/debug_hud") == true) then
return_str = se_obj:profile_name() .. [[ \n]] .. se_obj:character_icon() .. [[ \n]]
end
-- stalker stats
local m_data = alife_storage_manager.get_se_obj_state(se_obj)
if (m_data) then
local last_seen_level = m_data.last_seen_level
local last_seen_time = m_data.last_seen_time and m_data.last_seen_time.dateToString and m_data.last_seen_time:dateToString(game.CTime.DateToDay)
if (last_seen_level and last_seen_time) then
return_str = return_str .. game.translate_string("st_last_seen") .. ": " .. game.translate_string(last_seen_level) .. " (" .. last_seen_time .. ")"
if (m_data["killed_stalkers"]) then
return_str = return_str .. [[ \n]] .. game.translate_string("st_stalkers_killed") .. ": " .. tostring(m_data["killed_stalkers"])
end
if (m_data["killed_monsters"]) then
return_str = return_str .. [[ \n]] .. game.translate_string("st_mutants_killed") .. ": " .. tostring(m_data["killed_monsters"])
end
if (m_data["artefacts_found"]) then
return_str = return_str .. [[ \n]] .. game.translate_string("st_artefacts_found") .. ": " .. tostring(m_data["artefacts_found"])
end
if (m_data["wounded_helped"]) then
return_str = return_str .. [[ \n]] .. game.translate_string("st_wounded_helped") .. ": " .. tostring(m_data["wounded_helped"])
end
if (m_data["corpse_looted"]) then
return_str = return_str .. [[ \n]] .. game.translate_string("st_corpse_looted") .. ": " .. tostring(m_data["corpse_looted"])
end
if (m_data["items_sold"]) then
return_str = return_str .. [[ \n]] .. game.translate_string("st_items_sold") .. ": " .. tostring(m_data["items_sold"])
end
end
end
return return_str
end
end
return ""
end
-- called from engine! must return string!
function coc_rankings_set_description(index)
local se_obj = coc_ranking_list[index] ~= nil and alife_object(coc_ranking_list[index])
if (se_obj) then
local faction_color = "%c[255,255,255,1]"
if (game_relations.is_factions_enemies(db.actor:character_community(),se_obj:community())) then
faction_color = "%c[255,255,1,1]"
elseif (game_relations.is_factions_friends(db.actor:character_community(),se_obj:community())) then
faction_color = "%c[255,1,255,1]"
end
local reputation = se_obj:reputation()
local repu_color = "%c[255,255,255,1]"
if (reputation <= -500) then
repu_color = "%c[255,255,1,1]"
elseif (reputation >= 500) then
repu_color = "%c[255,1,255,1]"
end
local faction_str = game.translate_string("ui_st_community") .. ": " .. faction_color .. game.translate_string(se_obj:community()) .. "%c[default]"
local rank_str = game.translate_string("ui_st_rank") .. ": " .. "%c[255,215,215,215]" .. game.translate_string("st_rank_"..ranks.get_se_obj_rank_name(se_obj)) .. " %c[255,110,110,255]" .. se_obj:rank() .. "%c[default]"
local repu_str = game.translate_string("ui_st_reputation") .. ": " .. repu_color .. game.translate_string(utils_obj.get_reputation_name(reputation)) .. "%c[default]"
return strformat([[ %s \n %s \n %s]],faction_str,rank_str,repu_str)
end
return ""
end
-- called from engine! must return string!
function coc_rankings_set_icon(index)
local se_obj = coc_ranking_list[index] ~= nil and alife_object(coc_ranking_list[index])
if (se_obj) then
local icon_name
if (se_obj.id == AC_ID) then
if (ui_options.get("gameplay/general/outfit_portrait") == true) then
local outfit = db.actor:item_in_slot(7)
if (outfit) then
local icon = ini_sys:r_string_ex(outfit:section(),"character_portrait")
if (icon and icon ~= "") then
return icon
end
end
end
icon_name = db.actor:character_icon()
else
local npc = db.storage[se_obj.id] and db.storage[se_obj.id].object
if (npc) then
icon_name = npc:character_icon()
else
icon_name = se_obj:character_icon()
end
end
return icon_name and icon_name ~= "" and icon_name or "ui\\ui_noise"
end
return ""
end
function coc_rankings_show_border(index)
local se_obj = coc_ranking_list[index] ~= nil and alife_object(coc_ranking_list[index])
return se_obj and se_obj.id == AC_ID or false
end
local distance_tbl = {
["l12_stancia"] = 45,
["l12_stancia_2"] = 45,
["l11_hospital"] = 30,
["l10_limansk"] = 35,
["l06_rostok"] = 30,
["k02_trucks_cemetery"] = 45,
}
function discover_spots()
ResetTimeEvent(0,"ScanForSpots",3)
local actor = db.actor
for k,v in pairs(primary_objects_tbl) do
if actor:dont_has_info(v.target) then
local obj_id = get_story_object_id(v.target)
if obj_id and db.storage[obj_id] and db.storage[obj_id].object then
local n_dist = distance_tbl[level.name()] or 40
if (db.storage[obj_id].object:position():distance_to(actor:position()) <= n_dist) then
give_info(v.target)
game_statistics.increment_rank(10)
actor_menu.set_fade_msg( game.translate_string(v.hint), 5, nil, "device\\pda\\spot_discovered" )
--news_manager.send_tip(actor,game.translate_string(v.hint),0,"tourist",5000,nil,game.translate_string("st_revealled_area"))
fill_primary_objects()
end
end
end
end
end
@@ -0,0 +1,437 @@
--'******************************************************
--'*Registry of smart terrains. The playing field simulation.
-- Edited by Alundaio
--'******************************************************
-------------------
local level,alife,game_graph,math,pairs,tostring,tonumber,tsort,tinsert = level,alife,game_graph,math,pairs,tostring,tonumber,table.sort,table.insert
-------------------
-----------------------------------------------------------------------------------
-- Public
-----------------------------------------------------------------------------------
function general_squad_precondition(squad,target)
return false
end
function general_base_precondition(squad,target)
-- Any faction can target a base occupied by their own community / or empty
if (target.faction == nil or target.faction == squad.player_id) then
return true
end
-- if a base is occupied by enemies, squad can target it during early sunrise time
if (game_relations.is_valid(squad.player_id) and game_relations.is_valid(target.faction)) then
if (game_relations.is_factions_enemies(squad.player_id,target.faction)) then
return in_time_interval(3,6)
else
return true
end
end
return false
end
function general_territory_precondition(squad,target)
-- Mutants target territories based on their species and proper time
if (squad.player_id == "monster_predatory_day") then
return in_time_interval(6,19)
elseif (squad.player_id == "monster_predatory_night") then
return in_time_interval(19,6)
elseif (squad.player_id == "monster_zombied_day") then
return in_time_interval(6,19)
elseif (squad.player_id == "monster_zombied_night") then
return in_time_interval(19,6)
elseif (squad.player_id == "monster_vegetarian" or squad.player_id == "zombied") then
return true
end
-- Any squad can target a territory occupied by their own community / or empty
if (target.faction == nil or target.faction == squad.player_id) then
return true
end
-- if a territory is occupied by enemies, squad can target it during daytime
if (game_relations.is_valid(squad.player_id) and game_relations.is_valid(target.faction)) then
if (game_relations.is_factions_enemies(squad.player_id,target.faction)) then
return in_time_interval(9,15)
else
return true
end
end
return false
end
function general_resource_precondition(squad,target)
return in_time_interval(10,6)
end
function general_lair_precondition(squad,target)
return true -- Will fill up all the lairs first, by monster squads
end
--------------------------------------------------------------------------------------------------------
-- SIMULATION BOARD
--------------------------------------------------------------------------------------------------------
class "simulation_board"
function simulation_board:__init()
--' smart = {smrt, targets = {}, dangers = {}, squads = {}, stayed_squads = {}}
self.smarts = {}
self.smarts_by_names = {}
self.simulation_started = true
self.squads = {}
self.tmp_assigned_squad = {}
end
function simulation_board:register_smart(obj)
--utils_data.debug_write(strformat("simulation_board:register_smart %s",obj and obj:name()))
if self.smarts[obj.id] ~= nil then
printf("Smart already exist in list [%s]", obj:name())
return
end
--self.smarts[obj.id] = {smrt = obj, squads = {}, stayed_squads = {}, population = 0}
self.smarts[obj.id] = {smrt = obj, squads = {}, population = 0}
self.smarts_by_names[obj:name()] = obj
end
function simulation_board:unregister_smart(obj)
--utils_data.debug_write(strformat("simulation_board:unregister_smart %s",obj and obj:name()))
self.smarts[obj.id] = nil
self.smarts_by_names[obj:name()] = nil
end
function simulation_board:start_sim() -- Doesn't seem to be used in 1.6
self.simulation_started = true
end
function simulation_board:stop_sim() -- Doesn't seem to be used in 1.6
self.simulation_started = false
end
function simulation_board:set_actor_community(community)
---- Set the player grouping
db.actor:set_character_community(actor_communitites[community], 0, 0)
end
-- Smart initialization
function simulation_board:init_smart(obj)
--utils_data.debug_write(strformat("simulation_board:init_smart %s",obj and obj:name()))
if self.tmp_assigned_squad[obj.id] ~= nil then
for k,v in pairs(self.tmp_assigned_squad[obj.id]) do
self:assign_squad_to_smart(v, obj.id)
end
self.tmp_assigned_squad[obj.id] = nil
end
end
--' Create a new squad
function simulation_board:create_squad(spawn_smart, sq_id)
--utils_data.debug_write(strformat("simulation_board:create_squad spawn_smart=%s sq_id=%s",spawn_smart and spawn_smart:name(),sq_id))
local squad_id = tostring(sq_id)
-- if not (ini_sys:section_exist(squad_id)) then
-- printf("squad section does not exist: %s",squad_id)
-- return
-- end
local squad = alife_create(squad_id,spawn_smart.position, spawn_smart.m_level_vertex_id,spawn_smart.m_game_vertex_id)
squad:create_npc(spawn_smart)
self:assign_squad_to_smart(squad, spawn_smart.id)
local sim = alife()
for k in squad:squad_members() do
local se_obj = k.object or k.id and sim:object(k.id)
if (se_obj) then
SIMBOARD:setup_squad_and_group(se_obj)
-- Alundaio
SendScriptCallback("squad_on_npc_creation",squad,se_obj,spawn_smart)
-- Alundaio
end
end
-- SMR
smr_debug.get_log().info("simboard", "setting up civil war relations for squad %s (smart: %s)", squad:section_name(), spawn_smart:name())
smr_civil_war.setup_civil_war_squad(squad, spawn_smart:name())
-- SMR END
return squad
end
function simulation_board:create_squad_at_named_location(loc_name, squad_id) -- tdef
-- if not (ini_file('misc\\squad_descr.ltx'):section_exist(squad_id)) then
if not (ini_sys:section_exist(squad_id)) then
callstack()
printf("create_squad_at_named_location: squad section does not exist in misc\\squad_descr.ltx: %s",squad_id)
return
end
local str = utils_data.read_from_ini(ini_file("named_locations.ltx"),loc_name,'position')
if not str then
callstack()
printf('create_squad_at_named_location: named location not defined in named_locations.ltx: %s',loc_name)
return
end
-- printf('%s: %s',loc_name, str)
local function str_explode_num(str,sep,plain)
if not (sep ~= "" and string.find(str,sep,1,plain)) then
return { str }
end
local t = {}
local size = 0
for s in str:gsplit(sep,plain) do
size = size + 1
t[size] = tonumber(s)
if not t[size] then
printf("str_explode_num: warning: %s couldn't be parsed as number", s)
end
end
return t
end
local data = str_explode_num(str,',')
-- for k,v in pairs(data) do
-- printf('data[%s] = %s (%s)',k, v, type(v))
-- end
local pos = vector():set(data[1], data[2], data[3])
local squad = alife_create(squad_id, pos, data[4], data[5])
if squad then
-- printf('create_squad_at_named_location: squad created %s',squad.id)
end
squad:create_npc(nil, pos, data[4], data[5])
local sim = alife()
for k in squad:squad_members() do
local se_obj = k.object or k.id and sim:object(k.id)
if (se_obj) then
SIMBOARD:setup_squad_and_group(se_obj)
-- Alundaio
SendScriptCallback("squad_on_npc_creation",squad,se_obj)
-- Alundaio
end
end
return squad
end
--' Remove squad
function simulation_board:remove_squad(squad)
--utils_data.debug_write(strformat("simulation_board:remove_squad %s",squad and squad:name()))
self:assign_squad_to_smart(squad, nil)
squad:remove_squad()
end
--' Assignment squad in smart.
function simulation_board:assign_squad_to_smart(squad, smart_id)
--utils_data.debug_write(strformat("simulation_board:assign_squad_to_smart %s smart_id=%s",squad and squad:name(),smart_id))
if (smart_id and self.smarts[smart_id] == nil) then
if self.tmp_assigned_squad[smart_id] == nil then
self.tmp_assigned_squad[smart_id] = {}
end
local t = self.tmp_assigned_squad[smart_id]
t[#t+1] = squad
return
end
local old_smart_id = squad.smart_id
squad.smart_id = nil
-- remove squad from old smart if exist
if (old_smart_id and self.smarts[old_smart_id] and self.smarts[old_smart_id].squads[squad.id]) then
self.smarts[old_smart_id].squads[squad.id] = nil
-- get accurate population count excluding squads using target_smart param
self.smarts[old_smart_id].population = smart_terrain.smart_terrain_squad_count(SIMBOARD.smarts[old_smart_id].squads)
SendScriptCallback("squad_on_leave_smart",squad,self.smarts[old_smart_id].smrt)
end
if smart_id == nil then
squad:assign_smart(nil,old_smart_id)
return
end
squad:assign_smart(self.smarts[smart_id].smrt,old_smart_id)
--' .
if not (self.smarts[smart_id].squads[squad.id]) then
self.smarts[smart_id].squads[squad.id] = true
if not (squad:get_script_target()) then
-- don't count squads with target_smart
self.smarts[smart_id].population = self.smarts[smart_id].population + 1
end
end
SendScriptCallback("squad_on_enter_smart",squad,self.smarts[smart_id].smrt)
end
local community_groups = {}
-- Set squad and group according to work
function simulation_board:setup_squad_and_group(se_obj)
--utils_data.debug_write(strformat("simulation_board:setup_squad_and_group %s",obj and obj:name()))
local sim = alife()
local squad = se_obj.group_id and se_obj.group_id ~= 65535 and sim:object(se_obj.group_id)
if not (squad) then
change_team_squad_group(se_obj, se_obj.team, se_obj.squad, 0)
return
end
local smart = squad.smart_id and sim:object(squad.smart_id)
change_team_squad_group(se_obj, se_obj.team, smart and smart.squad_id or se_obj.squad, 1)
end
-- Filling start location for squads from "simulation.ltx"
function simulation_board:fill_start_position()
-- SMR
smr_civil_war.setup_factions_relation()
-- SMR END
-- Test map
if (axr_main.config:r_value("character_creation","new_game_test",1) == true) then
axr_main.config:w_value("character_creation","new_game_test")
axr_main.config:save()
-- Prevent spawn terrains from spawning NPCs
if ui_debug_launcher then
ui_debug_launcher.toggle_respawn()
end
printf("---------------- Welcome To Test Map ----------------")
return
end
SendScriptCallback("fill_start_position")
if self.start_position_filled == true then
return
end
self.start_position_filled = true
-- SMR
local setting_ini = smr_pop.get_population_preset()
local stalker_pop_factor = smr_pop.get_stalker_pop_factor()
local monster_pop_factor = smr_pop.get_monster_pop_factor()
-- SMR END
local result, squad_section, count, li, lc
setting_ini:section_for_each(function(section)
lc = setting_ini:line_count(section)
for li=0,lc-1 do
local smart = self.smarts_by_names[section]
if (smart) then
result, squad_section, count = setting_ini:r_line(section,li,"","")
count = tonumber(count) or 1
local common = ini_sys:r_bool_ex(squad_section,"common")
local faction = ini_sys:r_string_ex(squad_section,"faction")
if common then
-- Common mutants
if is_squad_monster[faction] then
count = count*monster_pop_factor
if (count == 0.5) then
count = math.random(0,1)
else
count = round_idp(count)
end
-- Common stalkers
else
count = count*stalker_pop_factor
if (count == 0.5) then -- just randomly 0 or 1 instead of always rounding to 1
count = math.random(0,1)
else
count = round_idp(count)
end
end
else
end
for i=1,count do
-- SMR
smr_pop.smr_handle_spawn(squad_section, smart)
-- SMR END
end
else
printf("sim_board:fill_start_position incorrect smart by name %s",section)
end
end
end
)
end
-- Return smart by its name.
function simulation_board:get_smart_by_name(name)
return self.smarts_by_names[name]
end
-- Returns the number of units in smart.
function simulation_board:get_smart_population(smart)
return self.smarts[smart.id].population
end
-- Getting the playing field.
function get_sim_board()
if _G.SIMBOARD == nil then
_G.SIMBOARD = simulation_board()
end
return _G.SIMBOARD
end
local priority_tasks = {}
function simulation_board:get_squad_target(squad)
local size_t = 0
local object_registry = simulation_objects.object_registry
local is_available = simulation_objects.available_by_id
for index=1,simulation_objects.object_registry_size do
local se_target = object_registry[index]
if (not se_target.locked and se_target.id ~= squad.id and is_available[se_target.id]) then
local curr_prior = se_target:evaluate_prior(squad)
if (curr_prior > 0 and se_target:target_precondition(squad)) then
-- Prioritize 5 potential targets
if (size_t < 5) then
size_t = size_t + 1
priority_tasks[size_t] = {se_target,curr_prior}
elseif (curr_prior > priority_tasks[size_t][2]) then
for i=1,size_t do
if (curr_prior > priority_tasks[i][2]) then
priority_tasks[i][2] = curr_prior
priority_tasks[i][1] = se_target
break
end
end
end
end
end
end
-- Tronex, get target with highest prior
local highest_prior = 0
local best_target
for i=1,size_t do
if highest_prior < priority_tasks[i][2] then
highest_prior = priority_tasks[i][2]
best_target = priority_tasks[i][1]
end
end
if (size_t > 0) then
--local target = priority_tasks[math.random(size_t)][1]
local target = (math.random(1,100) <= 50) and priority_tasks[math.random(size_t)][1] or best_target -- Tronex
--printf("squad=%s size=%s target=%s",squad:name(),size_t,target:name())
iempty_table(priority_tasks) -- It is better to reuse table to avoid GC
return target
end
end
-- Nilling the list on the creation of the game.
function clear()
_G.SIMBOARD = nil
end
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,43 @@
local defaults = {
["smr_enabled"] = true,
["glitched_pda"] = false,
["respawn_idle"] = 86400,
}
function get_config(key)
if ui_mcm then return ui_mcm.get("SMR/smr_amain/"..key) else return defaults[key] end
end
function level_present(r)
return (level.present() == r)
end
function on_mcm_load()
return { id="smr_amain", sh=true, gr={
{ id="title_header", type="slide", link="ui_options_slider_mask", text="ui_mcm_menu_smr_amain", size= {512,50}, spacing=20 },
{ id="persist_info_mm", type="desc", clr={200, 200, 200, 255}, text="ui_mcm_SMR_smr_amain_persist_info_mm", precondition={level_present, false} },
{ id="persist_info_level", type="desc", clr={200, 200, 255, 200}, text="ui_mcm_SMR_smr_amain_persist_info_level", precondition={level_present, true} },
{ id="tooltip_info", type="desc", text="ui_mcm_SMR_smr_amain_tooltip_info" },
{ id="persist_divider", type="line" },
{ id="smr_enabled", type="check", val=1, def=true},
{ id="smr_debug_log", type="check", val=1, def=false},
{ id="smr_persist_override", type="check", val=1, def=false},
{ id="smr_enabled_divider", type="line" },
{ id="respawn_idle", type="list", val=2, def=86400, content={
{10800,"smr_amain_respawn_idle_10800"},
{21600,"smr_amain_respawn_idle_21600"},
{43200,"smr_amain_respawn_idle_43200"},
{86400,"smr_amain_respawn_idle_86400"},
{172800,"smr_amain_respawn_idle_172800"},
{345600,"smr_amain_respawn_idle_345600"},
{604800,"smr_amain_respawn_idle_604800"},
{1209600, "smr_amain_respawn_idle_1209600"},
{-1, "smr_amain_respawn_idle_1"},
}},
{ id="pop_factor_info", type="desc", clr={200, 125, 125, 125}, text="ui_mcm_SMR_smr_amain_pop_factor_info" },
{ id="monster_pop_factor", type="track", val=2, min=0, max=3, step=0.05, def=0.5 },
{ id="stalker_pop_factor", type="track", val=2, min=0, max=3, step=0.05, def=0.5 },
{ id="pop_factor_divider", type="line" },
{ id="glitched_pda", type="check", val=1, def=false},
}}, "SMR"
end
@@ -0,0 +1,26 @@
local defaults = {
}
function get_config(key)
if ui_mcm then return ui_mcm.get("SMR/smr_anomalies/"..key) else return defaults[key] end
end
function level_present(r)
return (level.present() == r)
end
function on_mcm_load()
return { id="smr_anomalies", sh=true, gr={
{ id="title_header", type="slide", link="ui_options_slider_psi_storm", text="ui_mcm_menu_smr_anomalies", size= {512,50}, spacing=20 },
{ id="dyn_ano_chance", type="track", val=2, min=1, max=100, step=1, def=35 },
{ id="pulse", type="check", val=1, def=true},
{ id="anomalies_types_divider", type="line" },
{ id="anomalies_types_header", type="title", text="ui_mcm_smr_anomalies_anomalies_types_title", align="c" },
{ id="anomalies_types_info", type="desc", clr={200, 125, 125, 125}, text="ui_mcm_SMR_smr_anomalies_anomalies_types_info", },
{ id="electric", type="check", val=1, def=true},
{ id="chemical", type="check", val=1, def=true},
{ id="thermal", type="check", val=1, def=true},
{ id="gravitational", type="check", val=1, def=true},
{ id="radioactive", type="check", val=1, def=true},
}}, "SMR"
end
@@ -0,0 +1,231 @@
--[[
------------------------------------------------------------
-- Survival Mode Remade - Civil War
------------------------------------------------------------
-- Sets up relations if Civil War is enabled.
-- by dph-hcl
------------------------------------------------------------
]]--
-- TODO: factor these out into ltx files
local smart_bases = {
["sim_smr_default"] = {
"pri_a18_smart_terrain",
"agr_smart_terrain_1_6",
"agr_smart_terrain_1_6_near_1",
"agr_smart_terrain_1_6_near_2",
"bar_dolg_bunker",
"bar_dolg_general",
"bar_visitors",
"bar_zastava",
"bar_zastava_2",
"cit_killers",
"cit_killers_2",
"mlr_terrain",
"ds2_domik_st",
"esc_smart_terrain_2_12",
"esc_smart_terrain_3_16",
"esc_smart_terrain_5_7",
"gar_smart_terrain_3_5",
"gar_smart_terrain_6_3",
"jup_a12",
"jup_a6",
"jup_b41",
"mar_smart_terrain_base",
"mar_smart_terrain_doc",
"mil_smart_terrain_7_10",
"mil_smart_terrain_7_8",
"mil_smart_terrain_7_7",
"mil_smart_terrain_7_12",
"pri_a15",
"pri_a16_mlr_copy",
"pri_a16",
"pri_a18_smart_terrain",
"pri_monolith",
"red_smart_terrain_4_2",
"red_smart_terrain_3_2",
"ros_smart_stalker_killers1",
"ros_smart_stalker1",
"trc_sim_20",
"val_smart_terrain_7_3",
"val_smart_terrain_7_4",
"val_smart_terrain_7_5",
"yan_smart_terrain_6_4",
"zat_b40_smart_terrain",
"zat_stalker_base_smart"
},
["sim_smr_survival"] = {
"pri_a18_smart_terrain",
"agr_smart_terrain_1_6",
"agr_smart_terrain_1_6_near_1",
"agr_smart_terrain_1_6_near_2",
"bar_dolg_bunker",
"bar_dolg_general",
"bar_visitors",
"bar_zastava",
"bar_zastava_2",
"cit_killers",
"ds2_domik_st",
"esc_smart_terrain_2_12",
"esc_smart_terrain_3_16",
"gar_smart_terrain_3_5",
"jup_a12",
"jup_a6",
"jup_b41",
"mar_smart_terrain_base",
"mar_smart_terrain_doc",
"mil_smart_terrain_7_10",
"mil_smart_terrain_7_7",
"pri_monolith",
"trc_sim_20",
"val_smart_terrain_7_3",
"val_smart_terrain_7_4",
"val_smart_terrain_7_5",
"yan_smart_terrain_6_4",
"zat_b40_smart_terrain",
"zat_stalker_base_smart"
},
["sim_smr_minimal"] = {
"bar_dolg_bunker",
"bar_dolg_general",
"bar_visitors",
"bar_zastava",
"bar_zastava_2",
"yan_smart_terrain_6_4",
"zat_stalker_base_smart"
},
["sim_smr_none"] = {}
}
local civil_war_stalkers = {}
function smart_is_base(smart)
local l = smart_bases[smr_stalkers_mcm.get_config("base_population")]
for i,n in ipairs(l) do
if smart == n then return true end
end
return false
end
local function setup_squad_relation(squad, member)
local sim = alife()
for k in squad:squad_members() do
if (member.id ~= k.id) then
local se_obj = sim:object(member.id)
local se_obj2 = sim:object(k.id)
smr_debug.get_log().info("civilwar/relations", "setting up squad relations between %s and %s in squad %s", se_obj:section_name(), se_obj2:section_name(), squad:section_name())
-- these are cse_alife_human_abstract objs, their implementation of force_set_goodwill takes an ID as parameter.
se_obj:force_set_goodwill(5000, se_obj2.id)
se_obj2:force_set_goodwill(5000, se_obj.id)
end
end
end
local function setup_stalker_relation(squad)
local sim = alife()
for k in squad:squad_members() do
local se_obj = sim:object(k.id)
if (not IsStalker(nil, se_obj:clsid())) then
smr_debug.get_log().info("civilwar/relations", "not a stalker: %s in squad %s", se_obj:section_name(), squad:section_name())
goto continue
end
smr_debug.get_log().info("civilwar/relations", "setting up relations for %s in squad %s", se_obj:section_name(), squad:section_name())
se_obj:force_set_goodwill(-5000, sim:object(0))
for i, n in ipairs(game_relations.factions_table) do
relation_registry.set_community_goodwill(n, k.id, -2000)
game_relations.change_factions_community_num(n, k.id, -2000)
end
if smr_stalkers_mcm.get_config("civil_war") == "civilwar_squads" then
setup_squad_relation(squad, k)
end
::continue::
end
civil_war_stalkers[squad.id] = true
end
-- ---
-- ENTRY POINTS
-- ---
-- simulation_board:fill_start_position()
function setup_factions_relation()
if smr_stalkers_mcm.get_config("civil_war_monolith_allied") then
smr_debug.get_log().info("civilwar/relations", "monolith are allied")
relation_registry.set_community_relation("monolith", "monolith", 2000)
else
smr_debug.get_log().info("civilwar/relations", "monolith are enemies")
relation_registry.set_community_relation("monolith", "monolith", -5000)
end
if smr_stalkers_mcm.get_config("civil_war") == "civilwar_factions" then
apply_faction_civil_war()
end
end
-- smart_terrain.se_smart_terrain:try_respawn()
function setup_civil_war_squad(squad, smart)
if (not smr_amain_mcm.get_config("smr_enabled")) or smr_stalkers_mcm.get_config("civil_war") == "civilwar_disabled" then
-- smr_debug.get_log().info("civilwar", "ZCP or civil war disabled, skipping setup")
return
end
if (not smr_stalkers_mcm.get_config("civil_war_base_population")) and smart_is_base(smart) then
smr_debug.get_log().info("civilwar/relations", "smart %s is base, skipping squad %s", smart, squad:section_name())
return
end
local faction = ini_sys:r_string_ex(squad:section_name(), "faction")
if is_squad_monster[faction] then
smr_debug.get_log().info("civilwar/relations", "skipping monster squad %s", squad:section_name())
return
end
setup_stalker_relation(squad)
end
function squad_on_npc_death(squad, npc, killer)
if not smr_amain_mcm.get_config("smr_enabled") then
return
end
if (not (killer.id == AC_ID) and civil_war_stalkers[squad.id]) then
return
end
local pf = db.actor:character_community()
local nf = squad:get_squad_community()
if game_relations.is_factions_enemies(pf, nf) then
smr_debug.get_log().info("civilwar/relations", "actor killed enemy stalker %s", squad:section_name())
return
elseif game_relations.is_factions_friends(pf, nf) then
smr_debug.get_log().info("civilwar/relations", "actor killed friendly stalker %s", squad:section_name())
db.actor:change_character_reputation(100)
else
smr_debug.get_log().info("civilwar/relations", "actor killed neutral stalker %s", squad:section_name())
db.actor:change_character_reputation(75)
end
if (squad:npc_count() == 0) then
smr_debug.get_log().info("civilwar/relations", "actor killed last member of squad %s", squad:section_name())
civil_war_stalkers[squad.id] = nil
end
end
local function save_state(data)
if not (data.smr_civil_war) then
data.smr_civil_war = {}
end
data.smr_civil_war.civil_war_stalkers = civil_war_stalkers
end
local function load_state(data)
if not (data.smr_civil_war) then
return
end
civil_war_stalkers = data.smr_civil_war.civil_war_stalkers or {}
data.smr_civil_war.civil_war_stalkers = {}
end
function on_game_start()
if (not smr_amain_mcm.get_config("smr_enabled")) or smr_stalkers_mcm.get_config("civil_war") == "civilwar_disabled" then
smr_debug.get_log().info("civilwar", "Civil War disabled")
return
end
setup_factions_relation()
RegisterScriptCallback("save_state", save_state)
RegisterScriptCallback("load_state", load_state)
RegisterScriptCallback("squad_on_npc_death", squad_on_npc_death)
end
@@ -0,0 +1,62 @@
--[[
------------------------------------------------------------
-- Survival Mode Remade - Persistent configuration per savefile
------------------------------------------------------------
-- Saves/Load configuration state to/from savefile.
-- by dph-hcl
------------------------------------------------------------
]]--
local collection = "SMR"
local modules = {
"smr_amain",
"smr_loot",
"smr_zzintegration",
"smr_zombies",
"smr_stalkers",
}
local function load_state(data)
if smr_amain_mcm.get_config("smr_persist_override") then
return
end
local t = axr_main.config:collect_section("mcm")
for p, v in pairs(t) do
for i, m in ipairs(modules) do
if not data[m] then
goto continue
end
local pp = str_explode(p, "/")
if (pp[1] and pp[1] == collection)
and (pp[2] and pp[2] == m)
and (pp[3])
then
ui_mcm.set(p, (data[m][p] or false))
end
::continue::
end
end
end
local function save_state(data)
local t = axr_main.config:collect_section("mcm")
for p, v in pairs(t) do
for i, m in ipairs(modules) do
if not data[m] then
data[m] = {}
end
local pp = str_explode(p, "/")
if (pp[1] and pp[1] == collection)
and (pp[2] and pp[2] == m)
and (pp[3])
then
data[m][p] = ui_mcm.get(p)
end
end
end
end
function on_game_start()
RegisterScriptCallback("save_state", save_state)
RegisterScriptCallback("load_state", load_state)
end
@@ -0,0 +1,37 @@
local log = false
function get_log()
if (log == false) and (dph_debug_log) then
local log_config = {
["file"] = "dph_zcp.log",
["targets"] = {
-- ["log"] = 1,
["gamelog"] = 1,
}
}
local modules = {
"loot",
"integration",
"population",
"civilwar",
"smart",
"simboard",
"anomalies"
}
log = dph_debug_log.new(log_config, modules)
if (smr_amain_mcm.get_config("smr_debug_log")) then
log.enable()
end
end
return log
end
function on_option_change()
if smr_amain_mcm.get_config("smr_debug_log") then
log.enable()
else
log.disable()
end
end
RegisterScriptCallback("on_option_change", on_option_change)
@@ -0,0 +1,461 @@
--[[
------------------------------------------------------------
-- Survival Mode Remade - Extra items from stash boxes
------------------------------------------------------------
-- MCM-configurable script to give the player a chance to get some extra items whenever they open a stash box.
-- by dph-hcl
------------------------------------------------------------
]]--
-- REPAIR KITS
local repair_tier1 = {
"glue_a",
"glue_b",
"glue_e",
"gun_oil",
"gun_oil_ru",
"gun_oil_ru_d",
"armor_repair_fa",
"sharpening_stones",
}
local repair_tier2 = {
"sharpening_stones",
"cleaning_kit_p",
"cleaning_kit_s",
"cleaning_kit_r5",
"cleaning_kit_r7",
"sewing_kit_b",
"sewing_kit_a",
}
local repair_tier3 = {
"cleaning_kit_u",
"toolkit_p",
"toolkit_s",
"sewing_kit_h",
"medium_repair_kit",
"helmet_repair_kit",
"light_repair_kit",
}
local repair_tier4 = {
"toolkit_r5",
"toolkit_r7",
"heavy_repair_kit",
"exo_repair_kit",
}
-- BASIC AMMO
local basic_ammo = {
"ammo_11.43x23_fmj",
"ammo_12x70_buck",
"ammo_7.62x25_p",
"ammo_12x76_zhekan",
"ammo_5.45x39_fmj",
"ammo_5.45x39_ep",
"ammo_5.56x45_fmj",
"ammo_5.56x45_ss190",
"ammo_9x18_fmj",
"ammo_9x19_fmj",
"ammo_11.43x23_hydro",
"ammo_12x76_dart",
"ammo_7.62x25_ps",
"ammo_5.45x39_ap",
"ammo_5.56x45_ap",
"ammo_9x18_ap",
"ammo_9x18_pmm",
"ammo_9x19_ap",
"ammo_9x19_pbp",
}
-- ADVANCED AMMO
local advanced_ammo = {
"ammo_357_hp_mag",
"ammo_7.62x39_fmj",
"ammo_7.62x51_fmj",
"ammo_7.62x54_7h1",
"ammo_9x39_pab9",
"ammo_7.62x39_ap",
"ammo_7.62x51_ap",
"ammo_7.62x54_7h14",
"ammo_7.62x54_ap",
"ammo_9x39_ap",
}
-- EXOTIC AMMO
local exotic_ammo = {
"ammo_12.7x55_fmj",
"ammo_4.6x30_fmj",
"ammo_5.7x28_ss195",
"ammo_7.92x33_fmj",
"ammo_m209",
"ammo_vog-25",
"ammo_12.7x55_ap",
"ammo_5.7x28_ss190",
"ammo_50_bmg",
"ammo_7.92x33_ap",
"ammo_magnum_300",
"ammo_pkm_100",
"ammo_gauss",
}
-- USEFUL ITEMS
local useful_tier1 = {
"device_torch_dummy",
"batteries_dead", "batteries_dead", "batteries_dead",
"detector_simple",
"af_iam",
"itm_sleepbag",
"wpn_knife2",
"wpn_axe",
"kit_hunt",
"wpn_binoc_inv",
"itm_actor_backpack",
"leatherman_tool",
"itm_sleepbag",
"equ_small_pack",
"af_aac",
}
local useful_tier2 = {
"device_torch_nv_1",
"detector_advanced",
"wpn_knife3",
"wpn_axe2",
"equ_small_military_pack",
"itm_tent",
}
local useful_tier3 = {
"device_torch_nv_2",
"detector_scientific",
"wpn_knife4",
"wpn_knife5",
"wpn_axe3",
"equ_military_pack",
}
local useful_tier4 = {
"device_torch_nv_3",
"detector_elite",
"af_aam",
"equ_tourist_pack",
}
-- MEDICAL ITEMS
local meds_tier1 = {
"bandage",
"caffeine",
"drug_sleepingpills",
"drug_coagulant",
"yadylin",
"medkit",
"jgut",
"glucose_s",
"antirad",
"antirad_cystamine",
}
local meds_tier2 = {
"medkit_army",
"stimpack",
"salicidic_acid",
"glucose",
"drug_psy_blockade",
"antirad_kalium",
"medkit_ai1",
"akvatab",
}
local meds_tier3 = {
"medkit_scientic",
"stimpack_army",
"morphine",
"drug_radioprotector",
"medkit_ai3",
"adrenalin",
"drug_anabiotic",
}
local meds_tier4 = {
"stimpack_scientic",
"survival_kit",
"medkit_ai2",
}
local lootboxes_tier1 = {
"lootbox_1",
"lootbox_11",
"lootbox_2",
"lootbox_5",
"lootbox_51",
}
local lootboxes_tier2 = {
"lootbox_7",
"lootbox_4",
"lootbox_41",
"lootbox_6",
"lootbox_61",
"lootbox_71",
"lootbox_3",
}
local lootboxes_tier3 = {
"lootbox_8",
"lootbox_81",
"lootbox_9",
}
-- table of already looted boxes
local boxes = {}
-- table of already looted npcs
local npcs = {}
local pda_msg_status = true
local function pda_message(type)
local strs = {
["repair"] = "st_smr_loot_found_repair",
["ammo"] = "st_smr_loot_found_ammo",
["meds"] = "st_smr_loot_found_meds",
["useful"] = "st_smr_loot_found_useful",
["mags"] = "st_smr_loot_found_mags",
["lootbox"] = "st_smr_loot_found_lootbox",
}
if (not smr_loot_mcm.get_config("send_message")) or (not pda_msg_status) then
return
end
db.actor:give_game_news(game.translate_string(strs[type]), "", "ui_inGame2_Polucheni_koordinaty_taynika", 0, 3000)
smr_debug.get_log().info("loot/general", "PDA message sent: %s", strs[type])
xr_sound.set_sound_play(AC_ID, "pda_tips")
end
-- creates an item with a random amount of uses or condition
local function create_item_random_uses(i, box)
smr_debug.get_log().info("loot/general", "Creating item with random uses: %s", i)
local max_uses = ini_sys:r_float_ex(i, "max_uses")
local se_item = alife_create_item(i, box)
if max_uses then
alife_process_item(i, se_item.id, {uses = (math.random(1, max_uses))})
elseif utils_item.is_degradable(nil, se_item.id) then
alife_process_item(i, se_item.id, {cond = (math.random(50,100)/100)})
end
end
local function roll_item_tiered(t, box)
local r = math.random(1,100)
table.sort(t, function(a, b) return a[1] > b[1] end)
for i, n in ipairs(t) do
if (r >= n[1]) then
local itm = n[2][math.random(#n[2])]
smr_debug.get_log().info("loot/rolls", "Rolled succesfully for %s (%s >= %s)", itm, r, n[1])
create_item_random_uses(itm, box)
return true
end
end
return false
end
function try_spawn_lootbox(box)
if math.random(1,100) <= smr_zzintegration_mcm.get_config("lootboxes_chance") then
pda_message("lootbox")
local tbl = {
{ 90, lootboxes_tier3},
{ 50, lootboxes_tier2},
{ 0, lootboxes_tier1},
}
roll_item_tiered(tbl, box)
end
end
function try_spawn_mag(box)
if math.random(1,100) <= smr_zzintegration_mcm.get_config("mags_redux_chance") then
smr_debug.get_log().info("integration", "Rolling for magazine")
local mags = {}
for i=1,3 do
local wpn = db.actor:item_in_slot(i)
if wpn and magazine_binder.is_supported_weapon(wpn) then
mags = magazine_binder.get_mags_for_basetype(magazine_binder.get_weapon_base_type(wpn))
end
end
if (next(mags) == nil) then
return
end
pda_message("mags")
alife_create_item(mags[math.random(#mags)], box)
end
end
-- rolls for a repair kit, and spawns if sucessful
function try_spawn_repair(box)
if math.random(1,100) <= smr_loot_mcm.get_config("repair_chance") then
pda_message("repair")
local tbl = {
{ 90, repair_tier4},
{ 50, repair_tier3},
{ 0, repair_tier2},
}
roll_item_tiered(tbl, box)
end
end
function try_spawn_repair_minor(box)
if math.random(1,100) <= smr_loot_mcm.get_config("repair_minor_chance") then
pda_message("repair")
create_item_random_uses(repair_tier1[math.random(#repair_tier1)], box)
end
end
-- rolls for ammo, and spawns if sucessful
function try_spawn_ammo(box)
if math.random(1,100) <= smr_loot_mcm.get_config("ammo_chance") then
pda_message("ammo")
local r = math.random(1,100)
if r > 90 then create_ammo(exotic_ammo[math.random(#exotic_ammo)], box)
elseif r > 60 then create_ammo(advanced_ammo[math.random(#advanced_ammo)], box)
else create_ammo(basic_ammo[math.random(#basic_ammo)], box)end
end
end
-- rolls for an medical item, and spawns if sucessful
function try_spawn_meds(box)
if math.random(1,100) <= smr_loot_mcm.get_config("meds_chance") then
pda_message("meds")
local tbl = {
{ 90, meds_tier4},
{ 70, meds_tier3},
{ 40, meds_tier2},
{ 0, meds_tier1},
}
roll_item_tiered(tbl, box)
end
end
-- rolls for a useful item, and spawns if sucessful
function try_spawn_useful(box)
local f = factor or 1
if math.random(1,100) <= smr_loot_mcm.get_config("useful_chance") then
pda_message("useful")
local tbl = {
{ 90, useful_tier4},
{ 70, useful_tier3},
{ 40, useful_tier2},
{ 0, useful_tier1},
}
roll_item_tiered(tbl, box)
end
end
-- creates a random amount of ammo in a box
function create_ammo(i, box)
local se_item
if smr_loot_mcm.get_config("ammo_bad_spawn") and (math.random(1,100) <= smr_loot_mcm.get_config("ammo_bad_chance"))
then se_item = alife_create_item(i .. "_bad", box)
else se_item = alife_create_item(i, box) end
local bs = ini_sys:r_float_ex(i, "box_size") or 10
local r = math.ceil(math.random(bs/2, bs*2) * smr_loot_mcm.get_config("ammo_amount"))
alife_process_item(i, se_item.id, {ammo = r})
end
function try_spawn(box)
if smr_zzintegration_mcm.get_config("mags_redux") and magazines then smr_loot.try_spawn_mag(box) end
if smr_zzintegration_mcm.get_config("lootboxes") and arti_lootboxes_mcm then smr_loot.try_spawn_lootbox(box) end
if smr_loot_mcm.get_config("repair_spawn") then smr_loot.try_spawn_repair(box) end
if smr_loot_mcm.get_config("repair_minor_spawn") then smr_loot.try_spawn_repair_minor(box) end
if smr_loot_mcm.get_config("ammo_spawn") then smr_loot.try_spawn_ammo(box) end
if smr_loot_mcm.get_config("useful_spawn") then smr_loot.try_spawn_useful(box) end
if smr_loot_mcm.get_config("meds_spawn") then smr_loot.try_spawn_meds(box) end
end
-- ---
-- ENTRY POINTS
-- ---
-- callback, used to write box table to save
local function save_state(data)
if not (data.smr_loot) then
data.smr_loot = {}
end
data.smr_loot.npcs = npcs
data.smr_loot.boxes = boxes
end
-- callback, used to load box table from save
local function load_state(data)
if not (data.smr_loot) then
return
end
boxes = data.smr_loot.boxes or {}
data.smr_loot.boxes = {}
npcs = data.smr_loot.npcs or {}
data.smr_loot.npcs = {}
end
-- callback, when opening boxes
local function physic_object_on_use_callback(box)
local id = box:id()
local player_stashes = alife_storage_manager.get_state().player_created_stashes
if (id and boxes and boxes[id]) or (player_stashes and player_stashes[id]) then
return
end
if (IsInvbox(box)) then
try_spawn(box)
boxes[id] = true
end
end
local function npc_on_death_callback(obj, who)
local id = obj:id()
if id and npcs and npcs[id] then
return
end
if math.random(1,100) <= smr_loot_mcm.get_config("npc_chance") then
pda_msg_status = false
try_spawn(obj)
pda_msg_status = true
npcs[id] = true
end
end
-- register callback for box opening
local function actor_on_first_update()
if smr_amain_mcm.get_config("smr_enabled") then
RegisterScriptCallback("physic_object_on_use_callback", physic_object_on_use_callback)
if smr_loot_mcm.get_config("npc_spawn") then
RegisterScriptCallback("npc_on_death_callback", npc_on_death_callback)
end
end
end
-- register callbacks for saving/loading
function on_game_start()
if not smr_amain_mcm.get_config("smr_enabled") then
return
end
if smr_zzintegration_mcm.get_config("glowsticks") and zz_glowstick_mcm then
table.insert(useful_tier1, "device_glowstick_orange")
table.insert(useful_tier1, "device_glowstick_red")
table.insert(useful_tier1, "device_glowstick_blue")
table.insert(useful_tier1, "device_glowstick")
end
if smr_zzintegration_mcm.get_config("lootboxes") and arti_lootboxes_mcm then
table.insert(useful_tier1, "lockpick")
table.insert(useful_tier1, "bundle_lockpick")
table.insert(useful_tier2, "lockpick_set")
table.insert(useful_tier4, "skeleton_key")
end
if smr_loot_mcm.get_config("repair_parts_spawn") then
table.insert(repair_tier1, "ramrod_tool")
table.insert(repair_tier1, "rasp_tool")
table.insert(repair_tier1, "sewing_thread")
table.insert(repair_tier2, "heavy_sewing_thread")
end
RegisterScriptCallback("save_state", save_state)
RegisterScriptCallback("load_state", load_state)
RegisterScriptCallback("npc_on_death_callback", npc_on_death_callback)
RegisterScriptCallback("actor_on_first_update", actor_on_first_update)
end
@@ -0,0 +1,55 @@
local defaults = {
["send_message"] = true,
["npc_spawn"] = true,
["npc_chance"] = 10,
["repair_spawn"] = false,
["repair_parts_spawn"] = true,
["repair_chance"] = 15,
["ammo_spawn"] = false,
["ammo_chance"] = 20,
["ammo_bad_spawn"] = true,
["ammo_bad_chance"] = 50,
["ammo_amount"] = 1,
["useful_spawn"] = false,
["useful_chance"] = 10,
["random_items"] = 0.5,
}
function get_config(key)
if ui_mcm then return ui_mcm.get("SMR/smr_loot/"..key) else return defaults[key] end
end
function on_mcm_load()
return { id="smr_loot", sh=true, gr={
{ id="header", type="slide", link="ui_options_slider_economy_diff", text="ui_mcm_menu_smr_loot", size= {512,50}, spacing=20 },
{ id="random_items", type="track", val=2, min=0, max=1, step=0.05, def=0.5},
{ id="loot_divider", type="line" },
{ id="general_info", type="desc", text="ui_mcm_SMR_smr_loot_general_info", },
{ id="send_message", type="check", val=1, def=true},
{ id="npc_spawn", type="check", val=1, def=true},
{ id="npc_chance", type="track", val=2, min=1, max=100, step=1, def=10 },
-- repair
{ id="repair_divider", type="line" },
{ id="repair_spawn", type="check", val=1, def=false},
{ id="repair_chance", type="track", val=2, min=1, max=100, step=1, def=5 },
{ id="repair_minor_divider", type="line" },
{ id="repair_minor_spawn", type="check", val=1, def=true},
{ id="repair_parts_spawn", type="check", val=1, def=true},
{ id="repair_minor_chance", type="track", val=2, min=1, max=100, step=1, def=15 },
-- useful items
{ id="useful_divider", type="line" },
{ id="useful_spawn", type="check", val=1, def=false},
{ id="useful_chance", type="track", val=2, min=1, max=100, step=1, def=10 },
-- meds
{ id="meds_divider", type="line" },
{ id="meds_spawn", type="check", val=1, def=false},
{ id="meds_chance", type="track", val=2, min=1, max=100, step=1, def=15 },
-- ammo
{ id="ammo_divider", type="line" },
{ id="ammo_spawn", type="check", val=1, def=false},
{ id="ammo_chance", type="track", val=2, min=1, max=100, step=1, def=20 },
{ id="ammo_amount", type="track", val=2, min=0.1, max=3, step=0.1, def=1 },
{ id="ammo_bad_spawn", type="check", val=1, def=true},
{ id="ammo_bad_chance", type="track", val=2, min=1, max=100, step=1, def=50 },
}}, "SMR"
end
@@ -0,0 +1,9 @@
SetActiveSubdialog = pda.set_active_subdialog
pda.set_active_subdialog = function(section)
if smr_amain_mcm.get_config("smr_enabled") and smr_amain_mcm.get_config("glitched_pda") then
return ui_pda_glitched_tab.get_ui()
end
return SetActiveSubdialog(section)
end
@@ -0,0 +1,59 @@
local defaults = {
}
function get_config(key)
if ui_mcm then return ui_mcm.get("SMR/smr_mutants/"..key) else return defaults[key] end
end
function on_mcm_load()
return { id="smr_mutants", sh=true, gr={
{ id="title_header", type="slide", link="ui_options_slider_weather_foggy", text="ui_mcm_menu_smr_mutants", size= {512,50}, spacing=20 },
{ id="squad_size", type="track", val=2, min=0.1, max=5, step=0.1, def=1 },
{ id="squad_size_variance", type="track", val=2, min=0, max=3, step=0.1, def=0 },
{ id="squad_size_divider", type="line" },
{ id="random_mutants", type="check", val=1, def=false },
{ id="random_mutants_chance", type="track", val=2, min=1, max=100, step=1, def=10 },
{ id="types_divider", type="line" },
{ id="types_header", type="title", text="ui_mcm_smr_mutants_types_title", align="c" },
{ id="types_info", type="desc", clr={200, 125, 125, 125}, text="ui_mcm_SMR_smr_mutants_types_info", },
{ id="types_replace_squads", type="check", val=1, def=false },
{ id="types_replace_divider", type="line" },
{ id="dogp", type="check", val=1, def=true},
{ id="psydogp", type="check", val=1, def=true},
{ id="ratp", type="check", val=1, def=true},
{ id="tushkanop", type="check", val=1, def=true},
{ id="zombiep", type="check", val=1, def=true},
{ id="fracturep", type="check", val=1, def=true},
{ id="catp", type="check", val=1, def=true},
{ id="fleshp", type="check", val=1, def=true},
{ id="boarp", type="check", val=1, def=true},
{ id="snorkp", type="check", val=1, def=true},
{ id="psysuckerp", type="check", val=1, def=true},
{ id="bloodsuckerp", type="check", val=1, def=true},
{ id="lurkerp", type="check", val=1, def=true},
{ id="karlikp", type="check", val=1, def=true},
{ id="burerp", type="check", val=1, def=true},
{ id="poltergeistp", type="check", val=1, def=true},
{ id="controllerp", type="check", val=1, def=true},
{ id="chimerap", type="check", val=1, def=true},
{ id="gigantp", type="check", val=1, def=true},
{ id="unused_divider", type="line" },
{ id="unused_header", type="title", text="ui_mcm_smr_mutants_unused_title", align="c" },
{ id="unused_info", type="desc", clr={200, 125, 125, 125}, text="ui_mcm_smr_mutants_unused_info", },
{ id="bibliotekarp", type="check", val=1, def=false},
{ id="boryap", type="check", val=1, def=false},
{ id="unused_types_info", type="desc", clr={200, 125, 125, 125}, text="ui_mcm_smr_mutants_unused_types_info", },
{ id="unused_types_chance", type="track", val=2, min=1, max=100, step=1, def=20 },
{ id="bloodsucker_strong_bigp", type="check", val=1, def=false},
{ id="burer_electrap", type="check", val=1, def=false},
{ id="burer_firerp", type="check", val=1, def=false},
{ id="flesh_bolotp", type="check", val=1, def=false},
{ id="gigant_jumperp", type="check", val=1, def=false},
{ id="snork_no_maskp", type="check", val=1, def=false},
{ id="zombie_babkap", type="check", val=1, def=false},
{ id="zombie_gholp", type="check", val=1, def=false},
{ id="zombie_ghostp", type="check", val=1, def=false},
{ id="zombie_tetap", type="check", val=1, def=false},
{ id="zombie_wichp", type="check", val=1, def=false},
}}, "SMR"
end
@@ -0,0 +1,412 @@
--[[
------------------------------------------------------------
-- Survival Mode Remade - Setup Zone population and manage smart terrain spawms
------------------------------------------------------------
-- by dph-hcl
------------------------------------------------------------
]]--
local zombie_spawn_table = {}
local zombie_spawn_cfg = {
["zombifiedp"] = { "zombied_sim_squad_novice", "zombied_sim_squad_advanced", "zombied_sim_squad_veteran" },
["fracturep"] = { "simulation_fracture" },
["snorkp"] = { "simulation_snork" },
["bloodsuckerp"] = { "simulation_bloodsucker" },
["psysuckerp"] = { "simulation_psysucker" },
["blindp"] = { "simulation_zombie_blind_3zomb_civ", "simulation_zombie_blind_3zomb" },
}
local faction_spawn_table = {}
local faction_spawn_cfg = {
"stalker", "bandit", "csky", "duty", "freedom", "merc", "army", "ecolog", "monolith", "renegade", "greh", "isg", "zombied"
}
local retarded_squad_names = {
["duty_sim_squad_alpha"] = "dolg_sim_squad_alpha",
["merc_sim_squad_alpha"] = "killer_sim_squad_alpha",
["duty_sim_squad_trader"] = "dolg_sim_squad_trader",
["duty_sim_squad_medic"] = "dolg_sim_squad_medic",
["duty_sim_squad_barman"] = "dolg_sim_squad_barman",
["duty_sim_squad_mechanic"] = "dolg_sim_squad_mechanic",
}
local mutant_spawn_table = {}
local mutant_spawn_cfg = {
["psysucker_"] = "psysuckerp",
["bloodsucker_"] = "bloodsuckerp",
["boar_"] = "boarp",
["snork_"] = "snorkp",
["chimera_"] = "chimerap",
["m_controller_"] = "controllerp",
["dog_"] = "dogp",
["tushkano_"] = "tushkanop",
["pseudodog_"] = "dogp",
["fracture_"] = "fracturep",
["lurker_"] = "lurkerp",
["cat_"] = "catp",
["psy_dog_"] = "psydogp",
["m_karlik_"] = "karlikp",
["burer_"] = "burerp",
["m_poltergeist_"] = "poltergeistp",
["gigant_"] = "gigantp",
["flesh_"] = "fleshp",
["rat_"] = "ratp",
["zombie_"] = "zombiep",
["borya_"] = "boryap",
["bibliotekar_"] = "bibliotekarp",
}
local unused_mutant_spawn_table = {}
local unused_mutant_spawn_cfg = {
["bloodsucker_strong_bigp"] = { "bloodsucker_strong_big" },
["burer_electrap"] = { "burer_electra" },
["burer_firerp"] = { "burer_fire" },
["flesh_bolotp"] = { "flesh_bolot", "flesh_bolot1" },
["gigant_jumperp"] = { "gigant_jumper" },
["snork_no_maskp"] = { "snork_normal_no_mask", "snork_strong_no_mask", "snork_weak_no_mask" },
["zombie_babkap"] = { "zombi_babka_1", "zombi_babka_2", "zombi_babka_3" },
["zombie_gholp"] = { "zombie_ghol" },
["zombie_ghostp"] = { "zombie_ghost" },
["zombie_tetap"] = { "zombie_teta" },
["zombie_wichp"] = { "zombie_wich" },
}
local mutant_spawn_squads = {}
local function please_die_sid()
local ids = {"red_forester_tech", "esc_m_trader"}
for i, n in ipairs(ids) do
smr_debug.get_log().info("population", "removing story object %s", n)
local so = get_story_object_id(n)
if so then alife_release_id(so) end
end
end
function get_mutant_spawn_squads()
if next(mutant_spawn_squads) == nil then
local ini = ini_file("plugins\\zcp\\squads_by_type.ltx")
for m, c in pairs(mutant_spawn_cfg) do
if (smr_mutants_mcm.get_config(c) == true) then
local squads = smr_utils.ini_lines_to_table(ini, c)
for i, v in ipairs(squads) do
table.insert(mutant_spawn_squads, v)
end
end
end
end
return mutant_spawn_squads
end
function get_unused_mutant_spawn_table()
if next(unused_mutant_spawn_table) == nil then
for m, c in pairs(unused_mutant_spawn_cfg) do
if (smr_mutants_mcm.get_config(m) == true) then
local mn = str_explode(m, "_")
if not unused_mutant_spawn_table[mn[1]] then
unused_mutant_spawn_table[mn[1]] = {}
end
for i, v in ipairs(c) do
table.insert(unused_mutant_spawn_table[mn[1]], v)
end
end
end
end
return unused_mutant_spawn_table
end
function get_zombie_spawn_table()
if next(zombie_spawn_table) == nil then
for k, n in pairs(zombie_spawn_cfg) do
if smr_zombies_mcm.get_config(k) then
for i, s in ipairs(n) do
table.insert(zombie_spawn_table, s)
end
end
end
if next(zombie_spawn_table) == nil or smr_zombies_mcm.get_config("zombiesp") then
for i = 1, smr_zombies_mcm.get_config("zombies_amount") do
table.insert(zombie_spawn_table, "simulation_zombie")
end
end
end
return zombie_spawn_table
end
function get_faction_spawn_table()
if next(faction_spawn_table) == nil then
for k, n in ipairs(faction_spawn_cfg) do
if smr_stalkers_mcm.get_config(n) then
table.insert(faction_spawn_table, n)
end
end
end
if next(faction_spawn_table) == nil then
table.insert(faction_spawn_table, "stalker")
end
return faction_spawn_table
end
function is_squad_faction_enabled(squad)
local t = get_faction_spawn_table()
local faction = ini_sys:r_string_ex(squad, "faction")
if faction == "dolg" then
faction = "duty"
end
if faction == "killer" then
faction = "merc"
end
for i, f in ipairs(t) do
if (faction == f) then
return true
end
end
return false
end
function get_mutant_spawn_table()
if next(mutant_spawn_table) == nil then
for m, c in pairs(mutant_spawn_cfg) do
if (smr_mutants_mcm.get_config(c) == true) then
table.insert(mutant_spawn_table, m)
end
end
if next(mutant_spawn_table) == nil then
table.insert(mutant_spawn_table, "chimera_")
end
end
return mutant_spawn_table
end
function is_mutant_type_enabled(section)
local t = get_mutant_spawn_table()
for i, m in pairs(t) do
if (string.sub(section, 1, string.len(m)) == m) then
return true
end
end
return false
end
local function get_random_enabled_mutant_squad()
local t = get_mutant_spawn_squads()
return t[math.random(#t)]
end
local function get_common_squad_type(squad_name)
local ss = str_explode(squad_name, "_")
if ss[4] == "novice"
or ss[4] == "advanced"
or ss[4] == "veteran"
or ss[4] == "alpha"
or ss[4] == "trader"
or ss[4] == "medic"
or ss[4] == "barman"
or ss[4] == "mechanic"
then
return ss[4]
end
return false
end
local function release_npc_or_squad(npc, squad)
alife_release(npc)
if (squad:npc_count() <= 1) then
alife_release_id(squad.id)
end
end
local function try_spawn_faction(orig_spawn, smart)
if (not orig_spawn) then
return false
end
-- setup comparable squad of random enabled faction
local t = get_faction_spawn_table()
local st = { "novice", "veteran", "advanced" }
local squad_type = get_common_squad_type(orig_spawn) or st[math.random(#st)]
local tt = t[math.random(#t)] .. "_sim_squad_" .. squad_type
for n, r in pairs(retarded_squad_names) do
if tt == n then
tt = r
end
end
-- random stalkers
if smr_stalkers_mcm.get_config("random_stalkers")
and (math.random(1,100) <= smr_stalkers_mcm.get_config("random_stalkers_chance"))
-- only replace common squads with random stalkers
and (ini_sys:r_bool_ex(orig_spawn, "common"))
-- check if smart is base
and (not smr_civil_war.smart_is_base(smart:name()))
then
smr_debug.get_log().info("population/stalkers", "replaced squad %s with random stalkers %s (smart: %s)", orig_spawn, tt, smart:name())
return tt
end
-- check if faction is enabled
if is_squad_faction_enabled(orig_spawn) then
smr_debug.get_log().info("population/stalkers", "faction enabled - returning %s", orig_spawn)
return orig_spawn
end
-- replace if option enabled
if not smr_stalkers_mcm.get_config("factions_replace_squads") then
smr_debug.get_log().info("population/stalkers", "faction %s not enabled - not spawning squad %s", ini_sys:r_string_ex(orig_spawn,"faction"), orig_spawn)
return false
end
smr_debug.get_log().info("population/stalkers", "faction %s not enabled: replaced squad %s with random stalkers %s", ini_sys:r_string_ex(orig_spawn,"faction"), orig_spawn, tt)
return tt
end
local function add_random_npc_to_squad(squad, smart)
local npcs = ini_sys:r_string_ex(squad:section_name(),"npc_random")
if (not npcs) then
-- npcs = ini_sys:r_string_ex(squad:section_name(),"npc")
return
end
local t = parse_names(npcs)
local section = t[math.random(#t)]
local faction = ini_sys:r_string_ex(squad:section_name(), "faction")
if is_squad_monster[faction] and (not is_mutant_type_enabled(section)) then
smr_debug.get_log().warn("population/monsters", "could not add %s to squad %s (type disabled)", section, squad:section_name(), faction)
return nil
end
local npc = alife_create(section, smart)
if not npc then
smr_debug.get_log().error("population/monsters", "error while adding %s to squad %s", section, squad:section_name())
return nil
end
squad:register_member(npc.id)
smr_debug.get_log().info("population/monsters", "added %s to squad %s", section, squad:section_name())
return npc
end
-- ---
-- ENTRY POINTS
-- ---
-- smart_terrain.se_smart_terrain:try_respawn()
-- simulation_board:fill_start_position()
function smr_handle_spawn(orig_spawn, smart)
-- player wished for control
if has_alife_info("actor_made_wish_for_control") then
return SIMBOARD:create_squad(smart, "simulation_controller_psy")
end
-- ZCP not enabled
if not smr_amain_mcm.get_config("smr_enabled") then
smr_debug.get_log().info("population", "not replacing spawn -- ZCP disabled")
return SIMBOARD:create_squad(smart, orig_spawn)
end
-- zombies
local rnd = math.random(1,100)
if smr_zombies_mcm.get_config("zombie_spawn")
and rnd <= smr_zombies_mcm.get_config("zombie_chance")
-- only replace common squads
and ini_sys:r_bool_ex(orig_spawn,"common")
-- skip bases
and (not smr_civil_war.smart_is_base(smart))
then
local t = get_zombie_spawn_table()
local tt = t[math.random(#t)]
smr_debug.get_log().info("population/zombies", "replaced squad %s with zombie variant %s (%s <= %s)", orig_spawn, tt, rnd, smr_zombies_mcm.get_config("zombie_chance"))
return SIMBOARD:create_squad(smart, tt)
end
local faction = ini_sys:r_string_ex(orig_spawn, "faction")
-- mutant squads
if is_squad_monster[faction] then
if (string.sub(orig_spawn, 1, string.len("simulation_")) == "simulation_")
and smr_mutants_mcm.get_config("random_mutants")
and (math.random(1,100) <= smr_mutants_mcm.get_config("random_mutants_chance"))
then
local m
if smr_spawns_mcm.get_config("preset_apply_random") then
m = smr_spawn_template.get_random_squad_for_smart(smart) or get_random_enabled_mutant_squad()
smr_debug.get_log().info("population/monsters", "replaced squad %s with random mutant %s (template)", orig_spawn, m)
else
m = get_random_enabled_mutant_squad()
smr_debug.get_log().info("population/monsters", "replaced squad %s with random mutant %s", orig_spawn, m)
end
return SIMBOARD:create_squad(smart, m)
end
-- stalker squads
else
local maybe_squad_section = try_spawn_faction(orig_spawn, smart)
if maybe_squad_section then
return SIMBOARD:create_squad(smart, maybe_squad_section)
end
return nil
end
-- return original spawn
return SIMBOARD:create_squad(smart, orig_spawn)
end
-- smart_terrain.se_smart_terrain:try_respawn()
function smart_can_respawn(smart)
local name = smart:name()
local last_respawn_update = smart.last_respawn_update
-- default value
if (not smr_amain_mcm.get_config("smr_enabled")) and (smr_amain_mcm.get_config("respawn_idle") ~= 86400) then
smr_debug.get_log().info("population/smart", "default respawn check value: ZCP disabled or respawn_idle set to 86400 (testing for smart %s)", name)
return last_respawn_update == nil or curr_time:diffSec(last_respawn_update) > smart.respawn_idle
end
-- last update was nil
local cfg = smr_amain_mcm.get_config("respawn_idle")
if last_respawn_update == nil then
smr_debug.get_log().info("population/smart", "respawn check sucessful for smart %s (last update was nil)", name)
return true
end
-- respawns disabled
if cfg == -1 then
smr_debug.get_log().info("population/smart", "respawn check failed: respawns disabled (testing for smart %s)", name)
return false
end
-- use ZCP config value
local diff = game.get_game_time():diffSec(last_respawn_update)
if diff > cfg then
return true
else
return false
end
end
-- smart_terrain.se_smart_terrain:try_respawn()
-- simulation_board:fill_start_position()
function get_stalker_pop_factor()
if smr_amain_mcm.get_config("smr_enabled") then
--smr_debug.get_log().info("population/stalkers", "overriding population factor")
return smr_amain_mcm.get_config("stalker_pop_factor")
end
--smr_debug.get_log().info("population/stalkers", "ZCP disabled: using default population factor")
return ui_options.get("alife/general/alife_stalker_pop")
end
-- smart_terrain.se_smart_terrain:try_respawn()
-- simulation_board:fill_start_position()
function get_monster_pop_factor()
if smr_amain_mcm.get_config("smr_enabled") then
--smr_debug.get_log().info("population/monsters", "overriding population factor")
return smr_amain_mcm.get_config("monster_pop_factor")
end
--smr_debug.get_log().info("population/monsters", "ZCP disabled: using default population factor")
return ui_options.get("alife/general/alife_mutant_pop")
end
-- simulation_board:fill_start_position()
function get_population_preset()
if smr_amain_mcm.get_config("smr_enabled") and (smr_stalkers_mcm.get_config("base_population") ~= "sim_smr_default") then
smr_debug.get_log().info("population", "using population preset %s", "misc\\"..smr_stalkers_mcm.get_config("base_population")..".ltx")
return ini_file("misc\\"..smr_stalkers_mcm.get_config("base_population")..".ltx")
else
smr_debug.get_log().info("population", "using default population preset")
return ini_file("misc\\simulation.ltx")
end
end
local function actor_on_first_update()
if smr_amain_mcm.get_config("smr_enabled") and (smr_stalkers_mcm.get_config("base_population") == "sim_smr_none") then
smr_debug.get_log().info("population", "removing story objects")
please_die_sid()
end
end
function on_game_start()
RegisterScriptCallback("actor_on_first_update", actor_on_first_update)
end
@@ -0,0 +1,97 @@
template_cfg = {}
template_cfg_weights = {}
function get_template_config()
if next(template_cfg) == nil then
smr_debug.get_log().info("population/monsters", "Using preset %s ", smr_spawns_mcm.get_config("preset_file"))
template_cfg = load_template_config()
end
return template_cfg
end
function load_template_config()
local tcfg = {}
local msq = smr_pop.get_mutant_spawn_squads()
local ini = ini_file(smr_spawns_mcm.get_config("preset_file"))
local function itr(section)
local tmp = {}
template_cfg_weights[section] = 0
lc = ini:line_count(section)
for li=0,lc-1 do
local sq, weight = smr_utils.read_spawn_template_ln(ini, section, li)
local ss = str_explode(sq, "*")
if ss[2] and ss[3] then
local mini = ini_file("plugins\\zcp\\spawn_groups\\" .. ss[2] .. ".ltx")
for nk, nv in pairs(smr_utils.spawn_template_lines_to_table(mini, ss[3])) do
template_cfg_weights[section] = template_cfg_weights[section] + nv
tmp[nk] = nv
end
else
if smr_utils.table_has_value(msq, sq) then
tmp[sq] = weight
template_cfg_weights[section] = template_cfg_weights[section] + weight
end
end
end
if next(tmp) ~= nil then
tcfg[section] = tmp
end
end
ini:section_for_each(itr)
return tcfg
end
-- Weight code adapted from TheMrDemonized's "ZCP Kinda Balanced Spawns" (https://www.moddb.com/mods/stalker-anomaly/addons/zcp-balanced-spawns/)
function get_random_squad_for_smart(smart)
local tier = get_squad_tier()
local key = alife():level_name(game_graph():vertex(smart.m_game_vertex_id):level_id()) .. "_tier" .. tier .. "_monsters"
local mutant_table = get_template_config()[key]
if not mutant_table or next(mutant_table) == nil then
smr_debug.get_log().warn("population/monsters", "empty mutant table for %".. key)
return nil
end
local rand = math.random() * template_cfg_weights[key]
for mutant, weight in pairs(mutant_table) do
if (rand < weight) then
smr_debug.get_log().info("population/monsters", "got squad %s for section (roll: %s/%s) ".. key, mutant, rand, weight)
return mutant
end
rand = rand - weight
end
smr_debug.get_log().warn("population/monsters", "no weighted squad for section".. key)
return mutant_table[math.random(#mutant_table)]
end
function get_squad_tier()
local tier_1_fac = get_tier_factor(1)
local tier_2_fac = get_tier_factor(2)
local tier_3_fac = get_tier_factor(3)
local range = tier_1_fac + tier_2_fac + tier_3_fac
local rnd = math.random(0, range)
if rnd <= tier_1_fac then
return 1
elseif rnd <= tier_1_fac + tier_2_fac then
return 2
else
return 3
end
end
function get_tier_factor(tier)
return smr_spawns_mcm.get_config("preset_week".. actor_weeks_in_zone() .."_tier" .. tier)
end
function actor_weeks_in_zone()
if not db.actor then
return 0
end
local s_time = level.get_start_time()
local seconds = tonumber(game.get_game_time():diffSec(s_time))
local days = math.floor(((seconds/60)/60)/24)
weeks = math.floor(days/7)
if weeks > 3 then weeks = 3 end
return weeks
end
@@ -0,0 +1,52 @@
local defaults = {
}
local flist = {}
function get_config(key)
if ui_mcm then return ui_mcm.get("SMR/smr_spawns/"..key) else return defaults[key] end
end
local function get_flist()
if next(flist) == nil then
local files = getFS():file_list_open('$game_config$', "plugins\\zcp\\spawn_templates\\", bit_or(FS.FS_ListFiles, FS.FS_RootOnly))
for i=0,files:Size()-1 do
local file_name = files:GetAt(i)
table.insert(flist, {"plugins\\zcp\\spawn_templates\\" .. file_name, file_name })
end
end
return flist
end
function on_mcm_load()
local templates = get_flist()
return { id="smr_spawns", sh=true, gr={
{ id="title_header", type="slide", link="ui_options_slider_warfare", text="ui_mcm_menu_smr_spawns", size= {512,50}, spacing=20 },
{ id="preset_desc", type="desc", clr={200, 125, 125, 125}, text="ui_mcm_SMR_smr_spawns_preset_desc"},
{ id="preset_file", type="list", val=0, no_str=true, content=templates},
{ id="preset_file_desc", type="desc", clr={200, 125, 125, 125}, text="ui_mcm_SMR_smr_spawns_preset_file_desc"},
{ id="preset_apply_random", type="check", val=1, def=false },
{ id="preset_apply_replaced", type="check", val=1, def=false },
-- week 1
{ id="preset_week0_title", type="title", text="ui_mcm_smr_spawns_preset_week0_title", align="c" },
{ id="preset_week0_tier1", type="track", val=2, min=1, max=100, step=1, def=70 },
{ id="preset_week0_tier2", type="track", val=2, min=1, max=100, step=1, def=25 },
{ id="preset_week0_tier3", type="track", val=2, min=1, max=100, step=1, def=5 },
-- week 2
{ id="preset_week1_title", type="title", text="ui_mcm_smr_spawns_preset_week1_title", align="c" },
{ id="preset_week1_tier1", type="track", val=2, min=1, max=100, step=1, def=50 },
{ id="preset_week1_tier2", type="track", val=2, min=1, max=100, step=1, def=40 },
{ id="preset_week1_tier3", type="track", val=2, min=1, max=100, step=1, def=10 },
-- week 3
{ id="preset_week2_title", type="title", text="ui_mcm_smr_spawns_preset_week2_title", align="c" },
{ id="preset_week2_tier1", type="track", val=2, min=1, max=100, step=1, def=35 },
{ id="preset_week2_tier2", type="track", val=2, min=1, max=100, step=1, def=50 },
{ id="preset_week2_tier3", type="track", val=2, min=1, max=100, step=1, def=15 },
-- week 4
{ id="preset_week3_title", type="title", text="ui_mcm_smr_spawns_preset_week3_title", align="c" },
{ id="preset_week3_tier1", type="track", val=2, min=1, max=100, step=1, def=30 },
{ id="preset_week3_tier2", type="track", val=2, min=1, max=100, step=1, def=45 },
{ id="preset_week3_tier3", type="track", val=2, min=1, max=100, step=1, def=25 },
}}, "SMR"
end
@@ -0,0 +1,68 @@
function adjust_random_count(squad, c)
-- uncommon squad
if not ini_sys:r_bool_ex(squad:section_name(),"common") then
smr_debug.get_log().warn("population", "no adjustment to squad size for %s (uncommon squad)", squad:section_name())
return c
end
-- story squad
if get_story_squad(squad:section_name()) then
smr_debug.get_log().warn("population", "no adjustment to squad size for %s (story squad)", squad:section_name())
return c
end
-- get adjustment factor
local variance
local squad_size
if is_squad_monster[ini_sys:r_string_ex(squad:section_name(), "faction")] then
variance = smr_mutants_mcm.get_config("squad_size_variance")
squad_size = smr_mutants_mcm.get_config("squad_size")
else
variance = smr_stalkers_mcm.get_config("squad_size_variance")
squad_size = smr_stalkers_mcm.get_config("squad_size")
end
local varf = math.random(-variance, variance)
local fac = varf + squad_size
-- factor is 1 (no adjustment)
if (fac == 1.0) then
smr_debug.get_log().info("population", "no adjustment to squad size for %s", squad:section_name())
return c
end
-- return adjusted count
local target_count = math.floor(c * fac)
smr_debug.get_log().info("population", "adusted squad size for %s: %s -> %s", squad:section_name(), c, target_count)
return target_count
end
function replace_mutant_variant(section)
smr_debug.get_log().info("population/monsters", "FOO %s", section)
local vt = smr_pop.get_unused_mutant_spawn_table()
for m, v in pairs(vt) do
if (str_explode(section, "_")[1] == m)
and (math.random(1,100) <= smr_mutants_mcm.get_config("unused_types_chance"))
then
local mrs = v[math.random(#v)]
smr_debug.get_log().info("population/monsters", "replaced %s with variant %s", section, mrs)
return mrs
end
end
return section
end
function is_mutant_type_enabled(section)
local t = smr_pop.get_mutant_spawn_table()
for _, m in pairs(t) do
if (string.sub(section, 1, string.len(m)) == m) then
return true
end
end
return false
end
local function on_key_press(key)
if (dik == key_bindings.kSAFEMODE) then
end
end
function on_game_start()
RegisterScriptCallback("on_key_press", on_key_press)
end
@@ -0,0 +1,61 @@
local defaults = {
["base_population"] = "sim_smr_default",
["civil_war"] = "civilwar_disabled",
["civil_war_base_population"] = false,
["civil_war_monolith_allied"] = false,
["monolith_spawns"] = "disabled",
}
function get_config(key)
if ui_mcm then return ui_mcm.get("SMR/smr_stalkers/"..key) else return defaults[key] end
end
local function p_base_pop(n)
return get_config("base_population") == n
end
function on_mcm_load()
return { id="smr_stalkers", sh=true, gr={
{ id="title_header", type="slide", link="ui_options_slider_disguise", text="ui_mcm_menu_smr_stalkers", size= {512,50}, spacing=20 },
{ id="squad_size", type="track", val=2, min=0.1, max=5, step=0.1, def=1 },
{ id="squad_size_variance", type="track", val=2, min=0, max=3, step=0.1, def=0 },
{ id="squad_size_divider", type="line" },
{ id="base_population", type="list", val=0, def="sim_smr_default", content={
{"sim_smr_default", "smr_stalkers_base_population_default"},
{"sim_smr_survival","smr_stalkers_base_population_survival"},
{"sim_smr_minimal","smr_stalkers_base_population_minimal"},
{"sim_smr_none","smr_stalkers_base_population_none"}} },
{ id="base_population_default", type="desc", clr={200, 125, 125, 125}, text="ui_mcm_SMR_smr_stalkers_base_population_default", precondition={p_base_pop, "sim_smr_default"}},
{ id="base_population_survival", type="desc", clr={200, 125, 125, 125}, text="ui_mcm_SMR_smr_stalkers_base_population_survival", precondition={p_base_pop, "sim_smr_survival"}},
{ id="base_population_minimal", type="desc", clr={200, 125, 125, 125}, text="ui_mcm_SMR_smr_stalkers_base_population_minimal", precondition={p_base_pop, "sim_smr_minimal"}},
{ id="base_population_none", type="desc", clr={200, 125, 125, 125}, text="ui_mcm_SMR_smr_stalkers_base_population_none", precondition={p_base_pop, "sim_smr_none"}},
{ id="civil_war", type="list", val=0, def="civilwar_disabled", content={
{"civilwar_disabled","smr_stalkers_civilwar_disabled"},
{"civilwar_stalkers","smr_stalkers_civilwar_stalkers"},
{"civilwar_squads","smr_stalkers_civilwar_squads"},
}},
{ id="civil_war_base_population", type="check", val=1, def=false },
{ id="civil_war_monolith_allied", type="check", val=1, def=false },
{ id="random_stalkers_divider", type="line" },
{ id="random_stalkers", type="check", val=1, def=false },
{ id="random_stalkers_chance", type="track", val=2, min=1, max=100, step=1, def=10 },
{ id="factions_divider", type="line" },
{ id="factions_header", type="title", text="ui_mcm_smr_stalkers_factions_title", align="c" },
{ id="factions_info", type="desc", clr={200, 125, 125, 125}, text="ui_mcm_SMR_smr_stalkers_factions_info", },
{ id="factions_replace_squads", type="check", val=1, def=false },
{ id="factions_replace_divider", type="line" },
{ id="stalker", type="check", val=1, def=true},
{ id="bandit", type="check", val=1, def=true},
{ id="csky", type="check", val=1, def=true},
{ id="duty", type="check", val=1, def=true},
{ id="freedom", type="check", val=1, def=true},
{ id="merc", type="check", val=1, def=true},
{ id="army", type="check", val=1, def=true},
{ id="ecolog", type="check", val=1, def=true},
{ id="monolith", type="check", val=1, def=true},
{ id="renegade", type="check", val=1, def=true},
{ id="greh", type="check", val=1, def=true},
{ id="isg", type="check", val=1, def=true},
{ id="zombied", type="check", val=1, def=true},
}}, "SMR"
end
@@ -0,0 +1,64 @@
function intersect(t1,t2)
local function make_lookup(t)
local res={}
for _,v in ipairs(t) do
res[v]=true
end
return res
end
local smaller,larger
if (#t1>#t2) then
larger=t1
smaller=t2
else
larger=t2
smaller=t1
end
local lookup=make_lookup(smaller)
local res={}
for _,v in ipairs(larger) do
if lookup[v] then
res[#res+1]=v
end
end
return res
end
function table_has_value(t, n)
for _,v in ipairs(t) do
if v == n then
return true
end
end
return false
end
function ini_lines_to_table(ini, section)
local tmp = {}
lc = ini:line_count(section)
for li=0,lc-1 do
local result, sq, count = ini:r_line(section,li,"","")
table.insert(tmp, sq)
end
return tmp
end
function spawn_template_lines_to_table(ini, section)
local tmp = {}
lc = ini:line_count(section)
for li=0,lc-1 do
local result, sq, count = ini:r_line(section,li,"","")
tmp[sq] = tonumber(count) or 1.0
end
return tmp
end
function read_spawn_template_ln(ini, section, line)
local result, sq, count = ini:r_line(section,line,"","")
local weight = tonumber(count) or 1.0
return sq, weight
end
@@ -0,0 +1,42 @@
local defaults = {
["zombie_spawn"] = false,
["zombie_chance"] = 90,
["seek_enabled"] = false,
["seek_distance"] = 250,
["zombiesp"] = true,
["zombies_amount"] = 5,
["blindp"] = true,
["zombifiedp"] = true,
["fracturep"] = true,
["snorkp"] = true,
["bloodsuckerp"] = false,
["psysuckerp"] = false
}
function get_config(key)
if ui_mcm then return ui_mcm.get("SMR/smr_zombies/"..key) else return defaults[key] end
end
function on_mcm_load()
return { id="smr_zombies", sh=true, gr={
{ id="title_header", type="slide", link="ui_options_slider_night", text="ui_mcm_menu_smr_zombies", size= {512,50}, spacing=20 },
-- zombies
{ id="zombie_spawn", type="check", val=1, def=false},
{ id="zombie_spawn_divider", type="line" },
{ id="zombie_chance", type="track", val=2, min=0, max=100, step=1, def=90 },
{ id="zombies_amount", type="track", val=2, min=1, max=10, step=1, def=5 },
{ id="seek_enabled", type="check", val=1, def=false},
{ id="seek_distance", type="track", val=2, min=1, max=250, step=10, def=250 },
-- zombie types
{ id="zombie_types_divider", type="line" },
{ id="zombie_types_header", type="title", text="ui_mcm_smr_zombies_zombie_types_title", align="c" },
{ id="zombie_types_info", type="desc", clr={200, 125, 125, 125}, text="ui_mcm_SMR_smr_zombies_zombie_types_info", },
{ id="zombiesp", type="check", val=1, def=true},
{ id="blindp", type="check", val=1, def=true},
{ id="zombifiedp", type="check", val=1, def=true},
{ id="fracturep", type="check", val=1, def=true},
{ id="snorkp", type="check", val=1, def=true},
{ id="bloodsuckerp", type="check", val=1, def=false},
{ id="psysuckerp", type="check", val=1, def=false}
}}, "SMR"
end
@@ -0,0 +1,25 @@
local defaults = {
["glowsticks"] = false,
["mad_mags"] = false,
["mad_mags_chance"] = false,
}
function get_config(key)
if ui_mcm then return ui_mcm.get("SMR/smr_zzintegration/"..key) else return defaults[key] end
end
function on_mcm_load()
return { id="smr_zzintegration", sh=true, gr={
{ id="integration_header", type="slide", link="ui_options_slider_alife", text="ui_mcm_menu_smr_zzintegration", size={512,50}, spacing=20 },
{ id="integration_info", type="desc", text="ui_mcm_SMR_smr_zzintegration_integration_info" },
{ id="glowsticks", type="check", val=1, def=false },
{ id="glowsticks_info", type="desc", clr={200, 125, 125, 125}, text="ui_mcm_SMR_smr_zzintegration_glowsticks_info" },
{ id="glowsticks_divider", type="line" },
{ id="mags_redux", type="check", val=1, def=false },
{ id="mags_redux_chance", type="track", val=2, min=1, max=100, step=1, def=5 },
{ id="mags_redux_info", type="desc", clr={200, 125, 125, 125}, text="ui_mcm_SMR_smr_zzintegration_mags_redux_info" },
{ id="lootboxes", type="check", val=1, def=false },
{ id="lootboxes_chance", type="track", val=2, min=1, max=100, step=1, def=5 },
{ id="lootboxes_info", type="desc", clr={200, 125, 125, 125}, text="ui_mcm_SMR_smr_zzintegration_lootboxes_info" },
}}, "SMR"
end
@@ -0,0 +1,748 @@
local DIALOG_ID = {}
local sfind = string.find
local fetch_items = {}
local fetch_rank_tier = {}
local patch_general = {
["army"] = {
["freedom_patch"] = 0,
["bandit_patch"] = 0,
["stalker_patch"] = 0,
["csky_patch"] = 0,
["monolith_patch"] = 0,
},
["bandit"] = {
["army_patch"] = 0,
["dolg_patch"] = 0,
["stalker_patch"] = 0,
["csky_patch"] = 0,
["ecolog_patch"] = 0,
},
["csky"] = {
["army_patch"] = 0,
["bandit_patch"] = 0,
["renegade_patch"] = 0,
},
["dolg"] = {
["freedom_patch"] = 0,
["bandit_patch"] = 0,
["monolith_patch"] = 0,
},
["freedom"] = {
["dolg_patch"] = 0,
["army_patch"] = 0,
["monolith_patch"] = 0,
},
["killer"] = {
["freedom_patch"] = 0,
["bandit_patch"] = 0,
["dolg_patch"] = 0,
["army_patch"] = 0,
["monolith_patch"] = 0,
},
["monolith"] = {
["army_patch"] = 0,
["freedom_patch"] = 0,
["bandit_patch"] = 0,
["stalker_patch"] = 0,
["csky_patch"] = 0,
["dolg_patch"] = 0,
},
["stalker"] = {
["bandit_patch"] = 0,
},
["greh"] = {
["army_patch"] = 0,
["freedom_patch"] = 0,
["bandit_patch"] = 0,
["stalker_patch"] = 0,
["csky_patch"] = 0,
["dolg_patch"] = 0,
},
["renegade"] = {
["army_patch"] = 0,
["dolg_patch"] = 0,
["stalker_patch"] = 0,
["csky_patch"] = 0,
["ecolog_patch"] = 0,
},
}
local faction_lookup = { -- List of factions used in patch tasks
"stalker",
"dolg",
"freedom",
"csky",
"ecolog",
"killer",
"army",
"bandit",
"monolith"
}
if smr_amain_mcm.get_config("smr_enabled") then
faction_lookup = smr_pop.get_faction_spawn_table()
end
---------------------------< Utility >---------------------------
function postpone_fetch_for_next_frame(task_id, section, amount)
if not (task_id and section) then
return true
end
task_id = string.sub(task_id,1,-7) or "" -- because it ends with fetch
amount = amount or 1
local extra = ""
if (ini_sys:r_string_ex(section,"kind") == "i_arty") then
extra = " " .. game.translate_string("st_ui_artefact")
end
local clr = utils_xml.get_color("pda_white") --"%c[255,238,153,26]"
local news_caption = game.translate_string("ui_inv_needs") .. ":" --game.translate_string(task_manager.task_ini:r_string_ex(task_id, "title")) or "error"
local news_ico = task_manager.task_ini:r_string_ex(task_id, "icon") or "ui_inGame2_D_Sisshik"
local news_text = ui_item.get_sec_name(section) .. extra .. clr .. " (x" .. amount .. ")"
db.actor:give_talk_message2(news_caption, news_text, news_ico, "iconed_answer_item")
return true
end
xr_effects.fetch_reward_and_remove = function(actor, npc, p) -- Remove fetch items and give money reward:
-- Description: Removes fetch task items and gives actor money reward based on item value
-- Usage: fetch_reward_and_remove( p[1]:p[2] )
-- Parameters:
-- p[1] (type: string) Var name given to fetch task items
-- p[2] (type: float) Multiplier for cost of items to apply to reward value (optional; default = 1.0)
-- Return value (type: none): none, removes fetch items and gives actor reward
-- Get fetch items
local sec = load_var( db.actor, p[1] )
if not (sec) then return end
local sim = alife()
-- Extract artefact if its in container
if string.find(sec,"af_") and (not db.actor:object(sec)) then
local break_con
local break_arty
local id_combo
local search_cont = { "lead_box" , "af_aam", "af_aac", "af_iam" }
for i=1,#search_cont do
if db.actor:object(sec .. "_" .. search_cont[i]) then
break_arty = sec
break_con = search_cont[i]
id_combo = db.actor:object(sec .. "_" .. search_cont[i]):id()
break
end
end
if id_combo and break_con and break_arty and ini_sys:section_exist(break_con) then
printdbg("/ Artefact container found, artefact [%s] - contairer [%s]", break_arty, break_con)
alife_create_item(break_arty, db.actor)
alife_create_item(break_con, db.actor)
alife_release_id(id_combo)
-- play effect
level.add_cam_effector('camera_effects\\item_use.anm', 8053, false,'')
xr_effects.play_inv_aac_open()
end
end
local function timer() -- delay for 1 sec, to register alife changes
-- Gather task items and cost
local count = load_var( db.actor, (p[1] .. "_count") ) or 1
local mult = tonumber(p[2]) or 1
local max_use = IsItem("multiuse",sec) or 1
local cost = ini_sys:r_float_ex(sec,"cost") * (1 / max_use)
local last_obj
local collected_itms = {}
local total_cost, remain = 0,0
local cur_count = count
local use_con = (max_use == 1) and (not IsItem("device",sec)) and (not IsItem("battery", sec)) and true or false
local function itr(temp, obj)
if (obj:section() == sec) then
local cnt = (max_use > 1) and obj:get_remaining_uses() or 1
local con = use_con and obj:condition() or 1
collected_itms[obj:id()] = cnt
total_cost = total_cost + (cost * cnt * (con * con) * mult)
cur_count = cur_count - cnt
last_obj = obj
end
if (cur_count <= 0) then
if (cur_count < 0) then
remain = math.abs(cur_count)
end
return true
end
--return false
end
db.actor:iterate_inventory(itr, nil)
-- Check availability
if is_empty(collected_itms) then
printe("! ERROR: fetch_reward_and_remove | no fetch item found!")
return true
end
if (total_cost < 50) then
total_cost = 50
printf("~ Warning: fetch_reward_and_remove | total_cost is below 50")
end
-- Reward value for artefacts depends on progression difficulty
if IsArtefact(last_obj) then
local eco = game_difficulties.get_eco_factor("type") or 0.5
local factor = (eco == 3 and 0.4) or (eco == 2 and 0.5) or 0.6
total_cost = total_cost * factor
end
--
local delta = math.floor(total_cost * 0.1)
local min_reward = (total_cost - delta)
local max_reward = (total_cost + delta)
xr_effects.reward_random_money( actor, npc, { min_reward , max_reward } )
-- Give task items to npc
local trade_npc = false --get_speaker()
for k,v in pairs(collected_itms) do
if trade_npc then
local obj = level.object_by_id(k)
if obj then
db.actor:transfer_item(obj, trade_npc)
end
else
alife_release_id(k)
end
end
if (remain > 0) and IsItem("multiuse",sec) then
alife_create_item(sec, db.actor, {uses = remain})
local last_obj_uses = last_obj:get_remaining_uses()
if last_obj_uses and (last_obj_uses > remain) then
local uses = (last_obj_uses - remain)
alife_process_item(last_obj:section(), last_obj:id(), {uses = uses})
end
end
news_manager.relocate_item(db.actor, "out", sec, count)
return true
end
CreateTimeEvent(0,"delay_reward", 1, timer)
end
xr_effects.remove_fetch_item = function(actor,npc,p)
local section = load_var(db.actor,p[1])
if (section and db.actor:object(section)) then
local amt = p[2] or load_var(db.actor,p[1].."_count") or 1
local trade_npc = get_speaker()
if (trade_npc) then
local function transfer_object_item(itm)
if (itm:section() == section and amt > 0) then
db.actor:transfer_item(itm, trade_npc)
amt = amt - 1
end
if (amt <= 0) then
return true
end
return false
end
db.actor:inventory_for_each(transfer_object_item)
else
xr_effects.remove_item(actor, npc, {section,amt})
end
end
end
xr_effects.remove_artefact_item = function(actor,npc,p)
local section = load_var(db.actor,p[1])
if (not section) then
printe("!ERROR xr_effects.remove_artefact_item | no var found for %s", p[1])
return
end
local cont
local obj = db.actor:object(section)
if (not obj) then
local search_cont = { "lead_box" , "af_aam", "af_aac", "af_iam" }
for i=1,#search_cont do
if db.actor:object(section .. "_" .. search_cont[i]) then
obj = db.actor:object(section .. "_" .. search_cont[i])
cont = search_cont[i]
break
end
end
end
if (not obj) then
return
end
local trade_npc = get_speaker()
if (trade_npc) then
db.actor:transfer_item(obj, trade_npc)
else
alife_release(obj)
end
if cont then
alife_create_item(cont, db.actor)
-- play effect
level.add_cam_effector('camera_effects\\item_use.anm', 8053, false,'')
xr_effects.play_inv_aac_open()
end
end
---------------------------< Effects >---------------------------
local function get_suitable_item(tbl,rank)
local temp = {}
for sec,tier in pairs(tbl) do
if (not rank) or (rank and fetch_rank_tier[rank] and fetch_rank_tier[rank][tier]) then
temp[#temp + 1] = sec
--printf("- Fetch items | found proper item [%s] tier (%s) for rank (%s)", sec, tier, rank)
end
end
return (#temp > 0) and temp[math.random(#temp)]
end
xr_effects.setup_fetch_task = function(actor,npc,p) -- setup_supplies_fetch_task
-- Pick a random item from the list:
-- param 1 - var name
-- param 2 - items type
-- param 2 - min count
-- param 3 - max count
local npc = get_speaker(true)
local id = npc and npc:id()
local sec = DIALOG_ID[id] and DIALOG_ID[id][p[1]] and DIALOG_ID[id][p[1]].sec
local cnt = DIALOG_ID[id] and DIALOG_ID[id][p[1]] and DIALOG_ID[id][p[1]].cnt
if (sec and ini_sys:section_exist(sec) and cnt) then
dialogs._FETCH_TEXT = ui_item.get_sec_name(sec)
save_var( db.actor, p[1], sec )
save_var( db.actor, (p[1] .. "_count"), cnt )
else
local npc_comm = npc and character_community(npc) or "stalker"
local npc_rank = ranks.get_obj_rank_name(npc) or "experienced"
local itms = {} -- non-key table
-- expand supplies list to include drinks and smoke if the task giver is not monolith
if (p[2] == "supplies") and (npc_comm ~= "monolith") then
itms = fetch_items["supplies"]
for sec,tier in pairs(fetch_items["drink"]) do
itms[sec] = tier
end
-- Gather patches of NPC's enemy factions
elseif (p[2] == "patch_general") then
local patches = {}
for i=1,#faction_lookup do
if game_relations.is_factions_enemies(faction_lookup[i], npc_comm) then
local comm
if (faction_lookup[i] == "killer") then comm = "merc"
elseif (faction_lookup[i] == "dolg") then comm = "duty"
else comm = faction_lookup[i]
end
local patch = comm .. "_patch"
patches[patch] = 0
end
end
if is_empty(patches) then
if smr_amain_mcm.get_config("smr_enabled") then
local t = smr_pop.get_faction_spawn_table()
local patch = t[math.random(#t)] .. "_patch"
patches[patch] = 0
else
patches = patch_general[npc_comm]
end
end
itms = patches
-- Gather suitable repair kits
elseif (p[2] == "repair") then
-- Get NPC's weapon
local obj_wep = npc:best_weapon()
local sec_wep = obj_wep and obj_wep:section()
-- Gather proper repair kits
local repair_kits = {
["sharpening_stones"] = 0,
["sewing_kit_b"] = 0,
}
if sec_wep then
local wep_type = ini_sys:r_string_ex(sec_wep,"repair_type") or ""
for sec,tier in pairs(fetch_items["repair"]) do
local kit_type = parse_list(ini_sys,sec,"repair_only",true)
if kit_type[wep_type] then
repair_kits[sec] = tier
end
end
end
itms = repair_kits
-- Gather suitable weapons
elseif (p[2] == "weapons") then
local f = faction_expansions.faction[npc_comm]
local npc_preference = f and f["weapon"] or ""
-- Collects weapons suitable for npc rank
local wpn_by_rank = {}
if fetch_items["weapons_" .. npc_rank] then
local tbl = fetch_items["weapons_" .. npc_rank]
for sec,tier in pairs(tbl) do
wpn_by_rank[sec] = tier
end
end
-- Collects weapons suitable for npc faction
local wpn_by_ref = {}
if fetch_items["weapons_" .. npc_preference] then
local tbl = fetch_items["weapons_" .. npc_preference]
for sec,tier in pairs(tbl) do
wpn_by_ref[sec] = tier
end
end
-- collect suitable weapons
local wpns = {}
for sec,tier in pairs(wpn_by_rank) do
if wpn_by_ref[sec] then
wpns[sec] = tier
end
end
for sec,tier in pairs(wpn_by_ref) do
if wpn_by_rank[sec] then
wpns[sec] = tier
end
end
if is_not_empty(wpns) then
itms = wpns
else
itms = fetch_items["weapons"]
end
else
itms = fetch_items[p[2]]
end
if (not itms) then
printe("! ERROR: %s | fetch list [%s] is invalid", p[1], p[2])
end
local min_count = (p[3] and tonumber( p[3] ) or 1)
local max_count = (p[4] and tonumber( p[4] ) or min_count)
sec = get_suitable_item(itms, npc_rank) or random_key_table(itms)
cnt = math.random( min_count, max_count )
-- Save chosen fetch item:
if (not DIALOG_ID[id]) then DIALOG_ID[id] = {} end
if (not DIALOG_ID[id][p[1]]) then DIALOG_ID[id][p[1]] = {} end
DIALOG_ID[id][p[1]].sec = sec
DIALOG_ID[id][p[1]].cnt = cnt
dialogs._FETCH_TEXT = ui_item.get_sec_name(sec)
save_var( db.actor, p[1], sec )
save_var( db.actor, (p[1] .. "_count"), cnt )
end
CreateTimeEvent(0,"setup_fetch_task", 0, postpone_fetch_for_next_frame, p[1], sec, cnt)
end
xr_effects.setup_supplies_fetch_task_lostzone_patch = function(actor,npc,p)
local npc = get_speaker(true)
local id = npc and npc:id()
local sec = DIALOG_ID[id] and DIALOG_ID[id][p[1]] and DIALOG_ID[id][p[1]].sec
local cnt = DIALOG_ID[id] and DIALOG_ID[id][p[1]] and DIALOG_ID[id][p[1]].cnt
if (sec and cnt and ini_sys:section_exist(sec)) then
dialogs._FETCH_TEXT = ui_item.get_sec_name(sec)
save_var( db.actor, p[1], sec )
save_var( db.actor, (p[1] .. "_count"), cnt )
else
local comm = npc and character_community(npc) or "stalker"
local itms = patch_general[comm] or patch_general["stalker"]
-- SMR
if smr_amain_mcm.get_config("smr_enabled") then
local itms = {}
for i=1,#faction_lookup do
if game_relations.is_factions_enemies(faction_lookup[i], comm) then
if (faction_lookup[i] == "killer") then comm = "merc"
elseif (faction_lookup[i] == "dolg") then comm = "duty"
else comm = faction_lookup[i]
end
local patch = comm .. "_patch"
itms[patch] = 0
end
end
if is_empty(itms) then
local t = smr_pop.get_faction_spawn_table()
local patch = t[math.random(#t)] .. "_patch"
itms[patch] = 0
end
end
sec = random_key_table(itms)
cnt = math.random(p[2] and tonumber(p[2]) or 1,p[3] and tonumber(p[3]) or 1)
-- Save chosen fetch item:
if (not DIALOG_ID[id]) then DIALOG_ID[id] = {} end
if (not DIALOG_ID[id][p[1]]) then DIALOG_ID[id][p[1]] = {} end
DIALOG_ID[id][p[1]].sec = sec
DIALOG_ID[id][p[1]].cnt = cnt
dialogs._FETCH_TEXT = ui_item.get_sec_name(sec)
save_var( db.actor, p[1], sec )
save_var( db.actor, (p[1] .. "_count"), cnt )
end
CreateTimeEvent(0,"setup_fetch_task", 0, postpone_fetch_for_next_frame, p[1], sec, cnt)
end
xr_effects.setup_generic_fetch_task = function(actor,npc,p)
-- param1 - variable name
-- param2 - count
-- param3+ - sections
if (p[1] and p[2] and p[3]) then
local npc = get_speaker(true)
local id = npc and npc:id()
local sec = DIALOG_ID[id] and DIALOG_ID[id][p[1]] and DIALOG_ID[id][p[1]].sec
local cnt = DIALOG_ID[id] and DIALOG_ID[id][p[1]] and DIALOG_ID[id][p[1]].cnt
if (sec and cnt and ini_sys:section_exist(sec)) then
dialogs._FETCH_TEXT = ui_item.get_sec_name(sec)
save_var( db.actor, p[1], sec )
if (cnt > 1) then
save_var( db.actor, (p[1] .. "_count"), cnt )
end
else
sec = #p > 3 and p[math.random(3,#p)] or p[3]
if (sec and ini_sys:section_exist(sec)) then
cnt = tonumber(p[2]) or 1
-- Save chosen fetch item:
if (not DIALOG_ID[id]) then DIALOG_ID[id] = {} end
if (not DIALOG_ID[id][p[1]]) then DIALOG_ID[id][p[1]] = {} end
DIALOG_ID[id][p[1]].sec = sec
DIALOG_ID[id][p[1]].cnt = cnt
dialogs._FETCH_TEXT = ui_item.get_sec_name(sec)
save_var( db.actor, p[1], sec )
if (cnt > 1) then
save_var( db.actor, (p[1] .. "_count"), cnt )
end
else
printe("!ERROR: xr_effects:setup_generic_fetch_task - invalid section %s",sec)
end
end
CreateTimeEvent(0,"setup_fetch_task", 0, postpone_fetch_for_next_frame, p[1], sec, cnt)
end
end
---------------------------< Target functor >---------------------------
task_functor.general_fetch_task = function(task_id,field,p,tsk)
if (field == "title") then
local fetch = db.actor and ui_item.get_sec_name(load_var(db.actor,task_id.."_fetch",""))
local count = fetch and load_var(db.actor,task_id.."_fetch_count") or 1
if (count > 1) then
return strformat((game.translate_string(p) or ""),fetch .. " x" .. tostring(count))
end
return strformat(game.translate_string(p) or "",fetch)
elseif (field == "descr") then
if (tsk.stage == 1) then
return game.translate_string("st_return_for_reward")
end
local fetch = db.actor and ui_item.get_sec_name(load_var(db.actor,task_id.."_fetch",""))
local count = fetch and load_var(db.actor,task_id.."_fetch_count") or 1
if (count > 1) then
return strformat((game.translate_string(p) or ""),fetch .. " x" .. tostring(count))
end
return strformat(game.translate_string(p) or "",fetch)
elseif (field == "target") then
if (tsk.stage == 1) then
local id = db.actor and load_var(db.actor,task_id.."_target_id") or tsk.task_giver_id
if (id) then
return id
end
local story_id = string.sub(task_id,1,string.find(task_id,"_task")-1)
local se_obj = get_story_se_object(story_id)
if (se_obj) then
return se_obj.id
end
end
end
end
task_functor.general_warfare_fetch_task = function(task_id,field,p,tsk) -- xQd, add the name and location of the warfare trader to the task description along with the fetch item
local id = tsk.task_giver_id
local se_obj = id and alife_object(id)
if not (se_obj) then
--printf("is_task_giver_valid se_obj nil id=%s %s",id,tsk.id)
return ""
else
local name = se_obj:character_name()
local lvl = --[[game.translate_string(se_obj.community) or]] game.translate_string(alife():level_name(game_graph():vertex(se_obj.m_game_vertex_id):level_id()))
if (field == "title") then
local fetch = db.actor and ui_item.get_sec_name(load_var(db.actor,task_id.."_fetch",""))
local count = fetch and load_var(db.actor,task_id.."_fetch_count") or 1
if (count > 1) then
return strformat((game.translate_string(p) or ""),fetch .. " x" .. tostring(count))
end
return strformat(game.translate_string(p) or "",fetch)
elseif (field == "descr") then
if (tsk.stage == 1) then
return game.translate_string("st_return_for_reward")
end
local fetch = db.actor and ui_item.get_sec_name(load_var(db.actor,task_id.."_fetch",""))
local count = fetch and load_var(db.actor,task_id.."_fetch_count") or 1
if (count > 1) then
return strformat((game.translate_string(p) or ""),name,lvl,fetch .. " x" .. tostring(count))
end
return strformat(game.translate_string(p) or "",name,lvl,fetch)
end
end
end
---------------------------< Status functor >---------------------------
task_status_functor.actor_has_fetch_item = function(tsk,task_id)
local actor = db.actor
local section = actor and load_var(actor,task_id.."_fetch")
if (not section) then
return
end
local item = section and actor:object(section)
if (item ~= nil) then
if (task_id == "esc_2_12_stalker_nimble_task_1" or task_id == "jup_b220_trapper_task_3") then
if (item:condition() >= 0.9) then
tsk.stage = 1
else
tsk.stage = 0
end
else
local count = load_var(actor,task_id.."_fetch_count")
if (count and count > 1) then
local cnt = utils_item.get_amount(db.actor, section, 1)
if (cnt >= count) then
tsk.stage = 1
else
tsk.stage = 0
end
return
end
tsk.stage = 1 -- should never happen but in such case let player finish quest for free
end
elseif section and sfind(section,"af_") then
if actor:object(section .. "_af_aam")
or actor:object(section .. "_af_iam")
or actor:object(section .. "_af_aac")
or actor:object(section .. "_lead_box")
then
tsk.stage = 1
else
tsk.stage = 0
end
else
tsk.stage = 0
end
end
task_status_functor.actor_has_fetch_weapon_warfare = function(tsk,task_id) -- xQd, added this for warfare fetch weapon tasks
if not (db.actor) then
return
end
local section = db.actor and load_var(db.actor,task_id.."_fetch")
local item = section and db.actor:object(section)
if (item ~= nil) then
if (item:condition() >= 0.60) then
tsk.stage = 1
else
tsk.stage = 0
end
else
tsk.stage = 0
end
end
---------------------------< Callbacks >---------------------------
local function save_state(m_data)
m_data.tasks_fetch_ids = DIALOG_ID
end
local function load_state(m_data)
DIALOG_ID = m_data.tasks_fetch_ids or {}
end
local function on_before_level_changing()
empty_table(DIALOG_ID)
alife_storage_manager.get_state().tasks_fetch_ids = nil
printdbg("~ tasks_fetch | cleaned fetch list for npcs")
end
function on_game_start()
local ini_fetch = ini_file("items\\settings\\fetch_list.ltx")
local n = 0
local result, id, value = "","",""
local list = {}
n = ini_fetch:line_count("fetch_list")
for i=0,n-1 do
result, id, value = ini_fetch:r_line_ex("fetch_list",i,"","")
list[#list + 1] = id
end
n = ini_fetch:line_count("fetch_tiers")
for i=0,n-1 do
result, id, value = ini_fetch:r_line_ex("fetch_tiers",i,"","")
if id and value then
fetch_rank_tier[id] = {}
fetch_rank_tier[id][0] = true
local nums = str_explode(value,",")
for j=1,#nums do
local m = tonumber(nums[j]) or 0
fetch_rank_tier[id][m] = true
end
end
end
for k=1,#list do
local category = list[k]
fetch_items[category] = {}
n = ini_fetch:line_count(category)
for i=0,n-1 do
result, id, value = ini_fetch:r_line_ex(category,i,"","")
if id and ini_sys:section_exist(id) then
fetch_items[category][id] = (value == "true" and 0) or ini_sys:r_float_ex(id,"tier") or 0
else
printe("! WARNING: fetch_list.ltx | wrong section name [%s]", id)
end
end
end
RegisterScriptCallback("save_state",save_state)
RegisterScriptCallback("load_state",load_state)
RegisterScriptCallback("on_before_level_changing",on_before_level_changing)
end
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,37 @@
local SINGLETON = nil
function get_ui()
SINGLETON = SINGLETON or pda_glitched_tab()
SINGLETON:Reset()
return SINGLETON
end
class "pda_glitched_tab" (CUIScriptWnd)
function pda_glitched_tab:__init() super()
self:InitControls()
end
function pda_glitched_tab:__finalize()
end
function pda_glitched_tab:InitControls()
self:SetWndRect(Frect():set(0,0,1024,768))
local xml = CScriptXmlInit()
xml:ParseFile("pda_glitched.xml")
self.form = xml:InitStatic("glitched_pda",self)
self.form_text = xml:InitTextWnd("glitched_pda:state", self.form)
end
function pda_glitched_tab:Update()
CUIScriptWnd.Update(self)
end
function pda_glitched_tab:Reset()
self.form_text:SetText(game.translate_string("st_smr_glitched_pda_text"))
self.form_text:SetTextColor(GetARGB(255, 255, 255, 1))
self.form_text:Show(true)
local pda_menu = ActorMenu.get_pda_menu()
pda_menu:GetTabControl():Show(false)
end
+28
View File
@@ -0,0 +1,28 @@
[General]
gameName=stalkeranomaly
modid=0
version=d2024.4.4.0
newestVersion=
category="-1,"
nexusFileStatus=1
installationFile=zone_customization_project_1.5e.zip
repository=Nexus
ignoredVersion=
comments=
notes=
nexusDescription=
url=
hasCustomURL=false
lastNexusQuery=
lastNexusUpdate=
nexusLastModified=2024-04-04T05:09:12Z
nexusCategory=0
converted=false
validated=false
color=@Variant(\0\0\0\x43\0\xff\xff\0\0\0\0\0\0\0\0)
tracked=0
[installedFiles]
1\modid=0
1\fileid=0
size=1