Added, Updated and Removed Mods; Updated Readme
This commit is contained in:
@@ -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="97" y="223.4" 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,955 @@
|
||||
|
||||
--[[
|
||||
Jabbers
|
||||
05APR2023
|
||||
Jabbers' Soulslike Anomaly Mod
|
||||
--]]
|
||||
|
||||
local version = "0.28-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.")
|
||||
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
|
||||
|
||||
function on_game_start()
|
||||
debug('Version: '..version)
|
||||
|
||||
RegisterScriptCallback("actor_on_stash_remove", actor_on_stash_remove)
|
||||
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 get_config("scenarios/rf_detector_scenario_weight", 0.10)
|
||||
end
|
||||
|
||||
function hidden_stash_scenario_weight()
|
||||
return get_config("scenarios/hidden_stash_scenario_weight", 0.10)
|
||||
end
|
||||
|
||||
function scattered_stash_scenario_weight()
|
||||
return 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 is_debug_enabled() and get_config("debug/debug_the_rf_scenario", false)
|
||||
end
|
||||
|
||||
function debug_the_hidden_stash_scenario()
|
||||
return 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
|
||||
+369
@@ -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
|
||||
+142
@@ -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
|
||||
@@ -0,0 +1,28 @@
|
||||
[General]
|
||||
gameName=stalkeranomaly
|
||||
modid=0
|
||||
version=d2024.3.31.0
|
||||
newestVersion=
|
||||
category="-1,"
|
||||
nexusFileStatus=1
|
||||
installationFile=Jabbers_Soulslike_0.28-beta.zip
|
||||
repository=Nexus
|
||||
ignoredVersion=
|
||||
comments=
|
||||
notes=
|
||||
nexusDescription=
|
||||
url=
|
||||
hasCustomURL=true
|
||||
lastNexusQuery=
|
||||
lastNexusUpdate=
|
||||
nexusLastModified=2024-03-31T04:58:38Z
|
||||
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
|
||||
Reference in New Issue
Block a user