Added New Mods and Profiles Folders

This is a complete rebuild of the modpack, with all new mods and updates for 1.5.3 of Anomaly.
This commit is contained in:
2025-01-14 05:07:53 -05:00
parent 85c665b107
commit 376b4b9689
21217 changed files with 546254 additions and 0 deletions
@@ -0,0 +1,36 @@
![supplies_1]
prop_bed_1 = 1, 1
prop_cans_tuna = 1, 1
prop_counter_1 = 1, 1
prop_table_2 = 1, 1
prop_bong = 1, 1
prop_chair = 1, 1
prop_dish1 = 1, 1
prop_dish2 = 1, 1
prop_mug = 1, 1
prop_shelf_1 = 1, 1
prop_lamp2 = 1, 1
prop_lamp1 = 1, 1
![supplies_2]
prop_bed_2 = 1, 1
prop_board_map = 1, 1
prop_couch_1 = 1, 1
prop_table_1 = 1, 1
prop_fan = 1, 1
prop_stove1 = 1, 1
prop_shelf_2 = 1, 1
prop_stove2 = 1, 1
prop_fridge = 1, 1
prop_ammo_box = 1, 1
prop_med_case_1 = 1, 1
![supplies_3]
prop_bed_3 = 1, 1
prop_tv = 1, 1
![supplies_4]
prop_laptop_item = 1, 1
prop_clock_1 = 1, 1
![supplies_5]
@@ -0,0 +1,36 @@
![supplies_1]
prop_bed_1 = 1, 1
prop_cans_tuna = 1, 1
prop_counter_1 = 1, 1
prop_table_2 = 1, 1
prop_bong = 1, 1
prop_chair = 1, 1
prop_dish1 = 1, 1
prop_dish2 = 1, 1
prop_mug = 1, 1
prop_shelf_1 = 1, 1
prop_lamp2 = 1, 1
prop_lamp1 = 1, 1
![supplies_2]
prop_bed_2 = 1, 1
prop_board_map = 1, 1
prop_couch_1 = 1, 1
prop_table_1 = 1, 1
prop_fan = 1, 1
prop_stove1 = 1, 1
prop_shelf_2 = 1, 1
prop_stove2 = 1, 1
prop_fridge = 1, 1
prop_ammo_box = 1, 1
prop_med_case_1 = 1, 1
![supplies_3]
prop_bed_3 = 1, 1
prop_tv = 1, 1
![supplies_4]
prop_laptop_item = 1, 1
prop_clock_1 = 1, 1
![supplies_5]
@@ -0,0 +1,17 @@
![supplies_1]
prop_fan = 1, 1
![supplies_2]
prop_mice_pad = 1, 1
prop_keyboard = 1, 1
![supplies_3]
prop_tv = 1, 1
prop_monitor = 1, 1
prop_pccase = 1, 1
prop_fridge = 1, 1
![supplies_4]
![supplies_5]
@@ -0,0 +1,36 @@
![supplies_1]
prop_bed_1 = 1, 1
prop_cans_tuna = 1, 1
prop_counter_1 = 1, 1
prop_table_2 = 1, 1
prop_bong = 1, 1
prop_chair = 1, 1
prop_dish1 = 1, 1
prop_dish2 = 1, 1
prop_mug = 1, 1
prop_shelf_1 = 1, 1
prop_lamp2 = 1, 1
prop_lamp1 = 1, 1
![supplies_2]
prop_bed_2 = 1, 1
prop_board_map = 1, 1
prop_couch_1 = 1, 1
prop_table_1 = 1, 1
prop_fan = 1, 1
prop_stove1 = 1, 1
prop_shelf_2 = 1, 1
prop_stove2 = 1, 1
prop_fridge = 1, 1
prop_ammo_box = 1, 1
prop_med_case_1 = 1, 1
![supplies_3]
prop_bed_3 = 1, 1
prop_tv = 1, 1
![supplies_4]
prop_laptop_item = 1, 1
prop_clock_1 = 1, 1
![supplies_5]
@@ -0,0 +1,36 @@
![supplies_1]
prop_bed_1 = 1, 1
prop_cans_tuna = 1, 1
prop_counter_1 = 1, 1
prop_table_2 = 1, 1
prop_bong = 1, 1
prop_chair = 1, 1
prop_dish1 = 1, 1
prop_dish2 = 1, 1
prop_mug = 1, 1
prop_shelf_1 = 1, 1
prop_lamp2 = 1, 1
prop_lamp1 = 1, 1
![supplies_2]
prop_bed_2 = 1, 1
prop_board_map = 1, 1
prop_couch_1 = 1, 1
prop_table_1 = 1, 1
prop_fan = 1, 1
prop_stove1 = 1, 1
prop_shelf_2 = 1, 1
prop_stove2 = 1, 1
prop_fridge = 1, 1
prop_ammo_box = 1, 1
prop_med_case_1 = 1, 1
![supplies_3]
prop_bed_3 = 1, 1
prop_tv = 1, 1
![supplies_4]
prop_laptop_item = 1, 1
prop_clock_1 = 1, 1
![supplies_5]
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,38 @@
;;===========================================================
;;=========================| Rotten meat |========================
;;===========================================================
;======================================================
[rotten_meat]:tch_junk
visual = dynamics\zpf\meat_tushkano.ogf
inv_name = st_rotten_meat
inv_name_short = st_rotten_meat
description = st_rotten_meat_cooked_descr
inv_weight = 0.034
icons_texture = ui\ui_rottenmeat
inv_grid_width = 2
inv_grid_height = 2
inv_grid_x = 0
inv_grid_y = 0
can_trade = false
cost = 0
;[dog_cooked_rotten]:rotten_meat
;[pseudodog_cooked_rotten]:rotten_meat
;[flesh_cooked_rotten]:rotten_meat
;[boar_cooked_rotten]:rotten_meat
;[bloodsucker_cooked_rotten]:rotten_meat
;[snork_cooked_rotten]:rotten_meat
;[chimera_cooked_rotten]:rotten_meat
;[lurker_cooked_rotten]:rotten_meat
;[psysucker_cooked_rotten]:rotten_meat
;[flesh_rotten]:rotten_meat
;[boar_rotten]:rotten_meat
;[dog_rotten]:rotten_meat
;[psevdodog_rotten]:rotten_meat
;[krovosos_rotten]:rotten_meat
;[psysucker_rotten]:rotten_meat
;[snork_rotten]:rotten_meat
;[chimera_rotten]:rotten_meat
;[lurker_rotten]:rotten_meat
;[tushkano_rotten]:rotten_meat
@@ -0,0 +1,41 @@
[meats]
meat_tushkano
meat_tushkano_b
meat_tushkano_a
meat_dog
meat_dog_b
meat_dog_a
meat_pseudodog
meat_pseudodog_b
meat_pseudodog_a
meat_flesh
meat_flesh_b
meat_flesh_a
meat_boar
meat_boar_b
meat_boar_a
meat_bloodsucker
meat_bloodsucker_b
meat_bloodsucker_a
meat_snork
meat_snork_b
meat_snork_a
meat_chimera
meat_chimera_b
meat_chimera_a
meat_lurker
meat_lurker_b
meat_lurker_a
meat_psysucker
meat_psysucker_b
meat_psysucker_a
mutant_part_flesh_meat
mutant_part_boar_chop
mutant_part_dog_meat
mutant_part_psevdodog_meat
mutant_part_krovosos_meat
mutant_part_psysucker_meat
mutant_part_snork_hand
mutant_part_chimera_meat
mutant_part_lurker_meat
mutant_part_tushkano_meat
@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="windows-1251"?>
<string_table>
<string id="st_rotten_meat">
<text>Rotten meat</text>
</string>
<string id="st_rotten_meat_raw_descr">
<text>Zone produced raw meat, which was not cooked in time. After two days have passed, this lump of stinky meat is beyond saving. Not even dogs would eat it anymore. Best course of action is to get rid of it as soon as possible, because the smell might attract some creatures, which might be not so picky...</text>
</string>
<string id="st_rotten_meat_cooked_descr">
<text>Zone produced meal, which was not consumed in time. After five days have passed, this bowl of stinky remains of food is beyond saving. What a terrible loss, indeed. Best course of action is to get rid of it as soon as possible, because the smell might attract some creatures, which might be not so picky...</text>
</string>
<string id="st_rotten_meat_snork_descr">
<text>A rotten hand of a snork, which was not cooked in time. It saw better times definitely. Since you have no more use of it, the best course of action is to throw it as far away as possible, so it won't be able to crawl back for sure...</text>
</string>
<string id="ui_mcm_menu_meat_spoiling">
<text>Rotten Meat</text>
</string>
<string id="ui_mcm_meat_spoiling_expiration_hours_cooked">
<text>Cooked meat hours to rot</text>
</string>
<string id="ui_mcm_meat_spoiling_expiration_hours_raw">
<text>Raw meat hours to rot</text>
</string>
</string_table>
@@ -0,0 +1,428 @@
<?xml version="1.0" encoding="windows-1251"?>
<string_table>
<string id="st_use_stove">
<text>Use Stove</text>
</string>
<string id="st_prop_laptop_item">
<text>Laptop</text>
</string>
<string id="st_prop_laptop_item_descr">
<text>
A very sofisticated and modern laptop. Quite surprising in the Zone. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_green] • %c[ui_gray_2] furniture item\n
</text>
</string>
<string id="st_prop_bed_1">
<text>Rollable bed</text>
</string>
<string id="st_prop_bed_1_descr">
<text>
A simple mattress and a blanket, lightweight and portable. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_green] • %c[ui_gray_2] furniture item\n
%c[d_orange] • %c[ui_gray_2] usable for sleep\n
</text>
</string>
<string id="st_prop_bed_2">
<text>Metal bed</text>
</string>
<string id="st_prop_bed_2_descr">
<text>
An old rusty metal bed, with a basic mattress and a blanket. Better than sleeping on the ground. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_green] • %c[ui_gray_2] furniture item\n
%c[d_orange] • %c[ui_gray_2] usable for sleep\n
</text>
</string>
<string id="st_prop_bed_3">
<text>Wooden bed</text>
</string>
<string id="st_prop_bed_3_descr">
<text>
A sturdy wooden bed. The mattress is soft and comfortable. Comes with a double set of blankets to keep you warm during cold nights. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_green] • %c[ui_gray_2] furniture item\n
%c[d_orange] • %c[ui_gray_2] usable for sleep\n
</text>
</string>
<string id="st_prop_board_map">
<text>Zone map</text>
</string>
<string id="st_prop_board_map_descr">
<text>
Topographic map of the Zone. Plan out your next excursion. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_green] • %c[ui_gray_2] furniture item\n
</text>
</string>
<string id="st_prop_cans_tuna">
<text>Canned food crate</text>
</string>
<string id="st_prop_cans_tuna_descr">
<text>
A wooden crate commonly used by the merchants to display their vares. Only suitable for canned food. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] item storage\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_blue] • %c[ui_gray_2] high capacity\n
%c[d_blue] • %c[d_red] can only store canned food %c[ui_gray_2] \n
%c[0,100,255,150] • %c[ui_gray_2] usable as stash\n
</text>
</string>
<string id="st_prop_couch_1">
<text>Old sofa</text>
</string>
<string id="st_prop_couch_1_descr">
<text>
An old sofa. In a surprisingly good shape and free of radioactive particles. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_green] • %c[ui_gray_2] furniture item\n
</text>
</string>
<string id="st_prop_counter_1">
<text>Wooden counter</text>
</string>
<string id="st_prop_counter_1_descr">
<text>
A simple old wooden counter that survived the Zone's harsh enviroment, still in good shape. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_green] • %c[ui_gray_2] furniture item\n
</text>
</string>
<string id="st_prop_poster_vertical_item">
<text>Poster (Vertical)</text>
</string>
<string id="st_prop_poster_vertical_item_descr">
<text>
Simple piece of waxed paper with an image on it. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_green] • %c[ui_gray_2] furniture item\n
</text>
</string>
<string id="st_prop_table_1">
<text>Wooden desk</text>
</string>
<string id="st_prop_table_1_descr">
<text>
A sturdy wooden desk, still in good shape. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_green] • %c[ui_gray_2] furniture item\n
</text>
</string>
<string id="st_prop_table_2">
<text>Wooden table</text>
</string>
<string id="st_prop_table_2_descr">
<text>
An average wooden table, realiable and sturdy. \n \n
%%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_green] • %c[ui_gray_2] furniture item\n
</text>
</string>
<string id="st_prop_bong">
<text>Hookah</text>
</string>
<string id="st_prop_bong_descr">
<text>
A hookah also known as a waterpipe or arghile, is a single or multi-stemmed instrument for smoking Shisha Tobacco in which the smoke is cooled by water held in the base. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_green] • %c[ui_gray_2] furniture item\n
</text>
</string>
<string id="st_prop_case">
<text>PC case</text>
</string>
<string id="st_prop_case_descr">
<text>
An old PC case, non functional, perhaps repairable. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_green] • %c[ui_gray_2] furniture item\n
</text>
</string>
<string id="st_prop_chair_descr">
<text>Wooden chair</text>
</string>
<string id="st_prop_chair_descr">
<text>
Simple and sturdy wooden chair, has a soft seat. Comfortable enough. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_green] • %c[ui_gray_2] furniture item\n
</text>
</string>
<string id="st_prop_dish1">
<text>Ceramic plate</text>
</string>
<string id="st_prop_dish1_descr">
<text>
Ceramic plate of non-combat variety. Will serve you well on your mutant eating adventures. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_green] • %c[ui_gray_2] furniture item\n
</text>
</string>
<string id="st_prop_dish2">
<text>Ceramic bowl</text>
</string>
<string id="st_prop_dish2_descr">
<text>
Ceramic bowl, will serve you well on your mutant eating adventures. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_green] • %c[ui_gray_2] furniture item\n
</text>
</string>
<string id="st_prop_fan">
<text>Small fan</text>
</string>
<string id="st_prop_fan_descr">
<text>
Small fan, functional. Useful for those rare sunny days in the zone. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_green] • %c[ui_gray_2] furniture item\n
%c[d_orange] • %c[ui_gray_2] produces cool breeze when turned on\n
</text>
</string>
<string id="st_prop_fridge">
<text>Old fridge</text>
</string>
<string id="st_prop_fridge_descr">
<text>
Big and heavy fridge. Helps preserve mutant meat. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] item storage\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_blue] • %c[ui_gray_2] high capacity\n
%c[d_orange] • %c[ui_gray_2] mutant meat doesn't rot while in the fridge %c[ui_gray_2] \n
%c[0,100,255,150] • %c[ui_gray_2] usable as stash\n
</text>
</string>
<string id="st_prop_keyboard">
<text>Keyboard</text>
</string>
<string id="st_prop_keyboard_descr">
<text>
An old keyboard. Has a faint yellow tint due to the passage of time. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_green] • %c[ui_gray_2] furniture item\n
</text>
</string>
<string id="st_prop_mice">
<text>Mouse</text>
</string>
<string id="st_prop_mice_descr">
<text>
Basic, old PC mouse. Uncomfortable, sluggish and heavy. Welcome back to late 90s. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_green] • %c[ui_gray_2] furniture item\n
</text>
</string>
<string id="st_prop_mice_pad">
<text>Mouse and mouse pad</text>
</string>
<string id="st_prop_mice_pad_descr">
<text>
Basic, old PC mouse. Uncomfortable, sluggish and heavy. Comes with a bunch of fabrics sewn together to give the mouse a slightly better surface. Might not be as effective as it is marketed. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_green] • %c[ui_gray_2] furniture item\n
</text>
</string>
<string id="st_prop_monitor">
<text>Monitor</text>
</string>
<string id="st_prop_monitor_descr">
<text>
An old monitor, the screen seems to be intact, could potentially work. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_green] • %c[ui_gray_2] furniture item\n
</text>
</string>
<string id="st_prop_mug">
<text>Mug</text>
</string>
<string id="st_prop_mug_descr">
<text>
A basic mug of unknown origin. While clean enough, it might give your beverages a peculiar flavor. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_green] • %c[ui_gray_2] furniture item\n
</text>
</string>
<string id="st_prop_stove1">
<text>Small stove</text>
</string>
<string id="st_prop_stove1_descr">
<text>
A small stove, functional. Was refitted by stalkers to work with all fuels. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] technological item\n
%c[d_blue] • %c[ui_gray_2] valuable\n
%c[d_orange] • %c[ui_gray_2] usable for cooking\n
</text>
</string>
<string id="st_prop_stove2">
<text>Large stove</text>
</string>
<string id="st_prop_stove2_descr">
<text>
Large stove, functional. Was refitted by stalkers to work with all fuels. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] technological item\n
%c[d_blue] • %c[ui_gray_2] valuable\n
%c[d_blue] • %c[ui_gray_2] high capacity (integrated)\n
%c[d_orange] • %c[ui_gray_2] usable for cooking\n
</text>
</string>
<string id="st_prop_tv">
<text>TV</text>
</string>
<string id="st_prop_tv_descr">
<text>
An old TV that tunes in to the same single channel available in the Zone. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_green] • %c[ui_gray_2] furniture item\n
</text>
</string>
<string id="st_prop_shelf_1">
<text>Wooden shelf</text>
</string>
<string id="st_prop_shelf_1_descr">
<text>
Simple shelf, made out of wood. Common in the zone. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_green] • %c[ui_gray_2] furniture item\n
</text>
</string>
<string id="st_prop_shelf_2">
<text>Large wooden shelf</text>
</string>
<string id="st_prop_shelf_2_descr">
<text>
Sturdy wooden shelf, well preserved. Good way to organize your wares. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_green] • %c[ui_gray_2] furniture item\n
</text>
</string>
<string id="st_prop_prop_clock_1">
<text>Digital clock</text>
</string>
<string id="st_prop_prop_clock_1_descr">
<text>
Brand new digital clock. A rare sight in the zone.\n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] technological item\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_orange] • %c[ui_gray_2] shows time\n
</text>
</string>
<string id="st_prop_med_case_1">
<text>Medical case</text>
</string>
<string id="st_prop_med_case_1_descr">
<text>
Sturdy plastic made case, with cushioning on the inside. Intended to store medical items. \n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] item storage\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_blue] • %c[ui_gray_2] high capacity\n
%c[d_orange] • %c[d_red] can only store medical items %c[ui_gray_2] \n
%c[0,100,255,150] • %c[ui_gray_2] usable as stash\n
</text>
</string>
<string id="st_prop_lamp1">
<text>Small desk lamp</text>
</string>
<string id="st_prop_lamp1_descr">
<text>
Brightens your nights. \n \n
%c[ui_gray_3]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] technological item\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_blue] • %c[ui_gray_2] low electric power consumption\n
%c[d_blue] • %c[ui_gray_2] fuel: batteries\n
</text>
</string>
<string id="st_prop_lamp2">
<text>Large desk lamp</text>
</string>
<string id="st_prop_lamp2_descr">
<text>
Brightens your nights. \n \n
%c[ui_gray_3]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] technological item\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_blue] • %c[ui_gray_2] low electric power consumption\n
%c[d_blue] • %c[ui_gray_2] fuel: batteries\n
</text>
</string>
<string id="st_placeable_ammo_box">
<text>Ammo Box</text>
</string>
<string id="st_placeable_ammo_box_descr">
<text>A spacious wooden box used for storing ammo by the military. It provides a lot of space for ammo, but not suitable for anything else.\n \n
%c[ui_gray_1]PROPERTIES:\n
%c[d_blue] • %c[ui_gray_2] item storage\n
%c[d_blue] • %c[ui_gray_2] placeable item\n
%c[d_blue] • %c[ui_gray_2] high capacity\n
%c[d_orange] • %c[d_red] can only store ammo %c[ui_gray_2] \n
%c[0,100,255,150] • %c[ui_gray_2] usable as stash\n
</text>
</string>
</string_table>
@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="windows-1251"?>
<string_table>
<string id="st_rotten_meat">
<text>Гнилое мясо</text>
</string>
<string id="st_rotten_meat_raw_descr">
<text>Произведенное в Зоне сырое мясо, которое не было вовремя приготовлено. По прошествии двух дней этот кусок вонючего мяса уже не спасти. Его не скормить даже собакам. Лучше всего избавиться от него как можно скорее, потому что запах может привлечь некоторых существ, которые могут оказаться не такими привередливыми...</text>
</string>
<string id="st_rotten_meat_cooked_descr">
<text>Приготовленная из сырого мяса еда, которая не была съедена вовремя. По прошествии пяти дней эту миску с вонючими остатками еды уже не спасти. Какая ужасная потеря... Лучше всего избавиться от нее как можно скорее, потому что запах может привлечь некоторых существ, которые могут оказаться не такими привередливыми...</text>
</string>
<string id="st_rotten_meat_snork_descr">
<text>Гнилая рука снорка, которую вовремя не приготовили. Это "блюдо" определенно видало и лучшие времена. Поскольку оно вам больше не нужно, то лучше всего выбросить его как можно дальше, чтобы оно не смогло приползти обратно...</text>
</string>
<string id="ui_mcm_menu_meat_spoiling">
<text>Гнилое мясо</text>
</string>
<string id="ui_mcm_meat_spoiling_expiration_hours_cooked">
<text>Время до гниения приготовленного мяса</text>
</string>
<string id="ui_mcm_meat_spoiling_expiration_hours_raw">
<text>Время до гниения сырого мяса</text>
</string>
</string_table>
@@ -0,0 +1,426 @@
<?xml version="1.0" encoding="windows-1251"?>
<string_table>
<string id="st_use_stove">
<text>Èñïîëüçîâàòü ïëèòó</text>
</string>
<string id="st_prop_laptop_item">
<text>Íîóòáóê</text>
</string>
<string id="st_prop_laptop_item_descr">
<text>
Î÷åíü ñëîæíûé è ñîâðåìåííûé íîóòáóê. Äîâîëüíî óäèâèòåëüíî âèäåòü òàêîå â Çîíå. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_green] • %c[ui_gray_2] ìåáåëü\n
</text>
</string>
<string id="st_prop_bed_1">
<text>Ðàñêëàäûâàþùàÿñÿ êðîâàòü</text>
</string>
<string id="st_prop_bed_1_descr">
<text>
Ïðîñòîé ìàòðàñ è îäåÿëî, ëåãêèå è ïîðòàòèâíûå. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_green] • %c[ui_gray_2] ìåáåëü\n
%c[d_orange] • %c[ui_gray_2] ïðèãîäíà äëÿ ñíà\n
</text>
</string>
<string id="st_prop_bed_2">
<text>Ìåòàëëè÷åñêàÿ êðîâàòü</text>
</string>
<string id="st_prop_bed_2_descr">
<text>
Ñòàðàÿ ðæàâàÿ ìåòàëëè÷åñêàÿ êðîâàòü ñ ïðîñòûì ìàòðàñîì è îäåÿëîì. Ýòî ëó÷øå, ÷åì ñïàòü íà çåìëå. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_green] • %c[ui_gray_2] ìåáåëü\n
%c[d_orange] • %c[ui_gray_2] ïðèãîäíà äëÿ ñíà\n
</text>
</string>
<string id="st_prop_bed_3">
<text>Äåðåâÿííàÿ êðîâàòü</text>
</string>
<string id="st_prop_bed_3_descr">
<text>
Ïðî÷íàÿ äåðåâÿííàÿ êðîâàòü. Ìàòðàñ ìÿãêèé è óäîáíûé.  êîìïëåêò âõîäèò äâîéíîé êîìïëåêò îäåÿë, êîòîðûå ñîãðåþò âàñ õîëîäíûìè íî÷àìè. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_green] • %c[ui_gray_2] ìåáåëü\n
%c[d_orange] • %c[ui_gray_2] ïðèãîäíà äëÿ ñíà\n
</text>
</string>
<string id="st_prop_board_map">
<text>Êàðòà Çîíû</text>
</string>
<string id="st_prop_board_map_descr">
<text>
Òîïîãðàôè÷åñêàÿ êàðòà çîíû. Ñïëàíèðóéòå ñâîþ ñëåäóþùóþ âûëàçêó. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_green] • %c[ui_gray_2] ìåáåëü\n
</text>
</string>
<string id="st_prop_cans_tuna">
<text>ßùèê äëÿ êîíñåðâîâ</text>
</string>
<string id="st_prop_cans_tuna_descr">
<text>
Äåðåâÿííûé ÿùèê, îáû÷íî èñïîëüçóåìûé òîðãîâöàìè äëÿ äåìîíñòðàöèè ñâîèõ òîâàðîâ. Ïîäõîäèò òîëüêî äëÿ êîíñåðâîâ. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] õðàíèëèùå\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_blue] • %c[ui_gray_2] áîëüøàÿ âìåñòèìîñòü\n
%c[d_blue] • %c[d_red] ìîæåò õðàíèòü òîëüêî êîíñåðâû %c[ui_gray_2] \n
%c[0,100,255,150] • %c[ui_gray_2] ìîæåò áûòü èñïîëüçîâàíî êàê òàéíèê\n
</text>
</string>
<string id="st_prop_couch_1">
<text>Ñòàðûé äèâàí</text>
</string>
<string id="st_prop_couch_1_descr">
<text>
Ñòàðûé äèâàí. Â óäèâèòåëüíî õîðîøåì ñîñòîÿíèè è äàæå íå ðàäèîàêòèâíûé. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_green] • %c[ui_gray_2] ìåáåëü\n
</text>
</string>
<string id="st_prop_counter_1">
<text>Äåðåâÿííàÿ ñòîéêà</text>
</string>
<string id="st_prop_counter_1_descr">
<text>
Ïðîñòàÿ ñòàðàÿ äåðåâÿííàÿ ñòîéêà, êîòîðàÿ ïåðåæèëà ñóðîâûå óñëîâèÿ Çîíû è âñå åùå íàõîäèòñÿ â õîðîøåì ñîñòîÿíèè. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_green] • %c[ui_gray_2] ìåáåëü\n
</text>
</string>
<string id="st_prop_poster_vertical_item">
<text>Ïëàêàò (âåðòèêàëüíûé)</text>
</string>
<string id="st_prop_poster_vertical_item_descr">
<text>
Ïðîñòîé ëèñòîê âîùåíîé áóìàãè ñ íàíåñåííûì íà íåãî èçîáðàæåíèåì. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_green] • %c[ui_gray_2] ìåáåëü\n
</text>
</string>
<string id="st_prop_table_1">
<text>Äåðåâÿííûé îôèñíûé ñòîë</text>
</string>
<string id="st_prop_table_1_descr">
<text>
Êðåïêèé äåðåâÿííûé ñòîë, âñå åùå â õîðîøåì ñîñòîÿíèè. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_green] • %c[ui_gray_2] ìåáåëü\n
</text>
</string>
<string id="st_prop_table_2">
<text>Äåðåâÿííûé ñòîë</text>
</string>
<string id="st_prop_table_2_descr">
<text>
Îáû÷íûé äåðåâÿííûé ñòîë, íàäåæíûé è ïðî÷íûé. \n \n
%%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_green] • %c[ui_gray_2] ìåáåëü\n
</text>
</string>
<string id="st_prop_bong">
<text>Êàëüÿí</text>
</string>
<string id="st_prop_bong_descr">
<text>
Êàëüÿí, òàêæå èçâåñòíûé êàê âîäÿíàÿ òðóáêà èëè íàðãèëå, ïðåäñòàâëÿåò ñîáîé èíñòðóìåíò ñ îäíîé èëè íåñêîëüêèìè íîæêàìè äëÿ êóðåíèÿ òàáàêà äëÿ êàëüÿíà, â êîòîðîì äûì îõëàæäàåòñÿ âîäîé, óäåðæèâàåìîé â îñíîâàíèè. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_green] • %c[ui_gray_2] ìåáåëü\n
</text>
</string>
<string id="st_prop_case">
<text>Ñèñòåìíûé áëîê</text>
</string>
<string id="st_prop_case_descr">
<text>
Ñòàðûé êîðïóñ ÏÊ, ñëîìàí, âîçìîæíî, ïîääàþùèéñÿ ðåìîíòó. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_green] • %c[ui_gray_2] ìåáåëü\n
</text>
</string>
<string id="st_prop_chair_descr">
<text>Äåðåâÿííûé ñòóë</text>
</string>
<string id="st_prop_chair_descr">
<text>
Ïðîñòîé è ïðî÷íûé äåðåâÿííûé ñòóë ñ ìÿãêèì ñèäåíüåì. Äîñòàòî÷íî óäîáíûé. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_green] • %c[ui_gray_2] ìåáåëü\n
</text>
</string>
<string id="st_prop_dish1">
<text>Êåðàìè÷åñêàÿ òàðåëêà</text>
</string>
<string id="st_prop_dish1_descr">
<text>
Êåðàìè÷åñêàÿ òàðåëêà íåáîåâîé ðàçíîâèäíîñòè. Ñîñëóæèò âàì õîðîøóþ ñëóæáó â âàøèõ ïðèêëþ÷åíèÿõ ïî ïîåäàíèþ ìóòàíòîâ. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_green] • %c[ui_gray_2] ìåáåëü\n
</text>
</string>
<string id="st_prop_dish2">
<text>Êåðàìè÷åñêàÿ ìèñêà</text>
</string>
<string id="st_prop_dish2_descr">
<text>
Êåðàìè÷åñêàÿ ìèñêà ñîñëóæèò âàì õîðîøóþ ñëóæáó â âàøèõ ïðèêëþ÷åíèÿõ ïî ïîåäàíèþ ìóòàíòîâ. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_green] • %c[ui_gray_2] ìåáåëü\n
</text>
</string>
<string id="st_prop_fan">
<text>Ìàëåíüêèé âåíòèëÿòîð</text>
</string>
<string id="st_prop_fan_descr">
<text>
Ìàëåíüêèé âåíòèëÿòîð, ðàáî÷èé. Ïîëåçíî äëÿ òåõ ñàìûõ ðåäêèõ ñîëíå÷íûõ äíåé â Çîíå. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_green] • %c[ui_gray_2] ìåáåëü\n
%c[d_orange] • %c[ui_gray_2] ñîçäàåò ïðîõëàäíûé âåòåðîê ïðè âêëþ÷åíèè \n
</text>
</string>
<string id="st_prop_fridge">
<text>Ñòàðûé õîëîäèëüíèê</text>
</string>
<string id="st_prop_fridge_descr">
<text>
Áîëüøîé è òÿæåëûé õîëîäèëüíèê. Ïîìîãàåò ñîõðàíèòü ìÿñî ìóòàíòîâ. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] õðàíèëèùå\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_blue] • %c[ui_gray_2] áîëüøàÿ âìåñòèìîñòü\n
%c[d_orange] • %c[ui_gray_2] ìÿñî ìóòàíòîâ íå ãíèåò, ïîêà íàõîäèòñÿ â õîëîäèëüíèêå %c[ui_gray_2] \n
%c[0,100,255,150] • %c[ui_gray_2] ìîæåò áûòü èñïîëüçîâàíî êàê òàéíèê\n
</text>
</string>
<string id="st_prop_keyboard">
<text>Êëàâèàòóðà</text>
</string>
<string id="st_prop_keyboard_descr">
<text>
Ñòàðàÿ êëàâèàòóðà. Èìååò ñëàáûé æåëòûé îòòåíîê èç-çà ïðîøåäøåãî âðåìåíè. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_green] • %c[ui_gray_2] ìåáåëü\n
</text>
</string>
<string id="st_prop_mice">
<text>Ìûøü</text>
</string>
<string id="st_prop_mice_descr">
<text>
Îáû÷íàÿ, ñòàðàÿ êîìïüþòåðíàÿ ìûøü. Íåóäîáíàÿ è òÿæåëàÿ. Äîáðî ïîæàëîâàòü îáðàòíî â êîíåö 90-õ. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_green] • %c[ui_gray_2] ìåáåëü\n
</text>
</string>
<string id="st_prop_mice_pad">
<text>Ìûøü ñ êîâðèêîì</text>
</string>
<string id="st_prop_mice_pad_descr">
<text>
Îáû÷íàÿ, ñòàðàÿ êîìïüþòåðíàÿ ìûøü. Íåóäîáíàÿ è òÿæåëàÿ. Äîáðî ïîæàëîâàòü îáðàòíî â êîíåö 90-õ. Ïîñòàâëÿåòñÿ ñ íåñêîëüêèìè òêàíÿìè, ñøèòûìè âìåñòå, ÷òîáû ïðèäàòü ìûøè íåìíîãî ëó÷øóþ ïîâåðõíîñòü. Âîçìîæíî, íå òàê õîðîøà êàê ðåêëàìèðóåòñÿ. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_green] • %c[ui_gray_2] ìåáåëü\n
</text>
</string>
<string id="st_prop_monitor">
<text>Ìîíèòîð</text>
</string>
<string id="st_prop_monitor_descr">
<text>
Ñòàðûé ìîíèòîð, ýêðàí êîòîðîãî, êàæåòñÿ, öåë, ïîòåíöèàëüíî ìîæåò ðàáîòàòü. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_green] • %c[ui_gray_2] ìåáåëü\n
</text>
</string>
<string id="st_prop_mug">
<text>Êðóæêà</text>
</string>
<string id="st_prop_mug_descr">
<text>
Îáû÷íàÿ êðóæêà íåèçâåñòíîãî ïðîèñõîæäåíèÿ. Õîòü è îòíîñèòåëüíî ÷èñòàÿ, ìîæåò ïðèäàòü âàøèì íàïèòêàì îñîáûé ïðèâêóñ. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_green] • %c[ui_gray_2] ìåáåëü\n
</text>
</string>
<string id="st_prop_stove1">
<text>Ìàëåíüêàÿ ïëèòà</text>
</string>
<string id="st_prop_stove1_descr">
<text>
Íåáîëüøàÿ ïëèòà, ðàáî÷àÿ. Áûëà ïåðåîáîðóäîâàíà ñòàëêåðàìè äëÿ ðàáîòû ñî âñåìè âèäàìè òîïëèâà. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] òåõíîëîãè÷åñèêé ïðåäìåò\n
%c[d_blue] • %c[ui_gray_2] öåííûé ïðåäìåò\n
%c[d_orange] • %c[ui_gray_2] ìîæíî èñïîëüçîâàòü äëÿ ãîòîâêè\n
</text>
</string>
<string id="st_prop_stove2">
<text>Áîëüøàÿ ïëèòà</text>
</string>
<string id="st_prop_stove2_descr">
<text>
Áîëüøàÿ ïëèòà, ðàáî÷àÿ, èìååò îòäåëåíèå äëÿ õðàíåíèÿ ðàçëè÷íûõ ïðåäìåòîâ. Áûë ïåðåîáîðóäîâàíà ñòàëêåðàìè äëÿ ðàáîòû ñî âñåìè âèäàìè òîïëèâà. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] òåõíîëîãè÷åñèêé ïðåäìåò\n
%c[d_blue] • %c[ui_gray_2] öåííûé ïðåäìåò\n
%c[d_blue] • %c[ui_gray_2] áîëüøàÿ âìåñòèìîñòü (èíòåãðèðîâàííàÿ)\n
%c[d_orange] • %c[ui_gray_2] ìîæíî èñïîëüçîâàòü äëÿ ãîòîâêè\n
</text>
</string>
<string id="st_prop_tv">
<text>Òåëåâèçîð</text>
</string>
<string id="st_prop_tv_descr">
<text>
Ñòàðûé òåëåâèçîð, êîòîðûé íàñòðàèâàåòñÿ íà îäèí è òîò æå êàíàë, äîñòóïíûé â çîíå. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_green] • %c[ui_gray_2] ìåáåëü\n
</text>
</string>
<string id="st_prop_shelf_1">
<text>Äåðåâÿííûé øêàô</text>
</string>
<string id="st_prop_shelf_1_descr">
<text>
Ïðîñòîé øêàô, ñäåëàííûé èç äåðåâà. Îáû÷íîå ÿâëåíèå â çîíå. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_green] • %c[ui_gray_2] ìåáåëü\n
</text>
</string>
<string id="st_prop_shelf_2">
<text>Áîëüøàÿ äåðåâÿííûé øêàô</text>
</string>
<string id="st_prop_shelf_2_descr">
<text>
Ïðî÷íûé äåðåâÿííûé øêàô, õîðîøî ñîõðàíèâøèéñÿ. Õîðîøî ïîäõîäèò äëÿ îðãàíèçàöèè ñâîåãî õðàíèëèùà. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_green] • %c[ui_gray_2] ìåáåëü\n
</text>
</string>
<string id="st_prop_prop_clock_1">
<text>Öèôðîâûå ÷àñû</text>
</string>
<string id="st_prop_prop_clock_1_descr">
<text>
Ñîâåðøåííî íîâûå öèôðîâûå ÷àñû. Ðåäêàÿ âåùèöà â Çîíå.\n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] òåõíîëîãè÷åñèêé ïðåäìåò\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_orange] • %c[ui_gray_2] ïîêàçûâàþò âðåìÿ\n
</text>
</string>
<string id="st_prop_med_case_1">
<text>ßùèê äëÿ ìåäèêàìåíòîâ</text>
</string>
<string id="st_prop_med_case_1_descr">
<text>
Ïðî÷íûé ïëàñòèêîâûé ÿùèê ñ âíóòðåííåé ïîäêëàäêîé. Ïðåäíàçíà÷åí äëÿ õðàíåíèÿ ïðåäìåòîâ ìåäèöèíñêîãî íàçíà÷åíèÿ. \n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] õðàíèëèùå\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_blue] • %c[ui_gray_2] áîëüøàÿ âìåñòèìîñòü\n
%c[d_orange] • %c[d_red] ìîæåò õðàíèòü òîëüêî ìåäèêàìåíòû %c[ui_gray_2] \n
%c[0,100,255,150] • %c[ui_gray_2] ìîæåò áûòü èñïîëüçîâàíî êàê òàéíèê\n
</text>
</string>
<string id="st_prop_lamp1">
<text>Ìàëåíüêàÿ íàñòîëüíàÿ ëàìïà</text>
</string>
<string id="st_prop_lamp1_descr">
<text>
Ñêðàøèâàåò âàøè íî÷è. \n \n
%c[ui_gray_3]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] òåõíîëîãè÷åñèêé ïðåäìåò\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_blue] • %c[ui_gray_2] íèçêîå ïîòðåáëåíèå ýëåêòðîýíåðãèè\n
%c[d_blue] • %c[ui_gray_2] òîïëèâî: áàòàðåéêè\n
</text>
</string>
<string id="st_prop_lamp2">
<text>Large desk lamp</text>
</string>
<string id="st_prop_lamp2_descr">
<text>
Ñêðàøèâàåò âàøè íî÷è. \n \n
%c[ui_gray_3]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] òåõíîëîãè÷åñèêé ïðåäìåò\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_blue] • %c[ui_gray_2] íèçêîå ïîòðåáëåíèå ýëåêòðîýíåðãèè\n
%c[d_blue] • %c[ui_gray_2] òîïëèâî: áàòàðåéêè\n
</text>
</string>
<string id="st_placeable_ammo_box">
<text>ßùèê ïàòðîíîâ</text>
</string>
<string id="st_placeable_ammo_box_descr">
<text>Ïðîñòîðíûé äåðåâÿííûé ÿùèê, èñïîëüçóåìûé âîåííûìè äëÿ õðàíåíèÿ áîåïðèïàñîâ. Îí îáåñïå÷èâàåò ìíîãî ìåñòà, íî ïîäõîäèò òîëüêî äëÿ ïàòðîíîâ.\n \n
%c[ui_gray_1]ÕÀÐÀÊÒÅÐÈÑÒÈÊÈ:\n
%c[d_blue] • %c[ui_gray_2] õðàíèëèùå\n
%c[d_blue] • %c[ui_gray_2] ìîæíî ðàçìåñòèòü\n
%c[d_blue] • %c[ui_gray_2] áîëüøàÿ âìåñòèìîñòü\n
%c[d_orange] • %c[d_red] ìîæåò õðàíèòü ïàòðîíû %c[ui_gray_2] \n
%c[0,100,255,150] • %c[ui_gray_2] ìîæåò áûòü èñïîëüçîâàíî êàê òàéíèê\n
</text>
</string>
</string_table>
@@ -0,0 +1,5 @@
<w>
<file name="ui\ui_icon_freeze.dds">
<texture id="ui_icon_freeze" x="0" y="0" width="13" height="13" />
</file>
</w>
@@ -0,0 +1,32 @@
<w>
<file name="ui\ui_maid_efp_props">
<texture id="ui_efp_prop_laptop" x="0" y="0" width="50" height="50" />
<texture id="ui_efp_prop_bed1" x="50" y="0" width="200" height="100" />
<texture id="ui_efp_prop_bed2" x="300" y="0" width="200" height="150" />
<texture id="ui_efp_prop_bed3" x="0" y="100" width="200" height="150" />
<texture id="ui_efp_prop_mapboard" x="0" y="250" width="150" height="150" />
<texture id="ui_efp_prop_canstuna" x="0" y="50" width="50" height="50" />
<texture id="ui_efp_prop_sofa1" x="0" y="400" width="200" height="100" />
<texture id="ui_efp_prop_counter1" x="200" y="100" width="100" height="100" />
<texture id="ui_efp_prop_postervertical" x="150" y="250" width="50" height="100" />
<texture id="ui_efp_prop_table1" x="200" y="200" width="150" height="150" />
<texture id="ui_efp_prop_table2" x="200" y="350" width="150" height="100" />
<texture id="ui_efp_prop_bong" x="250" y="0" width="50" height="100" />
<texture id="ui_efp_prop_case" x="450" y="400" width="50" height="100" />
<texture id="ui_efp_prop_chair" x="400" y="400" width="50" height="100" />
<texture id="ui_efp_prop_dish1" x="200" y="450" width="50" height="50" />
<texture id="ui_efp_prop_dish2" x="300" y="150" width="50" height="50" />
<texture id="ui_efp_prop_fan" x="150" y="350" width="50" height="50" />
<texture id="ui_efp_prop_fridge" x="350" y="150" width="100" height="150" />
<texture id="ui_efp_prop_keyboard" x="250" y="450" width="100" height="50" />
<texture id="ui_efp_prop_mice" x="350" y="450" width="50" height="50" />
<texture id="ui_efp_prop_mice_pad" x="350" y="400" width="50" height="50" />
<texture id="ui_efp_prop_monitor" x="350" y="300" width="100" height="100" />
<texture id="ui_efp_prop_mug" x="450" y="350" width="50" height="50" />
<texture id="ui_efp_prop_stove1" x="500" y="0" width="100" height="50" />
<texture id="ui_efp_prop_tv" x="500" y="50" width="100" height="100" />
<texture id="ui_efp_prop_stove2" x="450" y="150" width="100" height="150" />
<texture id="ui_efp_prop_shelf_1" x="550" y="150" width="100" height="100" />
<texture id="ui_efp_prop_shelf_2" x="600" y="0" width="100" height="150" />
</file>
</w>
@@ -0,0 +1 @@
#include "ui\ui_furniture_stove_dialog_16.xml"
@@ -0,0 +1,31 @@
<w>
<background x="326" y="256" width="370" height="265" stretch="1">
<texture>ui_inGame2_hint_wnd_main_window</texture>
</background>
<icon x="135" y="25" width="100" height="100" stretch="1"/>
<btn_pickup x="78" y="212" width="101" height="28" check_mode="0" stretch="1">
<window_name>button_pickup</window_name>
<text font="letterica18">st_pickup</text>
<texture>ui_button_ordinary</texture>
</btn_pickup>
<btn_close x="191" y="212" width="101" height="28" check_mode="0" stretch="1">
<window_name>button_close</window_name>
<text font="letterica18">st_close</text>
<texture>ui_button_ordinary</texture>
</btn_close>
<btn_use_stove x="78" y="184" width="101" height="28" check_mode="0" stretch="1">
<window_name>button_use_stove</window_name>
<text font="letterica18">st_use_stove</text>
<texture>ui_button_ordinary</texture>
</btn_use_stove>
<btn_access_stash x="191" y="184" width="101" height="28" check_mode="0" stretch="1">
<window_name>button_access_stash</window_name>
<text font="letterica18">st_access_stash</text>
<texture>ui_button_ordinary</texture>
</btn_access_stash>
</w>
@@ -0,0 +1,55 @@
--[[
Functionality for digital clock furniture
Author: HarukaSai (visit us at: https://discord.com/invite/efp)
19-06-2023
]]
function init(obj)
obj:bind_object(haru_placeable_digital_clock_wrapper(obj).binder)
end
--------------------------------------------------------------------------------
-- Class "placeable_digital_clock_binder"
--------------------------------------------------------------------------------
class "haru_placeable_digital_clock_wrapper" (bind_hf_base.hf_binder_wrapper)
-- Class constructor
function haru_placeable_digital_clock_wrapper:__init(obj) super(obj)
end
-- Class update
function haru_placeable_digital_clock_wrapper:update(delta)
bind_hf_base.hf_binder_wrapper.update(self, delta)
local curr_time = game.get_game_time()
if (self.previous_time == nil) then self.previous_time = curr_time end
if not (curr_time:diffSec(self.previous_time) > 1) then
return
end
self.previous_time = curr_time
local time = {
h = string.format("%02d", tostring(level.get_time_hours())),
m = string.format("%02d", tostring(level.get_time_minutes()))
}
for k, v in pairs(time) do
local i = 1
v:gsub(".", function(c)
self:set_digit_visible({k, i}, c)
i = i + 1
end)
end
end
function haru_placeable_digital_clock_wrapper:set_digit_visible(pos, digit)
for i = 0, 9 do
self.object:set_bone_visible(
string.format("digit_%s_%s_%s", pos[1], pos[2], i),
i == tonumber(digit),
false, false
)
end
end
@@ -0,0 +1,64 @@
--[[
Functionality and interactivity for table fan furniture
Author: HarukaSai (visit us at: https://discord.com/invite/efp)
Credits: Aoldri
19-06-2023
]]
function toggle_fan(obj_id)
local section = alife_object(obj_id):section_name()
local is_on = hf_obj_manager.get_data(obj_id).is_on
hf_obj_manager.update_data(obj_id, {is_on = (not is_on)})
end
function init(obj)
obj:bind_object(haru_placeable_fan_wrapper(obj).binder)
end
--------------------------------------------------------------------------------
-- Class "placeable_digital_clock_binder"
--------------------------------------------------------------------------------
class "haru_placeable_fan_wrapper" (bind_hf_base.hf_binder_wrapper)
-- Class constructor
function haru_placeable_fan_wrapper:__init(obj) super(obj)
self.first_update = true
self.snd_switch = sound_object([[efp_props\fan_switch]])
self.snd_idle = sound_object([[efp_props\fan_idle]])
end
-- Class update
function haru_placeable_fan_wrapper:update(delta)
bind_hf_base.hf_binder_wrapper.update(self, delta)
local is_on = hf_obj_manager.get_data(self.object:id()).is_on
if (self.last_state ~= is_on) or self.first_update then
self.object:play_cycle(is_on and "fan_movement" or "fan_static")
if (not self.first_update) then
self.snd_switch:play_no_feedback(self.object, sound_object.s3d, 0, self.object:position(), 0.5, random_float(0.9, 1.1))
end
if is_on then
if (not self.snd_idle:playing()) then
self.snd_idle:play_at_pos(self.object, self.object:position(), 0, sound_object.s3d + sound_object.looped)
self.snd_idle.volume = self.first_update and 0.5 or 0
self.snd_idle_max = time_global() + (not self.first_update and 2000 or 0)
end
else
if self.snd_idle:playing() then
self.snd_idle:stop()
end
end
end
if self.snd_idle:playing() and (self.snd_idle_max > time_global()) then
self.snd_idle.volume = 0.5 - (self.snd_idle_max - time_global()) / 2000
end
self.last_state = is_on
self.first_update = false
end
@@ -0,0 +1,139 @@
--[[
Functionality for specialized storage boxes
Author: HarukaSai (visit us at: https://discord.gg/efp)
19-06-2023
]]
-- no real way to tell apart canned food, so we just have a table with them
canned_food = {
["beans"] = true,
["chili"] = true,
["conserva"] = true,
["corn"] = true,
["tomato"] = true,
["tushonka"] = true
}
storage_types = {
["ammo"] = function(obj)
return IsAmmo(obj)
end,
["meds"] = function(obj)
return SYS_GetParam(0, obj:section(), "kind") == "i_medical"
end,
["canned_food"] = function(obj)
local sec = obj:section()
return canned_food[sec] or false
end
}
-- Wrapper for CreateTimeEvent that checks if object exists
function CreateSafeObjEvent(obj, ev_id, act_id, timer, f, ...)
local id = obj:id()
CreateTimeEvent(ev_id, act_id, timer, function(...)
if level.object_by_id(id) then
return f(obj, ...)
end
return true
end, ...)
end
local check_ids = {
[EDDListType.iActorBag] = true,
[EDDListType.iActorBelt] = true,
[EDDListType.iActorTrade] = true,
[EDDListType.iActorSlot] = true
}
function actor_on_item_before_move(flags, npc_id, obj, mode, bag_id)
if not (check_ids[bag_id] and obj and mode == "loot") then return end
local box = get_object_by_id(npc_id)
if (not box) then return end
local specialized_storage = SYS_GetParam(0, box:section(), "specialized_storage")
if (not storage_types[specialized_storage]) or storage_types[specialized_storage](obj) then
return
end
flags.ret_value = false
end
local levels = {
[0] = 0,
[1] = 1,
[2] = 2,
[3] = 2,
[4] = 3,
}
function update_display(box)
local items = 0
box:iterate_inventory_box(function(box)
items = items + 1
end, box)
local level = levels[clamp(math.floor(items/12), 0, 4)] or 0
for i = 1, 3 do
local ev_id = string.format("update_tuna_box_bone_%s_%s", box:id(), i)
CreateSafeObjEvent(box, ev_id, ev_id, i/25, function()
box:set_bone_visible("tuna_" .. i, level >= i, false, false)
return true
end)
end
end
function update_tuna_box(box)
local id = box:id()
ResetTimeEvent("update_tuna_box" .. id, "update_tuna_box" .. id, 0.1)
CreateSafeObjEvent(box, "update_tuna_box" .. id, "update_tuna_box" .. id, 0.1, function()
update_display(box)
return true
end, id)
end
function is_tuna_box(box)
return box:section() == "placeable_cans_tuna"
end
function actor_on_item_take_from_box(box, item)
if (not is_tuna_box(box)) then
return
end
update_tuna_box(box)
end
function actor_on_item_put_in_box(box, item)
if (not is_tuna_box(box)) then
return
end
update_tuna_box(box)
end
binder_update = bind_physic_object.generic_physics_binder.update
bind_physic_object.generic_physics_binder.update = function(self, delta)
binder_update(self, delta)
if is_tuna_box(self.object) and (not self.tuna_box_updated) then
update_display(self.object)
self.tuna_box_updated = true
end
end
function on_game_start()
RegisterScriptCallback("actor_on_item_take_from_box", actor_on_item_take_from_box)
RegisterScriptCallback("actor_on_item_put_in_box", actor_on_item_put_in_box)
RegisterScriptCallback("ActorMenu_on_item_before_move", actor_on_item_before_move)
end
@@ -0,0 +1,185 @@
--[[
Full rewrite of Rotten Meat addon by HarukaSai for EFP (visit at: https://discord.com/invite/stalker-efp)
Created: 13-11-2022
Credits for original addon: Arszi
Features:
- Rewritten logic
- Refrigiration
- MCM configuration
]]
local mcm_id = "meat_spoiling"
local expiration_time = nil
local expiration_table = {}
local ini_meat = ini_file_ex("plugins\\meat_spoiling_settings.ltx")
meats = utils_data.collect_section(ini_meat.ini, "meats", true)
local function t2c(t)
if not t then return nil end
local ct = game.CTime()
ct:set(t.Y,t.M,t.D,t.h,t.m,t.s,t.ms)
return ct
end
local function c2t(ct)
if not ct then return nil end
local Y, M, D, h, m, s, ms = 0, 0, 0, 0, 0, 0, 0
Y, M, D, h, m, s, ms = ct:get(Y, M, D, h, m, s, ms)
return { Y=Y, M=M, D=D, h=h, m=m, s=s, ms=ms }
end
local previous_time = nil
function actor_on_update()
local curr_time = game.get_game_time()
if (previous_time == nil) then previous_time = curr_time end
if not (curr_time:diffSec(previous_time) > 1) then
return
end
previous_time = curr_time
tick_expiration()
end
function actor_on_item_take(item)
local id = item:id()
local sec = item:section()
if not (meats[sec] and (not expiration_table[id])) then
return
end
expiration_table[id] = {
duration = string.match(sec, "meat_") and expiration_time.cooked or expiration_time.raw,
last_update = c2t(game.get_game_time())
}
end
function actor_on_item_use(obj)
if (obj and expiration_table[obj:id()]) then
expiration_table[obj:id()] = nil
end
end
function get_meat_is_frozen(se_obj)
if (not se_obj) then return false end
local se_parent = se_obj.parent_id and se_obj.parent_id < 65535 and alife_object(se_obj.parent_id)
if (not se_parent) or (se_parent:section_name() ~= "placeable_fridge") then
return false
end
return true
end
function tick_expiration()
local curr_time = game.get_game_time()
for id, data in pairs(expiration_table) do
repeat
local se_obj = alife_object(id)
if (not se_obj) or (not meats[se_obj:section_name()]) then
expiration_table[id] = nil
do break end
end
if (not get_meat_is_frozen(se_obj)) then
data.duration = data.duration - curr_time:diffSec(t2c(data.last_update))
end
data.last_update = c2t(curr_time)
if (data.duration <= 0) then
expire_food(se_obj)
expiration_table[id] = nil
end
until true
end
end
function expire_food(se_obj)
if (not se_obj.parent_id) or se_obj.parent_id >= 65535 then
alife_release(se_obj)
return
end
local se_parent = alife_object(se_obj.parent_id)
alife_release(se_obj)
if se_parent and (IsInvbox(se_parent) or se_parent.id == AC_ID) then
alife_create_item("rotten_meat", se_parent)
end
end
function save_state(m_data)
m_data.expiration_table = expiration_table
end
function load_state(m_data)
expiration_table = m_data.expiration_table or {}
end
function on_option_change()
expiration_time = {
raw = ui_mcm and ui_mcm.get(mcm_id .. "/expiration_hours_raw") * 60 * 60 or 48 * 60 * 60,
cooked = ui_mcm and ui_mcm.get(mcm_id .. "/expiration_hours_cooked") * 60 * 60 or 120 * 60 * 60
}
end
local clr_frozen = GetARGB(40,0,197,255)
function get_meat_is_frozen_cell(cell)
local se_obj = cell.ID and expiration_table[cell.ID] and alife_object(cell.ID)
if get_meat_is_frozen(se_obj) then
return true
end
end
function on_game_start()
RegisterScriptCallback("actor_on_item_use", actor_on_item_use)
RegisterScriptCallback("save_state",save_state)
RegisterScriptCallback("load_state",load_state)
RegisterScriptCallback("actor_on_item_take",actor_on_item_take)
RegisterScriptCallback("actor_on_update", actor_on_update)
RegisterScriptCallback("on_option_change", on_option_change)
rax_persistent_highlight.register("frozen_meat", function(cell)
return get_meat_is_frozen_cell(cell) and clr_frozen or false
end)
local anchor_x = function(axis, margin, w)
return (axis.w - w) - margin
end
local anchor_y = function(axis, margin, h)
return margin
end
rax_icon_layers.register("frozen_meat", function(cell, obj, sec)
if get_meat_is_frozen_cell(cell) then
local axis = utils_xml.get_item_axis(sec)
return {
texture = "ui_icon_freeze",
x = anchor_x(axis, 2, 13),
y = anchor_y(axis, 2, 13),
w = 13,
h = 13
}
end
end)
on_option_change()
end
@@ -0,0 +1,13 @@
local mcm_id = "meat_spoiling"
function on_mcm_load()
local options = {
id = mcm_id, sh = true,
gr = {
{ id = mcm_id , type = "slide" , link = "ui_options_slider_player", text = "ui_mcm_menu_" .. mcm_id, size = {512, 50}, spacing = 20},
{ id = "expiration_hours_raw", type = "input", val = 2, def = 48, min = 24, max = 144},
{ id = "expiration_hours_cooked", type = "input", val = 2, def = 120, min = 24, max = 360},
}
}
return options
end
@@ -0,0 +1,191 @@
--[[
Dynamic Icon Layers for anomaly inventory. Used by SortingPlus and other mods by RavenAscendant.
4JUL2021
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
Author: RavenAscendant
--]]
function pr(txt, ...)
-- printf("RAXPH: "..txt, ...)
end
local iconor = aaa_rax_icon_override_mcm and true or false
local icon_override = iconor and aaa_rax_icon_override_mcm.icon_override
local ratio = utils_xml.screen_ratio()
local icon_layers = {}
--functor will be passed cell, obj and section
--functor should return table with the same info as an item section icon layer. {icon_layer = "tch_upgr_ico", icon_layer_x = 0, icon_layer_y = 1, icon_layer_scale = 0.75}
--functor can alternitivly return texture name/file, cords and dimesions {texture = "xxy.dds", x = 0, y = 0, w = 10, h = 10}
function register(name, functor)
if not name then return end -- need all three params and field really needs to be a string
if not icon_layers[name] then
icon_layers[name] = {}
end
table.insert(icon_layers[name], functor)
end
function refresh(mode) --safer way to refresh inventory, mode == 1 refreshes sorting.
local inventory = GetActorMenu()
inventory:UnHighlight_All()
if mode == 1 then
local sort = nil
for i=1,#inventory.sort_btn do
if inventory.sort_btn[i]:GetCheck() then
sort = i
end
end
inventory:On_Sort(sort or 1,false)
else
inventory:UpdateItems()
end
end
--add layers to what gets updated
local base_update = utils_ui.UICellItem.Update
function utils_ui.UICellItem:Update(obj)
obj = obj or (self.ID and level.object_by_id(self.ID))
if (self.showcase == 0) and (not obj) then
self:ResetToChild()
return false
end
local sec = self.section
local xml = self:GetXML()
if obj then
local clsid = obj:clsid()
self:Add_Layers(xml, obj, sec, clsid)
end
return base_update(self, obj)
end
local base_layers = utils_ui.UICellItem.Add_Layers
function utils_ui.UICellItem:Add_Layers(xml, obj, sec, clsid)
base_layers(self, xml, obj, sec, clsid)
local ii = 1
while ((iconor and icon_override:section_exist(sec) and icon_override:r_string_ex(sec,(ii).."icon_layer")) or SYS_GetParam(0, sec, (ii).."icon_layer") ~= nil) do --get ii up to next avail layer.
ii = ii + 1
end
if (not self.layer) then
self.layer = {}
end
for key, name in pairs(icon_layers) do
for _, functor in pairs(name) do
if (not self.layer[ii]) then
if (not xml) then
xml = self:GetXML()
end
self.layer[ii] = xml:InitStatic(self.path .. ":" .. self.cx .. ":pic", self.ico)
end
local tbl = functor and functor(self, obj, sec)
if tbl then
if tbl.icon_layer then
add_icon_layer(self, self.layer[ii], self.ico, sec, tbl)
ii = ii + 1
end
if tbl.texture then
add_texture_layer(self,self.layer[ii], self.ico, sec, tbl)
ii = ii + 1
end
end
end
end
end
function add_icon_layer(self,ele, base, sec_m, tbl)
local sec_l = tbl.icon_layer
local grid_size = self.grid_size
local x = tbl.icon_layer_x or 0
local y = tbl.icon_layer_y or 0
local axis = utils_xml.get_item_axis(sec_l, grid_size)
local w = axis.w
local h = axis.h
local scale = tbl.icon_layer_scale or 1
local scale_pos = scale * (grid_size/50)
local rot = ele:GetHeading() > 0
local x_s = x * ratio * scale_pos
local y_s = y * scale_pos
local w_s = w * ratio * scale
local h_s = h * scale
local w_off = (w_s/2)
local h_off = (h_s/2)
if rot then
-- despite rotation, movement for x and y stays normal!
-- Move start pos to match the one for rotated base icon
local w_b, h_b = base:GetWidth(), base:GetHeight()
local x_st = (w_b/2) - (h_b/2)
local y_st = h_b + x_st
-- On 90 rotation, x and y are inverted, y axis goes negative simulate normal x movement
x_s = x_st + (y * ratio * scale_pos)
y_s = y_st - (x * scale_pos)
w_s = w * scale
h_s = h * scale
w_off = (h_s - h_s *ratio/2)
h_off = -w_s/2
end
ele:InitTexture( utils_xml.get_icons_texture(sec_l) )
ele:SetTextureRect(Frect():set( utils_xml.get_item_axis(sec_l, nil, true) ))
ele:SetStretchTexture(true)
ele:SetWndPos(vector2():set( x_s + w_off , y_s + h_off ))
ele:SetWndSize(vector2():set( w_s , h_s ))
ele:Show(true)
end
function add_texture_layer(self,ele, base, sec_m, tbl)
local grid_size = self.grid_size
local x = tbl.x or 0
local y = tbl.y or 0
local w = tbl.w
local h = tbl.h
local scale = 1
local scale_pos = scale * (grid_size/50)
local rot = ele:GetHeading() > 0
local x_s = x * ratio * scale_pos
local y_s = y * scale_pos
local w_s = w * ratio * scale
local h_s = h * scale
local w_off = (w_s/2)
local h_off = (h_s/2)
if rot then
-- despite rotation, movement for x and y stays normal!
-- Move start pos to match the one for rotated base icon
local w_b, h_b = base:GetWidth(), base:GetHeight()
local x_st = (w_b/2) - (h_b/2)
local y_st = h_b + x_st
-- On 90 rotation, x and y are inverted, y axis goes negative simulate normal x movement
x_s = x_st + (y * ratio * scale_pos)
y_s = y_st - (x * scale_pos)
w_s = w * scale
h_s = h * scale
w_off = (h_s - h_s *ratio/2)
h_off = -w_s/2
end
ele:InitTexture( tbl.texture )
ele:SetStretchTexture(true)
ele:SetWndPos(vector2():set( x_s + w_off , y_s + h_off ))
ele:SetWndSize(vector2():set( w_s , h_s ))
ele:Show(true)
end
@@ -0,0 +1,68 @@
--[[
Persitant Highlights for anomaly inventory. Used by SortingPlus and other mods by RavenAscendant.
24FEB2021
Updated 19Jun21 improved compatablity.
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
Author: RavenAscendant
--]]
function pr(txt, ...)
-- printf("RAXPH: "..txt, ...)
end
local persistent_highlights = {}
--functor should return an ARGB for the highlight color. recomend low alpha values. name is mostly for aplhabetical priority. will not conflict. there is no unregister, just retun nil if you don't want to use.
function register(name, functor)
if not name then return end -- need all three params and field really needs to be a string
if not persistent_highlights[name] then
persistent_highlights[name] = {}
end
table.insert(persistent_highlights[name], functor)
end
function utils_ui.UICellItem:GetPersistantHighlight()
local clr = nil
for key, name in pairs(persistent_highlights) do
for _, functor in pairs(name) do
clr = functor and functor(self) or clr
pr(key .. ":" .. tostring(clr) .. ":" .. tostring(self.section))
end
end
return clr
end
local base_highlight = utils_ui.UICellItem.Highlight
function utils_ui.UICellItem:Highlight(state, clr_id, main_clr)
if state and (not self:IsShown()) and (not self.manual) then return end
persistant_highlight = self:GetPersistantHighlight()
if (not state) and persistant_highlight then
color = main_clr and change_alpha(persistant_highlight, 255) or persistant_highlight -- if main_clr set the alpha to max for reasons.
self.hl:Show(persistant_highlight or state) -- show if we have a persistant highlight or state is true, else hide.
self.hl:SetTextureColor(color)
else
base_highlight(self, state, clr_id, main_clr)
end
end
clr_cache = {}
function change_alpha(clr, a)
if not clr and a ~= nil then return end
if not clr_cache[clr .. "_" .. a] then
b = bit.band(clr, 255)
g = bit.band(bit.rshift(clr, 8), 255)
r = bit.band(bit.rshift(clr, 16), 255)
clr_cache[clr .. "_" .. a] = GetARGB(a, r, g, b)
end
return clr_cache[clr .. "_" .. a]
end
@@ -0,0 +1,276 @@
--[[
Interactivity for stove furniture
Author: HarukaSai (visit us at: https://discord.com/invite/efp)
Credits: Aoldri
19-06-2023
]]
local function use_container(id,pid)
local box = id and level.object_by_id(id)
if (box) then
--level.map_add_object_spot(id, "ui_pda2_actor_box_location", "st_ui_pda_actor_box") -- debug
curBoxID = pid
hide_hud_inventory()
box:use(db.actor)
return true -- destroy timed event
end
return false -- repeat timed event
end
-- called from item section in items.ltx
function access_inventory(obj)
local id = obj:id()
local m_data = alife_storage_manager.get_state()
local se_inv_box = m_data.stove_stashes and m_data.stove_stashes[id] and alife_object(m_data.stove_stashes[id])
if not (se_inv_box) then
-- position under map
local pos = vec_set(obj:position())
pos.y = pos.y - 50
-- create inventory_box_s
se_inv_box = alife_create(SYS_GetParam(0, obj:section(), "integrated_storage"),pos,obj:level_vertex_id(),obj:game_vertex_id())
end
if (se_inv_box) then
-- shouldn't be possible but very safe incase some sort of save corruption
if not (IsInvbox(nil,se_inv_box:clsid())) then
if m_data.stove_stashes then
m_data.stove_stashes[id] = nil
end
return
end
-- force strictly online
alife():set_switch_online(se_inv_box.id,true)
alife():set_switch_offline(se_inv_box.id,false)
-- Save container
if not (m_data.stove_stashes) then
m_data.stove_stashes = {}
end
m_data.stove_stashes[id] = se_inv_box.id
-- Object will come online next update so wait
CreateTimeEvent(id,"container",0,use_container,se_inv_box.id,id)
end
end
local ratio = utils_xml.screen_ratio()
GUI = nil -- instance, don't touch
class "UICookStove" (CUIScriptWnd)
function UICookStove:__init() super()
self:InitControls()
self:InitCallbacks()
end
function UICookStove:__finalize()
GUI = nil
end
function UICookStove:InitControls()
self:SetWndRect(Frect():set(0,0,1024,768))
self.wide = (device().width/device().height) > (1024/768 + 0.01)
self:SetAutoDelete(true)
local xml = CScriptXmlInit()
-- xml:ParseFile("ui_sleep_dialog.xml")
xml:ParseFile("ui_furniture_stove_dialog.xml")
self.back = xml:InitFrame("background", self)
self.icon = xml:InitStatic("icon", self.back)
self.icon_temp = xml:InitStatic("icon", self.back)
self.icon:SetWndSize(vector2():set( self.icon:GetWidth(), self.icon:GetWidth() / ratio ))
--self.btn_pickup = xml:Init3tButton("btn_pickup", self.back)
--self:Register(self.btn_pickup, "btn_pickup")
self.btn_close = xml:Init3tButton("btn_close", self.back)
self:Register(self.btn_close, "btn_close")
self.btn_access_stash = xml:Init3tButton("btn_access_stash", self.back)
self:Register(self.btn_access_stash, "btn_access_stash")
self.btn_use_stove = xml:Init3tButton("btn_use_stove", self.back)
self:Register(self.btn_use_stove, "btn_use_stove")
end
function UICookStove:AccessStash()
local obj = get_object_by_id(self.obj_id)
access_inventory(obj)
self:Close()
end
function UICookStove:GetStashObj()
local m_data = alife_storage_manager.get_state()
local se_inv_box = m_data.stove_stashes and m_data.stove_stashes[self.obj_id] and alife_object(m_data.stove_stashes[self.obj_id])
local stash_id = nil
if (se_inv_box) then
-- shouldn't be possible but very safe incase some sort of save corruption
if not (IsInvbox(nil,se_inv_box:clsid())) then
if m_data.stove_stashes then
m_data.stove_stashes[self.obj_id] = nil
end
return
end
-- force strictly online
alife():set_switch_online(se_inv_box.id,true)
alife():set_switch_offline(se_inv_box.id,false)
-- Save container
if not (m_data.stove_stashes) then
m_data.stove_stashes = {}
end
m_data.stove_stashes[self.obj_id] = se_inv_box.id
stash_id = se_inv_box.id
end
-- Object will come online next update so wait
CreateTimeEvent(self.obj_id,"move_stash",0,self.GiveStashToActor,self,stash_id)
end
function UICookStove:Pickup()
local obj = get_object_by_id(self.obj_id)
alife_create_item(self.section.item, db.actor)
local m_data = alife_storage_manager.get_state()
if m_data.stove_stashes then
local id = m_data.stove_stashes[self.obj_id]
local stash_obj = get_object_by_id(id)
if stash_obj then
stash_obj:iterate_inventory_box( function(temp, obj)
stash_obj:transfer_item(obj, db.actor)
end, stash_obj)
end
alife_release_id(id)
end
alife_release(obj)
self:Close()
end
function UICookStove:UseCook()
self:GetStashObj()
end
local item_ids = {}
local stash_obj_id = nil
function return_items()
if stash_obj_id == nil then return end
local stash_obj = get_object_by_id(stash_obj_id)
if stash_obj == nil then return end
for i, id in ipairs(item_ids) do
local item_obj = get_object_by_id(id)
if item_obj then
db.actor:transfer_item(item_obj, stash_obj)
end
end
end
function GUI_on_hide(name)
if name == "UICook" then
return_items()
UnregisterScriptCallback("GUI_on_hide", GUI_on_hide)
end
end
function UICookStove:GiveStashToActor(id)
local items = {}
if id then
local stash_obj = get_object_by_id(id)
stash_obj:iterate_inventory_box( function(temp, obj)
table.insert(items, obj:id())
stash_obj:transfer_item(obj, db.actor)
end, stash_obj)
end
item_ids = items
stash_obj_id = id
RegisterScriptCallback("GUI_on_hide", GUI_on_hide)
CreateTimeEvent(self.obj_id,"open_stove",0.1,self.OpenCookUI,self)
return true
end
function UICookStove:OpenCookUI()
local obj = get_object_by_id(self.obj_id)
local cook_ui = item_cooking.start(obj, "fieldcooker")
self:Close()
return true
end
function UICookStove:InitCallbacks()
self:AddCallback("btn_access_stash", ui_events.BUTTON_CLICKED, self.AccessStash, self)
--self:AddCallback("btn_pickup", ui_events.BUTTON_CLICKED, self.Pickup, self)
self:AddCallback("btn_use_stove", ui_events.BUTTON_CLICKED, self.UseCook, self)
self:AddCallback("btn_close", ui_events.BUTTON_CLICKED, self.Close, self)
end
function UICookStove:Initialize()
local obj = get_object_by_id(self.obj_id)
self.section = {}
self.section.placeable = obj:section() or "placeable_stove1"
self.section.item = SYS_GetParam(0, self.section.placeable, "item_section", "prop_stove2")
utils_xml.set_icon(self.section.item, false, self.icon_temp, self.icon)
self.btn_access_stash:Enable(SYS_GetParam(0, self.section.placeable, "integrated_storage") and true or false)
end
function UICookStove:TestAndShow(obj_id)
self.obj_id = obj_id
self:Initialize()
self:ShowDialog(true)
Register_UI("UICookStove","ui_furniture_stove")
end
function UICookStove:Update()
CUIScriptWnd.Update(self)
end
function UICookStove:OnTrackButton()
end
function UICookStove:OnKeyboard(dik, keyboard_action)
local res = CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
if (res == false) then
local bind = dik_to_bind(dik)
if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
if dik == DIK_keys.DIK_ESCAPE then
self:Close()
end
end
end
return res
end
function UICookStove:Close()
if (self:IsShown()) then
self:HideDialog()
end
Unregister_UI("UICookStove")
end
function start_dialog(obj_id)
if (GUI == nil) then
GUI = UICookStove()
end
GUI:TestAndShow(obj_id)
end