Various Changes; Updated and Added Mods

This commit is contained in:
Rage 2024-03-27 00:55:00 -04:00
parent 8abddf23c7
commit 46265b6fcc
2193 changed files with 23397 additions and 56583 deletions

View File

@ -19,7 +19,7 @@ nexusLastModified=2024-03-14T09:36:54Z
nexusCategory=0
converted=false
validated=false
color=@Variant(\0\0\0\x43\0\xff\xff\0\0\0\0\0\0\0\0)
color=@Variant(\0\0\0\x43\x1\xff\xff\xde\xde\xde\xde\0\0\0\0)
tracked=0
[installedFiles]

View File

@ -2,8 +2,25 @@
modid=0
version=
newestVersion=
category=0
category="-1,"
installationFile=
ignoredVersion=
repository=Nexus
gameName=stalkeranomaly
comments=
notes=
nexusDescription=
url=
hasCustomURL=true
nexusFileStatus=1
lastNexusQuery=
lastNexusUpdate=
nexusLastModified=2024-03-26T01:58:36Z
nexusCategory=0
converted=false
validated=false
color=@Variant(\0\0\0\x43\x1\xff\xff\xde\xde\xde\xde\0\0\0\0)
tracked=0
[installedFiles]
size=0

View File

@ -19,7 +19,7 @@ nexusLastModified=2024-03-14T09:13:50Z
nexusCategory=0
converted=false
validated=false
color=@Variant(\0\0\0\x43\0\xff\xff\0\0\0\0\0\0\0\0)
color=@Variant(\0\0\0\x43\x1\xff\xff\xde\xde\xde\xde\0\0\0\0)
tracked=0
[installedFiles]

View File

@ -0,0 +1,85 @@
slowmo_flag = false
drug_flag = false
function on_game_start()
RegisterScriptCallback("on_key_press", on_key_press)
RegisterScriptCallback("actor_on_update", power_drain_check)
RegisterScriptCallback("actor_on_before_death", actor_on_before_death)
RegisterScriptCallback("on_game_load", on_game_load)
RegisterScriptCallback("actor_on_item_use", drug_module)
end
function slowmo_on()
local slowmo_snd_on = sound_object("slow-mo\\slowmo_on")
slowmo_snd_on:play_at_pos(actor, vector():set(0, 0, 0), 0, sound_object.s2d)
level.add_pp_effector("blink.ppe", 2004, false)
level.set_pp_effector_factor(2004, 0.2) -- here you can change the brightness of the effect (second value, 0-1)
get_console():execute("time_factor 0.5")
slowmo_flag = true
end
function slowmo_off()
local slowmo_snd_off = sound_object("slow-mo\\slowmo_off")
slowmo_snd_off:play_at_pos(actor, vector():set(0, 0, 0), 0, sound_object.s2d)
level.add_pp_effector("blink.ppe", 2004, false)
level.set_pp_effector_factor(2004, 0.2) -- here you can change the brightness of the effect (second value, 0-1)
get_console():execute("time_factor 1")
slowmo_flag = false
end
function actor_on_before_death()
slowmo_off()
end
function on_game_load()
get_console():execute("time_factor 1")
end
function on_key_press(key)
if not db.actor:alive() then
return
end
-- here you can change slow-mo key
if (key == DIK_keys["DIK_V"]) then
if not slowmo_flag then
slowmo_on()
elseif slowmo_flag then
slowmo_off()
end
end
end
function power_drain_check()
if not drug_flag then
if (db.actor.power > 0.1 and slowmo_flag) then
db.actor:change_power(-0.004) -- here you can adjust stamina drain
elseif (db.actor.power < 0.1 and slowmo_flag) then
slowmo_off()
end
end
end
function drug_module(item)
local section = item:section()
local drug_tbl = {
["adrenalin"] = true,
["cocaine"] = true
}
if drug_tbl[section] then
CreateTimeEvent(0, "drug_on", 5, drug_on)
end
end
function drug_on()
xr_effects.play_snd(db.actor, nil, {[1] = "slow-mo\\adrenalin"})
CreateTimeEvent(0, "adrenalin_off", 20, drug_off)
drug_flag = true
slowmo_on()
return true
end
function drug_off()
slowmo_off()
drug_flag = false
return true
end

BIN
mods/Bullet Time/gamedata/sounds/slow-mo/adrenalin.ogg (Stored with Git LFS) Normal file

Binary file not shown.

BIN
mods/Bullet Time/gamedata/sounds/slow-mo/slowmo_off.ogg (Stored with Git LFS) Normal file

Binary file not shown.

BIN
mods/Bullet Time/gamedata/sounds/slow-mo/slowmo_on.ogg (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -1,21 +1,21 @@
[General]
modid=0
version=d2024.2.29.0
newestVersion=
category="7,"
installationFile=A1_Day_Stalkers.zip
gameName=stalkeranomaly
modid=0
version=d2024.3.23.0
newestVersion=
category="-1,"
nexusFileStatus=1
installationFile=Bullet_Time_v1.0.7z
repository=Nexus
ignoredVersion=
comments=
notes=
nexusDescription=
url=
hasCustomURL=true
hasCustomURL=false
lastNexusQuery=
lastNexusUpdate=
nexusLastModified=2024-02-29T05:48:11Z
nexusLastModified=2024-03-24T03:49:24Z
nexusCategory=0
converted=false
validated=false

View File

@ -2,8 +2,25 @@
modid=0
version=
newestVersion=
category=0
category="-1,"
installationFile=
ignoredVersion=
repository=Nexus
gameName=stalkeranomaly
comments=
notes=
nexusDescription=
url=
hasCustomURL=true
nexusFileStatus=1
lastNexusQuery=
lastNexusUpdate=
nexusLastModified=2024-03-26T01:58:36Z
nexusCategory=0
converted=false
validated=false
color=@Variant(\0\0\0\x43\x1\xff\xff\xde\xde\xde\xde\0\0\0\0)
tracked=0
[installedFiles]
size=0

View File

@ -19,7 +19,7 @@ nexusLastModified=2024-03-14T09:13:50Z
nexusCategory=0
converted=false
validated=false
color=@Variant(\0\0\0\x43\0\xff\xff\0\0\0\0\0\0\0\0)
color=@Variant(\0\0\0\x43\x1\xff\xff\xde\xde\xde\xde\0\0\0\0)
tracked=0
[installedFiles]

View File

@ -1,88 +0,0 @@
;//////////////////////////////////////////////////////////////////////////////////////////////////
;
; Day Stalkers (Night Mutants)
; ALL CREDIT GOES TO bvcx/xcvb
;------------------------------------------------
; name your squads however you want
; must have lines:
; "night_mutant = true"
; "faction = *appropiate faction type*"
;------------------------------------------------
;----< Free Stalkers >-----|
[day_free_stalkers]:online_offline_group
faction = stalker
npc_random = sim_default_stalker_0, sim_default_stalker_1, sim_default_stalker_2, sim_default_stalker_3, sim_default_stalker_4, sim_default_stalker_mechanic, sim_default_stalker_medic
npc_in_squad = 1, 3
common = true
night_mutant = true
;----< Bandits >-----|
[day_bandits]:online_offline_group
faction = bandit
npc_random = sim_default_bandit_0, sim_default_bandit_1, sim_default_bandit_2, sim_default_bandit_3, sim_default_bandit_4, sim_default_bandit_mechanic, sim_default_bandit_medic
npc_in_squad = 1, 3
common = true
night_mutant = true
;----< Renegades >-----|
[day_renegades]:online_offline_group
faction = renegade
npc_random = sim_default_renegade_0, sim_default_renegade_1, sim_default_renegade_2, sim_default_renegade_3, sim_default_renegade_4, sim_default_renegade_mechanic, sim_default_renegade_medic
npc_in_squad = 1, 3
common = true
night_mutant = true
;----< Dutyers >-----|
[day_dutyers]:online_offline_group
faction = dolg
npc_random = sim_default_duty_0, sim_default_duty_1, sim_default_duty_2, sim_default_duty_3, sim_default_duty_4, sim_default_dolg_medic, sim_default_dolg_mechanic
npc_in_squad = 1, 3
common = true
night_mutant = true
;----< Freedomers >-----|
[day_freedomers]:online_offline_group
faction = freedom
npc_random = sim_default_freedom_0, sim_default_freedom_1, sim_default_freedom_2, sim_default_freedom_3, sim_default_freedom_4, sim_default_freedom_medic, sim_default_freedom_mechanic
npc_in_squad = 1, 3
common = true
night_mutant = true
;----< Mercenaries >-----|
[day_mercenaries]:online_offline_group
faction = killer
npc_random = sim_default_killer_0, sim_default_killer_1, sim_default_killer_2, sim_default_killer_3, sim_default_killer_4, sim_default_killer_medic, sim_default_killer_mechanic
npc_in_squad = 1, 3
common = true
night_mutant = true
;----< Ecologists >-----|
[day_ecologists]:online_offline_group
faction = ecolog
npc_random = sim_default_ecolog_0, sim_default_ecolog_1, sim_default_ecolog_2, sim_default_ecolog_3, sim_default_ecolog_4, sim_default_ecolog_medic, sim_default_ecolog_mechanic
npc_in_squad = 1, 3
common = true
night_mutant = true
;----< Military >-----|
[day_militants]:online_offline_group
faction = army
npc_random = sim_default_military_0, sim_default_military_1, sim_default_military_2, sim_default_military_3, sim_default_military_4, sim_default_military_5
npc_in_squad = 1, 3
common = true
night_mutant = true
;----< Clear Sky >-----|
[day_clear_sky]:online_offline_group
faction = csky
npc_random = sim_default_csky_0, sim_default_csky_1, sim_default_csky_2, sim_default_csky_3, sim_default_csky_4, sim_default_csky_medic, sim_default_csky_mechanic
npc_in_squad = 1, 3
common = true
night_mutant = true

View File

@ -1,202 +0,0 @@
-- picks a random squad from "squad_descr_day_stalkers.ltx" every "spawn_time_interval" game minutes
-- spawns on smart terrains available for stalkers and if current population of smart is 0 or if no default day stalkers are on this smart online
-- ALL CREDIT GOES TO bvcx/xcvb
local spawn_time_interval = 5 -- game minutes
local safe_radius = 60 -- no spawn in this player's radius
local night_start = 6 -- time at which stalkers start to spawn
local night_end = 19 -- deletes all stalkers at this time !!!Skipping this time by sleeping will not delete stalkers!!!
local squads_to_spawn = {}
local spawned_stalkers = {}
local available_smart_terrains = {}
local ctime_to_t = utils_data.CTime_to_table
local t_to_ctime = utils_data.CTime_from_table
local xspawn_time
local debugx = false
---------------------------------------------------------------------------------------------------
local tmr
function try_to_spawn()
local tg = time_global()
if (tmr and tg < tmr) then return end
tmr = tg + 30000
if not is_night() then
if is_not_empty(spawned_stalkers) then
delete_mutants()
empty_table(spawned_stalkers)
xspawn_time = nil
end
return
end
local cur_time = game.get_game_time()
if not xspawn_time then
xspawn_time = ctime_to_t(cur_time)
end
if cur_time:diffSec(t_to_ctime(xspawn_time)) > (spawn_time_interval * 60) then
xspawn_time = ctime_to_t(cur_time)
spawn_mutants()
end
end
function spawn_mutants()
for level_name, t in pairs(available_smart_terrains) do
local random_smart_id = t[math.random(1, #t)]
spawned_stalkers[level_name] = spawned_stalkers[level_name] or {}
local simboard_t = SIMBOARD.smarts[random_smart_id]
local smart = simboard_t and simboard_t.smrt
if smart then
local smart_squads = simboard_t.squads
local smart_cur_pop = simboard_t.population
local smart_max_pop = smart.max_population
-- smart is empty
local allow_pop_spawn = smart_cur_pop < smart_max_pop
pr("----------------------------------------------------")
local smart_name = smart:name() or smart:section_name() or "<empty>"
pr("1test smart_id: %s || smart_name: %s || max pop: %s || current pop: %s", random_smart_id, smart_name, smart_max_pop, smart_cur_pop)
-- if at least one night squad is already on this smart
local night_squad_on_smart = false
for squad_id, _ in pairs(smart_squads) do
local sq = alife_object(squad_id)
if sq and (sq.player_id == "monster_predatory_night" or sq.player_id == "monster_zombied_night") then
pr("squad_id is NIGHT squad: %s", squad_id)
night_squad_on_smart = true
break
end
end
-- spawn squad
if allow_pop_spawn and (not night_squad_on_smart) and se_obj_outside_spawn_radius(smart) then
local squad_sec = is_not_empty(squads_to_spawn) and squads_to_spawn[math.random(1, #squads_to_spawn)]
local squad = squad_sec and SIMBOARD:create_squad(smart, squad_sec)
-- save squad id
if squad then
table.insert(spawned_stalkers[level_name], squad.id)
-- test
pr("- spawned level: %s || smart: %s || squad_id: %s || sec: %s", level_name, smart_name, squad.id, squad_sec)
pr("2test smart_id: %s || current pop: %s", random_smart_id, SIMBOARD.smarts[random_smart_id] and SIMBOARD.smarts[random_smart_id].population)
--------------
end
end
end
end
end
function delete_mutants()
for level_name, t in pairs(spawned_stalkers) do
for idx, squad_id in ipairs(t) do
local squad = alife_object(squad_id)
if squad then
pr("squad id: %s deleted", squad_id)
squad:remove_squad()
end
end
end
end
function server_entity_on_unregister(obj)
for level_name, t in pairs(spawned_stalkers) do
for idx, squad_id in ipairs(t) do
if obj.id == squad_id then
pr("removing squad_id: %s from table", squad_id)
table.remove(spawned_stalkers[level_name], idx)
end
end
end
end
---------------------------------------------------------------------------------------------------
function save_mutant_smarts()
-- save smarts that has props of "sim_avail" = true and "stalker" > 0
for i = 1, 65534 do
local smart = alife_object(i)
if smart and (smart:clsid() == clsid.smart_terrain) and (simulation_objects.available_by_id[smart.id] and simulation_objects.available_by_id[smart.id] == true) and (smart.props["stalker"] and smart.props["stalker"] > 0) then
local smart_level_name = get_se_obj_level_name(smart)
available_smart_terrains[smart_level_name] = available_smart_terrains[smart_level_name] or {}
table.insert(available_smart_terrains[smart_level_name], smart.id)
end
end
-- collect and add section names
ini_sys:section_for_each(function(sec)
local night_mutant = ini_sys:r_bool_ex(sec, "night_mutant")
if night_mutant then
table.insert(squads_to_spawn, sec)
end
end)
-- test
for i = 1, #squads_to_spawn do
pr("[%s] = %s", i, squads_to_spawn[i])
end
end
function se_obj_outside_spawn_radius(se_obj)
if not se_obj then
return false
end
local on_same_level = simulation_objects.is_on_the_same_level(alife():actor(), se_obj)
if not on_same_level then
return true
end
local ac_pos = db.actor:position()
local se_obj_pos = se_obj.position
local outside_radius = ac_pos:distance_to_xz(se_obj_pos) > safe_radius
return outside_radius
end
function is_night()
local cur_hour = level.get_time_hours() + level.get_time_minutes() / 60
return (cur_hour > night_start) or (cur_hour < night_end)
end
function get_se_obj_level_name(se_obj)
local target_level_id = game_graph():vertex(se_obj.m_game_vertex_id):level_id()
local target_level_name = alife():level_name(target_level_id)
return target_level_name
end
function pr(...)
if not debugx then return end
printf(...)
end
function save_state(m_data)
m_data.spawned_stalkers = spawned_stalkers
m_data.xspawn_time = xspawn_time
end
function load_state(m_data)
xspawn_time = xspawn_time or nil
spawned_stalkers = m_data.spawned_stalkers or {}
end
---------------------------------------------------------------------------------------------------
function on_game_start()
RegisterScriptCallback("actor_on_update", try_to_spawn)
RegisterScriptCallback("server_entity_on_unregister", server_entity_on_unregister)
RegisterScriptCallback("actor_on_first_update", save_mutant_smarts)
RegisterScriptCallback("save_state", save_state)
RegisterScriptCallback("load_state", load_state)
end

View File

@ -2,8 +2,25 @@
modid=0
version=
newestVersion=
category=0
category="-1,"
installationFile=
ignoredVersion=
repository=Nexus
gameName=stalkeranomaly
comments=
notes=
nexusDescription=
url=
hasCustomURL=true
nexusFileStatus=1
lastNexusQuery=
lastNexusUpdate=
nexusLastModified=2024-03-26T01:58:36Z
nexusCategory=0
converted=false
validated=false
color=@Variant(\0\0\0\x43\x1\xff\xff\xde\xde\xde\xde\0\0\0\0)
tracked=0
[installedFiles]
size=0

View File

@ -19,7 +19,7 @@ nexusLastModified=2024-03-07T09:27:13Z
nexusCategory=0
converted=false
validated=false
color=@Variant(\0\0\0\x43\0\xff\xff\0\0\0\0\0\0\0\0)
color=@Variant(\0\0\0\x43\x1\xff\xff\xde\xde\xde\xde\0\0\0\0)
tracked=0
[installedFiles]

View File

@ -19,7 +19,7 @@ nexusLastModified=2024-03-14T09:36:45Z
nexusCategory=0
converted=false
validated=false
color=@Variant(\0\0\0\x43\0\xff\xff\0\0\0\0\0\0\0\0)
color=@Variant(\0\0\0\x43\x1\xff\xff\xde\xde\xde\xde\0\0\0\0)
tracked=0
[installedFiles]

Binary file not shown.

View File

@ -0,0 +1,31 @@
[General]
gameName=stalkeranomaly
modid=0
version=d2024.3.26.0
newestVersion=
category="-1,"
nexusFileStatus=1
installationFile=EFT_Footsteps_and_Tinnitsus.7z
repository=Nexus
ignoredVersion=
comments=Opaque Bushes Option Only
notes=
nexusDescription=
url=
hasCustomURL=true
lastNexusQuery=
lastNexusUpdate=
nexusLastModified=2024-03-26T20:51:59Z
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
size=1
1\fileid=0
[Plugins]
BAIN%20Installer\option0=02. (Optional) Opaque Bushes

View File

@ -0,0 +1,37 @@
Extra Level Transitions - Bonus Transitions + Transitions for new maps Promzone, Grimwood & Yushniy
This is a set of new coordinates for extra transition points using Demonized's transition script (https://www.moddb.com/mods/stalker-anomaly/addons/extra-cordon-darkscape-transition).
-> needs be loaded with lower PRIORITY in MO2 than the new extra transitions.
It adds most of the available routes from the "New routes" mod (https://www.moddb.com/mods/stalker-anomaly/addons/anomaly-new-routes) but using Demonized's transition script.
I left out the Radar <-> Jupiter UG route.
-> whereas it wont show you conflicts, this mod and the new extra routes are highly incompatible
Also included is the "Extra level transitions - Rostok to Garbage and Yantar facing fix" mod (https://www.moddb.com/mods/stalker-anomaly/addons/extra-level-transitions-rostok-to-garbage-and-yantar-facing-fix).
-> disable in Mo2.
All extra routes will be available for free and can be used on game start.
MCM is strongly suggested to easily access the remove/update function for the new transitions.
Install: (Mod Organizer2 is suggested)
- drop included /gamedata folder into Anomaly root folder
Uninstall:
- to disable the new transition 1st use the attached MCM menu provided by Demonized to delete the transition
- remove files with the name "items_extra_level_transitions_*.ltx" from \gamedata\configs\items\items
- remove lc_extra_transitions.script & txr_routes.script from \gamedata\scripts
*Configuration:
Each of the new transitions can be disabled by simply commenting it out in the corresponding *.ltx file. You need to do this from outside of the game tho
E.g. you don't like the upper transition between Red Forest <-> Dead City then you'd find the "items_extra_level_transitions_deadcity.ltx" and disable (comment out) everything related to !one! transition point. You disable lines by putting a " ; " infront of the line.
The transition between Dead City to Red Forest via the sewer pipe is disabled, in case you want to make it go to Red Forest again (like in New Routes mod) you can do this by re-enabling the transition and disabling the transition from Dead city to yantar in the config file for Yantar. The transition zones should be apptly named and easily identifyable.
Credits: Demonized, AlphaLion, Cpt. Gunner, GhenTuong, Jurkonov, Qball, Solais, xcvb, TheSmersh

View File

@ -0,0 +1,80 @@
; Bar -> Garbage (one way)
[lc_rostok_west_garbage_north]:lc_extra_level_transition_base
lc_extra_level_transition = true
story_id = lc_rostok_west_garbage_north
pos = 56.2870, -0.0015, 122.7513
gvid = 1752
spot = level_changer_down
hint = esc_space_restrictor_to_garbage_descr
to_pos = -194.6798, 2.4084, 205.5613
dir = 0,30,0 ;; actor facing
to_gvid = 869
; Bar <-> Garbage new immmersified shortcut transition
[lc_rostok_south_garbage_north]:lc_extra_level_transition_base
lc_extra_level_transition = true ;; mandatory field
story_id = lc_rostok_south_garbage_north ;; story_id, without it the item wont be added
pos = 191.1017, 6.7427, -151.0793 ;; position of item
gvid = 1786 ;; Gvid of item
spot = level_changer_down ;; texture to use for spot on the map
hint = esc_space_restrictor_to_garbage_descr ;; string id for hint description, defined in xml files
to_pos = -16.1229,0.4275,260.8406 ;; position where to teleport actor
dir = 0,80,0 ;; actor facing, **alternate 'dir = 0,230,0'
to_gvid = 865 ;; Gvid where to teleport actor
[lc_garbage_north_rostok_south]:lc_extra_level_transition_base
lc_extra_level_transition = true
story_id = lc_garbage_north_rostok_south
pos = -34.3015,3.9882,274.2156
gvid = 783
spot = level_changer_up
hint = space_restrictor_to_bar_desc
to_pos = 200.1739, 6.0103, -150.7833
dir = 0,95,0
to_gvid = 1786
; ; Truck cemetery <-> Bar removed new levels dont agree
; [lc_bar_truck_south]:lc_extra_level_transition_base
; lc_extra_level_transition = true
; story_id = lc_bar_truck_south
; pos = 379.8, 13.4, -144.9
; gvid = 1790
; spot = level_changer_right
; hint = space_restrictor_to_tc_desc
; to_pos = -316.351, 15.7484, -165.6453 ;-319.5008, 15.5684, -172.5969
; dir = 0.789, -0.587, 0.180
; to_gvid = 5262 ;5291
; [lc_truck_south_bar]:lc_extra_level_transition_base
; lc_extra_level_transition = true
; story_id = lc_truck_south_bar
; pos = -324.4734, 15.8919, -173.9903
; gvid = 5291
; spot = level_changer_left
; hint = space_restrictor_to_bar_desc
; to_pos = 373.5, 12.3, -150.4
; to_gvid = 1790
; trigger_radius = 1.5
; Truck cemetery <-> Bar original suggestion by TheSmersh
;[lc_bar_truck_south]:lc_extra_level_transition_base
;lc_extra_level_transition = true
;story_id = lc_bar_truck_south
;pos = 379.8, 13.4, -144.9
;gvid = 1790
;spot = level_changer_right
;hint = space_restrictor_to_tc_desc
;to_pos = -318.7, 20.2, -393.9
;to_gvid = 5286
;[lc_truck_south_bar]:lc_extra_level_transition_base
;lc_extra_level_transition = true
;story_id = lc_truck_south_bar
;pos = -325.5, 21.2, -398.1
;gvid = 5286
;spot = level_changer_left
;hint = space_restrictor_to_bar_desc
;to_pos = 373.5, 12.3, -150.4
;to_gvid = 1790

View File

@ -0,0 +1,22 @@
; CNPP South <-> CNPP North
[lc_cnpp_east_cnpp2_east]:lc_extra_level_transition_base
lc_extra_level_transition = true ;; mandatory field
story_id = lc_cnpp_east_cnpp2_east ;; story_id, without it the item wont be added
pos = 1062.1354, -0.0985, -0.0381 ;; position of item
gvid = 3223 ;; Gvid of item
spot = level_changer_up ;; texture to use for spot on the map
hint = gen_space_restrictor_to_aes2_descr ;; string id for hint description, defined in xml files
to_pos = 999.8849, -0.0999, 109.8474 ;; position where to teleport actor
;dir = 0,80,0 ;; actor facing, **alternate 'dir = 0,230,0'
to_gvid = 3445 ;; Gvid where to teleport actor
[lc_cnpp2_east_cnpp_east]:lc_extra_level_transition_base
lc_extra_level_transition = true
story_id = lc_cnpp2_east_cnpp1_east
pos = 1000.2069, -0.0999, 95.0695
gvid = 3445
spot = level_changer_down
hint = gen_space_restrictor_to_aes2_descr
to_pos = 1056.7258, -0.0993, -15.0864
dir = 0,90,0
to_gvid = 3087

View File

@ -0,0 +1,62 @@
; Dead City <-> Grimwood
[lc_dead_city_road_grim_west]:lc_extra_level_transition_base
lc_extra_level_transition = true
story_id = lc_dead_city_road_grim_west
pos = 175.71, 2.99, 2.29
gvid = 2327
spot = level_changer_right
text = st_level_changer_descr
hint = space_restrictor_to_grim_desc
to_pos = -292.03, 7.46, 46.53 ;-294.8082, 7.4105, 46.3330 ;-284.1106, 7.3163, 42.7623
dir = 0,60,0
to_gvid = 5560
[lc_grim_west_dead_city_road]:lc_extra_level_transition_base
lc_extra_level_transition = true
story_id = lc_grim_west_dead_city_road
pos = -298.7502, 7.2873, 47.1749 ;-288.6048, 7.2686, 46.0168
gvid = 5560
spot = level_changer_left
text = st_level_changer_descr
hint = space_restrictor_to_deadcity_desc
to_pos = 165.4732, 2.9781, 4.4394
dir = 0,90,0
to_gvid = 2327
;trigger_radius = 1.5
; Dead City <-> Red Forest
[lc_dead_city_west_red_forest west]:lc_extra_level_transition_base
lc_extra_level_transition = true
story_id = lc_dead_city_west_red_forest west
pos = 174.9990, -2.6538, -50.3010 ;155.4070, -2.5587, -40.9181
gvid = 2390
spot = level_changer_up
hint = mil_space_restrictor_to_red_1_descr
to_pos = -132.8405, -6.1449, -289.3477 ;-156.6639, 0.6579, -312.9990
dir = 0,30,0
to_gvid = 2792 ;2847
;trigger_radius = 1.3
[lc_red_forest sewer_dead_city_west]:lc_extra_level_transition_base ; on sewer pipe
lc_extra_level_transition = true
story_id = lc_red_forest sewer_dead_city_west
pos = -147.0433, -4.1619, -288.1351
gvid = 2837
spot = level_changer_down
hint = space_restrictor_to_deadcity_desc
to_pos = 168.1035, -2.6257, -49.6608 ; 154.8109, -2.6685, -28.3135
dir = 0,90,0
to_gvid = 2390 ; 2204
; trigger_radius = 2.0
; [lc_red_forest west_dead_city_west]:lc_extra_level_transition_base ; door on bridge level
; lc_extra_level_transition = true
; story_id = lc_red_forest west_dead_city_west
; pos = -165.9319, 0.9899, -313.1411
; gvid = 2847
; spot = level_changer_down
; hint = space_restrictor_to_deadcity_desc
; to_pos = 154.8109, -2.6685, -28.3135
; ;dir = 0,60,0
; to_gvid = 2404

View File

@ -0,0 +1,23 @@
; Cordon <-> Darkscape Traintunnel
[lc_cordon_east_darkscape_train_tunnel]:lc_extra_level_transition_base
lc_extra_level_transition = true
story_id = lc_cordon_east_darkscape_train_tunnel
pos = 394.1906, 20.1711, 290.3670
gvid = 638
spot = level_changer_right
hint = esc_space_restrictor_to_darkscape_descr
to_pos = 349.5786, 20.1163, 285.8858
dir = 0,30,0
to_gvid = 1398
trigger_radius = 1.2
[lc_darkscape_train_tunnel_cordon_east]:lc_extra_level_transition_base
lc_extra_level_transition = true
story_id = lc_darkscape_train_tunnel_cordon_east
pos = 336.9702, 20.1165, 285.9505
gvid = 1407
spot = level_changer_left
hint = ds_space_restrictor_to_escape_descr
to_pos = 382.9006, 20.1699, 283.7180
dir = 0,90,0
to_gvid = 638

View File

@ -0,0 +1,50 @@
; Military Warehouse <-> Promzone
[lc_warehouse_south_promzone_south]:lc_extra_level_transition_base
lc_extra_level_transition = true
story_id = lc_warehouse_south_promzone_south
pos = -217.1257, 0.7621, -64.3403
gvid = 2175
spot = level_changer_right
hint = st_space_restrictor_to_prom_descr
to_pos = -170.8769, -23.7598, -167.3539 ;-171.0050, -21.9115, -172.8518
dir = 0.222, -0.238, 0.946 ;0.474, -0.031, 0.880
to_gvid = 5429
trigger_radius = 1.5
[lc_promzone_south_warehouse_south]:lc_extra_level_transition_base
lc_extra_level_transition = true
story_id = lc_promzone_south_warehouse_south
pos = -171.8078, -21.2987, -174.2657
gvid = 5429
spot = level_changer_left
hint = space_restrictor_to_military_desc
to_pos = -217.1697, -0.0484, -55.7299 ;-217.5727, 0.4712, -59.8789
dir = -0.048, -0.115, 0.992 ;0.142, -0.148, 0.979
to_gvid = 2175
; trigger_radius = 1.5
; Freedom Tunnel <-> Promzone
[lc_warehouse_east_promzone_west]:lc_extra_level_transition_base
lc_extra_level_transition = true
story_id = lc_warehouse_east_promzone_west
pos = 105.8052, -13.2056, 50.7543
gvid = 2041
spot = level_changer_right
hint = st_space_restrictor_to_prom_descr
to_pos = -432.7729, -28.7318, 69.9320 ;-445.0133, -28.7352, 69.9898
dir = 0,30,0
to_gvid = 5415
;trigger_radius = 3.5
[lc_promzone_west_warehouse_east]:lc_extra_level_transition_base
lc_extra_level_transition = true
story_id = lc_promzone_west_warehouse_east
pos = -449.4893, -28.8232, 73.1100
gvid = 5415
spot = level_changer_left
hint = space_restrictor_to_military_desc
to_pos = 98.8238, -13.2057, 50.8360 ;101.3890, -13.2054, 50.7779
dir = 0,90,0
to_gvid = 2041
;trigger_radius = 0.9

View File

@ -0,0 +1,60 @@
; Wild Territory -> Grimwood
[lc_rostok_west_grim_south]:lc_extra_level_transition_base
lc_extra_level_transition = true
story_id = lc_rostok_west_grim_south
pos = -289.78, 0.09, 192.05
gvid = 1958
spot = level_changer_up
hint = space_restrictor_to_grim_desc
to_pos = -49.7924, -5.1809, -194.5892 ;-49.6707, -4.5634, -196.0035 ;-47.9382, -1.1408, -200.4666
to_gvid = 5604
[lc_grim_south_rostok_west]:lc_extra_level_transition_base
lc_extra_level_transition = true
story_id = lc_grim_south_rostok_west
pos = -49.7952, -1.4925, -200.5192
gvid = 5604
spot = level_changer_down
hint = space_restrictor_to_rostok_desc
to_pos = -283.7832, 0.0969, 192.5535
dir = 0,30,0
to_gvid = 1849
; Agroprom -> Wild Territory (one way)
[lc_agro_north_rostok_south]:lc_extra_level_transition_base
lc_extra_level_transition = true
story_id = lc_agro_north_rostok_south
pos = 69.3176, 11.3754, 210.5387
gvid = 883
spot = level_changer_up
hint = space_restrictor_to_rostok_desc
to_pos = -27.1096, -3.4129, -179.7765
;dir = 0,95,0
to_gvid = 1953
; Yantar <-> Wild Territory
[lc_yantar_north_rostok_west]:lc_extra_level_transition_base
lc_extra_level_transition = true
story_id = lc_yantar_north_rostok_west
pos = 163.10, 1.71, 82.70
gvid = 2213
spot = level_changer_up_right
hint = space_restrictor_to_rostok_desc
to_pos = -289.9959, 0.0235, 107.0288
dir = 0,30,0
to_gvid = 1958
trigger_radius = 0.9
[lc_rostok_west_yantar_north]:lc_extra_level_transition_base
lc_extra_level_transition = true
story_id = lc_rostok_west_yantar_north
pos = -292.0420, 0.1472, 106.6506 ;-289.78, 0.09, 192.05
gvid = 1958 ;1849
spot = level_changer_down_left
hint = space_restrictor_to_yantar_desc
to_pos = 165.2181, 1.2656, 70.9240
dir = 0,90,0
to_gvid = 2213
trigger_radius = 0.9

View File

@ -0,0 +1,48 @@
; Zaton <-> Jupiter
[lc_jupiter_north_zaton_south]:lc_extra_level_transition_base
lc_extra_level_transition = true ;; mandatory field
story_id = lc_jupiter_north_zaton_south ;; story_id, without it the item wont be added
pos = -340.5847, 3.5741, 415.0195 ;; position of item
gvid = 4581 ;; Gvid of item
spot = level_changer_up ;; texture to use for spot on the map
hint = space_restrictor_to_zaton_desc ;; string id for hint description, defined in xml files
to_pos = -275.5266, 38.8298, -476.3330 ;; position where to teleport actor
dir = 0,30,0 ;; actor facing, **alternate 'dir = 0,230,0'
to_gvid = 4167 ;; Gvid where to teleport actor
trigger_radius = 1.5
[lc_zaton_south_jupiter_north]:lc_extra_level_transition_base
lc_extra_level_transition = true
story_id = lc_zaton_south_jupiter_north
pos = -288.8179, 40.9423, -475.7296
gvid = 4167
spot = level_changer_down
hint = space_restrictor_to_jupiter_desc
to_pos = -352.3163, 27.6663, 442.2489
dir = 0,60,0 ;; actor facing, **alternate 'dir = 0,230,0'
to_gvid = 4822
trigger_radius = 2.0
; Zaton <-> Outskirts questionable very long teleport
[lc_zaton_east_outskirts_north]:lc_extra_level_transition_base
lc_extra_level_transition = true
story_id = lc_zaton_east_outskirts_north
pos = 476.7127, 35.0672, 51.0224
gvid = 4433
spot = level_changer_right
hint = space_restrictor_to_cop_pripyat_desc
to_pos = -8.0005, -0.3025, 386.8188
dir = 0,60,0
to_gvid = 5007
[lc_outskirts_north_zaton_east]:lc_extra_level_transition_base
lc_extra_level_transition = true
story_id = lc_outskirts_north_zaton_east
pos = -22.1619, -0.5085, 383.1399
gvid = 4907
spot = level_changer_left
hint = space_restrictor_to_zaton_desc
to_pos = 462.8077, 35.3672, 47.6661
dir = 0,90,0
to_gvid = 4433
trigger_radius = 1.5

View File

@ -0,0 +1,245 @@
-- UTILS
-- Load the defaults
local function load_defaults()
local t = {}
local op = lc_extra_transitions_mcm.op
for i, v in ipairs(op.gr) do
if v.def ~= nil then
t[v.id] = v.def
end
end
return t
end
local settings = load_defaults()
local function on_option_change()
settings = load_defaults()
if ui_mcm then
for k, v in pairs(settings) do
settings[k] = ui_mcm.get("extra_level_transitions/" .. k)
end
end
end
local function str_coords_to_vector(str)
local t = str_explode(str, ",")
if #t < 3 then
error("str_coords_to_vector, missing %s coords", 3 - #t)
end
return vector():set(tonumber(t[1]), tonumber(t[2]), tonumber(t[3]))
end
-- Transitions
lc_pool = (function()
local res = {}
ini_sys:section_for_each(function(section)
if SYS_GetParam(1, section, "lc_extra_level_transition", false) and SYS_GetParam(0, section, "story_id") then
local n = ini_sys:section_exist(section) and ini_sys:line_count(section) or 0
if (n > 0) then
res[section] = {}
for i = 0,n-1 do
local _,id,val = ini_sys:r_line(section,i,"","")
res[section][id] = val
end
end
end
end)
return res
end)()
local saved_spots = {}
local change_triggered = false
local function find_save_spot(vid, gid)
for k, v in pairs(saved_spots) do
if v.vid == vid and
v.gid == gid
then
return v
end
end
end
function xr_conditions.is_actor_inside_lc(actor, npc, p)
local lc = actor:id() == AC_ID and npc or actor
local d = SYS_GetParam(2, lc:section(), "trigger_radius", 6)
d = d * d
return npc:position():distance_to_sqr(actor:position()) <= d
end
function actor_on_first_update()
on_option_change()
if ui_mcm and ui_mcm.get("extra_level_transitions/delete_level_transitions") then
ui_mcm.set("extra_level_transitions/delete_level_transitions", false)
end
for sec,v in pairs(lc_pool) do
local se = get_story_se_item(sec)
local pos = str_coords_to_vector(v.pos)
local vid = level.vertex_id(pos)
local gid = tonumber(v.gvid)
if not (se) then
se = alife():create(sec,pos,vid,gid)
end
if (se.position:distance_to_sqr(pos) > 0.1) then
TeleportObject(se.id,pos,vid,gid)
end
if saved_spots[se.id] and saved_spots[se.id].spot and level.map_has_object_spot(se.id,saved_spots[se.id].spot) ~= 0 then
level.map_remove_object_spot(se.id, saved_spots[se.id].spot)
end
if (level.map_has_object_spot(se.id,v.spot) == 0) then
level.map_add_object_spot_ser(se.id,v.spot,game.translate_string(v.hint))
end
saved_spots[se.id] = {
spot = v.spot,
sec = sec,
id = se.id,
vid = vid,
gid = gid,
}
end
end
function delete_level_transitions()
if ui_mcm and ui_mcm.get("extra_level_transitions/delete_level_transitions") then
ui_mcm.set("extra_level_transitions/delete_level_transitions", false)
local sim = alife()
for i = 1, 65534 do
local obj = sim:object(i)
if obj then
local sec = obj:section_name()
if lc_pool[sec] then
sim:release(obj)
if level.map_has_object_spot(obj.id,saved_spots[obj.id].spot) ~= 0 then
level.map_remove_object_spot(obj.id, saved_spots[obj.id].spot)
end
end
end
end
empty_table(saved_spots)
end
end
--global distance calculation
function get_travel_cost(se_obj)
if not se_obj then return end
local sim = alife()
local actor = db.actor
local closest_smart_id
for name,smart in pairs( SIMBOARD.smarts_by_names ) do
if simulation_objects.is_on_the_same_level(sim:actor(), smart) then
local dist = smart.position:distance_to(actor:position())
local smrt = SIMBOARD.smarts[smart.id]
if (smrt) and (not closest_smart_id or (dist < closest_smart_id[1])) then
closest_smart_id = { dist, smart.id }
end
end
end
local closest_smart = alife_object(closest_smart_id[2])
local dist = math.sqrt(warfare.distance_to_xz_sqr(global_position.from(closest_smart), global_position.from(se_obj)))
return dist
end
function is_gvid_on_the_actor_level(gvid)
return game_graph():vertex(alife():actor().m_game_vertex_id):level_id() == game_graph():vertex(gvid):level_id()
end
function teleport_actor(actor,obj)
local sec = obj and obj:section()
local v = sec and lc_pool[sec]
if (v and v.to_pos and v.to_gvid and not change_triggered) then
local pos = str_coords_to_vector(v.to_pos)
local dir = v.dir and str_coords_to_vector(v.dir) or VEC_ZERO
local vid = level.vertex_id(pos)
local gid = tonumber(v.to_gvid)
if settings.enable_time_advance then
-- local saved_spot = find_save_spot(vid, gid)
-- local d = saved_spot and get_travel_cost(alife_object(saved_spot.id)) or 1000
local d = math.random(800, 1600)
local dist = math.floor(d / SYS_GetParam(2, "actor", "walk_accel", 11.5) * random_float(0.75, 1.25))
local hours = math.floor(dist / 60)
local minutes = dist % 60
printf("advance time by %s, %s, distance %s, speed %s", hours, minutes, d, dist)
level.change_game_time(0, hours, minutes)
surge_manager.get_surge_manager().time_forwarded = true
psi_storm_manager.get_psi_storm_manager().time_forwarded = true
level_weathers.get_weather_manager():forced_weather_change()
end
change_triggered = true
if v.snd then
utils_obj.play_sound(v.snd)
end
if v.on_teleport then
local condlist = xr_logic.parse_condlist(obj, obj:section(), "on_teleport", v.on_teleport)
xr_logic.pick_section_from_condlist(actor, obj, condlist)
end
if is_gvid_on_the_actor_level(gid) then
level.add_pp_effector("sleep_fade.ppe", 1313, false)
CreateTimeEvent(0,"delay_travel",3,function()
db.actor:set_actor_position(pos)
db.actor:set_actor_direction((dir.y * 180) / math.pi)
change_triggered = false
return true
end)
return
end
ChangeLevel(pos,vid,gid,dir,true)
-- level.disable_input()
end
end
function handle_nearby_actor(actor, obj)
local sec = obj and obj:section()
local v = sec and lc_pool[sec]
if not v then return end
if change_triggered then return end
-- Evaluate precondition before enabling transition
if (v.precondition and v.precondition ~= "") then
local precond_list = xr_logic.parse_condlist(obj, nil, "precondition", v.precondition)
if (precond_list == "false") then
return
end
if (actor and xr_logic.pick_section_from_condlist(actor, obj, precond_list) == "false") then
return
end
end
if v.disable_dialog then
teleport_actor(actor, npc)
else
local dialog = lc_extra_transitions_ui.create_dialog()
dialog:SetObj(obj)
dialog:Show()
end
end
function save_state(m_data)
m_data.lc_extra_transitions_saved_spots = saved_spots
end
function load_state(m_data)
saved_spots = m_data.lc_extra_transitions_saved_spots or {}
end
function on_game_start()
RegisterScriptCallback("actor_on_first_update",actor_on_first_update)
RegisterScriptCallback("on_option_change", on_option_change)
RegisterScriptCallback("on_option_change", delete_level_transitions)
RegisterScriptCallback("save_state",save_state)
RegisterScriptCallback("load_state",load_state)
end

View File

@ -0,0 +1,23 @@
local to_del = {
["grim_level_changer_to_cit"] = true,
["grim_space_restrictor_to_cit"] = true,
["cit_level_changer_to_grim"] = true,
["cit_space_restrictor_to_grim"] = true,
["mil_level_changer_to_prom"] = true,
["mil_space_restrictor_to_prom"] = true,
["prom_level_changer_to_military"] = true,
["prom_space_restrictor_to_military"] = true,
}
function actor_on_first_update()
for i = 1, 65534 do
local se_obj = alife_object(i)
if se_obj and se_obj.name and se_obj:name() and to_del[se_obj:name()] then
alife_release(se_obj)
end
end
end
function on_game_start()
RegisterScriptCallback("actor_on_first_update", actor_on_first_update)
end

View File

@ -0,0 +1,31 @@
[General]
gameName=stalkeranomaly
modid=0
version=d2024.3.25.0
newestVersion=
category="-1,"
nexusFileStatus=1
installationFile=Extra_level_transitions_bonus_transitions.2.zip
repository=
ignoredVersion=
comments=
notes=
nexusDescription=
url=
hasCustomURL=false
lastNexusQuery=
lastNexusUpdate=
nexusLastModified=2024-03-25T08:52:53Z
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
size=1
1\fileid=0
[Plugins]
BAIN%20Installer\option0=Extra_Transitions_new_maps

View File

@ -0,0 +1,13 @@
[lc_extra_level_transition_base]
GroupControlSection = spawn_group
$spawn = "physics\object"
$prefetch = 8
class = O_PHYSIC
remove_time = 60
visual = dynamics\light\light_signal.ogf
fixed_bones = link
script_binding = bind_physic_object.init
custom_data = scripts\lc_extra_level_transitions.ltx
; Extra items can be included by naming them items_extra_level_transitions_*
; For example,items_extra_level_transitions_cordon.ltx

View File

@ -0,0 +1,21 @@
[lc_cordon_south_darkscape_collapsed_tunnel]:lc_extra_level_transition_base
lc_extra_level_transition = true ; mandatory field
story_id = lc_cordon_south_darkscape_collapsed_tunnel ; story_id, without it the item wont be added
pos = -59,-30,-477 ; position of item
gvid = 449 ; Gvid of item
spot = level_changer_right ; texture to use for spot on the map
hint = esc_space_restrictor_to_darkscape_descr ; string id for hint description, defined in xml files
to_pos = 513.7,-1.5,-420.8 ; position where to teleport actor
to_gvid = 1119 ; Gvid where to teleport actor
; dir = 0,60,0 ;; actor facing
; trigger_radius = 1.2 ;; Radius to trigger transition (default is 6)
[lc_darkscape_collapsed_tunnel_cordon_south]:lc_extra_level_transition_base
lc_extra_level_transition = true ; mandatory field
story_id = lc_darkscape_collapsed_tunnel_cordon_south
pos = 520.17,-1.35,-429.54
gvid = 1119
spot = level_changer_down
hint = ds_space_restrictor_to_escape_descr
to_pos = -64,-29,-457
to_gvid = 449

View File

@ -0,0 +1,19 @@
[lc_limansk_river_jupiter_bandit_base]:lc_extra_level_transition_base
lc_extra_level_transition = true ; mandatory field
story_id = lc_limansk_river_jupiter_bandit_base ; story_id, without it the item wont be added
pos = 68.83,-7,-15.85 ; position of item
gvid = 2440 ; Gvid of item
spot = level_changer_up_right ; texture to use for spot on the map
hint = space_restrictor_to_jupiter_desc ; string id for hint description, defined in xml files
to_pos = -446,0,-345.2 ; position where to teleport actor
to_gvid = 4818 ; Gvid where to teleport actor
[lc_jupiter_bandit_base_limansk_river]:lc_extra_level_transition_base
lc_extra_level_transition = true ; mandatory field
story_id = lc_jupiter_bandit_base_limansk_river
pos = -455.8,0,-345.9
gvid = 4818
spot = level_changer_down_left
hint = space_restrictor_to_limansk_desc
to_pos = 60.1,-7,-5.51
to_gvid = 2440

View File

@ -0,0 +1,21 @@
; Yantar <-> Dead City
[lc_yantar_west_dead_city_west]:lc_extra_level_transition_base
lc_extra_level_transition = true ;; mandatory field
story_id = lc_yantar_west_dead_city_west ;; story_id, without it the item wont be added
pos = -219.6,6.7,-48.95 ;; position of item
gvid = 2307 ;; Gvid of item
spot = level_changer_up ;; texture to use for spot on the map
hint = space_restrictor_to_deadcity_desc ;; string id for hint description, defined in xml files
to_pos = -226,10.01,-181.52 ;; position where to teleport actor
to_gvid = 2318 ;; Gvid where to teleport actor
[lc_dead_city_west_yantar_west]:lc_extra_level_transition_base
lc_extra_level_transition = true ;; mandatory field
story_id = lc_yantar_west_dead_city_west ;; story_id, without it the item wont be added
pos = -234.17,9.86,-190.01 ;; position of item
gvid = 2318 ;; Gvid of item
spot = level_changer_down ;; texture to use for spot on the map
hint = space_restrictor_to_yantar_desc ;; string id for hint description, defined in xml files
to_pos = -222.64,7.48,-62.54 ;; position where to teleport actor
dir = 0,60,0 ;; actor facing
to_gvid = 2307 ;; Gvid where to teleport actor

View File

@ -0,0 +1,8 @@
[logic]
active = ph_idle@idle
[ph_idle@idle]
on_info = {=is_actor_inside_lc} %=script(lc_extra_transitions:handle_nearby_actor)% ph_idle@wait
[ph_idle@wait]
on_timer = 5000| ph_idle@idle

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="windows-1251"?>
<string_table>
<string id="ui_mcm_extra_level_transitions_title">
<text>Extra Level Transitions</text>
</string>
<string id="ui_mcm_menu_extra_level_transitions">
<text>Level Transitions</text>
</string>
<string id="ui_mcm_extra_level_transitions_enable_time_advance">
<text>Enable Time Advance</text>
</string>
<string id="ui_mcm_extra_level_transitions_enable_time_advance_desc">
<text>Time will be advanced on level transitions</text>
</string>
<string id="ui_mcm_extra_level_transitions_delete_level_transitions">
<text>Delete Level Transitions</text>
</string>
<string id="ui_mcm_extra_level_transitions_delete_level_transitions_desc">
<text>Extra level transitions will be deleted from the game. The option is intended for safe removal of the mod</text>
</string>
</string_table>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="windows-1251"?>
<string_table>
<string id="ui_mcm_extra_level_transitions_title">
<text>Äîïîëíèòåëüíûå ïåðåõîäû óðîâíåé</text>
</string>
<string id="ui_mcm_menu_extra_level_transitions">
<text>Ïåðåõîäû óðîâíåé</text>
</string>
<string id="ui_mcm_extra_level_transitions_enable_time_advance">
<text>Âêëþ÷èòü çàòðàòó âðåìåíè</text>
</string>
<string id="ui_mcm_extra_level_transitions_enable_time_advance_desc">
<text>Ïðè èñïîëüçîâàíèè íîâûõ ïåðåõîäîâ áóäåò òðàòèòüñÿ âðåìÿ íà ïåðåìåùåíèå</text>
</string>
<string id="ui_mcm_extra_level_transitions_delete_level_transitions">
<text>Óäàëèòü ïåðåõîäû óðîâíåé</text>
</string>
<string id="ui_mcm_extra_level_transitions_delete_level_transitions_desc">
<text>Äîïîëíèòåëüíûå ïåðåõîäû óðîâíåé áóäóò óäàëåíû èç èãðû. Îïöèÿ ïðåäíàçíà÷åíà äëÿ áåçîïàñíîãî óäàëåíèÿ ìîäà</text>
</string>
</string_table>

View File

@ -0,0 +1,245 @@
-- UTILS
-- Load the defaults
local function load_defaults()
local t = {}
local op = lc_extra_transitions_mcm.op
for i, v in ipairs(op.gr) do
if v.def ~= nil then
t[v.id] = v.def
end
end
return t
end
local settings = load_defaults()
local function on_option_change()
settings = load_defaults()
if ui_mcm then
for k, v in pairs(settings) do
settings[k] = ui_mcm.get("extra_level_transitions/" .. k)
end
end
end
local function str_coords_to_vector(str)
local t = str_explode(str, ",")
if #t < 3 then
error("str_coords_to_vector, missing %s coords", 3 - #t)
end
return vector():set(tonumber(t[1]), tonumber(t[2]), tonumber(t[3]))
end
-- Transitions
lc_pool = (function()
local res = {}
ini_sys:section_for_each(function(section)
if SYS_GetParam(1, section, "lc_extra_level_transition", false) and SYS_GetParam(0, section, "story_id") then
local n = ini_sys:section_exist(section) and ini_sys:line_count(section) or 0
if (n > 0) then
res[section] = {}
for i = 0,n-1 do
local _,id,val = ini_sys:r_line(section,i,"","")
res[section][id] = val
end
end
end
end)
return res
end)()
local saved_spots = {}
local change_triggered = false
local function find_save_spot(vid, gid)
for k, v in pairs(saved_spots) do
if v.vid == vid and
v.gid == gid
then
return v
end
end
end
function xr_conditions.is_actor_inside_lc(actor, npc, p)
local lc = actor:id() == AC_ID and npc or actor
local d = SYS_GetParam(2, lc:section(), "trigger_radius", 6)
d = d * d
return npc:position():distance_to_sqr(actor:position()) <= d
end
function actor_on_first_update()
on_option_change()
if ui_mcm and ui_mcm.get("extra_level_transitions/delete_level_transitions") then
ui_mcm.set("extra_level_transitions/delete_level_transitions", false)
end
for sec,v in pairs(lc_pool) do
local se = get_story_se_item(sec)
local pos = str_coords_to_vector(v.pos)
local vid = level.vertex_id(pos)
local gid = tonumber(v.gvid)
if not (se) then
se = alife():create(sec,pos,vid,gid)
end
if (se.position:distance_to_sqr(pos) > 0.1) then
TeleportObject(se.id,pos,vid,gid)
end
if saved_spots[se.id] and saved_spots[se.id].spot and level.map_has_object_spot(se.id,saved_spots[se.id].spot) ~= 0 then
level.map_remove_object_spot(se.id, saved_spots[se.id].spot)
end
if (level.map_has_object_spot(se.id,v.spot) == 0) then
level.map_add_object_spot_ser(se.id,v.spot,game.translate_string(v.hint))
end
saved_spots[se.id] = {
spot = v.spot,
sec = sec,
id = se.id,
vid = vid,
gid = gid,
}
end
end
function delete_level_transitions()
if ui_mcm and ui_mcm.get("extra_level_transitions/delete_level_transitions") then
ui_mcm.set("extra_level_transitions/delete_level_transitions", false)
local sim = alife()
for i = 1, 65534 do
local obj = sim:object(i)
if obj then
local sec = obj:section_name()
if lc_pool[sec] then
sim:release(obj)
if level.map_has_object_spot(obj.id,saved_spots[obj.id].spot) ~= 0 then
level.map_remove_object_spot(obj.id, saved_spots[obj.id].spot)
end
end
end
end
empty_table(saved_spots)
end
end
--global distance calculation
function get_travel_cost(se_obj)
if not se_obj then return end
local sim = alife()
local actor = db.actor
local closest_smart_id
for name,smart in pairs( SIMBOARD.smarts_by_names ) do
if simulation_objects.is_on_the_same_level(sim:actor(), smart) then
local dist = smart.position:distance_to(actor:position())
local smrt = SIMBOARD.smarts[smart.id]
if (smrt) and (not closest_smart_id or (dist < closest_smart_id[1])) then
closest_smart_id = { dist, smart.id }
end
end
end
local closest_smart = alife_object(closest_smart_id[2])
local dist = math.sqrt(warfare.distance_to_xz_sqr(global_position.from(closest_smart), global_position.from(se_obj)))
return dist
end
function is_gvid_on_the_actor_level(gvid)
return game_graph():vertex(alife():actor().m_game_vertex_id):level_id() == game_graph():vertex(gvid):level_id()
end
function teleport_actor(actor,obj)
local sec = obj and obj:section()
local v = sec and lc_pool[sec]
if (v and v.to_pos and v.to_gvid and not change_triggered) then
local pos = str_coords_to_vector(v.to_pos)
local dir = v.dir and str_coords_to_vector(v.dir) or VEC_ZERO
local vid = level.vertex_id(pos)
local gid = tonumber(v.to_gvid)
if settings.enable_time_advance then
-- local saved_spot = find_save_spot(vid, gid)
-- local d = saved_spot and get_travel_cost(alife_object(saved_spot.id)) or 1000
local d = math.random(800, 1600)
local dist = math.floor(d / SYS_GetParam(2, "actor", "walk_accel", 11.5) * random_float(0.75, 1.25))
local hours = math.floor(dist / 60)
local minutes = dist % 60
printf("advance time by %s, %s, distance %s, speed %s", hours, minutes, d, dist)
level.change_game_time(0, hours, minutes)
surge_manager.get_surge_manager().time_forwarded = true
psi_storm_manager.get_psi_storm_manager().time_forwarded = true
level_weathers.get_weather_manager():forced_weather_change()
end
change_triggered = true
if v.snd then
utils_obj.play_sound(v.snd)
end
if v.on_teleport then
local condlist = xr_logic.parse_condlist(obj, obj:section(), "on_teleport", v.on_teleport)
xr_logic.pick_section_from_condlist(actor, obj, condlist)
end
if is_gvid_on_the_actor_level(gid) then
level.add_pp_effector("sleep_fade.ppe", 1313, false)
CreateTimeEvent(0,"delay_travel",3,function()
db.actor:set_actor_position(pos)
db.actor:set_actor_direction((dir.y * 180) / math.pi)
change_triggered = false
return true
end)
return
end
ChangeLevel(pos,vid,gid,dir,true)
-- level.disable_input()
end
end
function handle_nearby_actor(actor, obj)
local sec = obj and obj:section()
local v = sec and lc_pool[sec]
if not v then return end
if change_triggered then return end
-- Evaluate precondition before enabling transition
if (v.precondition and v.precondition ~= "") then
local precond_list = xr_logic.parse_condlist(obj, nil, "precondition", v.precondition)
if (precond_list == "false") then
return
end
if (actor and xr_logic.pick_section_from_condlist(actor, obj, precond_list) == "false") then
return
end
end
if v.disable_dialog then
teleport_actor(actor, npc)
else
local dialog = lc_extra_transitions_ui.create_dialog()
dialog:SetObj(obj)
dialog:Show()
end
end
function save_state(m_data)
m_data.lc_extra_transitions_saved_spots = saved_spots
end
function load_state(m_data)
saved_spots = m_data.lc_extra_transitions_saved_spots or {}
end
function on_game_start()
RegisterScriptCallback("actor_on_first_update",actor_on_first_update)
RegisterScriptCallback("on_option_change", on_option_change)
RegisterScriptCallback("on_option_change", delete_level_transitions)
RegisterScriptCallback("save_state",save_state)
RegisterScriptCallback("load_state",load_state)
end

View File

@ -0,0 +1,11 @@
op = {
id = "extra_level_transitions", sh = true, gr = {
{id = "banner", type = "slide", text = "ui_mcm_extra_level_transitions_title", size = {512, 50}, spacing = 20},
{id = "enable_time_advance", type = "check", val = 1, def = false},
{id = "delete_level_transitions", type = "check", val = 1, def = false},
}
}
function on_mcm_load()
return op
end

View File

@ -0,0 +1,71 @@
-- basic dynamic msg_box
-- alundaio
class "msg_box_ui" (CUIScriptWnd)
function msg_box_ui:__init() super()
self:SetWndRect(Frect():set(0,0,1024,768))
self:SetAutoDelete(true)
self:InitCallBacks()
self:OnMsgCancel()
self.message_box = CUIMessageBoxEx()
self:Register(self.message_box, "msg_box")
self:InitCallBacks()
self:InitControls()
end
function msg_box_ui:Reset()
self.obj = nil
end
---@param obj game_object
function msg_box_ui:SetObj(obj)
-- Track nearby teleport space restrictor
self.obj_id = obj:id()
-- Update text to indicate destination
local next_level = game.translate_string(lc_extra_transitions.lc_pool[obj:section()].hint or "")
local msg_str = game.translate_string("st_level_changer_descr")
local str = strformat(msg_str, next_level)
self.message_box:SetText(str)
end
function msg_box_ui:Show()
self.message_box:ShowDialog(true)
end
function msg_box_ui:__finalize()
end
function msg_box_ui:InitCallBacks()
self:AddCallback("msg_box", ui_events.MESSAGE_BOX_OK_CLICKED, self.OnMsgOk, self)
self:AddCallback("msg_box", ui_events.MESSAGE_BOX_CANCEL_CLICKED, self.OnMsgCancel, self)
self:AddCallback("msg_box", ui_events.MESSAGE_BOX_YES_CLICKED, self.OnMsgOk, self)
self:AddCallback("msg_box", ui_events.MESSAGE_BOX_NO_CLICKED, self.OnMsgCancel, self)
end
function msg_box_ui:OnMsgOk()
local obj = level.object_by_id(self.obj_id)
if not obj then return end
lc_extra_transitions.teleport_actor(db.actor, obj)
end
function msg_box_ui:OnMsgCancel()
-- Teleport player away from space restrictor?
-- Require grabbing some 'reject' position from config
-- See ui_sr_teleport.script
end
function msg_box_ui:InitControls()
self.message_box:InitMessageBox("message_box_yes_no")
end
function create_dialog()
local ui = msg_box_ui()
ui:Reset()
return ui
end

View File

@ -1,21 +1,21 @@
[General]
gameName=stalkeranomaly
modid=0
version=d2024.3.13.0
version=d2024.3.25.0
newestVersion=
category="2,"
category="-1,"
nexusFileStatus=1
installationFile=Fixed_Vanilla_ModelsTextures.6.7z
installationFile=Extra_Level_Transitions.4.zip
repository=Nexus
ignoredVersion=
comments=
notes=
nexusDescription=
url=
hasCustomURL=true
hasCustomURL=false
lastNexusQuery=
lastNexusUpdate=
nexusLastModified=2024-03-13T04:35:35Z
nexusLastModified=2024-03-25T08:27:06Z
nexusCategory=0
converted=false
validated=false

View File

@ -1,441 +0,0 @@
___________
DESCRIPTION
___________
Fixed Vanilla Models & Textures. "FV-M&T" for short, "FVM" for shorter and much more memorable.
After playing Anomaly for such a time, using no model mods whatsoever, I have noticed that the game, sadly, has so many, many flaws in its models.
Some examples:
* Many textures are missing mipmaps, making some textures look like an edged oversharpened mess.
* Some models have smoothing errors, making them look like a complete blocky mess. Especially prevalent on Nosorogs, ExoSEVAs and Protoexos.
* Some models have "repeated textures", to fix this I instead kept as such but completely changed the texture.
* Almost all factions have a "camo facemask" head variant that is so low quality it belongs in Counter-Strike 1.6 instead.
* All Monolith have a "full black camo" that looks like it was overlayed on the whole texture, completely ugly and unfit.
* Mercenaries have quite the variety of low-quality (re)textures.
* Ecologists could have been better instead of a single color that can make you confuse them for Mercenaries.
[For more information, check "DETAILS" below]
So, with all that in mind, I just got tired and went ahead and fixed almost all of them the best I could.
This took more than a year to make, and I do hope all the work done will be worth it for all of you, if it makes you to even at least give it a try despite being completely in favour of "HD Models", I am flattered you'd do so.
DO NOTE!
I do not have any intention to "HDify" anything, this pack was made ONLY to fix issues, be it technical or visual.
Knowing this, do not expect a massive visual improvement.
It may or may not be more performance heavy, this has not been tested, but it is doubtful that you'll get an extreme FPS drop.
(If anything, your FPS will increase thanks to these mipmaps)
Also, some models will not be changed simply because they're so low-quality they shouldn't even be in the game. For example...Monolith Patchwork SEVAs, the "Helmet" variants, some LC Suit variants.
I recommend you use this mod with "Less Ugly Variety" (LUV) in combination, so you can remove the ugly models like Monolith Patchwork SEVAs.
___________
INSTALLATION
___________
Simply extract the "gamedata" folder into your STALKER Anomaly directory.
New game is not required, since this is meant to be only a Models & Texture changer.
You can also install and uninstall anytime, but please be careful with the addons.
___________
OPTIONS/ADDONS INFORMATION
___________
- "Alternative Ecomercs". Changes how the Ecomercs are in FVM to use a more subtle, but still visibly highlited, yellow.
- "Armored SEVA" Ecomerc now uses a blue-&-yellow SEVA suit, with a black-&-yellow backpack and better emblem that has Ecologist orange background color. This will make him easily identifiable at a distance.
- "Twilight" Ecomerc now uses SEVA/PS5 armor for the torso, while preserving the pouches in the belly and the oxygen tanks are fixed. Also has a blue-and-yellow color scheme, with orange on its highlights.
- "LC Suit" Ecomerc now has many yellow color scheme details, a better emblem and orange visors.
- UNISG Overhaul. Completely redoes UNISG visual style, including camo and colour.
The main colour shall now be light gray, with a very bright Green and Red highlight.
- SIN Overhaul. Completely redoes SIN.
Makes them have a much more "mutant" and "cultist" look like it should have.
- 'Wind of Freedom' Variants. Adds more variants for Wind of Freedom, up to 6.
- SEVA Glass Variety. Adds various different types of SEVA Glass to SEVA armors instead of being just one single blueish tint.
In other words, Duty will use a beautiful golden tint, Loners will be a Greenish tint with some Orange and Monolith will use a bizarre Pinkish with Teal.
___________
COMPATIBILITY
___________
The mod will conflict with anything that changes the models and textures.
Popular mods such as "Dux's Innumerable Character Kit" and "Armor Balance Collection" are compatible by default. Besides, they use a lot of materials from FVM.
Not compatible with "HD Models" because they're both completely unrelated.
___________
DETAILS
___________
_____UNIQUE_____
* All Unique faces (Such as Trapper, Beard, Strelok, Nitro, Cardan and so on) now use the original CoP textures, which are much better, have proper skin tone and none of those ugly repainted beards.
* Ecologist character "Tokarev" was using a SSP suit despite being inside the bunker all day and a face texture that didn't fit the UV. It now uses "Sokolov"'s face and the Scientist Suit.
* Freedom character "Leshiy" was using a face texture that was a combination of over 7 materials, had smoothing errors and used an "old" texture for the suit. He now looks exactly like in Clear Sky, but with the "Sentinel of Freedom" armor.
* Freedom character "Screw" was just Loki. Now uses his own model, which is a "Wind of Freedom" with a face that resembles Bes from ShoC.
* Neutral character, part of Strelok's group, "Rogue", is now The Ultimate Badass (May Bill Paxton rest guns blazing):
- Uses the bulky CS-3a helmet
- Arms & Torso (Armor) is a SKAT, his top favourite armor, since he prefers something conventional over an Exoskeleton (Don't get mad, darlings).
- Carries many pouches for ammo, repair kits and the like. (From CS-3b)
- Has a good ol' protective ballistic kilt, the Scottish would be proud. (From CS-3b)
- Quite the bulky trousers with extra-bulky metal plated leg armor. (From CS-3a and CS-3b)
* Neutral character, "Doctor", has been fixed:
- Eye colour changed from a bright blue to a dark brown, fitting his cutscene in ShoC.
- Fixed the Normal Map, now uses a much better one made by Argus.
- Smoothing errors on the model fixed.
* Monolith character, Eidolon, has been overhauled:
- Now has a custom pattern for the glass that gives him a more sinister cultist look to it. (Don't want to spoil too much)
---Said glass also uses its own specular map, making the blood look bloody and the paint not have any "shine" to it.
-Now uses a custom armor texture, which is a complete Urban Camo pattern and uses Carapace (white) armor pads instead of the default metal.
-Fixed the model mesh itself, such as...Smoothing errors, visible voids, discrepancy and broken bones.
_____TEXTURES_____
-ALL-
* SEVA Glass was a badly compressed 128x128 texture taken from Build 1964. It has been completely redone, at 256x256, with a proper normal & specular map, picking the good from Build 1964, ShoC and CoP.
[The same treatment is given to the SPP and ExoSEVA glass, using a blue-tinted variant]
* "Specnaz Glass" has been overhauled, it is now at 512x512, has a proper "semi-bubbly" normal map and stronger shiny specular.
* "Glasses", the ones Skinflint and some other rare characters use, has been overhauled to fix all that complete blackness and give it transparency (for the cubemaps), its own normal map and a nice specular.
* The STS Suit, also known as X-18 Suit, didn't have a proper normal map. I have manually painted one.
* Two face variants that had green masks were missing their normal maps. This has been fixed.
* All modern Russian gasmasks (such as those on the SKAT-9M) had broken visors. This has been fixed, back to the original orange tinted one.
* Most if not all SEVAs (Loner, Merc, Freedom) backpacks had bad textures, broken normal maps or no mipmaps. This has been fixed.
* Proto-Exos' Skeleton had a terrible bumpmap, an original from ShoC has been restored.
* GP-5 Mask has bad compression errors, no normal map and no mipmaps. It has been given all.
* "Digital Black&Orange Camo" face has been replaced with good ol' classic ShoC green-cloth face. Also known as "The Green Stalker".
* All "Exoskeletons" had a somewhat flat Specular Map. It has been improved, metal now shines like metal.
* All "Trenchcoat" variants, especially including bandits, had a flat normal map. It now uses Argus' and mine. Also includes much better specular, with realistic shading for the eyes and leathery and wet appearance for the coat.
-ZOMBIFIED-
* One face variant was just a "painted on" balaclava based on the Balaclava's face. This has been replaced with a proper Zombified face.
* One face variant was just a "painted on" balaclava based on the Green Stalker's face. This has been replaced with a proper Zombified face.
* "Ecologist Zombies" now use their own unique texture, in a way, it's exactly the same as the Ecologist SPPs but much more visibly dirtier, rusty, unkempt, broken and so on.
-LONER-
* "Loner Trenchcoat" had missing Normal Maps. This has been fixed.
* "Rookie Jacket" Normal Map was a bit broken, especially on the Specular Map. This has been fixed.
* One of "Rookie Jacket" variants, "Camo", was nothing more than a darkened and camo-all-overlayed texture. It has been replaced with a proper bright camo, including pants and dark misc parts.
* One of "Rookie Jacket" variants, a green-toned type, had some consistency issues. This has been fixed.
* One of "Rookie Jacket" variants, just a plain forest camo, has been redone with a blue leather jacket that has some "edgy" urban camo parts to it and greenish pants.
* One of "Rookie Jacket" variants, which was just "Freedom Rookie" camo but desaturated, has been replaced with the classic "White Urban" from ShoC.
* "Sunrise Suit" had no Mipmaps, this has been fixed.
* "Sunrise Suit Variant 2", Salamander, had part of his shoulders fixed and his gastank redone.
* "Sunrise Suit Variant 3", Graphite, had part of his shoulders fixed and his pads redone to be a static colour instead of camo.
* "Sunrise Suit Variant 4", Drought, has been overhauled: It now uses a dark torso with green highlights, pads are dark green and clothing has better camo more fit for a dry swamp.
* "Sunrise Suit Variant 5", Tigerstripe, had part of his shoulders fixed.
* "Sunrise Suit Variant 6", Autumn, has been overhauled: Uses a completely different camo, more fit for Autumn/Fall, shoulderpads fixed and other enhancements.
* "Wastelander" had the leatherpads changed to brown, added some more black decor to it and fixed the shoulders. Also was missing normal map, restored.
* Original "Exoskeleton", with original colours has been restored.
-BANDIT-
* "Bandit Sunrise" has been overhauled, to be an actual Sunrise instead of an STS suit. It is made to appear like a rough craftsmanship and scavenged unpainted equipment.
* "Bandit Ecoguard" suit has been overhauled, it is now a combination of the STS pants, Wind of Freedom Belt and the rest a customized type of the Ecoguard outfit, using darker uglier colours and a specific brownish woodland camo.
* "Bandit Jacket" Normal Map was a bit broken, especially on the Specular Map. This has been fixed.
* "Bandit SEVA" Variant 1 is now a proper looted Loner SEVA, combined with looted parts of the Loner Sunrise and Ecologist Guard suit. Also uses its own normal map and specular.
* "Bandit SEVA" Variant 2 is now a Bandit LC with the SEVA backpack and helmet, this gives it a more proper "Looted" and "Ballistics Improved" appearance.
* One of "Bandit Rookie" variants, red&black letterman jacket, has been replaced with an intricate Red&Black Leather Jacket.
* All variants of the "Bandit Rookie" were using the wrong normal map, it now uses the proper one.
* The original "Bandit Trenchcoat" somehow had a SEAMLESS METAL hood texture and mipmaps broken. This has all been fixed by using the original CoP texture instead.
* One of the Bandit/Looted LC Suits was just a darker version of the original. It is now a "palette swap", where the clothing is black and the armor is brown instead.
* Bandit Exoskeletons have been overhauled, as well as given their proper .thm files so they have a normal map.
-CLEAR SKY-
* All Clear Sky textures were at 1024x1024, they have been restored to 2048x2048 with less compression artifacts. In detail:
- CS-1a was using a camo clothmask and badly-made metal spaulders, now it's back to the default blue-gray and green leather spaulders
- CS-1b had a variant that used an unfit and badly made "Digital Camo" as well as its normal maps were broken.
Normal maps are fixed, original restored and the other variant is now an intricate one with green pants.
- CS-2 was desaturated and added a green filter, with some bad artifacting on the glass. This has been fixed.
- CS-3a had an incredibly desaturated look, especially on the armor. Original color has been restored.
- CS-3b had a variant that used an unfit and badly made "Digital Camo".
Original restored and the other variant is now the same but with black pants.
* Clear Sky "Sunrise" has been overhauled, fixing the issues it had such as no mipmaps, bad texture clipping, broken pants and camo. It now uses proper camo, almost fitting CS-1a itself, has black pants and fixed pouches.
* New Clear Sky "Sunrise" variant that uses "STS" torso and camo hood.
* Clear Sky "Exosuit" had no mipmaps, now it does.
* Clear Sky "Exolight" had no mipmaps, no normal map and was identical to the Exosuit anyway. Now it has black torso instead of camo and uses mipmaps & normal map.
* Clear Sky "SKAT" completely overhauled, it now uses a much better texture, with better camo, set mipmaps and a proper normal map.
* "Clear Sky SEVA" Variant 1, the STS, was using an improper normal map. This has been fixed.
* "Clear Sky SEVA" Variant 2, the one 4x2 Bumps torso, was using an improper normal map. This has been fixed.
* "Clear Sky SEVA" Variant 3, the PS5m-lookalike, was using a wrong normal map. This has been fixed.
-DUTY-
* One Duty face variant had missing normal maps. Restored.
* Duty's PS5-M was using an unfit normal map. This has been fixed thanks to "Dynamic".
* One of the Duty SEVA variants, the Pathfinder, had some minor issues and imperfections, it has been redone to fit a "Hunter" scheme better.
* One of the Duty SEVA variants, the "Scientific Guard", had some minor issues and imperfections, it has been redone to have better color composition.
* One "Duty SKAT" variant was using a 512x512 texture instead of 1024x1024. It's now back to 1024x1024. Also changed it to be a SKAT-9 (Plates).
* "SKAT Commander" was not too impressive, it has been redone to look amazing and unique, fit for an actual Frontlines Captain.
* Second Variant of Duty's PS5-M had some minor errors such as metal being painted red, missing some color and slightly broken shoulders. This has been fixed.
* Maskless PZD Dutyers were using the wrong normal map for their armor, now it uses the proper one.
-FREEDOM-
X [OPTIONAL] Freedom now has about 6 more "Wind of Freedom" variants, making up to 8.
All Variants have different wear and two kinds of armor textures for some diversity.
* "Wind of Freedom" had no proper normal map. I have manually painted one.
* One variant of the "Wind of Freedom" was using a texture that was a mishmash of the CS-3b, it now uses the original from SHoC again, but with changes such as blueish dark gray on details and some clothing and orange on metals.
* One of the "Sentinel of Freedom" variants, the one that uses an STS torso, had a bad mismatched normal map. This has been fixed.
* One of the "Guardian of Freedom" variants had a texture with no mipmaps, this has been fixed.
* Freedom SKAT has been completely overhauled, it is now a somewhat-flashy SKAT-9 & SKAT-9m combo, meaning it uses Plates and Gasmask respectively, with green flecktarn camo and blue&orange details. Also has functioning mipmaps, normal map and specular map.
-MERCENARY-
* [UNUSED IN-GAME BUT AVAILABLE IN-FILES] "SEVA/LC Combo Merc" were using very flat textures, it has now been edited to have minor details to further indicate they're part of the Mercs.
* "Merc/LC Suit" was using a different version that looked weird, with badly-painted pants and erroneous contrast on the armor, as well as missing mipmaps. The Original has been restored.
* "Sunrise Merc" was missing mipmaps and had wrong textures for the gastanks, this has been fixed.
* One of the "Sunrise Merc" variants was just the same but heavily darkened. It is now the Merc Sunrise with more decorational highlights. Also used the wrong normal map, fixed.
* One of the Mercenary suits was an ugly "desert camo" that didn't fit in The Zone at all. It is now a blue urban camo.
* One of the Mercenary suits was some kind of "variety salad" camo that didn't fit The Zone at all. It is now an intricate Hunter-like suit.
* "SEVA Merc" was using a texture with some wonky contrast and missing mipmaps. The Original has been restored.
* "Merc SKAT" has been overhauled, it now uses Merc Blue and has green highlights. Fits with the remodel.
* One of the "SEVAs" were using a wrong normal map, this has been fixed.
* One of the "Merc/LC Suit" variants, "Green", had the patches green itself that resembled Freedom's. It has been fixed back to Mercenary Blue, also added some further blue decorations to make sure he's easily spot as a Mercenary.
* One of the "Merc/LC Suit" variants, which uses a slate-gray desert camouflage, now uses another camouflage fit for Urban combat and only on the jumpsuit.
* One of the "Exos" variants, "Green Camo", was badly made and had green eyes and patches. This has been redone to be much better.
* "Proto-Exo Merc" was using a texture from the Ecologists. It now uses one from the Mercs.
* All the "Exo" variants (ExoSEVA, Exosuit, Radsuit, etc) were using an unfit bright forest camo. The Original has been restored.
Also they had transparent eyes for some reason, unlike the others, this has been synchronized.
-MILITARY-
* SKAT-9 and SKAT-9M have been completely overhauled, with a much more improved normal map, new specular map and texture fixes.
* SKAT-9 Tinted Visors have been restored, previously they were transparent.
* Military SEVA has been overhauled to fit in with the overhauled model itself.
* Military Exoskeleton (and in turn, ExoSEVA) had a texture with no mipmaps and wasn't even using a normal map. This has been fixed.
* Military Exolight had a texture with no mipmaps and wasn't even using a normal map. This has been fixed.
(NOTE: This is also the "Woodland Exosuit", so it fixes more than just the Military Exolight)
* Soldiers & Spetsnaz had a lower-res texture with no mipmaps, this has been fixed.
-ECOLOGIST-
* All SPP suits have been improved:
- All now use a proper Normal Map made by Argus.
- All variants now have a better contrast for the highlighting parts (on the legs).
- Specular completely changed to make it so the suit is reflective, especially the highlights. This is similar to what the construction workers use.
- Blue variant has been changed to a more Ecologist fit type, which is more a mix of Cyan & Blue. Also has torso bumps.
- Brown variant is now a much darker dirt-brown color, without torso bumps.
- Red variant is a much more "fancy" type of the SPP, with black torso bumps and brass decorations.
- Yellow variant is a more mundane type of yellow.
- White variant is the same, but also has darker misc items to help with contrast.
* Ecologist Proto-Exo had no normal map, now it does. This is thanks to "Dynamic".
* All "Ecomercs" had boring details, just some black or a lighter shade of blue and the Ecologist symbol, they have been revamped:
- "Armored SEVA" Ecomerc now uses a blue-&-orange SEVA suit, with an orange backpack and better emblem. This will make him easily identifiable at a distance.
- "Twilight" Ecomerc now uses SEVA/PS5 armor for the torso, while preserving the pouches in the belly and the oxygen tanks are fixed. Also has a blue-and-orange color scheme.
- "LC Suit" Ecomerc now has many orange color scheme details, a better emblem and orange visors.
* Variant 1 of the Ecoguard has been changed, it now has black shoulderplates and better, unique kneeplates. Also uses its own normal map.
* Variant 2 of the Ecoguard has broken shoulders, this has been fixed, as well as given orange tint to decorations to make him be spotted better. (It was easy to confuse him for a mercenary)
* Variant 3 of the Ecoguard has broken shoulders, this has been fixed.
* "SEVA Ecoguard" has broken shoulders, this has been fixed.
* "Orange Guard" Ecologists were using the wrong normal map, this has been fixed.
* Restored original "Scientist" suit, the one in Anomaly used an Ecologist patch for no reason. Also improved the normal map.
-MONOLITH-
* The weird digital camo that was applied over the whole texture and was badly compressed and saved with no mipmaps has been removed, now it uses the original Monolith armor textures instead.
* Monolith SEVA Variant 2 has been revamped, it's now a more intricate "Loner" SEVA that uses Monolith colors & urban camo.
* All "Old/ShoC" models were using wrong normal maps, new one was made from scratch for all.
* All "Old/ShoC" models now have 3 texture varieties; default camo, no camo green jumpsuit from Builds and Monolith Sunrise suit.
* All "New/CoP" models now have 3 texture varieties: default camo, Monolith Sunrise and Monolith PS5.
* One of the "face" model variants now have a different, better face and use Monolith Sunrise suit.
* One of the variants had a duplicate texture, it now uses a "Duty PS5M" recolored to be using Monolith Colors & Urban Camo.
* The default gasmasks were somehow colored green, this has been reverted back to light gray.
* "Monolith Exosuit" was using a terrible texture that looked like a mix of Army Suit and Exosuit, this has been fixed now.
* "Monolith SKAT" has been completely overhauled, also has mipmaps and a proper normal map.
* "Monolith ExoSEVA" was missing a normal map, this has been fixed.
-RENEGADES-
* "Renegade Exoskeleton" Variant 1 was broken and had missing normal map & mipmaps. It has been redone to resemble a Neutral Exoskeleton that has been looted.
* "Renegade Exoskeleton" Variant 2 has been redone to resemble a Looted Freedom & Duty Exoskeleton.
* "Renegade SEVA" has been redone to resemble a combination of looted Neutral SEVA & Monolith SEVA, taken from corpses and made patchworks.
-SIN-
Sin has been REDONE, for the full experience though make sure you install the "Sin Overhaul" addon. All textures may now use the new Sin Camo, which is some sort of flesh being torn apart to reveal a dark purple skin, fit for a Demon. The pattern is also meant to look like emission waves, fitting Sin even more.
* All Sin faces that had "red strips" have been decolorized and darkened.
* Sin Stalker Variant 1 is still a PS5, but this time with its own Dark Purple color.
* Sin Stalker Variant 2 is now a Sunrise instead, with the new standardized Camo and scheme fitting its "Dark Stalker" aspect.
* Sin Stalker Variant 3 is now an STS suit, to indicate it is taken or traded from Monolith, completely darkened and made fit for its fainted Red color.
* "Sin Proto-Exo" now shares texture with the first variant.
[SIN OVERHAUL]
* "Sin Proto-Exo" is now The Iron Spirit, a combination of parts of the Exoskeleton. Makes it resemble a proper cultist.
* "Sin Armored Trenchcoat" variants all now have better trenchcoat texture with Sin-appropriate camo, high-quality concealed armors and other additions like Sin-modified gasmasks.
-UNISG-
* Some UNISG variants were missing normal maps, this has been fixed.
* Some UNISG variants were using the zombie face, they now use a light-skinned bright-eyed one instead.
* One Exoskeleton variant was missing mipmaps, this has been fixed.
[UNISG OVERHAUL]
* All suits (especially LC) now have a more consistent camo that should indicate their rank:
- Variant 1 is "Trooper", a Gray&Red spot-type camo.
- Variant 2 is "Officer/Recon", same as the "Trooper" but with Light Mint as the main color instead of Gray.
- Variant 3 is "Commander/Specops", which is tiger-stripes with the borders red and the inside green, main colour simply being dark gray.
* Exoskeletons now have their unique style:
- First Variant is a "Trooper" type that uses a slightly worn Carapace type of armor and the whole armour is camouflaged, with subtle details.
- Second Variant is a "Commander/Specops" type with better carapace armor and highlighted details.
- Both variants have their own type of gasmask.
- Both variants uses a unique Normal Map & Specular Map.
* "LC SEVA" suits have their unique style:
- First variant is a complete SEVA suit with UNISG colours and subtle "Officer/Recon" camo, as well as brass decorations.
- Second variant is a complete ISRIT jumpsuit with UNISG colours and more Carbon Fibre.
- Second variant uses its own normal map & specular map.
* "Proto-Exo" has been overhauled, it is now a combination of the "UNISG SEVA" and parts of the Exoskeleton itself, slimmed down heavily.
_____MODELS_____
Smoothing errors fixed, shading and smoothing improved on:
-ALL-
All NBCs completely overhauled, it is now meant to look like a true, makeshift NBC. Comes as a variety of either Primitive which uses GP5 or Modern which uses M40 gasmask, Bandits & Loners have unique variants that are a combination of Trenchcoat & Rookie Jacket.
* Primitive is the classic one that uses the GP-5, has no visible "naked" parts.
* Modern uses the XM-40 gas mask, with dual canisters as well as bigger than usual, has no visible "naked" parts.
* Bandits use a variant of the "Primitive" type that is cloaked by a Semi-Trenchcoat.
* Loner has a variety of everything; Primitive, Modern, Rookie and even one Trenchcoat GP5.
* Sin, if using "Sin Overhaul" itself, will have masked actual half-Mutants for NBCs.
* Most Sunrise had "puffy round" gastanks, this has been fixed. (It was actually caused by a texture)
* SEVAs
* Exoskeletons
* Exolights
* Proto-Exo
* ExoSEVAs [Also, all ExoSEVAs had bad glass shape and broken oxygen tanks, both fixed.]
* Nosorogs [Also, all Nosorogs had broken bones, where the legs and arms would go upwards instead of downwards. Now it is fixed.]
-ZOMBIFIED-
* "Ecozombies" [Also, now have broken glass, the glass is also different for each zombie.]
-LONERS-
* "Hybrid SEVA" (which is actually factionless just like the Loner SEVA itself) had a massive overhaul that makes it look like a proper patchwork of the SEVA with the torso replaced to be better against ballistic damage.
* "Wastelander" overhauled, it is now a combination of the Sunrise and parts of CS-3b; helmet, kneepads and elbowpads
* "Nomad" overhauled, still resembles the original but uses STALKER assets, it's a combination of the Sunrise and CS-2 with much bigger pouches.
* All "Rookies" and their variants.
* All "Sunrise Suits" and their variants.
[The "Merc" gasmask variant also had his oxygen tanks changed to a backpack]
-BANDITS-
* Some Trenchcoat variants now use a "fat" variant that may or may not have a looted gasmask.
* "Looted SKAT" overhauled, in the sense that it is an actual "Looted SKAT" now, where the clothes are ditched but the armour kept.
* "Armored Trenchcoats" are now properly using a variety of armors inside their trenchcoats.
* All "Rookie Bandits" and their variants.
* All Looted Merc/LC Suits.
-CLEAR SKY-
* Clear Sky Rookies
* Clear Sky Sunrise [CS-2b]
* CS-1a
[One new variant that uses CS-2 gasmask]
* CS-1b
[One new variant that uses CS-2 gasmask]
[One new variant that is a mix of CS-2 legs and CS-3b arms]
* CS-2
[New variant that is the same but "Open-Face"]
[New variant that makes him look like a scavenger, with a backpack and parts of the CS-1a including Pauldrons]
* CS-3a
[New variant that is the same but without the gasmask, revealing a face]
[New variant that is a mix of CS-3a itself, CS-1a and CS-2, looking much more armored and equipped]
* CS-3b
* SKAT-9 & SKAT-9M
-DUTY-
* All "PS5m" variants.
* All "Duty with Face" variants.
* Colonel Petrenko.
* General Voronin.
-FREEDOM-
* Wind of Freedom
* Sentinel of Freedom
* Guardian of Freedom
-MERCENARY-
* "Merc SKAT" overhauled, it is now a combination of the LC Torso & Gasmask with the SKAT limbs.
* "Twilight" Suits
* Merc/LC Suits
-MILITARY-
* "Military SEVA" is now a combination of the SEVA & SKAT, still clearly visible that it is indeed a SEVA.
* "Balaclava Soldiers" now use the proper head mesh.
* All "Soldiers with Bandanas"
* All "Soldiers with Berets"
* SKAT-9 & SKAT-9M
* Berill-5 and Berill-5M
-ECOLOGIST-
* All "SPP" variants
* "Proto-Exo" had some minor overhaul, specifically proper metallic armpads. (Credits to Dynamic for these pads)
* "Armored SEVA" Ecomerc
* "Twilight" Ecomerc [Also removed pointless oxygen hose]
* "LC Suit" Ecomerc
-MONOLITH-
* All GP5 models
* All "Old/ShoC" models
* All "Face" models
* SKAT is now a SKAT-9 (Plates, Mask) instead of a SKAT-9M (Pouches, Gasmask)
-RENEGADES-
* Looted LC Suits
* "Renegade Hoodie" had a major overhaul, now uses only original materials instead of Killing Floor. (Credits to "nestantart" for original model & texture)
-SIN-
* All "Stalker" Variants.
* All "LC Suits"
* All "Trenchcoat" Variants.
* "Sin NBCs" are now actually unique by making them look like half-mutants.
-UNISG-
* Nosorog was the "Fake Altyn" variant, it is now back to the Metro Helmet variant.
* LC Suits
* STS Suits
-MISC-
Various World Models were using Unique, but Duplicate, textures. This made no sense, they now use the correct default shared textures all.
___________
LORE
___________
Just in case you are either curious, worried or skeptical about something, I have put some "Lore Reasons"
"Broken Glass" for Ecozombies reasoning:
Apart of the broken glass itself simply being impressive, the SPP is a suit made for hazardous operations, and since it is indeed made by the Ecologists in the Zone (or with knowledge of it), Psy protection is a must.
So, considering that, how is it that "full zombies" are going around with these suits? They should all be dead, it makes no sense, especially with how the subject is ONLY zombified, not a full zombie.
Also, do notice how in no other STALKER game there are things such as "SEVA Zombies", or even zombies with helmets (Save for one Beril from ShoC), it gives you an idea that zombies remove any headgear to be, perhaps, more in tune with the "zombification" itself.
So in order to make at least *some* sense, the glass is broken to give the idea that this is how they lost their sanity and became zombies.
"Sin Overhaul" Reasoning & Lore:
I always wanted to consider Sin as a Cultist type of faction but with some will of their own still; instead of simply brainwashing people to join their cause, they spread the word around to convince them that The Zone is alive and sacred instead.
They're not fools, they know they have very little members and may continue so, so instead of using Pawns as cannon-fodder, they equip them with their own armours taken from other factions, all dark to try to avoid being noticed. Hence the "Dark Stalker" lore.
While highly aggressive, they shouldn't be territorial except to their own territory and what they consider sacred; The Zone itself, which includes the Nuclear Plant and especially the Generators.
So, they mostly prefer being left alone, but don't mind sending missionaries to get more members. Despite having Pawns, they still treat them with some respect and not as just meat, unlike Monolith itself.
And in terms of their relationship with Monolith, Sin should be the new de facto bosses of "Monolith" instead, the ones who are actually pulling the strings now.
"UNISG Overhaul" Reasoning & Lore:
UNISG, by default, uses a ridiculous camo which may be a "temporal" solution to GSC's attempt at making ISG, then UNISG and then finally scrapping it (yet some very vague references are left out in Call of Pripyat's quest regarding a drone)
Instead of going for something more subtle, I've decided to keep the ridiculous aspect but also not go way to far, it's not a literal clown camo, it's a camo that MAY work, similar to the Clear Sky camo.
For that reason, they have those kind of camos instead.
"Ecologist Mercenary" Lore:
* They are Mercenaries, of course, paid by and affiliated to the Ecologists.
* Their job is not only to be the bodyguard, backup and sometimes guinea pig, but also the first one and hopefully only to get shot, or mauled by a mutant.
* So they generally get paid more than if they weren't working for the ecologists and should get much more advanced inventory, hence you see stuff like the Merc Twilight armor but with a PS5/SEVA torso armor instead (This one is also better for mutant attacks, anyway).
* All these emblems and new paint scheme is mostly done by request from the Ecologists, but also by the thinking of some Mercs (Not all mercies are dummies, you know?): Considering the Ecologists had quite the problems with mercs themselves, especially Wolfhound's team, even if somewhat neutral these days and Wolfhound is gone, they don't want to run any more risk, hence this color scheme.
* The very flashy orange is exactly for that reason; to be seen by others, especially Hunters, so not to be shoot by them.
But if that's a hostile human, that's fine, since as mentioned before they have to be the ones to be shot first, not the more important eggheads they are babysitting for.
"Monolith are SKAT-9 instead of SKAT-9M" Lore:
[SPOILER!]
If you have played the classic STALKER series, especially "Shadow of Chernobyl", then you will know that during the Siege of CNPP, the Military also took role and they sent their best, including "Military STALKERs", who wore the SKAT-9 armours. Back then there was no SKAT-9M, despite it appearing in "Clear Sky" which is the pre-sequel.
But whatever the case, in my view, I consider SKAT-9 to be an "older" variant of the SKAT itself, but still as good, only being just a bit bad for radiation and weight carry.
So for that reason, I think it would make sense that Monolith would have A LOT of re-acquired SKAT-9s and not SKAT-9Ms.
"Military SEVA" Reasoning:
I had some people get confused as to why the Military would use SEVAs.
I believe the reason is very simple though: SEVA is a versatile suit made to be a jack-of-all-trades when it comes to zone exploration, where it sacrifices a bit of elemental resistance to add some to ballistics protection.
For the Military, it may not be as important, but I expect SEVAs to be carried by Military STALKERs more often than not, so, it does make sense they'd use a combination of some SKAT parts with the SEVA.
___________
FEEDBACK/CONTACT
___________
For suggestions, it would be best if you first explain what should be done, and then why. Providing other information, such as screenshots, sources and the like is highly encouraged.
For bug reporting, it would be best if you provide a screenshot and if you can, the name of the object in question that has issues. This can be done with the Debug Menu, simply press F7 in-game while aiming at a model, then "Get Info" and screenshot that.
Also, explaining the issue in detail would be nice, if you know how, for example...It uses the wrong normal map, normal map is broken, specular is too high, texture is compressed badly, it has missing mipmaps, etc...
___________
COPYRIGHT/LICENSE
___________
You are allowed to use this mod on other STALKER games (This includes the original series and major mods like Dead Air) AS LONG AS you provide credit to the original author, Blackgrowl, and you put a link to the original mod itself.
Taking textures from it is only allowed if you explicitly state that you are using FVM, put a link and credit the author (Blackgrowl), nothing else needs to be done. Putting it on other mods, even if it's the whole pack (modpack), follows the same rule as stated before.
There is a very high chance that "conflicts" will happen, in which case, simply tell the client to acquire and load FVM last so FVM textures are used. FVM will always be inherently the latest, as long as you don't change the texture names.
You are absolutely not allowed to get any monetary or commercial gain from this. Besides, that breaks GSC's license, so you'd be facing a whole company instead.
___________
CREDITS
___________
Lots of Credits go to "Argus", one of the "Photorealistic Zone" developers, for he made properly baked Normal Maps, which this mod uses.
Credits go to "nestantart" for the original "Clear Sky Hoodie" model, which is used for Renegades.
Credits go to "Dynamic" for some of her model-enhancing work provided.
Credits go to "Rolan" for making the Exoskeleton texture, which I have taken some parts of.
I would like to give thanks to "LVutner" for help provided, he was able to make my Workflow much faster, easier and efficient.
I would like to give thanks to "SD" for help provided, giving good technical information.
I would like to give thanks to "Jerkonov", "Dux Fortis", "Asnen", "Gwub", "Cr3pis", "Shen" and "Thundervision" for the feedback given.

View File

@ -0,0 +1,19 @@
<?xml version='1.0' encoding="windows-1251"?>
<xml>
#include "gameplay\character_desc_general_*.xml"
;#include "gameplay\character_desc_general_actor.xml"
;#include "gameplay\character_desc_general_army.xml"
;#include "gameplay\character_desc_general_bandit.xml"
;#include "gameplay\character_desc_general_csky.xml"
;#include "gameplay\character_desc_general_dolg.xml"
;#include "gameplay\character_desc_general_ecolog.xml"
;#include "gameplay\character_desc_general_freedom.xml"
;#include "gameplay\character_desc_general_greh.xml"
;#include "gameplay\character_desc_general_isg.xml"
;#include "gameplay\character_desc_general_killer.xml"
;#include "gameplay\character_desc_general_monolith.xml"
;#include "gameplay\character_desc_general_renegade.xml"
;#include "gameplay\character_desc_general_stalker.xml"
;#include "gameplay\character_desc_general_zombied.xml"
</xml>

View File

@ -0,0 +1,41 @@
<specific_character id="sim_default_freedom_0_default_15" team_default = "1">
#include "gameplay\profiles\character_desc_freedom_0.xml"
<icon>ui_inGame2_Freedom_1</icon>
<snd_config>characters_voice\human\freedom_1\</snd_config>
<visual>actors\stalker_freedom\stalker_freedom_1a</visual>
</specific_character>
<specific_character id="sim_default_freedom_0_default_16" team_default = "1">
#include "gameplay\profiles\character_desc_freedom_0.xml"
<icon>ui_inGame2_Freedom_1</icon>
<snd_config>characters_voice\human\freedom_1\</snd_config>
<visual>actors\stalker_freedom\stalker_freedom_1a_backpack</visual>
</specific_character>
<specific_character id="sim_default_freedom_0_default_17" team_default = "1">
#include "gameplay\profiles\character_desc_freedom_0.xml"
<icon>ui_inGame2_Freedom_1</icon>
<snd_config>characters_voice\human\freedom_3\</snd_config>
<visual>actors\stalker_freedom\stalker_freedom_1a_mask</visual>
</specific_character>
<specific_character id="sim_default_freedom_0_default_18" team_default = "1">
#include "gameplay\profiles\character_desc_freedom_0.xml"
<icon>ui_inGame2_Freedom_1</icon>
<snd_config>characters_voice\human\freedom_1\</snd_config>
<visual>actors\stalker_freedom\stalker_freedom_1b</visual>
</specific_character>
<specific_character id="sim_default_freedom_0_default_19" team_default = "1">
#include "gameplay\profiles\character_desc_freedom_0.xml"
<icon>ui_inGame2_Freedom_1</icon>
<snd_config>characters_voice\human\freedom_1\</snd_config>
<visual>actors\stalker_freedom\stalker_freedom_1b_backpack</visual>
</specific_character>
<specific_character id="sim_default_freedom_0_default_20" team_default = "1">
#include "gameplay\profiles\character_desc_freedom_0.xml"
<icon>ui_inGame2_Freedom_1</icon>
<snd_config>characters_voice\human\freedom_3\</snd_config>
<visual>actors\stalker_freedom\stalker_freedom_1b_mask</visual>
</specific_character>

Some files were not shown because too many files have changed in this diff Show More