Added New Mods and Profiles Folders

This is a complete rebuild of the modpack, with all new mods and updates for 1.5.3 of Anomaly.
This commit is contained in:
2025-01-14 05:07:53 -05:00
parent 85c665b107
commit 376b4b9689
21217 changed files with 546254 additions and 0 deletions
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2023 Jabbers
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+89
View File
@@ -0,0 +1,89 @@
![Jabbers Soulslike Anomaly Mod](https://cdn.discordapp.com/attachments/415664512981794818/1095127013150445680/Soulslike_Logo_-_Compressed.gif)
**Jabbers' Soulslike Anomaly Mod**
**Discord**: https://discord.gg/HRyCGesuXq
**Twitch**: https://www.twitch.tv/jabbers_
**Github**: https://github.com/jeffboulanger/Jabbers-Soulslike-Anomaly-Mod
**WARNING: THIS IS INTENTED TO BE USED ON NEW GAMES, I CANNOT PREDICT WHAT THE CONCIQUENCES WILL BE IF YOU USE THIS ON AN EXISTING GAME**
**THANKS**
Huge thanks to Dr.Pr1nkos for the RUS translations!
Huge thanks to GGFasd, robot, Twisted for help testing new versions!
**DESCRIPTION**
This S.T.A.L.K.E.R Anomaly mod brings elements souls style games to Stalker. Upon death your are rescued by a random Stalker in the zone. They bring you back to the set last spawn location where you awake to find a message from them about how you were found and the lengths they may have gone to to get you to a safe place. The items that were on your character must be retrieved, some can be lost and condition degraded all depending on settings.
DISCLAIMER: Stop crying, this mod is suppose to make the game harder. Because of this it's 100% possible to get yourself into a situation where you unexpectedly lose your gear. Random item loss on death means you could lose your weapons or armor, dying in the middle of an anomaly and not being able to get your gear back is possible and expected. Always stock a backup kit, plan for the worst, hope for the best.
**FEATURES**
- 100% Customizable experience through MCM
- 100% (as far as I know) conflict free from other mods. Jabbers' Soulslike Mod does not overwrite any scripts or ltx files and because of this it should not interfere with any other mods. If it does please let me know so I can resolve.
- Respawn locations can be set at any bed
- Scenario based respawn based on who/what killed you
- Rank/rep loss % (configurable)
- Possibility of having to find your items in a hidden stash with a RF detector (configurable)
- Item condition/loss scales based on rank in order to not hinder the players early game progress.
- Item condition degrade each death (configurable).
- Item loss % applied each death (configurable).
- Lost items can be found on nearby enemy NPCs (configurable).
- Players must heal upon respawn (configurable).
- Time will pass to simulate recovery.
- The player will be hungry and/or thirsty at respawn based on the time passed.
- Your PDA will be updated to show where the relative position is of your corpse
- Dynamic message from your rescuer will be sent to you to explain what happened and information about your gear
- Player does an inventory check and lists everything missing upon retrieving your gear
- Hardcore save mode where you can only save by sleeping (sometimes requiring sleeping pills) and respawning.
- Hardcore save mode only keeps around 1 save file.
- Ability to use campfires to save (configurable)
**INSTALLATION**
Simply extract into your S.T.A.L.K.E.R. Anomaly installation folder.
**MY THOUGHTS ON GAMEPLAY ADJUSTMENTS**
Based on having played about 10 hours in total into a new game with this mod I can tell you the following... Your initial focus should be to stockpile some food/meds/weapons and a flashlight at your starting location. This way when you respawn you will have something to use to go try and get your gear back. Another thing to try is grabbing a few companions to help you when you respawn, this makes things a slight bit easier in the case where you have some really crap gear. As you progress through the world, think about stashing items in the static stashes or if you are using the hideout stash mod, those stashes in various locations. Maybe rather then just selling everything, you hold on to it for those just incase scenarios. It tool me a few deaths to kind of get the hang of things, but the adventures of retrieving your gear with a couple of companions and a knife really made for some entertainment and a different style of gameplay along the way.
**FAQ**
**Q**: Doesn't this already exist with the Azazel game mode?
**A**: Sorta, while Azazel does allows you to continue as a new stalker after dying, You cannot play story mode at the same time, with Soulslike you can.
**Q**: Does this mod work with G.A.M.M.A.?
**A**: Yes, this mod is actually intended to be used with G.A.M.M.A.
**Q**: Does this mod work with Vanilla STALKER Anomaly?
**A**: I hope so, but I'll be honest, I didn't test it. If you try and it doesn't work, let me know and I'll see what I can do to help you.
**Q**: Have you done anything to make it easier to play factions that start in the North?
**A**: No, but I guess you can also say.. Not yet? I don't know what could be done that could help other than give extra minimalistic gear on respawn to help with things like radiation. This isn't exactly ideal, but I'm also open to suggestions. This mod should change how you play the game some, making an immediate focus on collecting some backup gear rather than progressing, so if you die to soon and can't seem to get a footing after due to how much harder norther starts can be, that' could be why.
**Q**: I died in the middle of and anomaly I cannot get my gear back what do I do?
**A**: First you can stop crying about it, that's the whole point of this mod... An actual consequence for dying. If you died in a shit location, well... that sucks, go get some new gear and continue playing or start over, choice is yours.
**Q**: I died and my weapon or armor is gone, how am I suppose to progress now?
**A**: First grow a pair...next, deep breath, now use that big brain of yours and think. Listen, I am not going to play this game for you but here's a possible tip, find some companions. Also, if you have "Lost items found on NPCs" turned on, go look for that bitch, he's around. Also I used he, the females in Stalker told me their pronouns are he/him.
**Q**: I decided to play with Hardcore Saves and my save location is awful and I cannot continue.
**A**: Yup, that can happen, awful, im so sad for you... see the DISCLAIMER above. OK so I'm not a total fucking jackass.. if you have to you can restore a save from the "appdata\savedgames\soulslike-backup" folder, yes, I backed up some, if not all the saves that are deleted.
**Q**: Will Hardcore Saves delete all my save files?
**A**: I lifted the code used to delete ironman saves and modified it slightly. It **should** only delete the saves for the playthrough in which you activated this mod for. That said it is also advised to backup yourselves before hand just incase.
**Q**: I activated this mod in the middle of a ongoing game and shit isnt working correctly.
**A**: Yup, there is a big fat warning up near the top that says don't do that.
**Q**: I have an idea for progression that isnt included in this mod, how do I contact you.
**A**: Well, the easiest way would be discord. You can join my personal discord (https://discord.gg/HRyCGesuXq) and message me direct at Jabbers#6969. I can also be found live most days on Twitch (https://www.twitch.tv/jabbers_) so feel free to stop by and say Hi! Additionally you can leave me a message on moddb... although this isnt my preferred communication platform so my response may be slower.
**TODOs**
- Random chance for some of the players gear to be left on the player at respawn, built into the story "I was able bring back some of your gear". Maybe with priority on weapons/outfit/headgear, but not limitted to.
- Chance to bring some/all weapon/outfit/headgear back based on reputation (maybe this is at the cost of reputation)
- Chance to have rescuer give handgun/ammo/meds based on rep (maybe this is at the cost of reputation)
- Insurance system?
- Breaking a tent causes your spawn location to no longer exist, warn about this and revert to (where?)..
@@ -0,0 +1,27 @@
[soulslike_rescuers_radio_frequency_note]:identity_immunities
$spawn = "devices\roubles"
$prefetch = 16
kind = i_letter
class = II_ATTCH
cform = skeleton
visual = dynamics\equipments\quest\notes_letter_1.ogf
description = st_soulslike_rescuers_radio_frequency_note_desc
inv_name = st_soulslike_rescuers_radio_frequency_note_name
inv_name_short = st_soulslike_rescuers_radio_frequency_note_name
inv_grid_width = 1
inv_grid_height = 1
inv_grid_x = 6
inv_grid_y = 14
cost = 0
inv_weight = 0.01
attach_angle_offset = -0.287979, 1.560923, 1.544060
attach_position_offset = 0.096910, -0.013594, 0.107925
attach_bone_name = bip01_r_hand
auto_attach = false
repair_part_bonus = 0.01
letter = true
snd_on_take = paper
use1_functor = soulslike_note.menu_read
use1_action_functor = soulslike_note.func_radio_freq
use1_allow_db = false
@@ -0,0 +1,256 @@
<?xml version="1.0" encoding="windows-1251"?>
<string_table>
<string id="st_save_only_when_sleeping">
<text>Hardcore Saving is enabled. Saves automatically occur when sleeping and respawning.</text>
</string>
<string id="st_soulslike_your_items">
<text>Stash with some of your items</text>
</string>
<string id="set_spawn_button">
<text>Set Spawn</text>
</string>
<string id="st_soulslike_spawn_location_set">
<text>Spawn location has been set.</text>
</string>
<string id="st_soulslike_rescuer_initial_generic">
<text>When you wake up you find yourself in a familiar place but with no idea how you got here.</text>
</string>
<string id="st_soulslike_rescuer_food_generic">
<text>Looking for your things you find someone left you something to eat and drink.</text>
</string>
<string id="st_soulslike_rescuer_radio_generic">
<text>You also find a note explaining your gear is found in a hidden stash and to use an RF receiver with the frequency %s to track it down which will start beeping once you're close enough.</text>
</string>
<string id="st_soulslike_rescuer_pda_generic">
<text>There appears to be a marker on your PDA where you were found.</text>
</string>
<string id="st_soulslike_rescuer_initial_1">
<text>Hi! I just wanted to see how you're feeling. You were almost dead when I found you.</text>
</string>
<string id="st_soulslike_rescuer_initial_2">
<text>I can't believe you are still with us! I couldn't believe you were still breathing when I found you.</text>
</string>
<string id="st_soulslike_rescuer_initial_3">
<text>Hey, how are you doing? I'm glad to see that you're feeling better now. You were in a really bad way when I found you.</text>
</string>
<string id="st_soulslike_rescuer_initial_4">
<text>Hi! Just wanted to check in and see how you're feeling. You were really beat up when I found you.</text>
</string>
<string id="st_soulslike_rescuer_initial_5">
<text>Hey, hope you're on the mend now. I was worried when I found you in such a bad state.</text>
</string>
<string id="st_soulslike_rescuer_food_1">
<text>I left something for you to eat and drink for when you wake up.</text>
</string>
<string id="st_soulslike_rescuer_food_2">
<text>I left you some food and drink to enjoy when you wake up.</text>
</string>
<string id="st_soulslike_rescuer_food_3">
<text>I left you a little something to eat and drink when you wake up.</text>
</string>
<string id="st_soulslike_rescuer_food_4">
<text>I made sure to leave you some food and drink for when you wake up.</text>
</string>
<string id="st_soulslike_rescuer_food_5">
<text>I left you a little something to eat and drink.</text>
</string>
<string id="st_soulslike_rescuer_pda_1">
<text>I added a marker where I found you to your PDA. Hopefully you can get back some of your things.</text>
</string>
<string id="st_soulslike_rescuer_pda_2">
<text>I added a marker to your PDA so you can hopefully retrieve some of your belongings from where I found you.</text>
</string>
<string id="st_soulslike_rescuer_pda_3">
<text>A marker has been added to your PDA to help you locate the spot where you were found, in hopes that you can recover some of your lost items.</text>
</string>
<string id="st_soulslike_rescuer_pda_4">
<text>Your PDA now has a marker indicating the location where I found you, which may help you retrieve some of your things.</text>
</string>
<string id="st_soulslike_rescuer_pda_5">
<text>To help you retrieve some of your belongings, I have added a marker to your PDA showing the location where I found you.</text>
</string>
<string id="st_soulslike_rescuer_used_items_1">
<text>I had to use some of the things you had on you to get you out of there alive. </text>
</string>
<string id="st_soulslike_rescuer_used_items_2">
<text>In order to save your life, I had to use some of the items you were carrying on you. </text>
</string>
<string id="st_soulslike_rescuer_used_items_3">
<text>I had to use some of your belongings to rescue you and keep you alive. </text>
</string>
<string id="st_soulslike_rescuer_used_items_4">
<text>To ensure your survival, I had to use some of the things you had on you. </text>
</string>
<string id="st_soulslike_rescuer_used_items_5">
<text>I used some of your possessions to get you out of there alive. </text>
</string>
<string id="st_soulslike_rescuer_stay_safe_1">
<text>Keep safe, Stalker.</text>
</string>
<string id="st_soulslike_rescuer_stay_safe_2">
<text>Take care, Stalker.</text>
</string>
<string id="st_soulslike_rescuer_stay_safe_3">
<text>Stay safe out there, Stalker.</text>
</string>
<string id="st_soulslike_rescuer_stay_safe_4">
<text>Be safe, Stalker.</text>
</string>
<string id="st_soulslike_rescuer_stay_safe_5">
<text>Stay out of trouble, Stalker.</text>
</string>
<string id="st_soulslike_rescuer_enemy_tarkov_looter_1">
<text>As soon as I stumbled upon you, I noticed a %s individual who goes by the name of %s, fiddling with your weapon. It seemed like he was taking something out of it. Fortunately, I scared him away, but please inspect your equipment when you retrieve it.</text>
</string>
<string id="st_soulslike_rescuer_enemy_tarkov_looter_2">
<text>The moment I came across you, my eyes caught sight of a %s member called %s, tampering with your weapon. I observed him removing something from it. Although I managed to scare him off, I suggest you thoroughly examine your gear upon retrieval.</text>
</string>
<string id="st_soulslike_rescuer_enemy_tarkov_looter_3">
<text>Upon my initial encounter with you, I noticed a %s individual, who introduced himself as %s, meddling with your weapon. It appeared as though he was extracting something from it. Luckily, I frightened him away, but please verify your equipment upon its return.</text>
</string>
<string id="st_soulslike_rescuer_enemy_tarkov_looter_4">
<text>When I first came across you, I spotted a %s member by the name of %s, fiddling with your weapon. I saw him removing something from it. However, I scared him off, but do check your gear thoroughly when you get it back.</text>
</string>
<string id="st_soulslike_rescuer_enemy_tarkov_looter_5">
<text>From the moment I discovered you, I witnessed a %s individual, who goes by the name of %s, tampering with your weapon. I observed him taking something out of it. Though I was able to frighten him away, please ensure to double-check your equipment when you retrieve it.</text>
</string>
<string id="st_soulslike_rescuer_enemy_looter_1">
<text>When I first found you I saw a %s member named %s, he grabbed some of your things and ran, hopefully you can find him and get whatever he took back.</text>
</string>
<string id="st_soulslike_rescuer_enemy_looter_2">
<text>When I first came across you, a %s member named %s was present. He took some of your belongings and ran off. Hopefully, you can locate him and retrieve your items.</text>
</string>
<string id="st_soulslike_rescuer_enemy_looter_3">
<text>My first sighting of you involved a %s member named %s who took some of your possessions and fled. I hope you can track him down and recover your belongings.</text>
</string>
<string id="st_soulslike_rescuer_enemy_looter_4">
<text>When I first stumbled upon you, there was a %s member named %s who took some of your belongings and escaped. Hopefully, you can find him and get back what he took.</text>
</string>
<string id="st_soulslike_rescuer_enemy_looter_5">
<text>As I stumbled upon you, there was another %s member nearby named %s who was rifling through your belongings. I hope you can track him down and retrieve what he took.</text>
</string>
<string id="st_soulslike_rescuer_radio_freq_1">
<text>Your gear was left unattended, so I went back and hid it to keep it safe. If you need to find it, use an RF Receiver and set the frequency to %s. When you get close enough, your device will start beeping. I also left a note in your pocket with the frequency just in case you forget.</text>
</string>
<string id="st_soulslike_rescuer_radio_freq_2">
<text>I took the initiative to hide your gear so that nobody else would take it. You can retrieve it by using an RF Receiver and setting the frequency to %s. Once you're in the vicinity, your device will start beeping. I've also included a note in your pocket with the frequency in case you forget.</text>
</string>
<string id="st_soulslike_rescuer_radio_freq_3">
<text>Your gear was vulnerable, so I went back and hid it to prevent theft. To locate it, use an RF Receiver and set the frequency to %s. When you get close enough, your device will beep. I've left a note in your pocket with the frequency in case you forget.</text>
</string>
<string id="st_soulslike_rescuer_radio_freq_4">
<text>To safeguard your gear, I hid it somewhere secure. You can locate it by using an RF Receiver and setting the frequency to %s. Your device will start beeping once you're in the proximity. I've also included a note in your pocket with the frequency in case you forget.</text>
</string>
<string id="st_soulslike_rescuer_radio_freq_5">
<text>I didn't want anyone to steal your gear, so I hid it for safekeeping. To find it, use an RF Receiver and set the frequency to %s. Your device will beep once you're close enough. If you forget the frequency, don't worry; there's a note in your pocket with the details.</text>
</string>
<string id="st_soulslike_hidden_stash_1">
<text>Your belongings are tucked away in a hidden spot that I marked on your PDA.</text>
</string>
<string id="st_soulslike_hidden_stash_2">
<text>I've stowed your items in a secure stash and labeled its location on your PDA.</text>
</string>
<string id="st_soulslike_hidden_stash_3">
<text>I've hidden your possessions in a secret location and noted it on your PDA.</text>
</string>
<string id="st_soulslike_hidden_stash_4">
<text>Your things are safely tucked away in a stash that I marked on your PDA.</text>
</string>
<string id="st_soulslike_hidden_stash_5">
<text>I concealed your items in a discreet stash and marked its location on your PDA for safekeeping.</text>
</string>
<string id="st_soulslike_rescuer_indoor_1">
<text>Yo, you are one lucky mother fucker! I cannot believe you went into %s. You are incredibly luck we found you! I was able to rally some of the other Stalkers to go in there and help me with your gear, hopefully it's all accounted for.</text>
</string>
<string id="st_soulslike_rescuer_indoor_2">
<text>Dude, you lucked out big time! I can't believe you went into %s. We found you just in time! A few of us Stalkers joined forces to retrieve your gear, and it looks like everything's intact.</text>
</string>
<string id="st_soulslike_rescuer_indoor_3">
<text>Hey, lucky son of a bitch! I'm amazed you made it into %s. Thank goodness we stumbled upon you! Some of the other Stalkers and I teamed up to salvage your gear, and we've got it all sorted out.</text>
</string>
<string id="st_soulslike_rescuer_indoor_4">
<text>Well, well, well, look who we have here - one lucky son of a bitch! You actually went into %s, huh? We found you just in time, and with the help of some fellow Stalkers, we were able to recover your gear. It's all accounted for.</text>
</string>
<string id="st_soulslike_rescuer_indoor_5">
<text>Holy shit, you're one lucky bastard! I can't believe you went into %s without any backup. Luckily, we found you in time, and a group of us Stalkers helped recover your gear. It's all there.</text>
</string>
<string id="st_soulslike_rescuer_monster_looter_1">
<text>I was able to scare off the mutant near by but they seemed to be rummaging through your backpack. I would take care when retrieving your things, whatever you had in there might attrack other wildllife in the area.</text>
</string>
<string id="st_soulslike_rescuer_monster_looter_2">
<text>After scaring off the nearby mutant, I noticed that it was rummaging through your backpack. Please exercise caution while retrieving your items, as whatever was in there might attract other wildlife in the area.</text>
</string>
<string id="st_soulslike_rescuer_monster_looter_3">
<text>While I was able to scare off the mutant nearby, it appeared to have been going through your backpack. Please be mindful when retrieving your belongings, as they might attract other wildlife in the area.</text>
</string>
<string id="st_soulslike_rescuer_monster_looter_4">
<text>The mutant near us fled after I scared it off, but I saw it rummaging through your backpack. Please be cautious when retrieving your things since other wildlife in the area might be attracted to whatever was in there.</text>
</string>
<string id="st_soulslike_rescuer_monster_looter_5">
<text>Your backpack caught the attention of a mutant, but I was able to scare it off. Please take care when retrieving your items, as whatever was in there might attract other wildlife in the area.</text>
</string>
</string_table>
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="windows-1251"?>
<string_table>
<string id="st_soulslike_rescuers_radio_frequency_note_name">
<text>Rescuer's Note</text>
</string>
<string id="st_soulslike_rescuers_radio_frequency_note_desc">
<text>A note written by one of the stalker that rescued you.</text>
</string>
<string id="st_soulslike_rescuers_radio_frequency_note_message">
<text>The note contains information about where your items are. It says to use an RF receiver with the frequency %s in %s</text>
</string>
</string_table>
@@ -0,0 +1,230 @@
<string_table>
<string id="ui_mcm_menu_soulslike">
<text>Soulslike</text>
</string>
<!--General-->
<string id="ui_mcm_soulslike_general">
<text>General</text>
</string>
<string id="ui_mcm_soulslike_general_title">
<text>Jabbers' Soulslike Settings</text>
</string>
<string id="ui_mcm_soulslike_general_description">
<text>The Soulslike mod brings elements souls style games to Stalker. Upon death your are saved by a random Stalker in the zone. They bring you back to the set last spawn location where you awake to find a message from them about how you were found and the lengths they may have gone to to get you to a safe place. The items that were on your character must be retrieved, some can be lost and condition degraded all depending on settings.</text>
</string>
<string id="ui_mcm_soulslike_general_disclaimer">
<text>DISCLAIMER: Stop crying, this mod is suppose to make the game harder. Because of this it's 100% possible to get yourself into a situation where you unexpectedly lose your gear. Random item loss on death means you could lose your weapons or armor, dying in the middle of an anomaly and not being able to get your gear back is possible and expected. Always stock a backup kit, plan for the worst, hope for the best.</text>
</string>
<!--Character-->
<string id="ui_mcm_soulslike_character">
<text>Character</text>
</string>
<string id="ui_mcm_soulslike_character_title">
<text>Character Settings</text>
</string>
<string id="ui_mcm_soulslike_character_rank_loss_percent">
<text>Rank Loss %</text>
</string>
<string id="ui_mcm_soulslike_character_rank_loss_percent_desc">
<text>This amount of character rank you will lose on respawn.</text>
</string>
<string id="ui_mcm_soulslike_character_rep_loss_percent">
<text>Reputation Loss %</text>
</string>
<string id="ui_mcm_soulslike_character_rep_loss_percent_desc">
<text>This amount of character reputation you will lose on respawn. This is personal repuation, not faction standing/rep.</text>
</string>
<string id="ui_mcm_soulslike_character_health_loss_on_respawn">
<text>Health loss % on respawn</text>
</string>
<string id="ui_mcm_soulslike_character_health_loss_on_respawn_desc">
<text>This add a bit more difficulty to your playthrough. This is the amount of health that will be removed when you respawn. Example: 25% means you will have 75% health when you respawn. The concept here is that you would still be slightly injured and requires you to keep some meds around to heal yourself before trying to continue and retrieve your items from where you died.</text>
</string>
<!--Items-->
<string id="ui_mcm_soulslike_items">
<text>Items</text>
</string>
<string id="ui_mcm_soulslike_items_title">
<text>Item Settings</text>
</string>
<string id="ui_mcm_soulslike_items_keep_equipped_items_on_death">
<text>Keep Equipped Items On Death</text>
</string>
<string id="ui_mcm_soulslike_items_allow_desc">
<text>The settings below apply to items dropped on death. Each of the item types below have a chance to be permanenently lost unless you uncheck them.</text>
</string>
<string id="ui_mcm_soulslike_items_allow_weapon_loss">
<text>Allow Weapon Loss</text>
</string>
<string id="ui_mcm_soulslike_items_allow_outfit_loss">
<text>Allow Outfit Loss</text>
</string>
<string id="ui_mcm_soulslike_items_allow_headgear_loss">
<text>Allow Headgear Loss</text>
</string>
<string id="ui_mcm_soulslike_items_allow_artifact_loss">
<text>Allow Artifact Loss</text>
</string>
<string id="ui_mcm_soulslike_items_allow_tool_loss">
<text>Allow Tools Loss</text>
</string>
<string id="ui_mcm_soulslike_items_scalar_description">
<text>Item and condition loss are based on your rank. When you die, the higher rank you are the more likely the chance to lose an item or have the condition reduced. This is to make it easier at the beginning of a new game but as you progress the conciquence of death becomes more and more severe. See the tooltip on each setting for a more detailed explination.</text>
</string>
<string id="ui_mcm_soulslike_items_item_loss_scalar">
<text>Item loss scalar</text>
</string>
<string id="ui_mcm_soulslike_items_item_loss_scalar_desc">
<text>At max rank your character has a 75% chance to lose each item on death. The Item loss scalar allows you to manage that loss to your liking. At the default value of 0.20 (or 20%) your maximum loss chance per item would be 15%. You should set this to a value that suits your accetable level of item loss. Examples: 0.10 = 7.5%, 0.20 = 15%, 0.30 = 22%, 0.40 = 30%... you get the idea yet?</text>
</string>
<string id="ui_mcm_soulslike_items_item_condition_loss_scalar">
<text>Item condition loss scalar</text>
</string>
<string id="ui_mcm_soulslike_items_item_condition_loss_scalar_desc">
<text>At max rank your character will lose 18 condition on each item on death. The Item condition loss scalar allows you to manage that loss to your liking. At the default value of 0.05 (or 5%) your maximum condition loss per item would be 3.7. You should set this to a value that suits your accetable level of item condition loss. Examples: 0.05 = 3.7, 0.10 = 7.4, 0.15 = 11... you get the idea yet?</text>
</string>
<!--Scenarios-->
<string id="ui_mcm_soulslike_scenarios">
<text>Scenarios</text>
</string>
<string id="ui_mcm_soulslike_scenarios_title">
<text>Scenario Settings</text>
</string>
<string id="ui_mcm_soulslike_scenarios_description">
<text>Soulslike scenarios are dynamic by nature. Respawn events occur based on who killed you, how you were killed, where, how close to your spawn you are when you died, whether you are inside or outside, just to name a few. These settings exist to allow you to customize the ways you want to try and recover your gear. The default scenario's that always exist are that you may end up having all of your items on you on respawn (again, based on events), or you may find that your items are in a backpack on the ground where your body was found. The options below are in addition to those and weight can be changed to make them more or less frequent.</text>
</string>
<string id="ui_mcm_soulslike_scenarios_rf_detector_scenario_weight">
<text>RF Detector Scenario Weight.</text>
</string>
<string id="ui_mcm_soulslike_scenarios_rf_detector_scenario_weight_desc">
<text>As an extra layer of difficulty and to just mix things up a bit, when this scenario is used it your rescuer will move all your items to a hidden stash on the same map where you were found. They will tell you the RF freqency to listen to to track down your gear, and also leave you a note in your inventory as a reminder.</text>
</string>
<string id="ui_mcm_soulslike_scenarios_hidden_stash_scenario_weight">
<text>Hidden Stash Scenario Weight.</text>
</string>
<string id="ui_mcm_soulslike_scenarios_rf_detector_scenario_weight_desc">
<text>As an extra layer of difficulty and to just mix things up a bit, when this scenario is used it your rescuer will move all your items to a hidden stash and mark it on your PDA.</text>
</string>
<string id="ui_mcm_soulslike_scenarios_looter_npcs_marked">
<text>Mark looting NPCs on the PDA</text>
</string>
<string id="ui_mcm_soulslike_scenarios_rf_detector_scenario_weight_desc">
<text>When your gear is looted by an NPC, this option will allow you to track them on your PDA.</text>
</string>
<!--Ambush-->
<string id="ui_mcm_soulslike_ambush">
<text>Ambush</text>
</string>
<string id="ui_mcm_soulslike_ambush_title">
<text>Ambush Settings</text>
</string>
<string id="ui_mcm_soulslike_ambush_description">
<text>Depending on what has occured in the scenario and what items are on your character, there is a chance for an ambush event to occur where your body was discovered.</text>
</string>
<string id="ui_mcm_soulslike_ambush_mutant_ambush_chance">
<text>Mutant Ambush Chance</text>
</string>
<string id="ui_mcm_soulslike_ambush_allow_boar_ambush">
<text>Allow Boar Ambush</text>
</string>
<string id="ui_mcm_soulslike_ambush_allow_flesh_ambush">
<text>Allow Flesh Ambush</text>
</string>
<string id="ui_mcm_soulslike_ambush_allow_dogs_ambush">
<text>Allow Dog Ambush</text>
</string>
<string id="ui_mcm_soulslike_ambush_allow_cats_ambush">
<text>Allow Cat Ambush</text>
</string>
<string id="ui_mcm_soulslike_ambush_allow_snorks_ambush">
<text>Allow Snork Ambush</text>
</string>
<string id="ui_mcm_soulslike_ambush_allow_bloodsucker_ambush">
<text>Allow Blood Sucker Ambush</text>
</string>
<string id="ui_mcm_soulslike_ambush_allow_burer_ambush">
<text>Allow Burer Ambush</text>
</string>
<string id="ui_mcm_soulslike_ambush_allow_chimera_ambush">
<text>Allow Chimera Ambush</text>
</string>
<string id="ui_mcm_soulslike_ambush_allow_controller_ambush">
<text>Allow Controller Ambush</text>
</string>
<string id="ui_mcm_soulslike_ambush_stalker_ambush_chance">
<text>Stalker Ambush Chance</text>
</string>
<string id="ui_mcm_soulslike_ambush_allow_stalker_novice_ambush">
<text>Allow Novice Stalker Ambush</text>
</string>
<string id="ui_mcm_soulslike_ambush_allow_stalker_advanced_ambush">
<text>Allow Experienced Stalker Ambush</text>
</string>
<string id="ui_mcm_soulslike_ambush_allow_stalker_veteran_ambush">
<text>Allow Master Stalker Ambush</text>
</string>
<string id="ui_mcm_soulslike_ambush_allow_stalker_sniper_ambush">
<text>Allow Sniper Stalker Ambush</text>
</string>
<!--Hardcore-->
<string id="ui_mcm_soulslike_hardcore">
<text>Hardcore</text>
</string>
<string id="ui_mcm_soulslike_hardcore_title">
<text>Hardcore Settings</text>
</string>
<string id="ui_mcm_soulslike_hardcore_save_description">
<text>Kind of like slamming your dick in a hard cover book, Hardcore Saves means manual, quick and campfire saves are all disabled and only one save file will ever exist. Hardcore Saves only allows saving during sleeping and when respawning. Keep in mind that because only 1 save file will ever exist, its possible to get stuck in a position where progression is tough if you lose all your gear and have no money to heal or eat.</text>
</string>
<string id="ui_mcm_soulslike_hardcore_is_enabled">
<text>Enable Hardcore Saves</text>
</string>
<string id="ui_mcm_soulslike_hardcore_override_campfire_hardcore_saves">
<text>Allow Campfire Saves w/Hardcore Saves</text>
</string>
<string id="ui_mcm_soulslike_hardcore_override_campfire_hardcore_saves_desc">
<text>Sometimes you need that warm fuzzy feeling of comfort you get by saving often. This allow saving at campfires, even though hardcore saves is enabled. Keep in mind that when respawning or sleeping your campfire saves will still be deleted if Hardcore Saves is enabled.</text>
</string>
<!--Debug-->
<string id="ui_mcm_soulslike_debug">
<text>Developer</text>
</string>
<string id="ui_mcm_soulslike_debug_title">
<text>Developer Settings</text>
</string>
<string id="ui_mcm_soulslike_debug_is_enabled">
<text>Debug Mode</text>
</string>
<string id="ui_mcm_soulslike_debug_enable_tips">
<text>Show PDA Messages</text>
</string>
<string id="ui_mcm_soulslike_debug_debug_hidden_stashes">
<text>Debug Hidden Stashes</text>
</string>
<string id="ui_mcm_soulslike_debug_debug_item_loss">
<text>Debug Item Loss</text>
</string>
<string id="ui_mcm_soulslike_debug_debug_the_tarkov_looter">
<text>Debug Tarkov Looter</text>
</string>
<string id="ui_mcm_soulslike_debug_debug_the_noloss_scenario">
<text>Debug No Loss Scenario</text>
</string>
<string id="ui_mcm_soulslike_debug_debug_the_default_scenario">
<text>Debug Default Loss Scenario</text>
</string>
<string id="ui_mcm_soulslike_debug_debug_the_rf_scenario">
<text>Debug RF Detector Scenario</text>
</string>
<string id="ui_mcm_soulslike_debug_debug_the_hidden_stash_scenario">
<text>Debug Hidden Stash Scenario</text>
</string>
</string_table>
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="windows-1251" ?>
<string_table>
<string id="st_cap_check_soulslike_mode">
<text>Soulslike Mode</text>
</string>
<string id="st_mm_ck_soulslike_mode_desc">
<text>
%c[0,150,150,150]In Soulslike mode, death technically never happens. Upon "death" your are rescued by a random Stalker in the zone. They bring you back to the set last spawn location where you awake to find a message from them\n
about how you were found and the lengths they may have gone to to get you to a safe place. The items that were on your character must be retrieved, some can be lost and condition degraded all depending on settings.\n
\n %c[200,200,50,50] Not compatible with Azazel mode.\n
\n %c[200,200,50,50] Not compatible with Ironman.
</text>
</string>
</string_table>
@@ -0,0 +1,236 @@
<?xml version="1.0" encoding="windows-1251"?>
<string_table>
<string id="st_save_only_when_sleeping">
<text>Хардкорная экономия включена.Сохраняет автоматически, когда сон и возрождается.</text>
</string>
<string id="st_soulslike_your_items">
<text>Stash with some of your items</text>
</string>
<string id="set_spawn_button">
<text>Set Spawn</text>
</string>
<string id="st_soulslike_spawn_location_set">
<text>Расположение порода было установлено.Нажмите снова, чтобы заснуть.</text>
</string>
<string id="st_soulslike_rescuer_initial_generic">
<text>Когда вы просыпаетесь, вы окажетесь в знакомых местах, но не зная, как вы сюда попали.</text>
</string>
<string id="st_soulslike_rescuer_food_generic">
<text>Ищите свои вещи, которые вы найдете, кто -то оставил вам что -нибудь поесть и выпить.</text>
</string>
<string id="st_soulslike_rescuer_radio_generic">
<text>Вы также обнаружите, что примечание, в которой объясняется, что ваше снаряжение находится в скрытом тайнике, и для использования РЧ -приемника с частотой %s, чтобы отслеживать его, что начнет звучать, как только вы достаточно близко.</text>
</string>
<string id="st_soulslike_rescuer_pda_generic">
<text>Похоже, на вашем КПК есть маркер, где вы были найдены.</text>
</string>
<string id="st_soulslike_rescuer_initial_1">
<text>Привет!Я просто хотел посмотреть, как ты себя чувствуешь.Ты был почти мертв, когда я нашел тебя.</text>
</string>
<string id="st_soulslike_rescuer_initial_2">
<text>Я не могу поверить, что ты все еще с нами!Я не мог поверить, что ты все еще дышал, когда нашел тебя.</text>
</string>
<string id="st_soulslike_rescuer_initial_3">
<text>Привет, как ты?Я рад видеть, что сейчас тебе лучше.Вы были очень плохими, когда я нашел вас.</text>
</string>
<string id="st_soulslike_rescuer_initial_4">
<text>Привет!Просто хотел проверить и посмотреть, как вы себя чувствуете.Вы действительно избили, когда я нашел вас.</text>
</string>
<string id="st_soulslike_rescuer_initial_5">
<text>Эй, надеюсь, ты сейчас на починке.Я волновался, когда нашел тебя в таком плохом состоянии.</text>
</string>
<string id="st_soulslike_rescuer_food_1">
<text>Я оставил что -нибудь, чтобы вы могли поесть и выпить, когда вы просыпаетесь.</text>
</string>
<string id="st_soulslike_rescuer_food_2">
<text>Я оставил вам немного еды и пить, чтобы наслаждаться, когда вы просыпаетесь.</text>
</string>
<string id="st_soulslike_rescuer_food_3">
<text>Я оставил тебе что -нибудь поесть и выпить, когда ты просыпаешься.</text>
</string>
<string id="st_soulslike_rescuer_food_4">
<text>Я позаботился о том, чтобы оставить вам еду и выпить, когда вы просыпаетесь.</text>
</string>
<string id="st_soulslike_rescuer_food_5">
<text>Я оставил тебе что -нибудь поесть и выпить.</text>
</string>
<string id="st_soulslike_rescuer_pda_1">
<text>Я добавил маркер, в котором я нашел вас в ваш КПК.Надеюсь, вы сможете вернуть некоторые из своих вещей.</text>
</string>
<string id="st_soulslike_rescuer_pda_2">
<text>Я добавил маркер в ваш КПК, чтобы вы могли, надеюсь, получить некоторые из ваших вещей, откуда я вас нашел.</text>
</string>
<string id="st_soulslike_rescuer_pda_3">
<text>В ваш КПК был добавлен маркер, чтобы помочь вам найти место, где вы были найдены, в надежде, что вы сможете восстановить некоторые из ваших потерянных предметов.</text>
</string>
<string id="st_soulslike_rescuer_pda_4">
<text>У вашего КПК теперь есть маркер, указывающий место, где я вас нашел, что может помочь вам получить некоторые из ваших вещей.</text>
</string>
<string id="st_soulslike_rescuer_pda_5">
<text>Чтобы помочь вам получить некоторые из ваших вещей, я добавил маркер в ваш КПК, показывающий место, где я вас нашел.</text>
</string>
<string id="st_soulslike_rescuer_used_items_1">
<text>Мне пришлось использовать некоторые из вещей, которые у вас были, чтобы вытащить вас оттуда.</text>
</string>
<string id="st_soulslike_rescuer_used_items_2">
<text>Чтобы спасти вашу жизнь, мне пришлось использовать некоторые предметы, которые вы несли на вас.</text>
</string>
<string id="st_soulslike_rescuer_used_items_3">
<text>Мне пришлось использовать некоторые из ваших вещей, чтобы спасти вас и сохранить вас в живых. </text>
</string>
<string id="st_soulslike_rescuer_used_items_4">
<text>Чтобы обеспечить ваше выживание, мне пришлось использовать некоторые из вещей, которые у вас были на вас.</text>
</string>
<string id="st_soulslike_rescuer_used_items_5">
<text>Я использовал некоторые из ваших вещей, чтобы вытащить вас оттуда. </text>
</string>
<string id="st_soulslike_rescuer_stay_safe_1">
<text>Держите в безопасности, сталкер.</text>
</string>
<string id="st_soulslike_rescuer_stay_safe_2">
<text>Береги себя, Сталкер.</text>
</string>
<string id="st_soulslike_rescuer_stay_safe_3">
<text>Оставайся в безопасности, Сталкер.</text>
</string>
<string id="st_soulslike_rescuer_stay_safe_4">
<text>Будьте в безопасности, Сталкер.</text>
</string>
<string id="st_soulslike_rescuer_stay_safe_5">
<text>Держись подальше от неприятностей, Сталкер.</text>
</string>
<string id="st_soulslike_rescuer_enemy_looter_1">
<text>Когда я впервые обнаружил вас, я увидел участника %s по имени %s, он схватил некоторые из ваших вещей и побежал, надеюсь, вы сможете найти его и вернуть все, что он взял.</text>
</string>
<string id="st_soulslike_rescuer_enemy_looter_2">
<text>Когда я впервые наткнулся на вас, присутствовал член %s с именем %s.Он взял некоторые из ваших вещей и убежал.Надеюсь, вы сможете найти его и получить свои вещи.</text>
</string>
<string id="st_soulslike_rescuer_enemy_looter_3">
<text>В моем первом наблюдении за вами участвовали члена %s по имени %s, который взял некоторые из ваших имущества и сбежал.Я надеюсь, что вы сможете отследить его и восстановить свои вещи.</text>
</string>
<string id="st_soulslike_rescuer_enemy_looter_4">
<text>Когда я впервые наткнулся на вас, был член %s по имени %s, который взял некоторые из ваших вещей и сбежал.Надеюсь, вы сможете найти его и вернуть то, что он взял.</text>
</string>
<string id="st_soulslike_rescuer_enemy_looter_5">
<text>Когда я наткнулся на вас, был еще один участник %s, который поблизости назвал %s, который пробил ваши вещи.Я надеюсь, что вы сможете отследить его и получить то, что он взял.</text>
</string>
<string id="st_soulslike_rescuer_radio_freq_1">
<text>Я вернулся и спрятал ваше снаряжение, чтобы никто не взял его.Вы должны быть в состоянии отслеживать его РЧ -приемник, установив частоту на %s.Как только вы приблизитесь к его местоположению, ваше устройство должно запустить звуковой сигнал.</text>
</string>
<string id="st_soulslike_rescuer_radio_freq_2">
<text>Я спрятал ваше снаряжение, чтобы предотвратить его украдение.Используйте РЧ -приемник и установите частоту на %s, чтобы найти его.Как только вы достаточно близко, ваше устройство начнет звучать.</text>
</string>
<string id="st_soulslike_rescuer_radio_freq_3">
<text>Чтобы сохранить ваше снаряжение в безопасности, я спрятал его и устанавливаю РЧ -приемник на частоту %s.Когда вы приблизитесь достаточно близко, ваше устройство будет звучать по звуковому сигналу, и вы можете найти его.</text>
</string>
<string id="st_soulslike_rescuer_radio_freq_4">
<text>Ваше снаряжение было в риске украденного, поэтому я спрятал его и установил РЧ -приемник на частоту %s.Ваше устройство должно звучать, когда вы находитесь рядом с его местоположением.</text>
</string>
<string id="st_soulslike_rescuer_radio_freq_5">
<text>Я закрепил ваше снаряжение, скрыв его и установив РЧ -приемник на частоту %s.Используйте свое устройство, чтобы отслеживать его, и оно начнет звучать, как только вы будете достаточно близко.</text>
</string>
<string id="st_soulslike_hidden_stash_1">
<text>Ваши вещи спрятаны в тайном месте, которое я отметил на вашем КПК.</text>
</string>
<string id="st_soulslike_hidden_stash_2">
<text>Я спрятал ваши вещи в безопасном месте и пометил его местоположение на вашем КПК.</text>
</string>
<string id="st_soulslike_hidden_stash_3">
<text>Я спрятал ваши вещи в тайном месте и отметил его на вашем КПК.</text>
</string>
<string id="st_soulslike_hidden_stash_4">
<text>Ваши вещи безопасно спрятаны в укрытии, которое я отметил на вашем КПК.</text>
</string>
<string id="st_soulslike_hidden_stash_5">
<text>Я скрыл ваши вещи в ненавязчивом укрытии и отметил его местоположение на вашем КПК для сохранности.</text>
</string>
<string id="st_soulslike_rescuer_indoor_1">
<text>Эй, ты один из самых удачливых ублюдков! Невероятно, что ты рискнул зайти в %s. Ты очень повезло, что мы тебя нашли! Мне удалось собрать нескольких других сталкеров, чтобы помочь мне с твоим снаряжением, надеюсь, все на месте.</text>
</string>
<string id="st_soulslike_rescuer_indoor_2">
<text>Чувак, тебе очень повезло! Невероятно, что ты залез в %s. Мы нашли тебя вовремя! Несколько нас сталкеров собрались, чтобы вернуть твоё снаряжение, и похоже, что всё целое и невредимое.</text>
</string>
<string id="st_soulslike_rescuer_indoor_3">
<text>Эй, сын везения! Я поражен, что ты смог зайти в %s. Слава богу, что мы наткнулись на тебя! Некоторые другие сталкеры и я объединили усилия, чтобы спасти твоё снаряжение, и всё у нас в порядке.</text>
</string>
<string id="st_soulslike_rescuer_indoor_4">
<text>Вот и ты, один из самых удачливых ублюдков! Ты реально зашёл в %s, да? Мы нашли тебя вовремя, и с помощью нескольких других сталкеров мы смогли вернуть твоё снаряжение. Всё на месте.</text>
</string>
<string id="st_soulslike_rescuer_indoor_5">
<text>Ох, блядь, тебе очень повезло! Невероятно, что ты залез в %s без какой-либо поддержки. К счастью, мы нашли тебя вовремя, и группа из нас сталкеров помогла вернуть твоё снаряжение. Всё на месте.</text>
</string>
<string id="st_soulslike_rescuer_monster_looter_1">
<text>Я смог отпугнуть мутанта рядом, но он кажется привлекался твоим рюкзаком. Будь осторожен, когда заберешь свои вещи - они могут привлечь других диких животных в этой области.</text>
</string>
<string id="st_soulslike_rescuer_monster_looter_2">
<text>После того, как я отпугнул рядом находившегося мутанта, заметил, что он пролезался в твоем рюкзаке. Будь осторожен при забирании своих вещей, так как то, что ты там имел, может привлечь других диких животных в этой области.</text>
</string>
<string id="st_soulslike_rescuer_monster_looter_3">
<text>Я смог отпугнуть мутанта, который находился рядом, но, похоже, он перерыл твой рюкзак. Будь внимателен, когда заберешь свои вещи, так как они могут привлечь других диких животных в этой области.</text>
</string>
<string id="st_soulslike_rescuer_monster_looter_4">
<text>Мутант, находившийся рядом с нами, бежал после того, как я его отпугнул, но я видел, что он роется в твоем рюкзаке. Будь осторожен, когда будешь забирать свои вещи, потому что другие дикие животные в этой области могут привлечься к тому, что находилось внутри.</text>
</string>
<string id="st_soulslike_rescuer_monster_looter_5">
<text>Твой рюкзак привлек внимание мутанта, но я смог его отпугнуть. Будь осторожен, когда будешь забирать свои вещи, так как то, что было внутри, может привлечь других диких животных в этой области.</text>
</string>
</string_table>
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="windows-1251"?>
<string_table>
<string id="st_soulslike_rescuers_radio_frequency_note_name">
<text>Ïðèìå÷àíèå ñïàñàòåëÿ</text>
</string>
<string id="st_soulslike_rescuers_radio_frequency_note_desc">
<text>Ïðèìå÷àíèå, íàïèñàííîå îäíèì èç ñòàëêåðîâ, êîòîðûé òåáÿ ñïàñ.</text>
</string>
<string id="st_soulslike_rescuers_radio_frequency_note_message">
<text> çàïèñêå óêàçàíà èíôîðìàöèÿ î ìåñòå, ãäå íàõîäÿòñÿ âàøè âåùè. Òàì íàïèñàíî, ÷òî íóæíî èñïîëüçîâàòü ðàäèîïðèåìíèê ñ ÷àñòîòîé %s â %s.</text>
</string>
</string_table>
@@ -0,0 +1,224 @@
<?xml version="1.0" encoding="windows-1251"?>
<string_table>
<string id="ui_mcm_menu_soulslike">
<text>Soulslike</text>
</string>
<!--General-->
<string id="ui_mcm_soulslike_general">
<text>Общий</text>
</string>
<string id="ui_mcm_soulslike_general_title">
<text>Jabbers' Soulslike Настройки</text>
</string>
<string id="ui_mcm_soulslike_general_description">
<text>Мод Soulslike привносит в Сталкер элементы игр в стиле Souls. После смерти вас спасает случайный сталкер в зоне. Он возвращает вас в установленное место последнего спавна, где вы просыпаетесь и находите сообщение от него о том, как вас нашли и на что он пошёл, чтобы доставить вас в безопасное место. Предметы, которые были на вашем персонаже, могут быть найдены, некоторые могут быть потеряны, а состояние ухудшено в зависимости от настроек.</text>
</string>
<string id="ui_mcm_soulslike_general_disclaimer">
<text>ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Хватит плакать, этот мод призван усложнить игру. В связи с этим существует 100% возможность попасть в ситуацию, когда вы неожиданно потеряете свое снаряжение. Случайная потеря предметов при смерти означает, что вы можете потерять оружие или броню, умереть в центре аномалии и не иметь возможности вернуть свое снаряжение - это возможно и ожидаемо. Всегда имейте запасной комплект, готовьтесь к худшему, надейтесь на лучшее.</text>
</string>
<!--Character-->
<string id="ui_mcm_soulslike_character">
<text>Персонаж</text>
</string>
<string id="ui_mcm_soulslike_character_title">
<text>Настройки персонажа</text>
</string>
<string id="ui_mcm_soulslike_character_rank_loss_percent">
<text>Потеря ранга %</text>
</string>
<string id="ui_mcm_soulslike_character_rank_loss_percent_desc">
<text>Это количество ранга персонажа, которое вы потеряете при возрождении.</text>
</string>
<string id="ui_mcm_soulslike_character_rep_loss_percent">
<text>Потеря репутации %</text>
</string>
<string id="ui_mcm_soulslike_character_rep_loss_percent_desc">
<text>Это количество репутации персонажа, которое вы потеряете при возрождении. Это личная репутация, а не стоящая/репутация фракции.</text>
</string>
<string id="ui_mcm_soulslike_character_health_loss_on_respawn">
<text>Потеря здоровья % при возрождении</text>
</string>
<string id="ui_mcm_soulslike_character_health_loss_on_respawn_desc">
<text>Это добавляет немного сложности к вашей игре. Это количество здоровья, которое будет удалено при возрождении. Пример: 25% означает, что у вас будет 75% здоровья при возрождении. Концепция заключается в том, что вы все еще будете слегка ранены и вам потребуется сохранять некоторые лекарства для лечения перед попыткой продолжить и получить свои вещи от места, где вы умерли.</text>
</string>
<!--Items-->
<string id="ui_mcm_soulslike_items">
<text>Предметы</text>
</string>
<string id="ui_mcm_soulslike_items_title">
<text>Настройки предметов</text>
</string>
<string id="ui_mcm_soulslike_items_allow_weapon_loss">
<text>Потеря оружия</text>
</string>
<string id="ui_mcm_soulslike_items_allow_outfit_loss">
<text>Потеря снаряжения</text>
</string>
<string id="ui_mcm_soulslike_items_allow_headgear_loss">
<text>Потеря головного убора</text>
</string>
<string id="ui_mcm_soulslike_items_allow_artifact_loss">
<text>Потеря артефактов</text>
</string>
<string id="ui_mcm_soulslike_items_allow_tool_loss">
<text>Потеря инструментов</text>
</string><string id="ui_mcm_soulslike_items_scalar_description">
<text>Потеря предметов и их состояния зависит от вашего ранга. При смерти выше уровень вашего ранга, тем больше вероятность потери предмета или уменьшения его состояния. Это делает игру более легкой в начале, но по мере прохождения игры последствия смерти становятся все более серьезными. См. подсказку к каждой настройке для более подробного объяснения.</text>
</string>
<string id="ui_mcm_soulslike_items_item_loss_scalar">
<text>Коэффициент потери предметов</text>
</string>
<string id="ui_mcm_soulslike_items_item_loss_scalar_desc">
<text>На максимальном уровне ранга вашего персонажа вероятность потери каждого предмета при смерти составляет 75%. Коэффициент потери предметов позволяет управлять этой потерей на ваше усмотрение. При стандартном значении 0,20 (или 20%) ваша максимальная потеря предмета составит 15%. Вы должны установить значение, которое подходит для вашего уровня потери предметов. Примеры: 0,10 = 7,5%, 0,20 = 15%, 0,30 = 22%, 0,40 = 30%... вы понимаете идею?</text>
</string>
<string id="ui_mcm_soulslike_items_item_condition_loss_scalar">
<text>Коэффициент потери состояния предметов</text>
</string>
<string id="ui_mcm_soulslike_items_item_condition_loss_scalar_desc">
<text>На максимальном уровне ранга вашего персонажа будет потеряно 18 единиц состояния на каждый предмет при смерти. Коэффициент потери состояния предметов позволяет управлять этой потерей на ваше усмотрение. При стандартном значении 0,05 (или 5%) ваша максимальная потеря состояния предмета составит 3,7. Вы должны установить значение, которое подходит для вашего уровня потери состояния предметов. Примеры: 0,05 = 3,7, 0,10 = 7,4, 0,15 = 11... вы понимаете идею?</text>
</string>
<!--Scenarios-->
<string id="ui_mcm_soulslike_scenarios">
<text>Сценарии</text>
</string>
<string id="ui_mcm_soulslike_scenarios_title">
<text>Настройки сценариев</text>
</string>
<string id="ui_mcm_soulslike_scenarios_description">
<text>Сценарии в духе Soulslike отличаются динамичностью. События респауна происходят в зависимости от того, кто убил вас, как вы были убиты, где, насколько близко к месту вашего респауна вы были, когда умерли, находитесь ли вы внутри или снаружи и многих других факторов. Эти настройки существуют, чтобы позволить вам настроить способы, которыми вы хотите попытаться восстановить свою экипировку. Сценарии по умолчанию всегда таковы, что при респауне вы можете оказаться со всеми своими вещами на себе (опять же, в зависимости от событий), или вы можете обнаружить, что ваша экипировка находится в рюкзаке на земле, где было найдено ваше тело. Ниже приведены дополнительные варианты, которые можно изменить, чтобы сделать их более или менее частыми.</text>
</string>
<string id="ui_mcm_soulslike_scenarios_rf_detector_scenario_weight">
<text>Вес сценария RF Detector.</text>
</string>
<string id="ui_mcm_soulslike_scenarios_rf_detector_scenario_weight_desc">
<text>Как дополнительный уровень сложности и просто для разнообразия, когда используется этот сценарий, ваш спаситель переместит все ваши предметы в скрытый ящик на той же карте, где вы были найдены. Он сообщит вам частоту радиоволн для отслеживания вашей экипировки и оставит вам записку в инвентаре как напоминание.</text>
</string>
<string id="ui_mcm_soulslike_scenarios_hidden_stash_scenario_weight">
<text>Вес сценария скрытого ящика</text>
</string>
<string id="ui_mcm_soulslike_scenarios_rf_detector_scenario_weight_desc">
<text>Как дополнительный уровень сложности и просто для разнообразия, когда используется этот сценарий, ваш спаситель переместит все ваши предметы в скрытый ящик и пометит его на вашем PDA.</text>
</string>
<string id="ui_mcm_soulslike_scenarios_looter_npcs_marked">
<text>Отметить ворующих NPC на PDA</text>
</string>
<string id="ui_mcm_soulslike_scenarios_rf_detector_scenario_weight_desc">
<text>Когда ваше снаряжение грабит NPC, эта опция позволяет отслеживать их на PDA.</text>
</string>
<!--Ambush-->
<string id="ui_mcm_soulslike_ambush">
<text>Засада</text>
</string>
<string id="ui_mcm_soulslike_ambush_title">
<text>Настройки засады</text>
</string>
<string id="ui_mcm_soulslike_ambush_description">
<text>В зависимости от того, что произошло в сценарии и какие предметы находятся у вашего персонажа, есть шанс возникновения события засады там, где было обнаружено ваше тело.</text>
</string>
<string id="ui_mcm_soulslike_ambush_mutant_ambush_chance">
<text>Шанс засады мутантов</text>
</string><string id="ui_mcm_soulslike_ambush_allow_boar_ambush">
<text>Разрешить нападение диких кабанов</text>
</string>
<string id="ui_mcm_soulslike_ambush_allow_flesh_ambush">
<text>Разрешить нападение Плоти</text>
</string>
<string id="ui_mcm_soulslike_ambush_allow_dogs_ambush">
<text>Разрешить нападение собак</text>
</string>
<string id="ui_mcm_soulslike_ambush_allow_cats_ambush">
<text>Разрешить нападение котов</text>
</string>
<string id="ui_mcm_soulslike_ambush_allow_snorks_ambush">
<text>Разрешить нападение Снорков</text>
</string>
<string id="ui_mcm_soulslike_ambush_allow_bloodsucker_ambush">
<text>Разрешить нападение Кровососов</text>
</string>
<string id="ui_mcm_soulslike_ambush_allow_burer_ambush">
<text>Разрешить нападение бюрера</text>
</string>
<string id="ui_mcm_soulslike_ambush_allow_chimera_ambush">
<text>Разрешить нападение химеры</text>
</string>
<string id="ui_mcm_soulslike_ambush_allow_controller_ambush">
<text>Разрешить нападение контроллера</text>
</string>
<string id="ui_mcm_soulslike_ambush_stalker_ambush_chance">
<text>Шанс нападения сталкеров</text>
</string>
<string id="ui_mcm_soulslike_ambush_allow_stalker_novice_ambush">
<text>Разрешить нападение начинающих сталкеров</text>
</string>
<string id="ui_mcm_soulslike_ambush_allow_stalker_advanced_ambush">
<text>Разрешить нападение опытных сталкеров</text>
</string>
<string id="ui_mcm_soulslike_ambush_allow_stalker_veteran_ambush">
<text>Разрешить нападение мастеров сталкеров</text>
</string>
<string id="ui_mcm_soulslike_ambush_allow_stalker_sniper_ambush">
<text>Разрешить нападение снайперов сталкеров</text>
</string>
<!--Hardcore-->
<string id="ui_mcm_soulslike_hardcore">
<text>Хардкоре</text>
</string>
<string id="ui_mcm_soulslike_hardcore_title">
<text>Хардкорные настройки</text>
</string>
<string id="ui_mcm_soulslike_hardcore_save_description">
<text>Похоже на то, что вы хлопаете своим членом по книге в твердой обложке, хардкорные сохранения означают, что ручное, быстрое сохранение и сохранение у костра отключены, и всегда будет существовать только один файл сохранения. Хардкорные сохранения позволяют сохраняться только во время сна и при возрождении. Имейте в виду, что, поскольку когда-либо будет существовать только один файл сохранения, можно застрять в ситуации, когда прогресс будет затруднен, если вы потеряете все свое снаряжение и у вас не будет денег на лечение или еду.</text>
</string>
<string id="ui_mcm_soulslike_hardcore_is_enabled">
<text>Включить хардкорные сохранения</text>
</string>
<string id="ui_mcm_soulslike_hardcore_override_campfire_hardcore_saves">
<text>Разрешить сохранения Campfire с хардкорными сохранениями</text>
</string>
<string id="ui_mcm_soulslike_hardcore_override_campfire_hardcore_saves_desc">
<text>Иногда вам нужно то теплое пушистое чувство комфорта, которое вы получаете, часто экономя. Это позволяет сохраняться у костров, даже если хардкорные сохранения включены. Имейте в виду, что при возрождении или сне ваши сохранения у костра все равно будут удалены, если включены хардкорные сохранения.</text>
</string>
<!--Debug-->
<string id="ui_mcm_soulslike_debug">
<text>Разработчик</text>
</string>
<string id="ui_mcm_soulslike_debug_title">
<text>Настройки Разработчика</text>
</string>
<string id="ui_mcm_soulslike_debug_is_enabled">
<text>Режим Отладки</text>
</string>
<string id="ui_mcm_soulslike_debug_enable_tips">
<text>Показывать сообщения PDA</text>
</string>
<string id="ui_mcm_soulslike_debug_debug_hidden_stashes">
<text>Отладка скрытых укрытий</text>
</string>
<string id="ui_mcm_soulslike_debug_debug_item_loss">
<text>Отладка потери предметов</text>
</string>
<string id="ui_mcm_soulslike_debug_debug_the_tarkov_looter">
<text>Отладка "Тарковского" грабителя</text>
</string>
<string id="ui_mcm_soulslike_debug_debug_the_noloss_scenario">
<text>Отладка без потерь</text>
</string>
<string id="ui_mcm_soulslike_debug_debug_the_default_scenario">
<text>Отладка стандартного сценария потерь</text>
</string>
<string id="ui_mcm_soulslike_debug_debug_the_rf_scenario">
<text>Отладка сценария с детектором РЧ</text>
</string>
<string id="ui_mcm_soulslike_debug_debug_the_hidden_stash_scenario">
<text>Отладка сценария скрытых укрытий</text>
</string>
</string_table>
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="windows-1251" ?>
<string_table>
<string id="st_cap_check_soulslike_mode">
<text>Soulslike Режим</text>
</string>
<string id="st_mm_ck_soulslike_mode_desc">
<text>
%c[0,150,150,150]В Soulslike-режиме, смерть, технически, никогда не наступает\n
\nОн возвращает вас в установленное место последнего спавна, где вы просыпаетесь и находите от него сообщение\n
о том, как он вас нашел и на что он пошел, чтобы доставить вас в безопасное место.\n\n
Предметы, которые были на вашем персонаже, необходимо вернуть, некоторые могут быть утеряны, а состояние ухудшено, все зависит от настроек\n
\n %c[200,200,50,50] Не совместим с режимом Азазель.\n
\n %c[200,200,50,50] Не совместим с режимом Ironman.
</text>
</string>
</string_table>
@@ -0,0 +1,12 @@
<w>
<main_dialog>
<options>
<cap_check_soulslike_mode x="100" y="95" width="40" height="20" stretch="1">
<text r="170" g="170" b="170" font="letterica16" align="l" vert_align="c">st_cap_check_soulslike_mode</text>
</cap_check_soulslike_mode>
<check_soulslike_mode x="60" y="94" width="35" height="23" stretch="1">
<texture>ui_inGame2_checkbox</texture>
</check_soulslike_mode>
</options>
</main_dialog>
</w>
@@ -0,0 +1,12 @@
<w>
<main_dialog>
<options>
<cap_check_soulslike_mode x="80" y="95" width="40" height="20" stretch="1">
<text r="170" g="170" b="170" font="letterica16" align="l" vert_align="c">st_cap_check_soulslike_mode</text>
</cap_check_soulslike_mode>
<check_soulslike_mode x="48" y="94" width="28" height="23" stretch="1">
<texture>ui_inGame2_checkbox</texture>
</check_soulslike_mode>
</options>
</main_dialog>
</w>
@@ -0,0 +1,7 @@
<w>
<btn_set_spawn x="115" y="212" width="101" height="28" check_mode="0" stretch="1">
<window_name>button_spawn</window_name>
<text font="letterica18">set_spawn_button</text>
<texture>ui_inGame2_Mp_bigbuttone</texture>
</btn_set_spawn>
</w>
@@ -0,0 +1,7 @@
<w>
<btn_set_spawn x="115" y="212" width="101" height="28" check_mode="0" stretch="1">
<window_name>button_spawn</window_name>
<text font="letterica18">set_spawn_button</text>
<texture>ui_inGame2_Mp_bigbuttone</texture>
</btn_set_spawn>
</w>
@@ -0,0 +1,962 @@
--[[
Jabbers
05APR2023
Jabbers' Soulslike Anomaly Mod
--]]
local version = "0.30-beta"
local tools_list = {
["itm_basickit"] = true,
["itm_advancedkit"] = true,
["itm_expertkit"] = true,
["itm_drugkit"] = true,
["itm_ammokit"] = true,
["itm_gunsmith_toolkit"] = true,
["itm_artefactskit"] = true,
}
local scenario_logic = nil
RELATIONS = {
FRIENDS = 1000,
BUDDIES = 500,
NEUTRALS = 0,
ENEMIES = -1000
}
SCENARIOS = {
Default = 1,
RFDetectorStash = 2,
HiddenStash = 3,
NoLoss = 4,
}
hit_type_to_str = {
[hit.light_burn] = "Light Burn",
[hit.burn] = "Burn",
[hit.strike] = "Strike",
[hit.shock] = "Shock",
[hit.wound] = "Wound",
[hit.radiation] = "Radiation",
[hit.telepatic] = "Telepatic",
[hit.chemical_burn] = "Chemical Burn",
[hit.explosion] = "Explosion",
[hit.fire_wound] = "Fire",
}
entity_type = {
Stalker = 1,
Monster = 2,
Anomaly = 3,
Self = 4,
Other = 4
}
----------------------------------------
-- Classes
----------------------------------------
MAX_HIT_POOL_COUNT = 30
MAX_HIT_TIME = 30000
local hit_queue = soulslike_classes.TimedQueue(MAX_HIT_POOL_COUNT, MAX_HIT_TIME)
----------------------------------------
-- Helpers
----------------------------------------
function try(func, ...)
local status, error_or_result = pcall(func, ...)
if not status then
soulslike.error(error_or_result)
return false
else
return error_or_result
end
end
function math.clamp(x, min, max)
if x < min then return min end
if x > max then return max end
return x
end
function table.get_length(T)
local count = 0
for _ in pairs(T) do count = count + 1 end
return count
end
function table.has_value(tab, val)
for _, value in ipairs(tab) do
if value == val then
return true
end
end
return false
end
----------------------------------------
-- DEBUG
----------------------------------------
local function print_table (tbl, indent)
if not indent then
indent = 0
end
utils_data.debug_write(string.rep(" ", indent) .. "{")
indent = indent + 2
if (type(tbl) == "userdata") then
utils_data.debug_write("<userdata>,\n")
else
for k, v in pairs(tbl) do
local toprint = string.rep(" ", indent)
if (type(k) == "number") then
toprint = toprint .. "[" .. k .. "] = "
elseif (type(k) == "string") then
toprint = toprint .. k .. " = "
end
if (type(v) == "number") then
utils_data.debug_write(toprint .. v .. ",")
elseif (type(v) == "string") then
utils_data.debug_write(toprint .. "\"" .. v .. "\",")
elseif (type(v) == "table") then
utils_data.debug_write(toprint)
print_table(v, indent + 2)
else
utils_data.debug_write(toprint .. "\"" .. tostring(v) .. "\",")
end
end
end
utils_data.debug_write(string.rep(" ", indent-2) .. "}")
end
local function log(log_type, output)
if not output then
utils_data.debug_write("[Soulslike] "..log_type..": ".."(nil)")
elseif (type(output) == "table") then
utils_data.debug_write("[Soulslike] "..log_type..": ")
print_table(output)
else
utils_data.debug_write("[Soulslike] "..log_type..": "..output)
end
end
function debug(output)
log("DEBUG", output)
end
function info(output)
log("INFO ", output)
end
function warn(output)
log("WARN ", output)
end
function error(output)
log("ERROR", output)
end
function debug_tip(text, delay)
debug(text)
if not soulslike_mcm.show_debug_tips() then
return
end
local text = "[Soulslike] "..tostring(text)
if not db.actor then
return
end
local ico = "ui_inGame2_Dengi_otdani"
local text_color = utils_xml.get_color("pda_white")
text = text_color .. text
if delay == nil then
delay = 6000
end
news_manager.send_tip(db.actor, text, nil, ico, delay)
end
----------------------------------------
-- Globals
----------------------------------------
function _G.IsSoulslikeMode()
return not IsHardcoreMode() and axr_main.config and axr_main.config:r_value("character_creation","new_game_soulslike_mode",1) == true or alife_storage_manager.get_state().enable_soulslike_mode == true
end
function _G.IsToolkit(o, s)
if not (s) then
s = o and o:section()
end
return tools_list[s]
end
----------------------------------------
-- Helper Functions
----------------------------------------
function get_soulslike_state()
local game_state = alife_storage_manager.get_state()
if not game_state.soulslike then
game_state.soulslike = {
created_stashes = {},
spawn_location = {
level = nil,
position = {
x = nil,
y = nil,
z = nil,
},
angle = {
x = nil,
y = nil,
z = nil,
},
level_vertex_id = nil,
game_vertex_id = nil,
},
note_message_data = {},
hidden_stashes = {}
}
end
-- Backward save compatibility
if not game_state.soulslike.note_message_data then
game_state.soulslike.note_message_data = {}
end
if not game_state.soulslike.hidden_stashes then
game_state.soulslike.hidden_stashes = {}
end
if not game_state.soulslike.created_stashes then
game_state.soulslike.created_stashes = {}
end
if not game_state.soulslike.spawn_location then
game_state.soulslike.spawn_location = {
level = nil,
position = {
x = nil,
y = nil,
z = nil,
},
angle = {
x = nil,
y = nil,
z = nil,
},
level_vertex_id = nil,
game_vertex_id = nil,
}
end
return game_state.soulslike
end
function set_spawn(show_message)
local se_actor = alife():actor()
local state = get_soulslike_state()
state.spawn_location.level = level.name()
state.spawn_location.position.x = se_actor.position.x
state.spawn_location.position.y = se_actor.position.y
state.spawn_location.position.z = se_actor.position.z
state.spawn_location.angle.x = se_actor.angle.x
state.spawn_location.angle.y = se_actor.angle.y
state.spawn_location.angle.z = se_actor.angle.z
state.spawn_location.level_vertex_id = se_actor.m_level_vertex_id
state.spawn_location.game_vertex_id = se_actor.m_game_vertex_id
debug("Saved spawn location data:")
if show_message then
local str = game.translate_string("st_soulslike_spawn_location_set")
actor_menu.set_msg(1, str, 4)
end
end
function find_closest_enemy()
local enemy = nil
local enemy_dist = 150
local sim = alife()
local gg = game_graph()
local level_name = level.name()
if not sim then return end
if not gg then return end
for i=1,65534 do
local se_obj = sim:object(i)
if se_obj and (level_name == sim:level_name(gg:vertex(se_obj.m_game_vertex_id):level_id())) then
local cls = se_obj:clsid()
local sec = se_obj:section_name()
local is_valid = false
if IsStalker(nil,cls) and string.find(sec,"sim_default_") and se_obj:alive() then
local comm = se_obj:community()
if (comm ~= "trader") and (comm ~= "zombied") then
is_valid = true
end
elseif IsMonster(nil,cls) then
is_valid = true
end
if is_valid then
local dist = se_obj.position:distance_to_sqr(db.actor:position())
if enemy_dist > dist then
if IsStalker(nil,cls) then
local comm = se_obj:community()
debug("Found enemy "..se_obj:name().." from the "..comm.." community "..tostring(dist).." meters away.")
enemy = se_obj
elseif IsMonster(nil,cls) then
enemy = se_obj
end
end
end
end
end
return enemy
end
function find_closest_enemy_mutant()
local enemy = nil
local enemy_dist = 75
local sim = alife()
local gg = game_graph()
local level_name = level.name()
if not sim then return end
if not gg then return end
for i=1,65534 do
local se_obj = sim:object(i)
if se_obj and (level_name == sim:level_name(gg:vertex(se_obj.m_game_vertex_id):level_id())) then
local cls = se_obj:clsid()
if IsMonster(nil,cls) then
local dist = se_obj.position:distance_to_sqr(db.actor:position())
if enemy_dist > dist then
if IsMonster(nil,cls) then
enemy = se_obj
end
end
end
end
end
return enemy
end
function find_closest_enemy_stalker()
local friend = nil
local friend_dist = 100000
for i=1, #db.OnlineStalkers do
local id = db.OnlineStalkers[i]
local npc = db.storage[id] and db.storage[id].object or level.object_by_id(id)
if npc then
local dist = npc:position():distance_to_sqr(db.actor:position())
local is_friend = npc:general_goodwill(db.actor) <= RELATIONS.ENEMIES
if npc:alive() and is_friend and friend_dist > dist and (not get_object_story_id(id)) then
local comm = npc:character_community()
debug("Found friend "..npc:name().." from the "..comm.." community "..tostring(dist).." meters away.")
friend = npc
friend_dist = dist
end
end
end
return friend
end
function find_closest_friendly_stalker()
local friend = nil
local friend_dist = 100000
for i=1, #db.OnlineStalkers do
local id = db.OnlineStalkers[i]
local npc = db.storage[id] and db.storage[id].object or level.object_by_id(id)
if npc then
local dist = npc:position():distance_to_sqr(db.actor:position())
local is_friend = npc:general_goodwill(db.actor) >= RELATIONS.ENEMIES
if npc:alive() and is_friend and friend_dist > dist and (not get_object_story_id(id)) then
local comm = npc:character_community()
debug("Found friend "..npc:name().." from the "..comm.." community "..tostring(dist).." meters away.")
friend = npc
friend_dist = dist
end
end
end
return friend
end
function force_save(type)
--if game isn't already paused, then force a pause here
local force_pause
if not (device():is_paused()) then
device():pause(true)
force_pause = true
end
local Y, M, D, h
Y, M, D, h = game.get_game_time():get(Y, M, D, h)
local m = level.get_time_minutes()
if m < 10 then
m = ("0"..m)
end
local comm = utils_xml.get_special_txt(db.actor:character_community())
local map = utils_xml.get_special_txt(level.name())
local date = string.format("%d.%d.%d %d-%d", D, M, Y, h, m)
local file_name = "soulslike_"..comm.." - "..map.." "..date.." - "..type
exec_console_cmd("save ".. file_name)
if (force_pause) then
device():pause(false)
end
end
----------------------------------------
-- Dream Callbacks
----------------------------------------
function wakeup_callback()
debug("wakeup_callback")
xr_effects.enable_ui(db.actor, nil)
exec_console_cmd("snd_volume_music "..tostring(_G.mus_vol))
exec_console_cmd("snd_volume_eff "..tostring(_G.amb_vol))
_G.amb_vol = 0
_G.mus_vol = 0
disable_info("tutorial_sleep")
disable_info("actor_is_sleeping")
disable_info("sleep_active")
debug("Looking for scenario logic.")
if scenario_logic then
debug("Completing scenario.")
scenario_logic:OnComplete()
else
error("No logic state")
end
local data = get_soulslike_state()
scenario_logic:destroy()
scenario_logic = nil
data.logic_state = nil
end
function dream_callback()
debug("dream_callback")
level.add_cam_effector("camera_effects\\sleep.anm", 10, false, "soulslike.wakeup_callback")
local hours = math.random(6,14)
level.change_game_time(0,hours,0)
db.actor.power = 1
SendScriptCallback("actor_on_sleep", hours)
end
----------------------------------------
-- Game Callbacks
----------------------------------------
local function actor_on_before_death(who, flags)
if not IsSoulslikeMode() then
return
end
-- Pretty sure this fixes arena fights, still need to test
if has_alife_info("bar_arena_fight") then
debug('Actor was in an arena fight, ignoring death.')
return
end
debug('Actor died')
game_statistics.increment_statistic("deaths")
hit_queue:Invalidate()
scenario_logic = soulslike_scenario_logic_factory.create_new(hit_queue:Values())
if scenario_logic then
scenario_logic:OnDeath()
flags.ret_value = false
end
hit_queue:Clear()
end
local function on_before_save_input(flags, type, text)
if not IsSoulslikeMode() then
return
end
-- No hardcore save setting, allow saving
if not soulslike_mcm.is_hardcore_save_enabled() then
return
end
-- Hardcore save is enabled, but we still want to save at campfires
-- We just return to let the regular saving work.
if soulslike_mcm.override_campfire_hardcore_saves() then
return
end
-- All other scenarios flow through here and we just disallow saving
if not level_weathers.valid_levels[level.name()] then
return
end
debug('User tried to save')
local str = game.translate_string("st_save_only_when_sleeping")
actor_menu.set_msg(1, str, 4)
exec_console_cmd("main_menu off")
flags.ret = true
end
local function try_send_inventory_examined_message(stash_id)
local data = get_soulslike_state()
local stash_data = data.created_stashes[stash_id]
if stash_data and not stash_data.examine then
local lost_items = stash_data.lost_items
debug('Stash not yet examined.')
debug(lost_items)
if #lost_items > 0 then
local msg = "You examine your belongings and find that you were missing the following items: "
local item_groups = {}
for _, sec in pairs(lost_items) do
if not item_groups[sec] then
item_groups[sec] = {
section = sec,
count = 1
}
else
item_groups[sec].count = item_groups[sec].count + 1
end
end
local item_names = {}
for _, group in pairs(item_groups) do
local inv_name = ui_item.get_sec_name(group.section)
if group.count > 1 then
table.insert(item_names, tostring(group.count).." x "..inv_name)
else
table.insert(item_names, inv_name)
end
end
msg = msg..table.concat(item_names, ", ")
local ui_sender = news_manager.tips_icons['default']
db.actor:give_game_news("", msg, ui_sender, 0, 20000)
stash_data.examine = true
end
end
end
local function actor_on_item_take_from_box(box,obj)
if not IsSoulslikeMode() then
return
end
local state = get_soulslike_state()
local id = box:id()
if (box:section() == "inv_backpack") then
if (box:is_inv_box_empty()) then
hide_hud_inventory()
local se_obj = alife_object(id)
if se_obj then
alife_release(se_obj)
try_send_inventory_examined_message(id)
state.created_stashes[id] = nil
end
end
end
end
local function actor_on_stash_remove(data)
if not IsSoulslikeMode() then
return
end
local state = get_soulslike_state()
if state.created_stashes[data.stash_id] then
data.cancel = true
try_send_inventory_examined_message(state.stash_id)
end
end
local function on_console_execute(name, ...)
if not IsSoulslikeMode() then
return
end
if(name == "save") then
debug(name)
local extraArgs = {...}
if extraArgs then
local last_save_file_name = table.concat(extraArgs," ")
debug(last_save_file_name)
if soulslike_mcm.is_hardcore_save_enabled() then
last_save_file_name = string.lower(last_save_file_name)
debug("Don't delete: ".. last_save_file_name)
local uuid = get_soulslike_state().uuid
local fs = getFS()
if not fs then return end
local flist = fs:file_list_open_ex("$game_saves$",bit_or(FS.FS_ListFiles,FS.FS_RootOnly),"*.scoc")
local f_cnt = flist:Size()
for it=0, f_cnt-1 do
local file = flist:GetAt(it)
local file_name = string.sub(file:NameFull(), 0, (string.len(file:NameFull()) - string.len(".scoc")))
local scoc_path = fs:update_path('$game_saves$', '')..file_name..".scoc"
local scop_path = fs:update_path('$game_saves$', '')..file_name..".scop"
local dds_path = fs:update_path('$game_saves$', '')..file_name..".dds"
local f = io.open(scoc_path,"rb")
if f then
local data = f:read("*all")
f:close()
if (data) then
local decoded = alife_storage_manager.decode(data)
local d_soulslike = decoded and decoded.soulslike
if (d_soulslike and (d_soulslike.uuid == uuid)) then
debug("/ Soulslike mode | file: "..file_name)
file_name = string.lower(file_name)
if file_name ~= last_save_file_name then
debug("~ Soulslike mode | delete save file: "..file_name)
local scoc_path_bak = fs:update_path('$game_saves$', '').."soulslike-backup/"..file_name..".scoc"
local scop_path_bak = fs:update_path('$game_saves$', '').."soulslike-backup/"..file_name..".scop"
local dds_path_bak = fs:update_path('$game_saves$', '').."soulslike-backup/"..file_name..".dds"
fs:file_copy(scoc_path, scoc_path_bak)
fs:file_copy(scop_path, scop_path_bak)
fs:file_copy(dds_path, dds_path_bak)
ui_load_dialog.delete_save_game(file_name)
end
end
end
end
end
end
end
end
end
local function physic_object_on_use_callback(box, who)
local data = get_soulslike_state()
if not IsInvbox(box) or not data.hidden_stashes or not data.hidden_stashes[box:id()] then
return
end
local id = box:id()
local stash_data = data.hidden_stashes[id]
local stash_id = stash_data.stash_id
local se_obj = alife_object(stash_id)
local stash = level.object_by_id(stash_id)
if not stash then
warn("Not expected, unable to find stash id linked to "..tostring(id)..". Please save and reload near the stash to see if it solves the issue.")
debug("Removing INVALID PDA marker "..tostring(id))
level.map_remove_object_spot(id, "secondary_task_location")
return
end
local sim = alife();
if not sim then return end
if se_obj and not se_obj.online then
se_obj:switch_online()
end
sim:set_switch_online(stash_id,true)
sim:set_switch_offline(stash_id,false)
try_send_inventory_examined_message(stash_id)
local function transfer_item(temp,item)
debug("Transfering item "..item:section())
stash:transfer_item(item, box)
end
if stash_data.radio_id then
debug("Clearing radio stash "..tostring(stash_data.radio_id))
item_radio.clear_stash(stash_data.radio_level, stash_data.radio_id)
end
debug("Transfering items from hidden stash "..tostring(id).." to static stash "..tostring(stash_id))
stash:iterate_inventory_box(transfer_item)
alife_release(stash)
debug("Removing PDA marker "..tostring(id))
level.map_remove_object_spot(id , "secondary_task_location")
data.hidden_stashes[id] = nil
end
local function load_state(data)
if not IsSoulslikeMode() then
return
end
local data = get_soulslike_state()
if not data.logic_state then
debug("No logic state")
elseif data.logic_state and not data.logic_state.scenario_id then
warn("Logic state exists without scenario id")
elseif data.logic_state and data.logic_state.scenario_id then
-- Reinitialize the last scenario using the saved logic state.
scenario_logic = soulslike_scenario_logic_factory.create_by_id(data.logic_state.scenario_id, data.logic_state)
end
end
local function save_state(data)
if not IsSoulslikeMode() then
return
end
local data = get_soulslike_state()
if not data.spawn_location.level and level.name() ~= 'fake_start' then
set_spawn(false)
end
if scenario_logic then
-- Save the logic state for the current scenario so we can restore it on load
-- This is for the purposes of ChangeLevel which unloads the scripts and then
-- reloads them, so we need to be able to reinitialize the scenario as it was
-- before changing levels
data.logic_state = scenario_logic.logic_state;
end
end
local function on_level_changing()
if not IsSoulslikeMode() then
return
end
debug("On on_level_changing load.")
local data = get_soulslike_state()
if not data.spawn_location.level and level.name() ~= 'fake_start' then
set_spawn(false)
end
end
local function on_game_load()
if not IsSoulslikeMode() then
return
end
debug("On game load.")
local data = get_soulslike_state()
local sim = alife()
if sim then
debug("Updating position and status of hidden stashes.")
for box_id, value in pairs(data.hidden_stashes) do
local se_hidden_stash = alife_object(value.stash_id)
local se_box = alife_object(box_id)
if not se_hidden_stash then
debug("Unable to find hidden stash "..tostring(value.stash_id))
elseif not se_box then
debug("Unable to find box id "..tostring(box_id))
else
debug("Moving hidden stash"..tostring(value.stash_id))
sim:teleport_object(value.stash_id, se_box.m_game_vertex_id, se_box.m_level_vertex_id, se_box.position)
debug("Setting hidden stash online")
if not se_box.online then
se_box:switch_online()
end
for i=1,65534 do
local se_obj = sim:object(i)
if (se_obj and se_obj.parent_id == id) then
debug("Moving "..se_obj.section.." id:"..tostring(value.stash_id))
sim:teleport_object(value.stash_id, se_box.m_game_vertex_id, se_box.m_level_vertex_id, se_box.position)
if se_obj then
if not se_obj.online then
debug("Setting "..se_obj.section.." online")
se_obj:switch_online()
end
end
end
end
end
end
end
-- Write out an identifier so we can use it later
-- to identify other saves with the same ID if the
-- user is playing with Hardcore Saves enabled.
if not data.uuid then
data.uuid = GAME_VERSION .. "_" .. tostring(math.random(100)) .. tostring(math.random()) .. tostring(math.random(1000))
end
debug("Looking for scenario logic.")
if scenario_logic then
debug("Calling scenario respawn.")
scenario_logic:OnRespawn()
end
end
local function actor_on_sleep(hours)
if not IsSoulslikeMode() then
return
end
soulslike.debug('actor_on_sleep')
-- Only force save if we aren't running a scenario
if not scenario_logic then
soulslike.force_save("sleep")
end
end
local detour_actor_on_before_hit = nil
local function actor_on_before_hit(shit, bone_id, flags)
if not IsSoulslikeMode() then
if detour_actor_on_before_hit then
detour_actor_on_before_hit(shit, bone_id, flags)
end
return
end
local damage = shit.power
if grok_actor_damage_balancer and grok_actor_damage_balancer.damage then
--debug("Using damage from Grok's Damage Balancer")
damage = grok_actor_damage_balancer.damage
end
--debug("Player hit:")
--debug("shit.type: "..tostring(hit_type_to_str[shit.type]))
--debug("shit.power: "..tostring(damage))
--debug("shit.impulse: "..tostring(shit.impulse))
--debug("shit.draftsman: "..(shit and shit.draftsman:name() or "<nil>"))
if shit.draftsman then
--debug("shit.draftsman: "..(shit and shit.draftsman:name() or "<nil>"))
end
local health = db.actor.health
local is_fatal = shit.power >= health
hit_queue:Enqueue({
type = shit.type,
power = damage,
is_fatal = is_fatal,
time = time_global(),
draftsman_id = shit.draftsman and shit.draftsman:id() or nil,
})
--debug("is_fatal: "..tostring(is_fatal))
end
local function npc_on_net_spawn(npc, se_obj)
if not IsSoulslikeMode() then
return
end
local state = get_soulslike_state()
if npc and IsStalker(npc) and state.tracked_ambushers and state.tracked_ambushers[npc:id()] then
debug("Setting up ambushers "..tostring(npc:id()))
local ambusher_state = state.tracked_ambushers[npc:id()]
local position = vector():set(ambusher_state.position.x, ambusher_state.position.y, ambusher_state.position.z)
npc:set_mental_state(ambusher_state.mental_state)
npc:set_body_state(ambusher_state.body_state)
npc:set_movement_type(ambusher_state.movement_type)
npc:set_sight(ambusher_state.sight_type, nil, 0)
npc:set_desired_position(position)
npc:set_desired_direction()
if soulslike_mcm.debug_squad_spawns() then
level.map_add_object_spot_ser(npc:id(), "secondary_task_location", "DEBUG: Ambush NPC")
end
state.tracked_ambushers[npc:id()] = nil
end
end
local function actor_on_first_update()
debug("actor_on_first_update")
end
function on_game_start()
debug('Version: '..version)
RegisterScriptCallback("actor_on_stash_remove", actor_on_stash_remove)
RegisterScriptCallback("actor_on_first_update", actor_on_first_update)
RegisterScriptCallback("actor_on_item_take_from_box", actor_on_item_take_from_box)
RegisterScriptCallback("actor_on_before_death", actor_on_before_death)
RegisterScriptCallback("on_before_save_input", on_before_save_input)
RegisterScriptCallback("save_state", save_state)
RegisterScriptCallback("load_state", load_state)
RegisterScriptCallback("on_level_changing", on_level_changing)
RegisterScriptCallback("on_game_load", on_game_load)
RegisterScriptCallback("actor_on_sleep", actor_on_sleep)
RegisterScriptCallback("on_console_execute", on_console_execute)
RegisterScriptCallback("actor_on_before_hit", actor_on_before_hit)
RegisterScriptCallback("physic_object_on_use_callback", physic_object_on_use_callback)
--RegisterScriptCallback("npc_on_net_spawn", npc_on_net_spawn)
end
@@ -0,0 +1,74 @@
class "TimedQueue"
function TimedQueue:__init(max_count, expiriation_ms)
self.data = {}
self.first = 0
self.last = -1
self.max_count = max_count
self.expiriation_ms = expiriation_ms
end
function TimedQueue:Clear()
self.data = {}
self.first = 0
self.last = -1
--soulslike.debug("TimedQueue:Clear")
end
function TimedQueue:Enqueue(value)
value.__cached_time = time_global()
self.last = self.last + 1
self.data[self.last] = value
--soulslike.debug("TimedQueue:Enqueue")
end
function TimedQueue:Dequeue()
local result
if (self.first > self.last) then
result = nil
else
result = self.data[self.first]
self.data[self.first] = nil
self.first = self.first + 1
end
--soulslike.debug("TimedQueue:Dequeue")
return result
end
function TimedQueue:Peek()
local result
if (self.first > self.last) then
result = nil
else
result = self.data[self.first]
end
return result
end
function TimedQueue:Values()
--soulslike.debug("TimedQueue:Values")
--soulslike.debug(self.data)
local values = {}
for _,v in pairs(self.data) do
if v then
table.insert(values, v)
end
end
return values
end
function TimedQueue:Invalidate()
while true do
local next = self:Peek()
if next == nil then
break
end
if next.__cached_time + self.expiriation_ms < time_global() then
--soulslike.debug("TimedQueue:Dequeue_time")
self:Dequeue()
else
break;
end
end
end
@@ -0,0 +1,644 @@
--[[
Jabbers
05APR2023
Jabbers' Soulslike Anomaly Mod
--]]
function on_mcm_load()
local op = {
id = "soulslike",
gr = { }
}
local general = {
id = "general",
text = "ui_mcm_soulslike_general",
sh = true,
gr = {
{
id = "title",
type = "slide",
link = "ui_options_slider_gameplay_diff",
text = "ui_mcm_soulslike_general_title",
size = {512,50},
spacing = 20
},
{
id = "desc_mcm",
type = "desc",
text = "ui_mcm_soulslike_general_description",
clr = {255, 255 ,255 ,255},
},
{
id = "desc_mcm",
type = "desc",
text = "ui_mcm_soulslike_general_disclaimer",
clr = {255, 255 ,255 ,0},
},
},
}
table.insert(op.gr, general)
local character = {
id = "character",
text = "ui_mcm_soulslike_character",
sh = true,
gr = {
{
id = "title",
type = "slide",
link = "ui_options_slider_gameplay_diff",
text = "ui_mcm_soulslike_character_title",
size = {512,50},
spacing = 20
},
{
id = "health_loss_on_respawn",
type = "track",
val = 2,
min = 0.0,
max = 0.75,
step = 0.01,
def = 0.75
},
{
id = "rank_loss_percent",
type = "track",
val = 2,
min = 0,
max = 0.75,
step = 0.01,
def = 0.02
},
{
id = "rep_loss_percent",
type = "track",
val = 2,
min = 0,
max = 0.75,
step = 0.01,
def = 0.05
}
},
}
table.insert(op.gr, character)
local items = {
id = "items",
text = "ui_mcm_soulslike_items",
sh = true,
gr = {
{
id = "title",
type = "slide",
link = "ui_options_slider_gameplay_diff",
text = "ui_mcm_soulslike_items_title",
size = {512,50},
spacing = 20
},
{
id = "keep_equipped_items_on_death",
type = "check",
val = 1,
def = false
},
{
id = "desc_mcm",
type = "desc",
text = "ui_mcm_soulslike_items_scalar_description",
clr = {255, 255 ,255 ,255},
},
{
id = "item_loss_scalar",
type = "track",
val = 2,
min = 0,
max = 0.75,
step = 0.01,
def = 0.20
},
{
id = "item_condition_loss_scalar",
type = "track",
val = 2,
min = 0,
max = 0.25,
step = 0.01,
def = 0.05
},
{
id = "desc_mcm",
type = "desc",
text = "ui_mcm_soulslike_items_allow_desc",
clr = {255, 255 ,255 ,255},
},
{
id = "allow_weapon_loss",
type = "check",
val = 1,
def = true
},
{
id = "allow_outfit_loss",
type = "check",
val = 1,
def = true
},
{
id = "allow_headgear_loss",
type = "check",
val = 1,
def = true
},
{
id = "allow_artifact_loss",
type = "check",
val = 1,
def = true
},
{
id = "allow_tool_loss",
type = "check",
val = 1,
def = true
},
},
}
table.insert(op.gr, items)
local scenarios = {
id = "scenarios",
text = "ui_mcm_soulslike_scenarios",
sh = true,
gr = {
{
id = "title",
type = "slide",
link = "ui_options_slider_gameplay_diff",
text = "ui_mcm_soulslike_scenarios_title",
size = {512,50},
spacing = 20
},
{
id = "desc_mcm",
type = "desc",
text = "ui_mcm_soulslike_scenarios_description",
clr = {255, 255 ,255 ,255},
},
-- {
-- id = "rf_detector_scenario_weight",
-- type = "track",
-- val = 2,
-- min = 0.0,
-- max = 1.0,
-- step = 0.01,
-- def = 0.10
-- },
-- {
-- id = "hidden_stash_scenario_weight",
-- type = "track",
-- val = 2,
-- min = 0.0,
-- max = 1.0,
-- step = 0.01,
-- def = 0.10
-- },
{
id = "looter_npcs_marked",
type = "check",
val = 1,
def = false
}
},
}
table.insert(op.gr, scenarios)
local ambush = {
id = "ambush",
text = "ui_mcm_soulslike_ambush",
sh = true,
gr = {
{
id = "title",
type = "slide",
link = "ui_options_slider_gameplay_diff",
text = "ui_mcm_soulslike_ambush_title",
size = {512,50},
spacing = 20
},
{
id = "desc_mcm",
type = "desc",
text = "ui_mcm_soulslike_ambush_description",
clr = {255, 255 ,255 ,255},
},
{
id = "mutant_ambush_chance",
type = "track",
val = 2,
min = 0.0,
max = 1.0,
step = 0.01,
def = 0.25
},
{
id = "allow_boar_ambush",
type = "check",
val = 1,
def = true
},
{
id = "allow_flesh_ambush",
type = "check",
val = 1,
def = true
},
{
id = "allow_dogs_ambush",
type = "check",
val = 1,
def = true
},
{
id = "allow_cats_ambush",
type = "check",
val = 1,
def = true
},
{
id = "allow_snorks_ambush",
type = "check",
val = 1,
def = true
},
{
id = "allow_bloodsucker_ambush",
type = "check",
val = 1,
def = true
},
{
id = "allow_burer_ambush",
type = "check",
val = 1,
def = true
},
{
id = "allow_chimera_ambush",
type = "check",
val = 1,
def = true
},
{
id = "allow_controller_ambush",
type = "check",
val = 1,
def = true
},
{
id = "stalker_ambush_chance",
type = "track",
val = 2,
min = 0.0,
max = 1.0,
step = 0.01,
def = 0.25
},
{
id = "allow_stalker_novice_ambush",
type = "check",
val = 1,
def = true
},
{
id = "allow_stalker_advanced_ambush",
type = "check",
val = 1,
def = true
},
{
id = "allow_stalker_veteran_ambush",
type = "check",
val = 1,
def = true
},
{
id = "allow_stalker_sniper_ambush",
type = "check",
val = 1,
def = true
}
},
}
table.insert(op.gr, ambush)
local hardcore = {
id = "hardcore",
text = "ui_mcm_soulslike_hardcore",
sh = true,
gr = {
{
id = "title",
type = "slide",
link = "ui_options_slider_gameplay_diff",
text = "ui_mcm_soulslike_hardcore_title",
size = {512,50},
spacing = 20
},
{
id = "desc_mcm",
type = "desc",
text = "ui_mcm_soulslike_hardcore_save_description",
clr = {255, 255 ,255 ,0},
},
{
id = "is_enabled",
type = "check",
val = 1,
def = false
},
{
id = "override_campfire_hardcore_saves",
type = "check",
val = 1,
def = false
}
},
}
table.insert(op.gr, hardcore)
local debug = {
id = "debug",
text = "ui_mcm_soulslike_debug",
sh = true,
gr = {
{
id = "title",
type = "slide",
link = "ui_options_slider_gameplay_diff",
text = "ui_mcm_soulslike_debug_title",
size = {512,50},
spacing = 20
},
{
id = "is_enabled",
type = "check",
val = 1,
def = false
},
{
id = "enable_tips",
type = "check",
val = 1,
def = false
},
-- {
-- id = "debug_hidden_stashes",
-- type = "check",
-- val = 1,
-- def = false
-- },
{
id = "debug_squad_spawns",
type = "check",
val = 1,
def = false
},
{
id = "debug_item_loss",
type = "check",
val = 1,
def = false
},
{
id = "debug_the_tarkov_looter",
type = "check",
val = 1,
def = false
},
{
id = "debug_the_noloss_scenario",
type = "check",
val = 1,
def = false
},
{
id = "debug_the_default_scenario",
type = "check",
val = 1,
def = false
},
-- {
-- id = "debug_the_rf_scenario",
-- type = "check",
-- val = 1,
-- def = false
-- },
-- {
-- id = "debug_the_hidden_stash_scenario",
-- type = "check",
-- val = 1,
-- def = false
-- },
{
id = "debug_always_spawn_ambush",
type = "check",
val = 1,
def = false
}
},
}
table.insert(op.gr, debug)
return op
end
local function get_config(key, default_when_nil)
local opt = ui_mcm and ui_mcm.get("soulslike/"..key)
if opt == nil then
opt = default_when_nil
end
return opt
end
-- Hardcore
function is_hardcore_save_enabled()
return get_config("hardcore/is_enabled", false)
end
function override_campfire_hardcore_saves()
return get_config("hardcore/override_campfire_hardcore_saves", false)
end
-- Scenarios
function are_looter_npcs_marked()
return get_config("scenarios/looter_npcs_marked", false)
end
function rf_detector_scenario_weight()
return 0.0 --get_config("scenarios/rf_detector_scenario_weight", 0.10)
end
function hidden_stash_scenario_weight()
return 0.0 --get_config("scenarios/hidden_stash_scenario_weight", 0.10)
end
function scattered_stash_scenario_weight()
return 0.0 --get_config("scenarios/scattered_stash_scenario_weight", 0.02)
end
function nearby_dead_stalker_scenario_weight()
return get_config("scenarios/nearby_dead_stalker_scenario_weight", 0.10)
end
-- Items
function get_item_loss_scalar()
return get_config("items/item_loss_scalar", 0.2)
end
function get_item_condition_loss_percent()
return get_config("items/item_condition_loss_scalar", 0.05)
end
function allow_toolkit_loss()
return get_config("items/allow_tool_loss", true)
end
function allow_artifact_loss()
return get_config("items/allow_artifact_loss", true)
end
function allow_headgear_loss()
return get_config("items/allow_headgear_loss", true)
end
function allow_outfit_loss()
return get_config("items/allow_outfit_loss", true)
end
function allow_weapon_loss()
return get_config("items/allow_weapon_loss", true)
end
function get_keep_equipped_items_on_death()
return get_config("items/keep_equipped_items_on_death", false)
end
-- Ambush
function mutant_ambush_chance()
return get_config("ambush/mutant_ambush_chance", 0.5)
end
function stalker_ambush_chance()
return get_config("ambush/stalker_ambush_chance", 0.5)
end
function allow_boar_ambush()
return get_config("ambush/allow_boar_ambush", true)
end
function allow_flesh_ambush()
return get_config("ambush/allow_flesh_ambush", true)
end
function allow_dogs_ambush()
return get_config("ambush/allow_dogs_ambush", true)
end
function allow_cats_ambush()
return get_config("ambush/allow_cats_ambush", true)
end
function allow_snorks_ambush()
return get_config("ambush/allow_snorks_ambush", true)
end
function allow_bloodsucker_ambush()
return get_config("ambush/allow_bloodsucker_ambush", true)
end
function allow_burer_ambush()
return get_config("ambush/allow_burer_ambush", true)
end
function allow_chimera_ambush()
return get_config("ambush/allow_chimera_ambush", true)
end
function allow_controller_ambush()
return get_config("ambush/allow_controller_ambush", true)
end
function allow_stalker_novice_ambush()
return get_config("ambush/allow_stalker_novice_ambush", true)
end
function allow_stalker_advanced_ambush()
return get_config("ambush/allow_stalker_advanced_ambush", true)
end
function allow_stalker_veteran_ambush()
return get_config("ambush/allow_stalker_veteran_ambush", true)
end
function allow_stalker_sniper_ambush()
return get_config("ambush/allow_stalker_sniper_ambush", true)
end
-- Character
function get_health_loss_percent()
return get_config("character/health_loss_on_respawn", 0.75)
end
function rank_loss_percent()
return get_config("character/rank_loss_percent", 0.05)
end
function rep_loss_percent()
return get_config("character/rep_loss_percent", 0.02)
end
-- Debug
function is_debug_enabled()
return get_config("debug/is_enabled", false)
end
function show_debug_tips()
return get_config("debug/enable_tips", false)
end
function debug_hidden_stashes()
return is_debug_enabled() and get_config("debug/debug_hidden_stashes", false)
end
function debug_squad_spawns()
return is_debug_enabled() and get_config("debug/debug_squad_spawns", false)
end
function debug_item_loss()
return is_debug_enabled() and get_config("debug/debug_item_loss", false)
end
function debug_remove_default_scenario()
return is_debug_enabled() and get_config("debug/debug_remove_default_scenario", false)
end
function debug_the_tarkov_looter()
return is_debug_enabled() and get_config("debug/debug_the_tarkov_looter", false)
end
function debug_the_noloss_scenario()
return is_debug_enabled() and get_config("debug/debug_the_noloss_scenario", false)
end
function debug_the_default_scenario()
return is_debug_enabled() and get_config("debug/debug_the_default_scenario", false)
end
function debug_the_rf_scenario()
return false -- is_debug_enabled() and get_config("debug/debug_the_rf_scenario", false)
end
function debug_the_hidden_stash_scenario()
return false -- is_debug_enabled() and get_config("debug/debug_the_hidden_stash_scenario", false)
end
function debug_always_spawn_ambush()
return is_debug_enabled() and get_config("debug/debug_always_spawn_ambush", false)
end
@@ -0,0 +1,183 @@
local function rescuer_initial_msg_factory()
local messages = {
"st_soulslike_rescuer_initial_1",
"st_soulslike_rescuer_initial_2",
"st_soulslike_rescuer_initial_3",
"st_soulslike_rescuer_initial_4",
"st_soulslike_rescuer_initial_5",
}
return game.translate_string(messages[math.random(#messages)])
end
local function rescuer_eat_drink_msg_factory()
local messages = {
"st_soulslike_rescuer_food_1",
"st_soulslike_rescuer_food_2",
"st_soulslike_rescuer_food_3",
"st_soulslike_rescuer_food_4",
"st_soulslike_rescuer_food_5",
}
return game.translate_string(messages[math.random(#messages)])
end
local function rescuer_pda_marker_msg_factory()
local messages = {
"st_soulslike_rescuer_pda_1",
"st_soulslike_rescuer_pda_2",
"st_soulslike_rescuer_pda_3",
"st_soulslike_rescuer_pda_4",
"st_soulslike_rescuer_pda_5",
}
return game.translate_string(messages[math.random(#messages)])
end
local function rescuer_used_items_msg_factory()
local messages = {
"st_soulslike_rescuer_used_items_1",
"st_soulslike_rescuer_used_items_2",
"st_soulslike_rescuer_used_items_3",
"st_soulslike_rescuer_used_items_4",
"st_soulslike_rescuer_used_items_5",
}
return game.translate_string(messages[math.random(#messages)])
end
local function rescuer_stay_safe_msg_factory()
local messages = {
"st_soulslike_rescuer_stay_safe_1",
"st_soulslike_rescuer_stay_safe_2",
"st_soulslike_rescuer_stay_safe_3",
"st_soulslike_rescuer_stay_safe_4",
"st_soulslike_rescuer_stay_safe_5",
}
return game.translate_string(messages[math.random(#messages)])
end
local function rescuer_moster_looter_msg_factory(enemy_name, enemy_comm)
local messages = {
"st_soulslike_rescuer_monster_looter_1",
"st_soulslike_rescuer_monster_looter_2",
"st_soulslike_rescuer_monster_looter_3",
"st_soulslike_rescuer_monster_looter_4",
"st_soulslike_rescuer_monster_looter_5",
}
return game.translate_string(messages[math.random(#messages)])
end
local function rescuer_enemy_looter_msg_factory(enemy_name, enemy_comm)
local messages = {
"st_soulslike_rescuer_enemy_looter_1",
"st_soulslike_rescuer_enemy_looter_2",
"st_soulslike_rescuer_enemy_looter_3",
"st_soulslike_rescuer_enemy_looter_4",
"st_soulslike_rescuer_enemy_looter_5",
}
return strformat(game.translate_string(messages[math.random(#messages)]), enemy_comm, enemy_name)
end
local function rescuer_enemy_looter_tarkov_looter_msg_factory(enemy_name, enemy_comm)
local messages = {
"st_soulslike_rescuer_enemy_tarkov_looter_1",
"st_soulslike_rescuer_enemy_tarkov_looter_2",
"st_soulslike_rescuer_enemy_tarkov_looter_3",
"st_soulslike_rescuer_enemy_tarkov_looter_4",
"st_soulslike_rescuer_enemy_tarkov_looter_5",
}
return strformat(game.translate_string(messages[math.random(#messages)]), enemy_comm, enemy_name)
end
local function rescuer_enemy_radio_freq_msg_factory(freq)
local messages = {
"st_soulslike_rescuer_radio_freq_1",
"st_soulslike_rescuer_radio_freq_2",
"st_soulslike_rescuer_radio_freq_3",
"st_soulslike_rescuer_radio_freq_4",
"st_soulslike_rescuer_radio_freq_5",
}
return strformat(game.translate_string(messages[math.random(#messages)]), freq)
end
local function rescuer_hidden_stash_msg_factory(freq)
local messages = {
"st_soulslike_hidden_stash_1",
"st_soulslike_hidden_stash_2",
"st_soulslike_hidden_stash_3",
"st_soulslike_hidden_stash_4",
"st_soulslike_hidden_stash_5",
}
return strformat(game.translate_string(messages[math.random(#messages)]), freq)
end
local function recuer_indoor_msg_factory(level_name)
local messages = {
"st_soulslike_rescuer_indoor_1",
"st_soulslike_rescuer_indoor_2",
"st_soulslike_rescuer_indoor_3",
"st_soulslike_rescuer_indoor_4",
"st_soulslike_rescuer_indoor_5",
}
return strformat(game.translate_string(messages[math.random(#messages)]), level_name)
end
function create(rescuer, params)
if rescuer then
local msg = params.player_died_indoor
and recuer_indoor_msg_factory(params.level_name)
or rescuer_initial_msg_factory()
local looter = params.enemy
if params.gave_food_or_water then
msg = msg.." "..rescuer_eat_drink_msg_factory()
end
if looter then
if looter.tarkov_experience then
--TODO: Make message factory for this
msg = msg.." "..rescuer_enemy_looter_tarkov_looter_msg_factory(looter.name, looter.community)
else
msg = msg.." "..rescuer_enemy_looter_msg_factory(looter.name, looter.community)
end
end
if params.has_pda_marker then
msg = msg.." "..rescuer_pda_marker_msg_factory()
end
if params.has_stash_pda_marker then
msg = msg.." "..rescuer_hidden_stash_msg_factory()
end
if params.radio_freq then
msg = msg.." "..rescuer_enemy_radio_freq_msg_factory(params.radio_freq)
end
if params.items_were_lost then
if params.looter_type == soulslike.entity_type.Monster then
msg = msg.." "..rescuer_moster_looter_msg_factory()
else
msg = msg.." "..rescuer_used_items_msg_factory()
end
end
msg = msg.." "..rescuer_stay_safe_msg_factory()
return msg
else
local msg = game.translate_string("st_soulslike_rescuer_initial_generic")
if params.gave_food_or_water then
msg = msg.." "..game.translate_string("st_soulslike_rescuer_food_generic")
end
if params.has_pda_marker or params.has_stash_pda_marker or params.has_multi_stash_pda_marker then
msg = msg.." " ..game.translate_string("st_soulslike_rescuer_pda_generic")
end
if params.radio_freq then
msg = msg.." "..game.translate_string(strformat("st_soulslike_rescuer_radio_generic", params.radio_freq))
end
return msg
end
end
@@ -0,0 +1,28 @@
function menu_read(obj) -- return "read" name
local p = obj:parent()
if not (p and p:id() == AC_ID) then return end
return game.translate_string("st_item_read")
end
function func_radio_freq(obj)
local sec = obj:section()
if (not IsItem("letter",sec)) then
return
end
local id = obj:id()
local data = soulslike.get_soulslike_state()
if data.note_message_data and data.note_message_data[id] then
local note_data = data.note_message_data[id]
local freq = note_data.freq;
local level_name = utils_xml.get_special_txt(note_data.level_name)
local msg = strformat(game.translate_string("st_soulslike_rescuers_radio_frequency_note_message"), freq, level_name)
actor_menu.set_msg(2, msg, 10)
hide_hud_inventory()
end
end
@@ -0,0 +1,369 @@
local function compute_fatal_hit_info(hits)
local fatal_hit = nil
local agg_hit = {}
local max_time = -1
soulslike.debug("Calculating fatal hit:")
soulslike.debug(hits)
-- Find the final blow
for _, value in ipairs(hits) do
if value.is_fatal then
fatal_hit = value
break
end
end
for _, value in ipairs(hits) do
max_time = math.max(max_time, value.time)
end
local min_time = soulslike.MAX_HIT_TIME
-- Convert to an aggregation of damage if there is a well defined draftsman_type
for _, hit_data in ipairs(hits) do
hit_data.draftsman = hit_data.draftsman_id and level.object_by_id(hit_data.draftsman_id) or nil
local power_weight = (hit_data.time - min_time) / soulslike.MAX_HIT_TIME
local draftsman_type = soulslike.entity_type.Other
if hit_data.draftsman then
if hit_data.draftsman:id() == AC_ID then
draftsman_type = soulslike.entity_type.Self
elseif IsStalker(hit_data.draftsman) then
draftsman_type = soulslike.entity_type.Stalker
elseif IsMonster(hit_data.draftsman) then
draftsman_type = soulslike.entity_type.Monster
elseif IsAnomaly(hit_data.draftsman) then
draftsman_type = soulslike.entity_type.Anomaly
end
end
if not agg_hit[draftsman_type] then
agg_hit[draftsman_type] = {
draftsman_type = draftsman_type
}
end
local data = agg_hit[draftsman_type]
data.power = (data.power or 0) + hit_data.power * (power_weight * (hit_data.is_fatal and 2 or 1))
end
soulslike.debug("Agg Hit Info:")
soulslike.debug(agg_hit)
local result = nil
for _, value in pairs(agg_hit) do
if not result then
result = value
elseif result.power < value.power then
result = value
end
end
if result then
result.fatal_hit = fatal_hit
end
return result
end
local function find_backpack()
soulslike.debug("Looking for player backpack")
local has_backpack = false
local function find_backpack(_, item)
local sec = item:section()
has_backpack = SYS_GetParam(0, sec, "kind") == "i_backpack"
if has_backpack then return true end
return false
end
db.actor:iterate_inventory(find_backpack)
if has_backpack then
soulslike.debug("Player has a backpack")
else
soulslike.debug("Player does not have a backpack")
end
return has_backpack
end
---------------------------------------------------------
-- Factory
---------------------------------------------------------
function create_by_id(scenario_id, state)
local scenario = nil
soulslike.debug_tip("Creating scenario "..tostring(scenario_id))
if scenario_id == soulslike.SCENARIOS.Default then
scenario = soulslike_scenarios.DefaultSoulslikeScenarioLogic(state)
end
if scenario_id == soulslike.SCENARIOS.RFDetectorStash then
scenario = soulslike_scenarios.RFDetectorSoulslikeScenarioLogic(state)
end
if scenario_id == soulslike.SCENARIOS.HiddenStash then
scenario = soulslike_scenarios.HiddenStashSoulslikeScenarioLogic(state)
end
if scenario_id == soulslike.SCENARIOS.NoLoss then
scenario = soulslike_scenarios.NoLossSoulslikeScenarioLogic(state)
end
if scenario == nil then
soulslike.debug("Unrecognized Scenario Id: "..tostring(scenario_id))
scenario = soulslike_scenarios.DefaultSoulslikeScenarioLogic(state)
end
return scenario
end
function create_new(hits)
local hit = compute_fatal_hit_info(hits)
if hit then
soulslike.debug("Fatal Hit Type: "..tostring(hit.draftsman_type))
end
-- We want to be able to debug each scenario using the
-- scenario weight to max, and in this case we want to
-- be able to remove the default scenario so its always
-- chosen.
local has_backpack = find_backpack()
local player_is_indoor = not level_weathers.valid_levels[level.name()]
local rescuer = nil
local looter = nil
local looter_type = nil
local scenario_loot_scalar = 1.0
local available_scenarios = {}
local game_state = soulslike.get_soulslike_state()
local spawn_position = vector():set(game_state.spawn_location.position.x, game_state.spawn_location.position.y, game_state.spawn_location.position.z)
local distance_from_spawn = spawn_position:distance_to_sqr(db.actor:position())
if soulslike_mcm.debug_the_noloss_scenario() then
soulslike.debug("Debugging noloss scenario.")
rescuer = soulslike.find_closest_friendly_stalker()
scenario_loot_scalar = 0
table.insert(available_scenarios, {id = soulslike.SCENARIOS.NoLoss, min = 0, max = 0, weight = 1.0})
elseif soulslike_mcm.debug_the_default_scenario() then
soulslike.debug("Debugging default scenario.")
rescuer = soulslike.find_closest_friendly_stalker()
looter = soulslike.find_closest_enemy()
scenario_loot_scalar = 1
table.insert(available_scenarios, {id = soulslike.SCENARIOS.Default, min = 0, max = 0, weight = 1.0})
elseif soulslike_mcm.debug_the_rf_scenario() then
soulslike.debug("Debugging rf detector scenario.")
rescuer = soulslike.find_closest_friendly_stalker()
looter = soulslike.find_closest_enemy()
scenario_loot_scalar = 1
table.insert(available_scenarios, {id = soulslike.SCENARIOS.RFDetectorStash, min = 0, max = 0, weight = 1.0})
elseif soulslike_mcm.debug_the_rf_scenario() then
soulslike.debug("Debugging hidden stash scenario.")
rescuer = soulslike.find_closest_friendly_stalker()
looter = soulslike.find_closest_enemy()
scenario_loot_scalar = 1
table.insert(available_scenarios, {id = soulslike.SCENARIOS.HiddenStash, min = 0, max = 0, weight = 1.0})
elseif distance_from_spawn <= 50 then
soulslike.debug("Player was killed "..tostring(distance_from_spawn).." meters their spawn point.")
rescuer = soulslike.find_closest_friendly_stalker()
scenario_loot_scalar = 0
table.insert(available_scenarios, {id = soulslike.SCENARIOS.NoLoss, min = 0, max = 0, weight = 1.0})
elseif distance_from_spawn <= 200 then
soulslike.debug("Player was killed "..tostring(distance_from_spawn).." meters their spawn point.")
rescuer = soulslike.find_closest_friendly_stalker()
looter = soulslike.find_closest_enemy()
scenario_loot_scalar = (distance_from_spawn - 50) / 150
table.insert(available_scenarios, {id = soulslike.SCENARIOS.NoLoss, min = 0, max = 0, weight = 1.0})
table.insert(available_scenarios, {id = soulslike.SCENARIOS.Default, min = 0, max = 0, weight = scenario_loot_scalar})
elseif player_is_indoor then
soulslike.debug("Player died indoor, oof.")
-- TODO: Need to figure out this scenario later, not sure what to do....
-- It will be very difficult to get your gear back, prob annoyingly frustrating...
-- For now, no loss scenario
table.insert(available_scenarios, {id = soulslike.SCENARIOS.NoLoss, min = 0, max = 0, weight = 1.0})
elseif hit and hit.draftsman_type == soulslike.entity_type.Self then
soulslike.debug("Player killed themself. haha idiot.")
rescuer = soulslike.find_closest_friendly_stalker()
looter = soulslike.find_closest_enemy()
scenario_loot_scalar = 0.75
table.insert(available_scenarios, {id = soulslike.SCENARIOS.NoLoss, min = 0, max = 0, weight = 0.05})
if has_backpack then
table.insert(available_scenarios, {id = soulslike.SCENARIOS.Default, min = 0, max = 0, weight = 1.0})
end
-- table.insert(available_scenarios, {id = soulslike.SCENARIOS.RFDetectorStash, min = 0, max = 0, weight = soulslike_mcm.rf_detector_scenario_weight()})
-- table.insert(available_scenarios, {id = soulslike.SCENARIOS.HiddenStash, min = 0, max = 0, weight = soulslike_mcm.hidden_stash_scenario_weight()})
elseif hit and
hit.draftsman_type == soulslike.entity_type.Stalker and
hit.fatal_hit and
hit.fatal_hit.draftsman:general_goodwill(db.actor) >= soulslike.RELATIONS.NEUTRALS then
soulslike.debug("Friendly/Neutral Stalker killed the player.")
rescuer = hit.draftsman
looter = nil
scenario_loot_scalar = 0.0
table.insert(available_scenarios, {id = soulslike.SCENARIOS.NoLoss, min = 0, max = 0, weight = 1.0})
elseif hit and
hit.draftsman_type == soulslike.entity_type.Stalker then
soulslike.debug("Enemy Stalker killed the player.")
rescuer = soulslike.find_closest_friendly_stalker()
looter = soulslike.find_closest_enemy_stalker()
scenario_loot_scalar = 1.0
table.insert(available_scenarios, {id = soulslike.SCENARIOS.NoLoss, min = 0, max = 0, weight = 0.05})
if has_backpack then
table.insert(available_scenarios, {id = soulslike.SCENARIOS.Default, min = 0, max = 0, weight = 1.0})
end
-- table.insert(available_scenarios, {id = soulslike.SCENARIOS.RFDetectorStash, min = 0, max = 0, weight = soulslike_mcm.rf_detector_scenario_weight()})
-- table.insert(available_scenarios, {id = soulslike.SCENARIOS.HiddenStash, min = 0, max = 0, weight = soulslike_mcm.hidden_stash_scenario_weight()})
elseif hit and
hit.draftsman_type == soulslike.entity_type.Monster then
soulslike.debug("Mutant killed the player.")
rescuer = soulslike.find_closest_friendly_stalker()
looter = soulslike.find_closest_enemy_mutant()
scenario_loot_scalar = 1.0
table.insert(available_scenarios, {id = soulslike.SCENARIOS.NoLoss, min = 0, max = 0, weight = 0.05})
if has_backpack then
table.insert(available_scenarios, {id = soulslike.SCENARIOS.Default, min = 0, max = 0, weight = 1.0})
end
-- table.insert(available_scenarios, {id = soulslike.SCENARIOS.RFDetectorStash, min = 0, max = 0, weight = soulslike_mcm.rf_detector_scenario_weight()})
-- table.insert(available_scenarios, {id = soulslike.SCENARIOS.HiddenStash, min = 0, max = 0, weight = soulslike_mcm.hidden_stash_scenario_weight()})
elseif hit and
hit.draftsman_type == soulslike.entity_type.Anomaly then
soulslike.debug("Player died to an anomaly.")
rescuer = soulslike.find_closest_friendly_stalker()
looter = soulslike.find_closest_enemy()
scenario_loot_scalar = 0.25
table.insert(available_scenarios, {id = soulslike.SCENARIOS.NoLoss, min = 0, max = 0, weight = 0.05})
if has_backpack then
table.insert(available_scenarios, {id = soulslike.SCENARIOS.Default, min = 0, max = 0, weight = 1.0})
else
-- table.insert(available_scenarios, {id = soulslike.SCENARIOS.RFDetectorStash, min = 0, max = 0, weight = soulslike_mcm.rf_detector_scenario_weight()})
-- table.insert(available_scenarios, {id = soulslike.SCENARIOS.HiddenStash, min = 0, max = 0, weight = soulslike_mcm.hidden_stash_scenario_weight()})
end
elseif hit and
hit.draftsman_type == soulslike.entity_type.Other then
soulslike.debug("Player died to damage over time of some sort.")
rescuer = soulslike.find_closest_friendly_stalker()
looter = soulslike.find_closest_enemy()
scenario_loot_scalar = 0.25
table.insert(available_scenarios, {id = soulslike.SCENARIOS.NoLoss, min = 0, max = 0, weight = 0.05})
if has_backpack then
table.insert(available_scenarios, {id = soulslike.SCENARIOS.Default, min = 0, max = 0, weight = 1.0})
else
-- table.insert(available_scenarios, {id = soulslike.SCENARIOS.RFDetectorStash, min = 0, max = 0, weight = soulslike_mcm.rf_detector_scenario_weight()})
-- table.insert(available_scenarios, {id = soulslike.SCENARIOS.HiddenStash, min = 0, max = 0, weight = soulslike_mcm.hidden_stash_scenario_weight()})
end
else
soulslike.warn("I have no idea how the player died.")
rescuer = soulslike.find_closest_friendly_stalker()
looter = soulslike.find_closest_enemy()
scenario_loot_scalar = 0.25
table.insert(available_scenarios, {id = soulslike.SCENARIOS.NoLoss, min = 0, max = 0, weight = 0.05})
if has_backpack then
table.insert(available_scenarios, {id = soulslike.SCENARIOS.Default, min = 0, max = 0, weight = 1.0})
else
-- table.insert(available_scenarios, {id = soulslike.SCENARIOS.RFDetectorStash, min = 0, max = 0, weight = soulslike_mcm.rf_detector_scenario_weight()})
-- table.insert(available_scenarios, {id = soulslike.SCENARIOS.HiddenStash, min = 0, max = 0, weight = soulslike_mcm.hidden_stash_scenario_weight()})
end
end
if looter and IsStalker(looter) then
looter_type = soulslike.entity_type.Stalker
elseif looter and IsMonster(looter) then
looter_type = soulslike.entity_type.Monster
end
local is_in_water = load_var(db.actor,"grw_in_water") == true
if is_in_water then
soulslike.debug("Actor died in the water, reducing loot scalar.")
scenario_loot_scalar = scenario_loot_scalar * 0.5
end
if #available_scenarios == 0 then
soulslike.error("No scenario chosen because all scenario weights are at 0 and remove default was enabled.")
return nil
end
local weight_sum = 0
for _, value in pairs(available_scenarios) do
weight_sum = weight_sum + value.weight
end
local min = 0
for _, value in pairs(available_scenarios) do
value.min = min + 1
value.max = math.floor(min + (100 * (value.weight / weight_sum)))
min = value.max
end
local roll = math.random(1, 100)
local scenario_id = nil
for id, value in pairs(available_scenarios) do
if(roll >= value.min and roll <= value.max) then
scenario_id = value.id
break
end
end
if scenario_id == nil then
soulslike.debug("ERROR: Unable to determine scenario from roll: "..tostring(roll))
soulslike.debug(available_scenarios)
scenario_id = soulslike.SCENARIOS.NoLoss
end
local scenario_logic = create_by_id(scenario_id)
local level_name = level.name()
scenario_logic:SetLevelName(game.translate_string(level_name))
scenario_logic:SetLootScalar(scenario_loot_scalar)
scenario_logic:SetIsInDoor(player_is_indoor)
scenario_logic:SetIsInWater(is_in_water)
scenario_logic:SetRescuer(rescuer)
if looter then
scenario_logic:SetLooter(looter)
scenario_logic:SetLooterType(looter_type)
end
if hit and hit.fatal_hit then
scenario_logic:SetKillerType(hit.draftsman_type)
scenario_logic:SetKiller(hit.fatal_hit.draftsman)
scenario_logic:SetFatalHitType(hit.fatal_hit.type)
end
return scenario_logic
end
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,109 @@
local _InitControls = ui_sleep_dialog.UISleep.InitControls
local _InitCallbacks = ui_sleep_dialog.UISleep.InitCallbacks
local _TestAndShow = ui_sleep_dialog.UISleep.TestAndShow
local _OnButtonSleep = ui_sleep_dialog.UISleep.OnButtonSleep
function ui_sleep_dialog.UISleep.OnButtonSleep(self)
if not soulslike.IsSoulslikeMode() then
_OnButtonSleep(self)
return
end
local bleeding = db.actor.bleeding > 0
local radiation = db.actor.radiation > 0
-- Prevent sleep if bleeding and/or iradiated.
if (bleeding or radiation) then
if (bleeding and radiation) then
actor_menu.set_msg(1, game.translate_string("st_sleep_bleeding_irradiated"),5)
elseif (bleeding) then
actor_menu.set_msg(1, game.translate_string("st_sleep_bleeding"),4)
elseif (radiation) then
actor_menu.set_msg(1, game.translate_string("st_sleep_irradiated"),4)
end
disable_info("sleep_active")
if self:IsShown() then
self:HideDialog()
Unregister_UI("UISleep")
end
return
end
-- Check if actor is inside a safe zone
local actor_hide = GetEvent("current_safe_cover") and true or false
-- Check if actor is inside a tent
if (not actor_hide) then
actor_hide = item_tent.get_nearby_tent(1.5)
end
-- If all is no, dont sleep
if (not actor_hide) then
actor_menu.set_msg(1, game.translate_string("st_cant_sleep_find_shelter_mlr"),4)
disable_info("sleep_active")
if self:IsShown() then
self:HideDialog()
Unregister_UI("UISleep")
end
return
end
_OnButtonSleep(self)
end
function ui_sleep_dialog.UISleep.TestAndShow(self, force)
if not soulslike.IsSoulslikeMode() then
_TestAndShow(self, force)
return
end
if force then
_TestAndShow(self, force)
else
-- Detour and show the UI so we can let the user
-- set their spawn point. Move the sleep check code
-- to the Sleep button click instead
self:Initialize()
self:ShowDialog(true)
Register_UI("UISleep","ui_sleep_dialog")
end
end
function ui_sleep_dialog.UISleep.InitControls(self)
_InitControls(self)
if not soulslike.IsSoulslikeMode() then
return
end
local xml = CScriptXmlInit()
xml:ParseFile("soulslike_ui_sleep_dialog.xml")
local function move(ctrl, deltaX, deltaY)
local pos = ctrl:GetWndPos()
ctrl:SetWndPos(vector2():set( pos.x + deltaX ,pos.y + deltaY ))
end
move(self.btn_sleep, 52, 0)
move(self.btn_cancel, 52, 0)
self.btn_set_spawn = xml:Init3tButton("btn_set_spawn", self.back)
self:Register(self.btn_set_spawn, "btn_set_spawn")
if not utils_xml.is_widescreen() then
move(self.btn_set_spawn, 40, 0)
end
end
function ui_sleep_dialog.UISleep.InitCallbacks(self)
_InitCallbacks(self)
if not soulslike.IsSoulslikeMode() then
return
end
self:AddCallback("btn_set_spawn", ui_events.BUTTON_CLICKED, self.OnButtonSetSpawn, self)
end
function ui_sleep_dialog.UISleep:OnButtonSetSpawn()
soulslike.set_spawn(true);
end
@@ -0,0 +1,142 @@
local _Main_Controls = ui_mm_faction_select.UINewGame.Main_Controls
local _Main_CallBacks = ui_mm_faction_select.UINewGame.Main_CallBacks
local _OnStartGame = ui_mm_faction_select.UINewGame.OnStartGame
local _OnCheckSetAzazel = ui_mm_faction_select.UINewGame.OnCheckSetAzazel
function ui_mm_faction_select.UINewGame.Main_Controls(self, rand)
_Main_Controls(self, rand)
local function move(ctrl, deltaX, deltaY)
local pos = ctrl:GetWndPos()
ctrl:SetWndPos(vector2():set( pos.x + deltaX ,pos.y + deltaY ))
end
if efp_utils_mcm then
move(self.ck_azazel_mode_cap, 0, -10)
move(self.ck_azazel_mode, 0, -10)
else
move(self.ck_story_cap, 0, -10)
move(self.ck_story, 0, -10)
move(self.ck_azazel_mode_cap, 0, -15)
move(self.ck_azazel_mode, 0, -15)
move(self.ck_survival_cap, 0, -20)
move(self.ck_survival, 0, -20)
end
local xml = CScriptXmlInit()
xml:ParseFile ("soulslike_ui_mm_gamemode.xml")
self.ck_soulslike_mode_cap = xml:InitStatic("main_dialog:options:cap_check_soulslike_mode",self.templ_options)
self.ck_soulslike_mode = xml:InitCheck("main_dialog:options:check_soulslike_mode", self.templ_options)
self:Register(self.ck_soulslike_mode,"check_soulslike_mode")
if efp_utils_mcm then
move(self.ck_soulslike_mode_cap, 0, 65)
move(self.ck_soulslike_mode, 0, 65)
end
self.ck_states["ck_soulslike_mode"] = false
end
function ui_mm_faction_select.UINewGame.Main_CallBacks(self)
_Main_CallBacks(self)
self:AddCallback("check_soulslike_mode", ui_events.BUTTON_CLICKED, self.OnCheckSetSoulslike, self)
self:AddCallback("check_hardcore", ui_events.BUTTON_CLICKED, self.OnCheckHardcore, self)
end
function ui_mm_faction_select.UINewGame.OnStartGame(self)
if (not self.access) then
return
end
local character_name = self.character_name:GetText()
if axr_main and axr_main.config and character_name and character_name ~= "" then
local is_soulslike_mode = self.ck_soulslike_mode and self.ck_soulslike_mode:GetCheck() and true or nil
printf('[Soulslike] OnStartGame:is_soulslike_mode='..tostring(is_soulslike_mode))
axr_main.config:w_value("character_creation", "new_game_soulslike_mode", is_soulslike_mode)
axr_main.config:save()
end
_OnStartGame(self)
end
function ui_mm_faction_select.UINewGame.OnCheckSetAzazel(self)
_OnCheckSetAzazel(self)
if (not self.access) then
return
end
self.ck_soulslike_mode:SetCheck(false)
self.ck_states["ck_soulslike_mode"] = false
end
function ui_mm_faction_select.UINewGame:OnCheckHardcore()
if (not self.access) then
return
end
self.ck_soulslike_mode:SetCheck(false)
self.ck_states["ck_soulslike_mode"] = false
end
function ui_mm_faction_select.UINewGame:OnCheckSetSoulslike()
if (not self.access) then
return
end
self.ck_azazel_mode:SetCheck(false)
self.ck_states["ck_azazel_mode"] = false
self.ck_hardcore:SetCheck(false)
self.ck_states["ck_hardcore"] = false
self:LoadMap()
end
local function on_game_load(binder)
local config = axr_main.config
if not (config) then
printf('[Soulslike] on_game_load:no config')
return
end
local need_save
-- Gameplay Options
if (USE_MARSHAL) then
if (config:r_value("character_creation","new_game_soulslike_mode", 1) == true) then
printf('[Soulslike] on_game_load:enable_soulslike_mode=true')
alife_storage_manager.get_state().enable_soulslike_mode = true
config:w_value("character_creation","new_game_soulslike_mode")
need_save = true
end
end
if (need_save) then
config:save()
end
end
local function actor_on_first_update()
if not soulslike.IsSoulslikeMode() then
return
end
local state = alife_storage_manager.get_state()
if not state.soulslike_mode_initial_spawn_set and level.name() ~= 'fake_start' then
printf('Initial spawn point set to '..level.name())
soulslike.set_spawn(false)
state.soulslike_mode_initial_spawn_set = true
end
end
function on_game_start()
RegisterScriptCallback("on_game_load",on_game_load)
RegisterScriptCallback("actor_on_first_update", actor_on_first_update)
end
+28
View File
@@ -0,0 +1,28 @@
[General]
gameName=stalkeranomaly
modid=0
version=d2024.12.8.0
newestVersion=
category="-1,"
nexusFileStatus=1
installationFile=Jabbers_Soulslike_0.30-beta.zip
repository=Nexus
ignoredVersion=
comments=
notes=
nexusDescription=
url=
hasCustomURL=true
lastNexusQuery=
lastNexusUpdate=
nexusLastModified=2024-12-08T22:09:08Z
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