diff --git a/code/controllers/subsystems/supply.dm b/code/controllers/subsystems/supply.dm
index e31b3d8f6505b..16d4f40626faa 100644
--- a/code/controllers/subsystems/supply.dm
+++ b/code/controllers/subsystems/supply.dm
@@ -33,9 +33,9 @@ SUBSYSTEM_DEF(supply)
"virology_dishes" = "From exported virus dishes",
//SIERRA-ADD
"animal" = "From captured exotic alien fauna",
- //[SIERRA-ADD] - ANOMALY - Добавляем категорию "Артефакты"
+//[SIERRA-ADD] - ANOMALY - Добавляем категорию "Артефакты"
"artefacts" = "From artefacts",
- //[SIERRA-ADD]
+//[SIERRA-ADD]
"total" = "Total" // If you're adding additional point sources, add it here in a new line. Don't forget to put a comma after the old last line.
)
diff --git a/code/modules/mob/living/carbon/viruses.dm b/code/modules/mob/living/carbon/viruses.dm
index ca6a3b1a0fb09..008c24182e06a 100644
--- a/code/modules/mob/living/carbon/viruses.dm
+++ b/code/modules/mob/living/carbon/viruses.dm
@@ -1,65 +1,11 @@
/mob/living/carbon
var/immunity = 100 //current immune system strength
-//[SIERRA-ADD] VIRUSOLOGY
var/immunity_norm = 100 //it will regenerate to this value
/mob/living/carbon/proc/handle_viruses()
if(status_flags & GODMODE) return 0 //godmode
- if(bodytemperature > 406)
- for (var/ID in virus2)
- var/datum/disease2/disease/V = virus2[ID]
- V.cure(src)
-
- if(life_tick % 3) //don't spam checks over all objects in view every tick.
- for(var/obj/decal/cleanable/O in view(1,src))
- if(istype(O,/obj/decal/cleanable/blood))
- var/obj/decal/cleanable/blood/B = O
- if(isnull(B.virus2))
- B.virus2 = list()
- if(LAZYLEN(B.virus2))
- for (var/ID in B.virus2)
- var/datum/disease2/disease/V = B.virus2[ID]
- infect_virus2(src,V)
-
- else if(istype(O,/obj/decal/cleanable/mucus))
- var/obj/decal/cleanable/mucus/M = O
- if(isnull(M.virus2))
- M.virus2 = list()
- if(LAZYLEN(M.virus2))
- for (var/ID in M.virus2)
- var/datum/disease2/disease/V = M.virus2[ID]
- infect_virus2(src,V)
-
- if(LAZYLEN(virus2))
- for (var/ID in virus2)
- var/datum/disease2/disease/V = virus2[ID]
- if(isnull(V)) // Trying to figure out a runtime error that keeps repeating
- CRASH("virus2 nulled before calling activate()")
- else
- V.process(src)
- // activate may have deleted the virus
- if(!V) continue
-
- // check if we're immune
- var/list/common_antibodies = V.antigen & src.antibodies
- if(LAZYLEN(common_antibodies))
- V.dead = 1
-//[/SIERRA-ADD] VIRUSOLOGY
if(immunity > 0.2 * immunity_norm && immunity < immunity_norm)
immunity = min(immunity + 0.25, immunity_norm)
-//[SIERRA-ADD] VIRUSOLOGY
- if(life_tick % 5 && immunity < 15 && chem_effects[CE_ANTIVIRAL] < VIRUS_COMMON && !LAZYLEN(virus2))
- var/infection_prob = 5 - immunity
- var/turf/simulated/T = loc
- if(istype(T))
- infection_prob += T.dirt
- if(T.dirt >= 50)
- if(prob(infection_prob))
- infect_mob_random_greater(src)
- else
- if(prob(infection_prob))
- infect_mob_random_lesser(src)
-//[/SIERRA-ADD] VIRUSOLOGY
/mob/living/carbon/proc/virus_immunity()
var/antibiotic_boost = reagents.get_reagent_amount(/datum/reagent/spaceacillin) / (REAGENTS_OVERDOSE/2)
diff --git a/maps/sierra/icons/obj/clothing/new_loadout.dmi b/maps/sierra/icons/obj/clothing/new_loadout.dmi
new file mode 100644
index 0000000000000..92294be524a50
Binary files /dev/null and b/maps/sierra/icons/obj/clothing/new_loadout.dmi differ
diff --git a/maps/sierra/icons/obj/clothing/new_loadout_icons.dmi b/maps/sierra/icons/obj/clothing/new_loadout_icons.dmi
new file mode 100644
index 0000000000000..712396a4be249
Binary files /dev/null and b/maps/sierra/icons/obj/clothing/new_loadout_icons.dmi differ
diff --git a/maps/sierra/icons/obj/clothing/new_loadout_tajara.dmi b/maps/sierra/icons/obj/clothing/new_loadout_tajara.dmi
new file mode 100644
index 0000000000000..af5049a47c5d3
Binary files /dev/null and b/maps/sierra/icons/obj/clothing/new_loadout_tajara.dmi differ
diff --git a/maps/sierra/icons/obj/clothing/new_loadout_unati.dmi b/maps/sierra/icons/obj/clothing/new_loadout_unati.dmi
new file mode 100644
index 0000000000000..21c5b4e70fbb2
Binary files /dev/null and b/maps/sierra/icons/obj/clothing/new_loadout_unati.dmi differ
diff --git a/maps/sierra/items/clothing/new_uniform.dm b/maps/sierra/items/clothing/new_uniform.dm
new file mode 100644
index 0000000000000..8e75e250edb64
--- /dev/null
+++ b/maps/sierra/items/clothing/new_uniform.dm
@@ -0,0 +1,339 @@
+//УНИФОРМА
+/obj/item/clothing/under/new_uniform/get_icon_state(mob/user_mob, slot)
+ if(item_state_slots && item_state_slots[slot])
+ . = item_state_slots[slot]
+ else
+ . = icon_state
+ if(!findtext(.,"_s", -2)) // If we don't already have our suffix
+ . += get_gender_suffix()
+ else
+ . += "_s"
+
+/obj/item/clothing/under/new_uniform/
+ icon = 'maps/sierra/icons/obj/clothing/new_loadout_icons.dmi'
+ item_icons = list(slot_w_uniform_str = 'maps/sierra/icons/obj/clothing/new_loadout.dmi')
+ sprite_sheets = list(
+ SPECIES_TAJARA = 'maps/sierra/icons/obj/clothing/new_loadout_tajara.dmi',
+ SPECIES_UNATHI = 'maps/sierra/icons/obj/clothing/new_loadout_unati.dmi'
+ )
+
+/obj/item/clothing/under/new_uniform/cargo_trousers
+ name = "cargo trousers"
+ desc = "Sleek slim-fit trousers with extra pockets and some stripes hanging off the belt for... extra style points perhaps."
+ icon_state = "cargo_trousers"
+ item_state = "cargo_trousers"
+ worn_state = "cargo_trousers"
+
+/obj/item/clothing/under/new_uniform/cargos
+ name = "cargo pants"
+ desc = "Loose-fit grey cargo pants with plenty of pockets."
+ icon_state = "cargos"
+ item_state = "cargos"
+ worn_state = "cargos"
+
+/obj/item/clothing/under/new_uniform/neotac
+ name = "neotac pants"
+ desc = "Regular-fit trousers with gradient pattern and plenty of belts around the waist. For the sake of style, of course."
+ icon_state = "neotac"
+ item_state = "cargos"
+ worn_state = "cargos"
+
+/obj/item/clothing/under/new_uniform/breeches
+ name = "denim breeches"
+ desc = "Short-cut jeans with micromesh underlayer at the crotch for extra durability."
+ icon_state = "breeches"
+ item_state = "breeches"
+ worn_state = "breeches"
+
+/obj/item/clothing/under/new_uniform/gorka_pants //olive
+ name = "olive gorka paints"
+ desc = "Sturdy pants made of tarp-like fabric. Extremely durable."
+ item_flags = ITEM_FLAG_THICKMATERIAL
+ icon_state = "gorka_pants_olive"
+ item_state = "gorka_pants_olive"
+ worn_state = "gorka_pants_olive"
+
+/obj/item/clothing/under/new_uniform/gorka_pants/tan
+ name = "tan gorka paints"
+ icon_state = "gorka_pants_tan"
+ item_state = "gorka_pants_tan"
+ worn_state = "gorka_pants_tan"
+
+/obj/item/clothing/under/new_uniform/gorka_pants/blue
+ name = "blue gorka paints"
+ icon_state = "gorka_pants_blue"
+ item_state = "gorka_pants_blue"
+ worn_state = "gorka_pants_blue"
+
+/obj/item/clothing/under/new_uniform/netrunner
+ name = "specialized netrunner suit"
+ desc = "A compressing, thermoregulating suit that prevents body from going numb of sitting still too long monitoring telecommunication systems."
+ icon_state = "netrunner"
+ item_state = "netrunner"
+ worn_state = "netrunner"
+ gender_icons = TRUE
+ min_cold_protection_temperature = T0C - 5
+
+/obj/item/clothing/under/new_uniform/plain_suit
+ name = "White plain suit"
+ desc = "A plain suit with double-breasted shirt. Buttons not included."
+ icon_state = "plain_suit"
+ item_state = "plain_suit"
+ worn_state = "plain_suit"
+ gender_icons = TRUE
+
+/obj/item/clothing/under/new_uniform/plain_suit_dark
+ name = "Dark plain suit"
+ desc = "A plain suit with double-breasted shirt. Buttons not included."
+ icon_state = "plain_suit_dark"
+ item_state = "plain_suit_dark"
+ worn_state = "plain_suit_dark"
+ gender_icons = TRUE
+
+/obj/item/clothing/under/new_uniform/kitsch_dress
+ name = "kitsch dress"
+ desc = "Very extravagant piece of fashion. Style over necessity."
+ icon_state = "kitsch_dress_1"
+ item_state = "kitsch_dress_1"
+ worn_state = "kitsch_dress_1"
+
+/obj/item/clothing/under/new_uniform/kitsch_dress/second
+ icon_state = "kitsch_dress_2"
+ item_state = "kitsch_dress_2"
+ worn_state = "kitsch_dress_2"
+
+/obj/item/clothing/under/new_uniform/kitsch_dress/third
+ icon_state = "kitsch_dress_3"
+ item_state = "kitsch_dress_3"
+ worn_state = "kitsch_dress_3"
+
+/obj/item/clothing/under/new_uniform/cherry_suit
+ name = "cherry suit"
+ desc = "Some cherry-colored slacks with a burgundy shirt."
+ icon_state = "cherry_suit"
+ item_state = "cherry_suit"
+ worn_state = "cherry_suit"
+ gender_icons = TRUE
+
+/obj/item/clothing/under/new_uniform/bdu
+ name = "BDU suite"
+ desc = "A padded jumpsuit purposed for combat engagement."
+ armor = list(
+ melee = ARMOR_MELEE_SMALL,
+ bullet = ARMOR_BALLISTIC_MINOR,
+ laser = ARMOR_LASER_MINOR
+ )
+ siemens_coefficient = 0.9
+ icon_state = "bdu"
+ item_state = "bdu"
+ worn_state = "bdu"
+
+/obj/item/clothing/under/new_uniform/ems
+ name = "emergency medical responder's jumpsuit"
+ desc = "This jumpsuit bears a really big red cross on its back so to let everyone know what your job is."
+ icon_state = "ems_dark"
+ item_state = "ems_dark"
+ worn_state = "ems_dark"
+
+
+/obj/item/clothing/under/new_uniform/ems/white
+ icon_state = "ems_white"
+ item_state = "ems_white"
+ worn_state = "ems_white"
+
+/obj/item/clothing/under/new_uniform/papaleroy_rubiwhite
+ name = "Rubiwhite"
+ icon_state = "papaleroy_rubywhite"
+ item_state = "papaleroy_rubywhite"
+ worn_state = "papaleroy_rubywhite"
+ gender_icons = TRUE
+
+/obj/item/clothing/under/new_uniform/chvk
+ name = "PCRC uniform"
+ icon_state = "pcrcsuit"
+ item_state = "pcrcsuit"
+ worn_state = "pcrcsuit"
+ gender_icons = TRUE
+
+//Куртки и прочий мусор в слоте EXOSUIT
+/obj/item/clothing/suit/new_suits
+ icon = 'maps/sierra/icons/obj/clothing/new_loadout_icons.dmi'
+ item_icons = list(slot_wear_suit_str = 'maps/sierra/icons/obj/clothing/new_loadout.dmi')
+ sprite_sheets = list(
+ SPECIES_TAJARA = 'maps/sierra/icons/obj/clothing/new_loadout_tajara.dmi',
+ SPECIES_UNATHI = 'maps/sierra/icons/obj/clothing/new_loadout_unati.dmi'
+ )
+
+/obj/item/clothing/suit/new_suits/crystaljock
+ name = "crystaljock bobmer"
+ desc = "This neckband is really... something."
+ icon_state = "crystaljock"
+
+/obj/item/clothing/suit/new_suits/shortcoat
+ icon_state = "shortcoat"
+ desc = "A felt french coat. Incredibly warm and is heavy as well."
+
+/obj/item/clothing/suit/new_suits/freefit_shirt
+ name = "freefit shirt"
+ desc = "This silken fabric is like a breath of fresh air."
+ icon_state = "freefit_shirt_1"
+
+/obj/item/clothing/suit/new_suits/freefit_shirt/second
+ icon_state = "freefit_shirt_2"
+
+/obj/item/clothing/suit/new_suits/freefit_shirt/third
+ icon_state = "freefit_shirt_3"
+
+/obj/item/clothing/suit/new_suits/crop_sweater
+ name = "crop sweater"
+ desc = "Well, this seems impractical. Are you actually cold or not?"
+ icon_state = "crop_sweater_1"
+
+/obj/item/clothing/suit/new_suits/crop_sweater/second
+ icon_state = "crop_sweater_2"
+
+/obj/item/clothing/suit/new_suits/crop_sweater/third
+ icon_state = "crop_sweater_3"
+
+/obj/item/clothing/suit/new_suits/denim_jacket
+ name = "denim jacket"
+ desc = "Behold - the pinnacle of colonial fashion."
+ icon_state = "denim_jacket"
+
+/obj/item/clothing/suit/new_suits/denim_jacket/gray
+ icon_state = "denim_jacket_gray"
+
+/obj/item/clothing/suit/new_suits/rugby //red
+ name = "Red rugby"
+ desc = "The pinnacle of the sportswear amongst school bullies."
+ icon_state = "rugby_red"
+
+/obj/item/clothing/suit/new_suits/rugby/black
+ name = "Black rugby"
+ icon_state = "rugby_black"
+
+/obj/item/clothing/suit/new_suits/rugby/blue
+ name = "Blue rugby"
+ icon_state = "rugby_blue"
+
+/obj/item/clothing/suit/new_suits/rugby/brown
+ name = "Brown rugby"
+ icon_state = "rugby_brown"
+
+/obj/item/clothing/suit/new_suits/engjacket
+ name = "Engineer jacket"
+ desc = "A bright yellow jacket with NSV Sierra insignia and high-visibility reflective stripes."
+ icon_state = "engjacket"
+
+/obj/item/clothing/suit/new_suits/cargojacket
+ name = "Cargo jacket"
+ desc = "A brown sturdy jacket with NSV Sierra insignia on its back."
+ icon_state = "cargojacket"
+
+/obj/item/clothing/suit/new_suits/amizov
+ name = "striped pullover"
+ desc = "This pullover oddly reminisces you of some old video game."
+ icon_state = "amizov"
+
+/obj/item/clothing/suit/new_suits/grimjacket
+ name = "Another cool jacket"
+ icon_state = "grimjacket"
+
+/obj/item/clothing/suit/storage/toggle/bomber_navy
+ name = "bomber navy"
+ desc = "Very warm jacket made of tanned leather with fleece inner."
+ icon = 'maps/sierra/icons/obj/clothing/new_loadout.dmi'
+ item_icons = list(slot_wear_suit_str = 'maps/sierra/icons/obj/clothing/new_loadout.dmi')
+ icon_state = "bomber_navy"
+ body_parts_covered = UPPER_TORSO|ARMS
+ cold_protection = UPPER_TORSO|ARMS
+ min_cold_protection_temperature = T0C - 20
+ siemens_coefficient = 0.7
+
+/obj/item/clothing/suit/storage/hooded/hoodie/gorka
+ name = "olive gorka"
+ desc = "A warm gorka suit."
+ item_flags = ITEM_FLAG_THICKMATERIAL
+ icon = 'maps/sierra/icons/obj/clothing/new_loadout_icons.dmi'
+ item_icons = list(slot_wear_suit_str = 'maps/sierra/icons/obj/clothing/new_loadout.dmi')
+ sprite_sheets = list(
+ SPECIES_TAJARA = 'maps/sierra/icons/obj/clothing/new_loadout_tajara.dmi',
+ SPECIES_UNATHI = 'maps/sierra/icons/obj/clothing/new_loadout_unati.dmi'
+ )
+ icon_state = "gorka_olive"
+ hoodtype = /obj/item/clothing/head/hoodiehood/gorka
+
+/obj/item/clothing/head/hoodiehood/gorka
+ name = "gorka hood"
+ desc = "A gorka hood attached to a warm gorka suit."
+
+/obj/item/clothing/suit/storage/hooded/hoodie/gorka/tan
+ name = "tan gorka"
+ icon_state = "gorka_tan"
+ hoodtype = /obj/item/clothing/head/hoodiehood/gorka
+
+/obj/item/clothing/suit/storage/hooded/hoodie/gorka/blue
+ name = "blue gorka"
+ icon_state = "gorka_blue"
+ hoodtype = /obj/item/clothing/head/hoodiehood/gorka
+
+/obj/item/clothing/suit/color/storage/neo_blaser
+ name = "neokitsch blaser"
+ desc = "Style and substance. Show everyone all these money ain't for nothing."
+ icon = 'maps/sierra/icons/obj/clothing/new_loadout_icons.dmi'
+ icon_state = "neokitsch_blaser"
+ item_icons = list(slot_wear_suit_str = 'maps/sierra/icons/obj/clothing/new_loadout.dmi')
+ sprite_sheets = list(
+ SPECIES_TAJARA = 'maps/sierra/icons/obj/clothing/new_loadout_tajara.dmi',
+ SPECIES_UNATHI = 'maps/sierra/icons/obj/clothing/new_loadout_unati.dmi'
+ )
+
+/obj/item/clothing/suit/color/storage/neo_blaser/female
+ icon_state = "neokitsch_blaser_f"
+
+/obj/item/clothing/suit/color/storage/neo_jacket
+ name = "neokitsch jacket"
+ desc = "Style and substance. Show everyone all these money ain't for nothing."
+ icon = 'maps/sierra/icons/obj/clothing/new_loadout_icons.dmi'
+ icon_state = "neokitsch_jacket"
+ item_icons = list(slot_wear_suit_str = 'maps/sierra/icons/obj/clothing/new_loadout.dmi')
+ sprite_sheets = list(
+ SPECIES_TAJARA = 'maps/sierra/icons/obj/clothing/new_loadout_tajara.dmi',
+ SPECIES_UNATHI = 'maps/sierra/icons/obj/clothing/new_loadout_unati.dmi'
+ )
+
+/obj/item/clothing/suit/color/storage/neo_jacket/female
+ icon_state = "neokitsch_jacket_f"
+
+//Обувь
+/obj/item/clothing/shoes/trekking_boots
+ name = "Trekking boots"
+ desc = "A pair of sleek and ergonomical military-style sneakers."
+ icon = 'maps/sierra/icons/obj/clothing/new_loadout_icons.dmi'
+ item_icons = list(slot_shoes_str = 'maps/sierra/icons/obj/clothing/new_loadout.dmi')
+ sprite_sheets = list(
+ SPECIES_TAJARA = 'maps/sierra/icons/obj/clothing/new_loadout_tajara.dmi',
+ SPECIES_UNATHI = 'maps/sierra/icons/obj/clothing/new_loadout_unati.dmi'
+ )
+ icon_state = "trekking_boots"
+ species_restricted = list("exclude", SPECIES_NABBER, SPECIES_VOX)
+
+//Шляпки
+/obj/item/clothing/head/drill_sergeant
+ name = "drill sergeant's hat"
+ desc = "Assert the dominance."
+ icon = 'maps/sierra/icons/obj/clothing/new_loadout_icons.dmi'
+ item_icons = list(slot_head_str = 'maps/sierra/icons/obj/clothing/new_loadout.dmi')
+ icon_state = "sergeants"
+ item_state = "sergeants"
+
+//Нижнее бельё
+/datum/category_item/underwear/undershirt/yukata
+ name = "Yukata shirt"
+ icon = 'maps/sierra/icons/obj/clothing/new_loadout_icons.dmi'
+ icon_state = "yukata"
+
+/obj/item/clothing/suit/surgicalapron
+ icon = 'maps/sierra/icons/obj/clothing/new_loadout.dmi'
+ icon_state = "surgical_down"
+ item_icons = list(slot_wear_suit_str = 'maps/sierra/icons/obj/clothing/new_loadout.dmi')
diff --git a/maps/sierra/loadout/loadout_suit.dm b/maps/sierra/loadout/loadout_suit.dm
index 99ac4b8d03b51..4adb7c3f86e2e 100644
--- a/maps/sierra/loadout/loadout_suit.dm
+++ b/maps/sierra/loadout/loadout_suit.dm
@@ -118,3 +118,118 @@
options["formal SFP jacket"] = /obj/item/clothing/suit/storage/toggle/agent_jacket/formal
options["SFP patrol cloak"] = /obj/item/clothing/suit/storage/agent_rain
gear_tweaks += new/datum/gear_tweak/path(options)
+
+//papa leroy and honk
+/datum/gear/suit/shortcoat
+ display_name = "shortcoat"
+ path = /obj/item/clothing/suit/new_suits/shortcoat
+
+/datum/gear/suit/freefit_shirt
+ display_name = "freefit shirt"
+ path = /obj/item/clothing/suit
+
+/datum/gear/suit/freefit_shirt/New()
+ . = ..()
+ var/list/options = list()
+ options["blue freefit shirt"] = /obj/item/clothing/suit/new_suits/freefit_shirt
+ options["black freefit shirt with red stripes"] = /obj/item/clothing/suit/new_suits/freefit_shirt/second
+ options[ "black freefit shirt with yellow stripes"] = /obj/item/clothing/suit/new_suits/freefit_shirt/third
+ gear_tweaks += new/datum/gear_tweak/path(options)
+
+/datum/gear/suit/cropped_shirt
+ display_name = "cropped shirt"
+ path = /obj/item/clothing/suit
+
+/datum/gear/suit/cropped_shirt/New()
+ . = ..()
+ var/list/options = list()
+ options["black and red cropped sweater"] = /obj/item/clothing/suit/new_suits/crop_sweater
+ options["black and yellow cropped sweater"] = /obj/item/clothing/suit/new_suits/crop_sweater/second
+ options["white cropped sweater"] = /obj/item/clothing/suit/new_suits/crop_sweater/third
+ gear_tweaks += new/datum/gear_tweak/path(options)
+
+/datum/gear/suit/denim_jacket
+ display_name = "denim jacket"
+ path = /obj/item/clothing/suit/new_suits/denim_jacket
+
+/datum/gear/suit/rugby
+ display_name = "Rugby"
+ path = /obj/item/clothing/suit
+
+/datum/gear/suit/rugby/New()
+ . = ..()
+ var/list/options = list()
+ options["red rugby"] = /obj/item/clothing/suit/new_suits/rugby
+ options["black rugby"] = /obj/item/clothing/suit/new_suits/rugby/black
+ options["blue rugby"] = /obj/item/clothing/suit/new_suits/rugby/blue
+ options["brown rugby"] = /obj/item/clothing/suit/new_suits/rugby/brown
+ gear_tweaks += new/datum/gear_tweak/path(options)
+
+/datum/gear/suit/enjijacket
+ display_name = "engineer jacket"
+ path = /obj/item/clothing/suit/new_suits/engjacket
+
+/datum/gear/suit/cargo_jacket
+ display_name = "cargo jacket"
+ path = /obj/item/clothing/suit/new_suits/cargojacket
+
+/datum/gear/suit/cool_jacket
+ display_name = "cool jacket"
+ path = /obj/item/clothing/suit/new_suits/amizov
+
+/datum/gear/suit/grimjacket
+ display_name = "grim jacket"
+ path = /obj/item/clothing/suit/new_suits/grimjacket
+
+/datum/gear/suit/bomber_navy
+ display_name = "bomber navy"
+ path = /obj/item/clothing/suit/storage/toggle/bomber_navy
+
+/datum/gear/suit/gorka_pants
+ display_name = "gorka pants"
+ path = /obj/item/clothing/suit
+
+/datum/gear/suit/gorka_pants/New()
+ . = ..()
+ var/list/options = list()
+ options["olive gorka pants"] = /obj/item/clothing/under/new_uniform/gorka_pants
+ options["tan gorka pants"] = /obj/item/clothing/under/new_uniform/gorka_pants/tan
+ options["blue gorka pants"] = /obj/item/clothing/under/new_uniform/gorka_pants/blue
+ gear_tweaks += new/datum/gear_tweak/path(options)
+
+
+/datum/gear/suit/gorka
+ display_name = "gorka suit"
+ path = /obj/item/clothing/suit
+
+/datum/gear/suit/gorka/New()
+ . = ..()
+ var/list/options = list()
+ options["olive gorka"] = /obj/item/clothing/suit/storage/hooded/hoodie/gorka
+ options["tan gorka"] = /obj/item/clothing/suit/storage/hooded/hoodie/gorka/tan
+ options["blue gorka"] = /obj/item/clothing/suit/storage/hooded/hoodie/gorka/blue
+ gear_tweaks += new/datum/gear_tweak/path(options)
+
+/datum/gear/suit/neo_blaser
+ display_name = "neokitsch blaser"
+ path = /obj/item/clothing/suit/color/storage/neo_blaser
+ flags = GEAR_HAS_COLOR_SELECTION
+
+/datum/gear/suit/neo_blaser/New()
+ . = ..()
+ var/list/options = list()
+ options["man"] = /obj/item/clothing/suit/color/storage/neo_blaser
+ options["female"] = /obj/item/clothing/suit/color/storage/neo_blaser/female
+ gear_tweaks += new/datum/gear_tweak/path(options)
+//У одежды ниже ломается выбор цвета, описания и прочий кал. Почему? Если бы я знал
+//TODO: починить шмот ниже
+/datum/gear/suit/neo_jacket
+ display_name = "neo jacket"
+ path = /obj/item/clothing/suit/color/storage/neo_jacket
+ flags = GEAR_HAS_COLOR_SELECTION
+
+/datum/gear/suit/neo_jacket/New()
+ var/list/options = list()
+ options["man"] = /obj/item/clothing/suit/color/storage/neo_jacket
+ options["female"] = /obj/item/clothing/suit/color/storage/neo_jacket/female
+ gear_tweaks += new/datum/gear_tweak/path(options)
diff --git a/maps/sierra/loadout/loadout_uniform.dm b/maps/sierra/loadout/loadout_uniform.dm
index 2a8cd354d8476..8cb0932909617 100644
--- a/maps/sierra/loadout/loadout_uniform.dm
+++ b/maps/sierra/loadout/loadout_uniform.dm
@@ -96,3 +96,83 @@
/datum/gear/suit/unathi/officer_uniform
allowed_roles = SECURITY_ROLES
+
+//papaleroy and honk
+/datum/gear/uniform/cargo_trousers
+ display_name = "cargo trousers"
+ path = /obj/item/clothing/under/new_uniform/cargo_trousers
+
+/datum/gear/uniform/cargo_pants
+ display_name = "cargo pants"
+ path = /obj/item/clothing/under/new_uniform/cargos
+
+/datum/gear/uniform/neotac
+ display_name = "neotac pants"
+ path = /obj/item/clothing/under/new_uniform/neotac
+
+/datum/gear/uniform/breeches
+ display_name = "denim breeches"
+ path = /obj/item/clothing/under/new_uniform/breeches
+
+/datum/gear/uniform/gorka_pants
+ display_name = "olive gorka paints"
+ path = /obj/item/clothing/under/new_uniform/gorka_pants
+
+/datum/gear/uniform/gorka_pants/New()
+ ..()
+ var/uniforms = list()
+ uniforms["Olive gorka paints"] = /obj/item/clothing/under/new_uniform/gorka_pants
+ uniforms["Tan gorka paints"] = /obj/item/clothing/under/new_uniform/gorka_pants/tan
+ uniforms["Blue gorka paints"] = /obj/item/clothing/under/new_uniform/gorka_pants/blue
+ gear_tweaks += new/datum/gear_tweak/path(uniforms)
+
+/datum/gear/uniform/netrunner
+ path = /obj/item/clothing/under/new_uniform/netrunner
+ display_name = "specialized netrunner suit"
+
+/datum/gear/uniform/plain_suit
+ display_name = "White plain suit"
+ path = /obj/item/clothing/under/new_uniform/plain_suit
+
+/datum/gear/uniform/plain_suit/New()
+ var/uniforms = list()
+ uniforms["White plain suit"] = /obj/item/clothing/under/new_uniform/plain_suit
+ uniforms["Dark plain suit"] = /obj/item/clothing/under/new_uniform/plain_suit_dark
+ gear_tweaks += new/datum/gear_tweak/path(uniforms)
+
+/datum/gear/uniform/kitsch_dress
+ display_name = "kitsch dress"
+ path = /obj/item/clothing/under/new_uniform/kitsch_dress
+
+/datum/gear/uniform/kitsch_dress/New()
+ var/uniforms = list()
+ uniforms["Blue-yellow kitsch dress"] = /obj/item/clothing/under/new_uniform/kitsch_dress
+ uniforms["Gray-violet kitsch dress"] = /obj/item/clothing/under/new_uniform/kitsch_dress/second
+ uniforms["White-dark kitsch dress"] = /obj/item/clothing/under/new_uniform/kitsch_dress/third
+ gear_tweaks += new/datum/gear_tweak/path(uniforms)
+
+/datum/gear/uniform/cherry_suit
+ display_name = "cherry suit"
+ path = /obj/item/clothing/under/new_uniform/cherry_suit
+
+/datum/gear/uniform/bdu
+ display_name = "BDU suite"
+ path = /obj/item/clothing/under/new_uniform/bdu
+
+/datum/gear/uniform/ems
+ display_name = "emergency medical responder's jumpsuit"
+ path = /obj/item/clothing/under/new_uniform/ems
+
+/datum/gear/uniform/ems/New()
+ var/uniforms = list()
+ uniforms["dark ems suit"] = /obj/item/clothing/under/new_uniform/ems
+ uniforms["white ems suit"] = /obj/item/clothing/under/new_uniform/ems/white
+ gear_tweaks += new/datum/gear_tweak/path(uniforms)
+
+/datum/gear/uniform/rubiwhite
+ display_name = "Rubiwhite"
+ path = /obj/item/clothing/under/new_uniform/papaleroy_rubiwhite
+
+/datum/gear/uniform/pcrc
+ display_name = "PCRC uniform"
+ path = /obj/item/clothing/under/new_uniform/chvk
diff --git a/maps/sierra/sierra.dm b/maps/sierra/sierra.dm
index 0dcf28ab95e8b..4a0b96101a66a 100644
--- a/maps/sierra/sierra.dm
+++ b/maps/sierra/sierra.dm
@@ -77,6 +77,7 @@
#include "items/clothing/clothing.dm"
#include "items/clothing/exploration.dm"
+ #include "items/clothing/new_uniform.dm"
#include "items/clothing/override.dm"
#include "items/clothing/storages.dm"
#include "items/clothing/security.dm"
diff --git a/mods/_master_files/icons/obj/loadout_stuffs.dmi b/mods/_master_files/icons/obj/loadout_stuffs.dmi
new file mode 100644
index 0000000000000..f85aad433165f
Binary files /dev/null and b/mods/_master_files/icons/obj/loadout_stuffs.dmi differ
diff --git a/mods/anomaly/code/anomalies/anomaly_types/electra/_electra.dm b/mods/anomaly/code/anomalies/anomaly_types/electra/_electra.dm
index 3399d4c49735b..33c02a9093836 100644
--- a/mods/anomaly/code/anomalies/anomaly_types/electra/_electra.dm
+++ b/mods/anomaly/code/anomalies/anomaly_types/electra/_electra.dm
@@ -149,8 +149,9 @@
//Сперва мы обозначаем КУДА мы ударим, после какого-то времени производим удар
/obj/electrostatic
icon = 'icons/effects/effects.dmi'
- icon_state = "blue_electricity_constant"
+ icon_state = "electricity_constant"
mouse_opacity = MOUSE_OPACITY_UNCLICKABLE
+ layer = 5001
/proc/tesla_act_start(target, attack_delay, obj/anomaly/electra/input_electra)
var/target_turf = get_turf(target)
@@ -173,8 +174,7 @@
/mob/living/proc/electoanomaly_damage(shock_damage, obj/source, def_zone = null)
if(status_flags & GODMODE) //godmode
return 0
-
- apply_damage(shock_damage, DAMAGE_BURN, def_zone, used_weapon="Electrocution")
+ apply_damage(shock_damage, DAMAGE_BURN, def_zone, used_weapon="Electrocution", armor_pen = 100, silent = TRUE)
return shock_damage
diff --git a/mods/anomaly/code/anomalies/anomaly_types/rvach.dm b/mods/anomaly/code/anomalies/anomaly_types/rvach.dm
index fde459b1a33c9..dc43c1daa4ee9 100644
--- a/mods/anomaly/code/anomalies/anomaly_types/rvach.dm
+++ b/mods/anomaly/code/anomalies/anomaly_types/rvach.dm
@@ -60,25 +60,17 @@
if(prob(7 * victim.get_skill_value(SKILL_HAULING)))
victim.Weaken(10)
return
-
- //Создаём список органов, которые мы МОЖЕМ оторвать
- var/list/list_of_organs_types = list(
- /obj/item/organ/external/arm,
- /obj/item/organ/external/arm/right,
- /obj/item/organ/external/leg,
- /obj/item/organ/external/leg/right
- )
- var/obj/item/organ/external/to_destroy = pick(list_of_organs_types)
- for(var/obj/item/organ/external/E in victim.organs)
- if(E.type == to_destroy)
- E.take_external_damage(500)
- playsound(src, 'mods/anomaly/sounds/rvach_gibbed.ogg', 100, FALSE )
+ victim.apply_damage(500, DAMAGE_BRUTE, pick(BP_R_ARM, BP_L_ARM, BP_R_LEG, BP_L_LEG), armor_pen = 100)
+ playsound(src, 'mods/anomaly/sounds/rvach_gibbed.ogg', 100, FALSE )
else if(istype(target, /mob/living))
var/mob/living/victim = target
SSanom.add_last_gibbed(target, "Рвач")
victim.gib()
playsound(src, 'mods/anomaly/sounds/rvach_gibbed.ogg', 100, FALSE )
- else if(istype(target, /obj/item))
+ else if(istype(target, /obj/item/artefact))
+ var/obj/item/artefact/detected_artefact = target
+ detected_artefact.rvach_destroy_effect()
+ else if(isitem(target))
qdel(target)
else if(istype(target, /obj/structure/mech_wreckage))
qdel(target)
@@ -134,19 +126,23 @@
detected_atom.throw_at(target_turf, local_range_of_throw, 5)
-/proc/rvach_pull_around(atom/target, pull_range = 255, pull_power = STAGE_FIVE)
+/proc/rvach_pull_around(atom/target, pull_range = 255)
for(var/atom/A in range(pull_range, target))
if(ismech(A))
continue
- A.rvach_anomaly_pull(get_turf(target), pull_power)
+ A.rvach_anomaly_pull(get_turf(target))
-/atom/proc/rvach_anomaly_pull(turf/target, current_size)
+/atom/proc/rvach_anomaly_pull(turf/target)
return
-/obj/item/rvach_anomaly_pull(turf/target, current_size)
+/obj/item/rvach_anomaly_pull(turf/target)
step_towards(src, target)
+/obj/item/artefact/rvach_anomaly_pull(turf/target)
+ src.forceMove(target)
+
+
/mob/living/rvach_anomaly_pull(turf/target, current_size)
step_towards(src, target)
Weaken(5)
diff --git a/mods/anomaly/code/anomalies/anomaly_types/tramplin.dm b/mods/anomaly/code/anomalies/anomaly_types/tramplin.dm
index 8cd46868255cc..4487969f332a7 100644
--- a/mods/anomaly/code/anomalies/anomaly_types/tramplin.dm
+++ b/mods/anomaly/code/anomalies/anomaly_types/tramplin.dm
@@ -28,7 +28,8 @@
/obj/anomaly/tramplin/Initialize()
. = ..()
- range_of_throw = rand(2,5)
+ if(ranzomize_with_initialize)
+ range_of_throw = rand(2,5)
/obj/anomaly/tramplin/activate_anomaly()
for(var/obj/item/target in src.loc)
diff --git a/mods/anomaly/code/anomalies/premades/anomalies_premades.dm b/mods/anomaly/code/anomalies/premades/anomalies_premades.dm
index 1a95ef758a421..d7eefeeafeda3 100644
--- a/mods/anomaly/code/anomalies/premades/anomalies_premades.dm
+++ b/mods/anomaly/code/anomalies/premades/anomalies_premades.dm
@@ -40,3 +40,9 @@
/obj/anomaly/electra/three_and_three/preload
need_preload = TRUE
+
+/obj/anomaly/tramplin/powerfull
+ random_throw_dir = FALSE
+ ranzomize_with_initialize = FALSE
+ range_of_throw = 10
+ speed_of_throw = 10
diff --git a/mods/anomaly/code/artefacts/_artefact_external_interact.dm b/mods/anomaly/code/artefacts/_artefact_external_interact.dm
index 26a3ccbb4bf1d..7b1d02d765538 100644
--- a/mods/anomaly/code/artefacts/_artefact_external_interact.dm
+++ b/mods/anomaly/code/artefacts/_artefact_external_interact.dm
@@ -87,6 +87,9 @@
/obj/item/artefact/proc/react_at_can_fall(mob/living/user)
return
+/obj/item/artefact/proc/rvach_destroy_effect()
+ return
+
/mob/living/emp_act(severity)
var/list/result_effects = calculate_artefact_reaction(src, "ЭМИ")
if(result_effects)
diff --git a/mods/anomaly/code/artefacts/_artefact_processing.dm b/mods/anomaly/code/artefacts/_artefact_processing.dm
index ca4506da8c191..1b06a5b5f0243 100644
--- a/mods/anomaly/code/artefacts/_artefact_processing.dm
+++ b/mods/anomaly/code/artefacts/_artefact_processing.dm
@@ -16,6 +16,8 @@
/obj/item/artefact/Initialize()
. = ..()
+ prev_loc = get_turf(src)
+ LAZYADD(SSanom.artefacts_list_in_world , src)
user_long_check_cooldown = rand(3 SECONDS, 6 SECONDS)
user_check_cooldown = rand(2 SECONDS, 4 SECONDS)
additional_process_cooldown = rand(20 SECONDS, 50 SECONDS)
@@ -71,10 +73,17 @@
// В случае перемещения предмета между contents или подбора, обновляет своего ПОЛЬЗОВАТЕЛЯ
if(current_user) //Юзер уже есть,
if(get_turf(current_user) != get_turf(src)) //проверяем,
- current_user = null
+ disconnect_user(user)
else if(!current_user)
- current_user = user
+ connect_user(user)
+/obj/item/artefact/proc/disconnect_user(mob/living/user)
+ stop_process_by_ssanom()
+ current_user = null
+
+/obj/item/artefact/proc/connect_user(mob/living/user)
+ start_process_by_ssanom()
+ current_user = user
/obj/item/artefact/proc/start_process_by_ssanom()
if(!is_processing)
diff --git a/mods/anomaly/code/artefacts/_artefact_spawn.dm b/mods/anomaly/code/artefacts/_artefact_spawn.dm
index 52f5de4f5146b..f2f2111b918b0 100644
--- a/mods/anomaly/code/artefacts/_artefact_spawn.dm
+++ b/mods/anomaly/code/artefacts/_artefact_spawn.dm
@@ -64,5 +64,4 @@
var/artifact = pick(artefacts)
var/obj/item/artefact/spawned_artefact = new artifact(result)
spawned_artefact.connected_to_anomaly = TRUE
- LAZYADD(SSanom.artefacts_list_in_world ,spawned_artefact)
SSanom.artefacts_spawned_by_game++
diff --git a/mods/anomaly/code/artefacts/_interact_with_artefacts.dm b/mods/anomaly/code/artefacts/_interact_with_artefacts.dm
index a22ad22c1c595..c66f3540074b4 100644
--- a/mods/anomaly/code/artefacts/_interact_with_artefacts.dm
+++ b/mods/anomaly/code/artefacts/_interact_with_artefacts.dm
@@ -5,11 +5,6 @@
var/turf/prev_loc
//Подбор артефакта
-
-/obj/item/artefact/Initialize()
- . = ..()
- prev_loc = get_turf(src)
-
/obj/item/artefact/attack_hand(mob/user as mob)
if(inmech_sec(user))
to_chat(user, SPAN_WARNING("Вы недотягиваетесь."))
@@ -127,6 +122,8 @@
/obj/item/artefact/proc/rub_interaction(mob/living/user)
return
+/obj/item/artefact/rvach_destroy_effect()
+ delete_artefact()
///ВЗАИМОДЕЙСТВИЯ ОТ МАШИНЫ ДЛЯ ИЗУЧЕНИЙ И АНАЛИЗА
/obj/item/artefact/proc/urm_radiation(mob/living/user)
diff --git a/mods/anomaly/code/artefacts/artefact_flyer.dm b/mods/anomaly/code/artefacts/artefact_flyer.dm
index bb5e9ea192568..f04b5f1284948 100644
--- a/mods/anomaly/code/artefacts/artefact_flyer.dm
+++ b/mods/anomaly/code/artefacts/artefact_flyer.dm
@@ -64,11 +64,14 @@
/obj/item/artefact/flyer/urm_phoron(mob/living/user)
return "Обьект не реагирует"
-
-
/obj/item/artefact/flyer/process_artefact_effect_to_user()
if(current_user.stamina < 85)
current_user.adjust_stamina(5)
+ if(istype(current_user, /mob/living/carbon/human/adherent) || current_user.is_floating)
+ return
+ current_user.pass_flags |= PASS_FLAG_TABLE
+ if(current_user.floatiness <= 5)
+ current_user.make_floating(5)
/mob/living/carbon/human/can_fall(anchor_bypass, turf/location_override)
var/list/result_effects = calculate_artefact_reaction(src, "Возможность упасть")
@@ -77,7 +80,6 @@
return
.=..()
-
/obj/item/artefact/flyer/react_at_tramplin(mob/living/user)
. = ..()
return "Усиливает дальность полёта"
@@ -87,3 +89,17 @@
/obj/item/artefact/flyer/react_at_can_fall(mob/living/user)
return "Держит в воздухе"
+
+/obj/item/artefact/flyer/rvach_destroy_effect()
+ //У нас нет турфа?
+ if(!src.loc)
+ return
+ var/started_in = world.time
+ var/list/turfs_for_spawn = list()
+ //Собираем все турфы в определённом радиусе
+ for(var/turf/choosed_turf in RANGE_TURFS(src.loc, 5))
+ if(!TurfBlocked(choosed_turf) && !TurfBlockedByAnomaly(choosed_turf))
+ LAZYADD(turfs_for_spawn, choosed_turf)
+ var/list/possible_anomalies = list(/obj/anomaly/tramplin/powerfull)
+ generate_anomalies_in_turfs(possible_anomalies, turfs_for_spawn, 10, 20, 0, 0, null, null, "разрыв малого артефакта", started_in)
+ delete_artefact()
diff --git a/mods/anomaly/code/artefacts/artefact_gravi.dm b/mods/anomaly/code/artefacts/artefact_gravi.dm
index f8131b7b613f2..ea57435551584 100644
--- a/mods/anomaly/code/artefacts/artefact_gravi.dm
+++ b/mods/anomaly/code/artefacts/artefact_gravi.dm
@@ -109,3 +109,6 @@
/obj/item/artefact/gravi/react_at_failing(mob/living/user)
return "Защищает от падения"
+
+/obj/item/artefact/rvach_destroy_effect()
+ return
diff --git a/mods/anomaly/code/detectors_and_etc/artefact_detector.dm b/mods/anomaly/code/detectors_and_etc/artefact_detector.dm
index f96547fff1a5d..a1b237cbf6a0d 100644
--- a/mods/anomaly/code/detectors_and_etc/artefact_detector.dm
+++ b/mods/anomaly/code/detectors_and_etc/artefact_detector.dm
@@ -66,7 +66,7 @@
var/list/good_z_artefacts_list = list()
for(var/obj/item/artefact/choosed_artefact in SSanom.artefacts_list_in_world)
- if(get_z(src) == get_z(choosed_artefact))
+ if(get_z(src) == get_z(choosed_artefact) && !istype(choosed_artefact.loc, /obj/item/collector))
LAZYADD(good_z_artefacts_list,choosed_artefact)
if(!LAZYLEN(good_z_artefacts_list)) //Артефакты то есть в мире, но не на нашем Z уровне
diff --git a/mods/anomaly/code/detectors_and_etc/bolt.dm b/mods/anomaly/code/detectors_and_etc/bolt.dm
index 7cd25210af80e..b9b8b61d6c0f0 100644
--- a/mods/anomaly/code/detectors_and_etc/bolt.dm
+++ b/mods/anomaly/code/detectors_and_etc/bolt.dm
@@ -6,6 +6,12 @@
w_class = ITEM_SIZE_TINY
matter = list(MATERIAL_STEEL = 200)
+/obj/item/bolt/throw_at(atom/target, range, speed, mob/thrower, spin, datum/callback/callback)
+ . = ..()
+ for(var/obj/item/storage/bolt_bag/detected_bag in thrower)
+ detected_bag.attack_self(thrower)
+ break
+
/obj/item/bolt/Crossed(O)
. = ..()
if(ishuman(usr))
@@ -28,8 +34,11 @@
var/autocollect = TRUE
/obj/item/storage/bolt_bag/attack_self(mob/living/user)
- if(LAZYLEN(contents))
+ if(user.get_active_hand()) //Что-то в руке есть
+ src.use_tool(user.get_active_hand())
+ else if(LAZYLEN(contents))
usr.put_in_hands(pick(contents))
+ user.throw_mode_on()
/obj/item/storage/bolt_bag/examine(mob/user, distance, is_adjacent)
@@ -75,10 +84,6 @@
. = ..()
on_update_icon()
-/obj/item/bolt/advanced_bolt/add_fingerprint(mob/M, ignoregloves, obj/item/tool)
- on_update_icon()
- . = ..()
-
/obj/item/bolt/advanced_bolt/on_update_icon()
. = ..()
var/turf/current_turf = get_turf(src)
diff --git a/mods/anomaly/code/detectors_and_etc/collector.dm b/mods/anomaly/code/detectors_and_etc/collector.dm
index a7c846d081c8a..929f8f3bdc51e 100644
--- a/mods/anomaly/code/detectors_and_etc/collector.dm
+++ b/mods/anomaly/code/detectors_and_etc/collector.dm
@@ -94,6 +94,8 @@
icon_state = "collector_zjar"
else if(istype(stored_artefact, /obj/item/artefact/gravi))
icon_state = "collector_gravi"
+ else if(istype(stored_artefact, /obj/item/artefact/flyer))
+ icon_state = "collector_flyer"
else if(!stored_artefact)
icon_state = "collector_empty"
diff --git a/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/flying_planet/clouds.dm b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/flying_planet/clouds.dm
index dd9ace72beb41..70bf897ad2173 100644
--- a/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/flying_planet/clouds.dm
+++ b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/flying_planet/clouds.dm
@@ -22,7 +22,7 @@
if(isanomalyhere(src))
return
//Если обьект НЕ моб, НЕ предмет или прожектайл - игнор
- if((!ismech(AM) && !ismob(AM) && !isitem(AM)) || isprojectile(AM))
+ if((!ismech(AM) && !ismob(AM) && !isitem(AM)) || isprojectile(AM) || isobserver(AM))
return
if(locate(/obj/structure/catwalk) in src)
return
@@ -30,7 +30,7 @@
if(isliving(AM))
var/mob/living/L = AM
//Летающие существа не тревожат облака
- if (L.can_overcome_gravity())
+ if (L.can_overcome_gravity() || L.is_floating)
return
//Артефакты с этим эффектом заставят облака игнорировать существо
var/list/result_effects = calculate_artefact_reaction(L, "Возможность упасть")
@@ -53,16 +53,25 @@
//Собираем все обьекты на поверхности облачков
var/total_clouds_damage = 0
for(var/atom/movable/choosed_atom in src)
- if(isprojectile(choosed_atom) || isghost(choosed_atom) || (choosed_atom.anchored && !ismech(choosed_atom)))
+ if(isprojectile(choosed_atom) || isghost(choosed_atom) || (choosed_atom.anchored && !ismech(choosed_atom)) || isobserver(choosed_atom))
continue
if(ismech(choosed_atom))
total_clouds_damage += 100
else if(isitem(choosed_atom))
var/obj/item/choosed_item = choosed_atom
- total_clouds_damage += 5 * choosed_item.w_class
+ if(choosed_item.w_class == ITEM_SIZE_TINY)
+ total_clouds_damage += 0
+ else
+ total_clouds_damage += 5 * choosed_item.w_class
else if(isliving(choosed_atom))
var/mob/living/choosed_living = choosed_atom
- total_clouds_damage += choosed_living.mob_size
+ if(choosed_living.is_floating)
+ continue
+ if(choosed_living.lying)
+ total_clouds_damage += choosed_living.mob_size / 2
+ else
+ total_clouds_damage += choosed_living.mob_size
+
if(total_clouds_damage)
damage_clouds(total_clouds_damage)
else
diff --git a/mods/anomaly/icons/collectors.dmi b/mods/anomaly/icons/collectors.dmi
index 9cdef4e30b721..2ab739db6d706 100644
Binary files a/mods/anomaly/icons/collectors.dmi and b/mods/anomaly/icons/collectors.dmi differ
diff --git a/mods/anomaly/icons/pig.dmi b/mods/anomaly/icons/pig.dmi
new file mode 100644
index 0000000000000..31092fe28ab1f
Binary files /dev/null and b/mods/anomaly/icons/pig.dmi differ
diff --git a/mods/anomaly/maps/electra_ruins/bunker.dm b/mods/anomaly/maps/electra_ruins/bunker.dm
index 8908ee2ce82fb..42ae2810e03ce 100644
--- a/mods/anomaly/maps/electra_ruins/bunker.dm
+++ b/mods/anomaly/maps/electra_ruins/bunker.dm
@@ -12,3 +12,30 @@
/area/map_template/bunker
name = "\improper Science bunker"
icon_state = "A"
+ turfs_airless = TRUE
+
+/turf/simulated/wall/titanium/bunker_map/Initialize()
+ . = ..()
+ name = "Armored titanium wall"
+
+/turf/simulated/wall/titanium/bunker_map/damage_health(damage, damage_type, damage_flags, severity, skip_can_damage_check)
+ SHOULD_CALL_PARENT(FALSE)
+ return
+
+
+/turf/simulated/wall/titanium/bunker_map/use_tool(obj/item/W, mob/living/user, list/click_params)
+ SHOULD_CALL_PARENT(FALSE)
+ return //С этой стеной вообще нельзя взаимодействовать
+
+/obj/item/toy/bronze_pig
+ name = "bronze pig"
+ desc = "This bronze piglet is the ultimate home decor flex—small, shiny, and ready to oink its way into your heart"
+ icon_state = "bronze_pig"
+ w_class = ITEM_SIZE_GARGANTUAN
+ icon = 'mods/anomaly/icons/pig.dmi'
+
+/obj/item/toy/bronze_pig/Initialize()
+ slowdown_per_slot[slot_l_hand] = 5
+ slowdown_per_slot[slot_r_hand] = 5
+
+ . = ..()
diff --git a/mods/anomaly/maps/electra_ruins/bunker.dmm b/mods/anomaly/maps/electra_ruins/bunker.dmm
index b3fc7006996c4..7f261f2ab4213 100644
--- a/mods/anomaly/maps/electra_ruins/bunker.dmm
+++ b/mods/anomaly/maps/electra_ruins/bunker.dmm
@@ -156,6 +156,12 @@
/obj/decal/cleanable/dirt,
/turf/simulated/floor/holofloor/tiled,
/area/map_template/bunker)
+"oX" = (
+/obj/structure/table/steel_reinforced,
+/obj/decal/cleanable/dirt,
+/obj/random/firstaid,
+/turf/simulated/floor/holofloor/tiled,
+/area/map_template/bunker)
"pl" = (
/obj/structure/reagent_dispensers/watertank,
/obj/decal/cleanable/dirt,
@@ -168,9 +174,11 @@
/turf/simulated/floor/holofloor/tiled,
/area/map_template/bunker)
"qL" = (
-/obj/structure/table/steel_reinforced,
-/obj/random/contraband,
/obj/decal/cleanable/dirt,
+/obj/structure/table/rack,
+/obj/item/storage/firstaid/combat,
+/obj/item/storage/firstaid/combat,
+/obj/item/storage/firstaid/combat,
/turf/simulated/floor/holofloor/tiled,
/area/map_template/bunker)
"qM" = (
@@ -221,18 +229,36 @@
/obj/decal/cleanable/dirt,
/turf/simulated/floor/holofloor/tiled,
/area/map_template/bunker)
+"vi" = (
+/obj/decal/cleanable/generic,
+/obj/decal/cleanable/dirt,
+/obj/item/disk/secret_project/science,
+/obj/random/documents{
+ pixel_y = -16;
+ pixel_x = -8
+ },
+/obj/random/documents,
+/turf/simulated/floor/holofloor/tiled,
+/area/map_template/bunker)
"vR" = (
-/obj/structure/broken_door,
-/obj/floor_decal/snow,
+/obj/structure/table/steel_reinforced,
+/obj/decal/cleanable/dirt,
+/obj/random/documents,
/turf/simulated/floor/holofloor/tiled,
/area/map_template/bunker)
"vW" = (
-/obj/structure/bed/padded{
- dir = 1
- },
-/obj/item/bedsheet/hop,
-/obj/structure/curtain/open/bed,
/obj/decal/cleanable/dirt,
+/obj/structure/table/steel_reinforced,
+/obj/item/paper/Court{
+ info = "Техника отказала, пишу на эту бумажку. Наш отряд вернулся с полевой экспедиции и обнаружила, что основная научная группа эвакуировалась. Если кто-то из наших вернётся, мы отправились на местную гору, высота номер 102, попытаемся свзяаться с штабом. Техника сгорела из-за откуда-то взявшейся молнии, чертовщина...";
+ name = "Записка"
+ },
+/obj/random/documents,
+/obj/random/documents,
+/obj/item/disk/secret_project/science,
+/obj/item/disk/secret_project/science,
+/obj/item/disk/secret_project/science,
+/obj/item/disk/secret_project/science,
/turf/simulated/floor/holofloor/tiled,
/area/map_template/bunker)
"wa" = (
@@ -286,6 +312,14 @@
/obj/wallframe_spawn/reinforced/titanium,
/turf/template_noop,
/area/map_template/bunker)
+"zx" = (
+/obj/decal/cleanable/dirt,
+/obj/structure/table/rack,
+/obj/item/storage/firstaid/combat/special,
+/obj/item/storage/firstaid/combat/special,
+/obj/item/storage/firstaid/combat/special,
+/turf/simulated/floor/holofloor/tiled,
+/area/map_template/bunker)
"zW" = (
/obj/structure/curtain/open/shower,
/obj/decal/cleanable/dirt,
@@ -317,8 +351,16 @@
/turf/simulated/floor/holofloor/tiled,
/area/template_noop)
"Ek" = (
-/obj/machinery/door/blast/regular,
-/obj/structure/broken_door,
+/obj/structure/aurora/vault_door,
+/turf/simulated/floor/holofloor/tiled,
+/area/map_template/bunker)
+"Ey" = (
+/obj/decal/cleanable/dirt,
+/obj/item/disk/secret_project/science,
+/obj/random/documents,
+/obj/random/documents{
+ pixel_y = -14
+ },
/turf/simulated/floor/holofloor/tiled,
/area/map_template/bunker)
"Fi" = (
@@ -353,6 +395,12 @@
dir = 8
},
/obj/decal/cleanable/dirt,
+/obj/structure/table/steel_reinforced,
+/obj/item/disk/secret_project/science,
+/obj/item/disk/secret_project/science,
+/obj/item/disk/secret_project/science,
+/obj/random/documents,
+/obj/item/toy/bronze_pig,
/turf/simulated/floor/holofloor/tiled,
/area/map_template/bunker)
"Hk" = (
@@ -392,9 +440,15 @@
/obj/decal/cleanable/dirt,
/turf/simulated/floor/holofloor/tiled,
/area/map_template/bunker)
+"Oc" = (
+/obj/decal/cleanable/dirt,
+/obj/random/documents,
+/turf/simulated/floor/holofloor/tiled,
+/area/map_template/bunker)
"OQ" = (
/obj/structure/table/steel_reinforced,
/obj/decal/cleanable/dirt,
+/obj/random/contraband,
/turf/simulated/floor/holofloor/tiled,
/area/map_template/bunker)
"Pi" = (
@@ -446,6 +500,7 @@
dir = 4
},
/obj/decal/cleanable/dirt,
+/obj/random/documents,
/turf/simulated/floor/holofloor/tiled,
/area/map_template/bunker)
"WC" = (
@@ -455,6 +510,9 @@
/obj/floor_decal/snow,
/turf/simulated/floor/holofloor/tiled,
/area/template_noop)
+"WQ" = (
+/turf/simulated/wall/titanium/bunker_map,
+/area/map_template/bunker)
"XD" = (
/obj/structure/grille/broken,
/turf/simulated/floor/exoplanet/snow,
@@ -475,11 +533,23 @@
/obj/floor_decal/snow,
/turf/simulated/floor/holofloor/tiled,
/area/map_template/bunker)
+"YF" = (
+/obj/structure/table/steel_reinforced,
+/obj/decal/cleanable/dirt,
+/obj/item/integrated_circuit/arithmetic/random,
+/turf/simulated/floor/holofloor/tiled,
+/area/map_template/bunker)
"YK" = (
/obj/structure/grille/broken,
/obj/item/stack/material/rods,
/turf/simulated/floor/exoplanet/snow,
/area/template_noop)
+"YZ" = (
+/obj/decal/cleanable/dirt,
+/obj/item/disk/secret_project/science,
+/obj/random/documents,
+/turf/simulated/floor/holofloor/tiled,
+/area/map_template/bunker)
"Zu" = (
/obj/wallframe_spawn/reinforced/titanium,
/turf/simulated/wall/titanium,
@@ -1150,10 +1220,10 @@ cg
cg
cg
cg
-cg
-cg
-cg
-cg
+WQ
+WQ
+WQ
+WQ
XD
By
xu
@@ -1193,10 +1263,10 @@ ro
cg
BS
BS
-cg
+WQ
vW
GF
-cg
+WQ
ZL
ZL
ZL
@@ -1236,10 +1306,10 @@ qc
cg
vg
Lx
-cg
-vW
-AB
-cg
+WQ
+Ey
+YZ
+WQ
ZL
hq
ZL
@@ -1280,9 +1350,9 @@ IS
Lx
ro
Ek
-Lx
-AB
-vR
+vi
+Oc
+WQ
ZL
Yv
ZL
@@ -1322,10 +1392,10 @@ Gy
cg
vg
Lx
-cg
-AB
-AB
-cg
+WQ
+qL
+zx
+WQ
Yv
Yv
Yv
@@ -1365,10 +1435,10 @@ uX
cg
cg
IS
-cg
-cg
-cg
-cg
+WQ
+WQ
+WQ
+WQ
AB
AB
cg
@@ -1409,8 +1479,8 @@ cg
uE
Lx
OQ
-qL
-OQ
+AB
+oX
zk
AB
AB
@@ -1494,9 +1564,9 @@ wM
cg
br
Lx
-OQ
+vR
Vi
-OQ
+YF
Zu
AB
AB
diff --git a/mods/anomaly/maps/electra_ruins/deployed_generator.dm b/mods/anomaly/maps/electra_ruins/deployed_generator.dm
index bb0979030a5b1..ed6fa64f04baa 100644
--- a/mods/anomaly/maps/electra_ruins/deployed_generator.dm
+++ b/mods/anomaly/maps/electra_ruins/deployed_generator.dm
@@ -13,3 +13,4 @@
/area/map_template/deployed_generator
name = "\improper Deployed science generator"
icon_state = "A"
+ turfs_airless = TRUE
diff --git a/mods/anomaly/maps/electra_ruins/garage.dm b/mods/anomaly/maps/electra_ruins/garage.dm
index 270b19c53c19f..1a6474c07886b 100644
--- a/mods/anomaly/maps/electra_ruins/garage.dm
+++ b/mods/anomaly/maps/electra_ruins/garage.dm
@@ -14,6 +14,7 @@
/area/map_template/garage
name = "\improper Science garage"
icon_state = "A"
+ turfs_airless = TRUE
/area/map_template/garage/first_home
diff --git a/mods/dev_mode/code/dev_map/_dev_map.dm b/mods/dev_mode/code/dev_map/_dev_map.dm
index 9008c62cfd404..193ea424aaa9b 100644
--- a/mods/dev_mode/code/dev_map/_dev_map.dm
+++ b/mods/dev_mode/code/dev_map/_dev_map.dm
@@ -54,6 +54,7 @@
#include "../../../../maps/sierra/items/datajack.dm"
#include "../../../../maps/sierra/items/clothing/clothing.dm"
#include "../../../../maps/sierra/items/clothing/exploration.dm"
+ #include "../../../../maps\sierra\items\clothing\new_uniform.dm"
#include "../../../../maps/sierra/items/clothing/override.dm"
#include "../../../../maps/sierra/items/clothing/storages.dm"
#include "../../../../maps/sierra/items/clothing/security.dm"
diff --git a/mods/dev_mode/code/dev_map/dev_setup.dm b/mods/dev_mode/code/dev_map/dev_setup.dm
index fbddf6d30089f..38395fb226ed9 100644
--- a/mods/dev_mode/code/dev_map/dev_setup.dm
+++ b/mods/dev_mode/code/dev_map/dev_setup.dm
@@ -1,7 +1,6 @@
/datum/map/dev/setup_map()
..()
system_name = "Зазеркалье"
- minor_announcement = new(new_sound = sound(ANNOUNCER_COMMANDREPORT, volume = 45))
/datum/map/dev/map_info(victim)
to_chat(victim, "
Информация о карте
")
diff --git a/mods/global_modpacks.dm b/mods/global_modpacks.dm
index d5465bf76ce78..9854e087e330a 100644
--- a/mods/global_modpacks.dm
+++ b/mods/global_modpacks.dm
@@ -50,3 +50,4 @@
#include "item_identification/_item_identification_includes.dm"
#include "vehicle\_vehicle_includes.dm"
#include "../packs/sierra-tweaks/_pack.dm"
+#include "on_floor_icon\_on_floor_icons_includes.dm"
diff --git a/mods/on_floor_icon/README.md b/mods/on_floor_icon/README.md
new file mode 100644
index 0000000000000..2a65cbc32db27
--- /dev/null
+++ b/mods/on_floor_icon/README.md
@@ -0,0 +1,77 @@
+
+#### Список PRов:
+
+
+
+
+
+## Мод-пример
+
+ID мода: MODPACK_ON_FLOOR_ICON
+
+
+### Описание мода
+
+Рисует отдельный спрайт для обьектов на полу
+
+
+### Изменения *кор кода*
+
+Отсутствуют
+
+
+### Оверрайды
+
+Отсутствуют
+
+
+### Дефайны
+
+Отсутствуют
+
+
+### Используемые файлы, не содержащиеся в модпаке
+
+Отсутствуют
+
+
+### Авторы:
+
+Shegar
+
diff --git a/mods/on_floor_icon/_on_floor_icons.dm b/mods/on_floor_icon/_on_floor_icons.dm
new file mode 100644
index 0000000000000..3cc356a3e2ba3
--- /dev/null
+++ b/mods/on_floor_icon/_on_floor_icons.dm
@@ -0,0 +1,4 @@
+/singleton/modpack/on_floor_icon
+ name = "Спрайт на полу"
+ desc = "Мод рисует отдельный спрайт для предметов когда они на полу/столу, вообщем не в инвентаре."
+ author = "Shegar"
diff --git a/mods/on_floor_icon/_on_floor_icons_includes.dm b/mods/on_floor_icon/_on_floor_icons_includes.dm
new file mode 100644
index 0000000000000..99fb50b42fd6c
--- /dev/null
+++ b/mods/on_floor_icon/_on_floor_icons_includes.dm
@@ -0,0 +1,7 @@
+#ifndef MODPACK_ON_FLOOR_ICON
+#define MODPACK_ON_FLOOR_ICON
+
+#include "code\on_floor_icon.dm"
+#include "_on_floor_icons.dm"
+
+#endif
diff --git a/mods/utility_items/code/on_floor_icon.dm b/mods/on_floor_icon/code/on_floor_icon.dm
similarity index 53%
rename from mods/utility_items/code/on_floor_icon.dm
rename to mods/on_floor_icon/code/on_floor_icon.dm
index 59c402b150db6..99f0fe7febe46 100644
--- a/mods/utility_items/code/on_floor_icon.dm
+++ b/mods/on_floor_icon/code/on_floor_icon.dm
@@ -6,12 +6,20 @@
.=..()
update_onturf_icon_status()
-/obj/item/Move()
- .=..()
+/obj/item/dropped(mob/user)
+ . = ..()
update_onturf_icon_status()
-/obj/item/forceMove()
- .=..()
+///Тоже самое что и pickup, но loc изменился
+/obj/item/proc/pickuped(user)
+ update_onturf_icon_status()
+
+/obj/item/on_enter_storage(obj/item/storage/S)
+ . = ..()
+ update_onturf_icon_status()
+
+/obj/item/on_exit_storage(obj/item/storage/S)
+ . = ..()
update_onturf_icon_status()
/obj/item/proc/update_onturf_icon_status()
@@ -22,5 +30,5 @@
icon = initial(icon)
/obj/item/attack_hand(mob/user as mob)
- ..()
- update_onturf_icon_status()
+ .=..()
+ pickuped(user) //Всё что добавилось - это вот эта одна строка
diff --git a/mods/on_floor_icon/icons/money.dmi b/mods/on_floor_icon/icons/money.dmi
new file mode 100644
index 0000000000000..aead2b6a92ae6
Binary files /dev/null and b/mods/on_floor_icon/icons/money.dmi differ
diff --git a/mods/utility_items/_utility_items_includes.dm b/mods/utility_items/_utility_items_includes.dm
index e477b997adf4a..c8c2a92ecd9a3 100644
--- a/mods/utility_items/_utility_items_includes.dm
+++ b/mods/utility_items/_utility_items_includes.dm
@@ -35,6 +35,9 @@
#include "code/adherent_armor.dm"
#include "code/security.dm"
#include "code/FBP_vox.dm"
-#include "code/on_floor_icon.dm"
#include "code/rndloadout.dm"
-#endif
\ No newline at end of file
+#include "code/money_resprite.dm"
+#include "code/laders_stairs_grabs.dm"
+#include "code/screen_movable_fix.dm"
+#include "code/skills_desc.dm"
+#endif
diff --git a/mods/utility_items/code/laders_stairs_grabs.dm b/mods/utility_items/code/laders_stairs_grabs.dm
new file mode 100644
index 0000000000000..bd69b3542f7cf
--- /dev/null
+++ b/mods/utility_items/code/laders_stairs_grabs.dm
@@ -0,0 +1,34 @@
+//Чёто там меняет с грабами при таскании по лестнице
+//Лесенки
+/obj/structure/stairs/Bumped(atom/movable/A)
+ var/turf/above = GetAbove(A)
+ if (above)
+ var/turf/target = get_step(above, dir)
+ var/turf/source = get_turf(A)
+ if(above.CanZPass(source, UP) && target.Enter(A, src))
+ if (bluespace_affected)
+ var/list/obj/structure/other_stairs= list()
+ for (var/obj/structure/stairs/stair)
+ if (src != stair && (stair.z in GetConnectedZlevels(above.z)))
+ other_stairs += stair
+ var/obj/structure/stairs/other_stair = pick(other_stairs)
+ if (prob(displacement_chance))
+ target = get_turf(other_stair)
+ if (prob(20))
+ to_chat(A, SPAN_WARNING("You feel turned around..."))
+ A.forceMove(target)
+ if(isliving(A))
+ var/mob/living/L = A
+ if(L.pulling)
+ L.pulling.forceMove(target)
+ for(var/obj/item/grab/founded_grab in L)
+ founded_grab.affecting.forceMove(target)
+ if(ishuman(A))
+ var/mob/living/carbon/human/H = A
+ if(H.has_footsteps())
+ playsound(source, 'sound/effects/stairs_step.ogg', 50)
+ playsound(target, 'sound/effects/stairs_step.ogg', 50)
+ else
+ to_chat(A, SPAN_WARNING("Something blocks the path."))
+ else
+ to_chat(A, SPAN_NOTICE("There is nothing of interest in this direction."))
diff --git a/mods/utility_items/code/money_resprite.dm b/mods/utility_items/code/money_resprite.dm
new file mode 100644
index 0000000000000..9a1e88d79d214
--- /dev/null
+++ b/mods/utility_items/code/money_resprite.dm
@@ -0,0 +1,36 @@
+/obj/item/spacecash
+ icon = 'mods/utility_items/icons/money.dmi'
+ on_turf_icon = 'mods/on_floor_icon/icons/money.dmi'
+
+/obj/item/spacecash/bundle/
+ icon = 'mods/utility_items/icons/money.dmi'
+
+/obj/item/spacecash/bundle/update_onturf_icon_status()
+ if(on_turf_icon)
+ if(isturf(loc))
+ icon = on_turf_icon
+ on_update_icon(TRUE)
+ else
+ icon = initial(icon)
+ on_update_icon(FALSE)
+
+/obj/item/spacecash/bundle/on_update_icon(onturf = FALSE)
+ ClearOverlays()
+ var/list/images = src.getMoneyImages()
+ var/icon_type = 'mods/utility_items/icons/money.dmi'
+ if(onturf)
+ icon_type = 'mods/on_floor_icon/icons/money.dmi'
+ for(var/A in images)
+ var/image/banknote = image(icon_type, A)
+ banknote.SetTransform(
+ rotation = pick(-45, -27.5, 0, 0, 0, 0, 0, 0, 0, 27.5, 45),
+ offset_x = rand(-6, 6),
+ offset_y = rand(-4, 8)
+ )
+ AddOverlays(banknote)
+
+ src.desc = "They are worth [worth] [GLOB.using_map.local_currency_name]."
+ if(worth in denominations)
+ src.SetName("[worth] [GLOB.using_map.local_currency_name]")
+ else
+ src.SetName("pile of [worth] [GLOB.using_map.local_currency_name]")
diff --git a/mods/utility_items/code/screen_movable_fix.dm b/mods/utility_items/code/screen_movable_fix.dm
new file mode 100644
index 0000000000000..c474c25255c2b
--- /dev/null
+++ b/mods/utility_items/code/screen_movable_fix.dm
@@ -0,0 +1,3 @@
+/obj/screen/movable/MouseDrop(over_object, src_location, over_location, src_control, over_control, params)
+ .=..()
+ moved = TRUE
diff --git a/mods/utility_items/code/skills_desc.dm b/mods/utility_items/code/skills_desc.dm
new file mode 100644
index 0000000000000..31521cab666e8
--- /dev/null
+++ b/mods/utility_items/code/skills_desc.dm
@@ -0,0 +1,211 @@
+/singleton/hierarchy/skill
+ // Names for different skill values, in order from 1 up.
+ levels = list( "Необученный" = "Unskilled Description",
+ "Базовый" = "Basic Description",
+ "Тренированный" = "Trained Description",
+ "Опытный" = "Experienced Description",
+ "Мастер" = "Professional Description")
+
+/singleton/hierarchy/skill/organizational/bureaucracy
+ name = "Бюрократия"
+ desc = "Навык работы с документаций, навигацией в сложной организационной структуре и понимание законов и регуляций."
+ levels = list( "Необученный" = "Вы можете заполнить основные документы с несколькими ошибками. Вы смутно понимаете закон, выученный в основном из новостей и личного опыта.",
+ "Базовый" = "Вы знакомы с документами, необходимыми для выполнения вашей работы, и можете хорошо ориентироваться в них. У вас есть некоторое представление о законе, который применяется к вам и окружающим.",
+ "Тренированный" = "Вы можете ориентироваться в большинстве документов, брошенных на вас, даже если вы не знакомы с ними. У вас есть хорошее понимание закона и любых регуляций или процедур, имеющих отношение к вам.",
+ "Опытный" = "Со своим опытом вы можете легко создавать документы для любой ситуации и писать отчеты, которые являются ясными и понятными. У вас отличное знание закона, возможно, включая официальную юридическую подготовку.",
+ "Мастер" = "Вы можете заставить танцевать документы под свою дудку и легко и привычно ориентироваться в самых сложных бюрократических структурах. Ваши доклады являются литературными произведениями. Ваше знание закона идеально, и вы можете быть сертифицированы для практики права.
— Добавляет язык бюрократов (канцелярит) как показатель того что вы идеально владеете ведением документации а также свободно разбираетесь в сложной бюроктратической терминологии.")
+
+/singleton/hierarchy/skill/organizational/finance
+ name = "Финансовая грамотность"
+ desc = "Способность управление деньгами и инвистициями. Данный навык полезен для торговцев, так как влияет на затраты и получение денег с купли-продажи."
+ levels = list( "Необученный" = " Ваше умение распределять финансы заканчивается на личных расходах. Вы легко запутаетесь в деталях при попытке провести базовые транзакции.
— Вы получаете стартовые деньги. Их количество увеличивается с уровнем навыка.
— Вы можете использовать кнопку Appraise во вкладке IC, чтобы увидеть примерную стоимость различных объектов.",
+ "Базовый" = "Вы немного разбираетесь в финансовых операциях и, как правило, сможете вести точный учет. У вас мало опыта в инвестициях, и управление крупными суммами денег, скорее всего, собьет вас с толку.",
+ "Тренированный" = "Вы хорошо умеете управлять счетами, вести учет и организовывать транзакции. Вы немного знакомы с ипотекой, страховкой, акциями и облигациями, но можете столкнуться с трудностями, столкнувшись с более сложными финансовыми устройствами.",
+ "Опытный" = "По вашему опыту вы знакомы со всеми финансовыми организациями, с которыми вы можете столкнуться, и являетесь умелым судьей валюты. Чаще всего ваши инвестиции будут успешными.",
+ "Мастер" = "Вы отлично разбираетесь в финансах, часто делаете отличные инвестиции и инстинктивно чувствуете межзвездную экономику. Финансовые инструменты - это оружие в ваших руках. Вероятно, у вас есть профессиональный опыт работы в финансовой сфере.")
+
+// Category: General
+
+/singleton/hierarchy/skill/general/EVA
+ name = "Внешнекорабельная деятельность"
+ desc = "Ваш навык работы и передвижения в космосе и в скафандрах или"
+ levels = list( "Необученный" = "У вас есть базовая подготовка по технике безопасности, стандартная для людей, которые работают в космосе: вы знаете, как надевать скафандр и запечатывать ваши внутренности, и, возможно, вы можете надеть ИКС, если вам действительно это нужно, хотя вы будете неуклюжи в этом. Вы все еще склонны к ошибкам, которые могут заставить вас дышать вакуумом.
— Вы можете снимать ИКС. Скорость снятия повышается с уровнем навыка.
— Вы всегда будете падать на пол, входя в зону с гравитацией из космоса. Шанс понижается с повышением уровня навыка.
— Вероятно, вы будете очень часто поскальзываться. Шанс понижается с повышением уровня навыка.",
+ "Базовый" = " Вы прошли тщательную базовую подготовку по работе с ВКД и вряд ли будете делать ошибки новичка. Однако у вас все еще мало опыта работы в вакууме.",
+ "Тренированный" = "Вы можете нормально использовать скафандр и спокойно работать в космосе. Проверка остатков газа в кислородном баллоне - едва ли не привычка для вас, и вы не паникуете в чрезвычайной ситуации. — Вы можете полностью управлять джетпаком.",
+ "Опытный" = "Вы можете использовать все виды космических скафандров, включая специализированные версии. Ваш многолетний опыт работы по ВКД удерживает вас от дезориентации в космосе, и у вас есть опыт использования реактивного ранца для передвижения.
— Вы больше не сможете поскользнуться.",
+ "Мастер" = "Вакуум - ваш второй дом. ВКД, вероятно, занимает подавляющую часть всей вашей работы.
— Выходя из зоны отсутствия гравитации, Вы больше не сможете упасть на пол.
— Вы получаете дополнительную скорость, находясь в невесомости.")
+
+/singleton/hierarchy/skill/general/EVA/mech
+ name = "Управление мехом"
+ desc = "Позволяет корректно управлять мехом."
+ levels = list("Необученный" = "Интерфейс и управление экзоскелета незнакомы Вам, Вы определённо сделаете много ошибок при их использовании.",
+ "Тренированный" = "Пилотирование экзоскелета не составляет для Вас никакого труда.")
+
+/singleton/hierarchy/skill/general/pilot
+ name = "Пилотирование"
+ desc = "Описывает ваш опыт пилотирования пилотирования космических кораблей, начиная с маленьких шлюпок заканчивая манструозными корветами."
+ levels = list( "Необученный" = "Вы знаете, что такое космический корабль, и у вас может быть абстрактное понимание различий между различными кораблями. Если ваш отдел использует космические корабли, вы примерно знаете их возможности. Возможно, вы сможете управлять космическим кораблем в видеоигре. Если бы вы взяли управление маленьким судном, вы могли бы сдвинуть его с места с надлежащим руководством.
— Время полета между точками снижается с повышением уровня навыка.
— Вы можете пилотировать корабли, но направление их движения может быть случайным.
— Скорость сбивания карпов вашим кораблем увеличивается с уровнем навыка.",
+ "Базовый" = "Вы можете безопасно управлять малым кораблем, но более крупные корабли находятся вне вашей области знаний. Вы ни в коем случае не эксперт, и, вероятно, не так много тренировались. Навыки этого уровня характеры для палубного экипажа.
— Вы можете пилотировать маленький челнок без ошибок.
— Вы можете полностью избежать метеоров на маленькой скорости (до 2 Гм/ч), используя крошечные челноки, такие как Гуппи.",
+ "Тренированный" = "Вы - опытный пилот и можете безопасно управлять любым видом транспорта - от челнока до корвета. Вы можете проводить длительное время за штурвалом, и вы разбираетесь в способностях разных кораблей и в том, что заставляет их функционировать. Вы можете выполнять базовое техническое обслуживание на небольших судах и выполнять большинство основных маневров. Вы можете использовать вооруженный космический корабль. Вы можете сделать основные расчеты, касающиеся пилотирования. Навыки этого уровня характерны для начинающих пилотов. Вы, вероятно, получили формальное обучение пилотированию.
— Вы можете пилотировать большие корабли.
— Вы можете полностью избежать метеоров на медленной скорости (до 2 Гм/ч), используя любые челноки.",
+ "Опытный" = "Вы — опытный пилот и можете управлять любым типом корабля. Вероятно, вы смогли бы жить на космическом корабле, и вы очень хорошо разбираетесь почти во всем, что связано с космическими кораблями. Вы можете не только управлять кораблем, но и выполнять сложные маневры, а также выполнять большинство расчетов, связанных с пилотированием космического корабля. Вы можете обслуживать корабль. Навыки этого уровня характерны для очень опытных пилотов. Вы прошли формальное обучение пилотированию.
— Вы можете полностью избежать метеоров на нормальной скорости (2 Гм/ч), используя крошечные челноки.",
+ "Мастер" = "Вы не только профессиональный пилот, но и мастерски освоили такие периферийные функции, как звездная навигация и блюспейс-прыжки. У вас есть опыт выполнения сложных маневров, управления эскадронами малых судов и работы в агрессивных средах.
— Вы можете полностью избежать метеоров на нормальной скорости (2 Гм/ч), используя любой тип корабля.
— Меньше метеоров ударит по кораблю при прохождении через метеорные поля.")
+
+/singleton/hierarchy/skill/general/hauling
+ name = "Физическая подготовка"
+ desc = "Ваша сила, выносливость и ловкость, в общем - физическая подготовка."
+ levels = list( "Необученный" = "Вы не привыкли к физическому труду, быстро устаете и находитесь не в лучшей форме. Длительный тяжелый труд может быть опасным для вас.
— Вы можете таскать предметы, но будете быстро уставать, начиная задыхаться. Ваша сила увеличивается с навыком.
— Вы можете бросать предметы. Скорость, дальность и сила броска увеличиваются с уровнем навыка.
— Вы можете бегать. Выносливость увеличивается с уровнем навыка.
— Вы можете прыгать, щелкнув по удаленной цели с намерением захвата.
-Дальность прыжка увеличивается, и вероятность падения уменьшается с повышением уровня навыка.
-С каждой степенью навыка ваше тело становится крепче, сильней и ловчей, может лучше сопротивляться влиянию разнообразных аномалий. Ваша ловкость спасает от повреждений, а крепкое тело и сила воли позволяет стерпеть многое.",
+ "Базовый" = "Вы немного знакомы с физическим трудом и находитесь в разумной физической форме. Задачи, требующие большой ловкости или силы, могут все еще застать вас врасплох.
— Вы можете бросать предметы огромного (huge) размера и мобов нормального размера, не выдыхаясь.",
+ "Тренированный" = "Вы имеете достаточно силы и ловкости даже для задач требующих больших усилий, способны долго работать не уставая.",
+ "Опытный" = "У Вас есть опыт работы в тяжёлых условиях, и Вы находитесь в прекрасной форме. Спортзал - Ваше любимое место.",
+ "Мастер" = "Вдобавок к Вашей невероятной силе и выносливости, Вы имеете много опыта со всей физической частью своей работы. У Вас может быть какой-то опыт в соревнованиях по атлетике.")
+
+/singleton/hierarchy/skill/general/computer
+ name = "Информационные технологии"
+ desc = "Описывает ваше понимание компьютеров, ПО и телекомунникаций. Помогает в работе с компьютерами. Применяется в телекоммуникация, программировании компьюетров и ИИ."
+ levels = list( "Необученный" = "Вы знаете, как использовать компьютеры и устройства связи, на которых вы выросли. Вы можете использовать компьютерную консоль, портативную или настенную радиостанцию, а также свою гарнитуру и свой КПК. Вы знаете, что такое ИИ, но вы можете видеть их либо как людей из кремния, либо как просто машины; Вы знаете, что они должны соблюдать свои законы, но вы не знаете, как и почему они работают",
+ "Базовый" = " Вы знаете основы программирования, но вы не очень хороши в этом и не можете сделать это профессионально. У вас есть довольно хорошее представление о том, что заставляет ИИ поступать тем или иным образом. Вы понимаете, как информация хранится на компьютере, и вы можете решать простые компьютерные проблемы. Вы разбираетесь в компьютерах, но все равно делаете ошибки. Если вы попытались взломать ИИ, вы можете ошибиться в формулировании ваших новых законов.
— Программа расшифровки доступа антагониста имеет шанс остаться незаметной и более эффективно работать. Шанс увеличивается с уровнем навыка.",
+ "Тренированный" = "На этом уровне вы, вероятно, работаете с компьютерами ежедневно. Вы понимаете и можете починить телекоммуникационную сеть. Ваше понимание программирования и психологии ИИ позволяет вам решать проблемы с ИИ или киборгами. Или создавать проблемы, если вы того пожелаете. Вы можете программировать компьютеры и ИИ и эффективно изменять их законы.
— Вы можете полностью использовать программы мониторинга сети, администрирования почты и управления ИИ.",
+ "Опытный" = " У вас многолетний опыт работы с компьютерными сетями, системами искусственного интеллекта, телекоммуникациями и задачами сисадмина. Вы хорошо знаете системы, используемые ежедневно, и можете диагностировать сложные проблемы.
— Программа дешифрования ключей доступа у антагонистов посылает поддельные сообщения об атаке в системный журнал.
— Вы можете использовать командную строку на модульных компьютерах (наберите \"man\" для списка).",
+ "Мастер" = "Люди, вероятно, начинают задаваться вопросом, не являетесь ли вы компьютером сами. Компьютерный код - ваш родной язык; Вы относитесь к ИИ так же легко, как (возможно, легче, чем) к органике. Вы можете построить телекоммуникационную сеть с нуля от и до.")
+
+// Category: Service
+
+/singleton/hierarchy/skill/service/botany
+ name = "Ботаника"
+ desc = "Насколько вы хороши в выращивании и уходом за растениями. Необходимо для правильного ухода за растениями. Низкого уровня достаточно для выращивания растений, но для занятия агрономией и ксеноботаникой необходим уровень выше."
+ levels = list( "Необученный" = "Вы знаете чуть больше чем ничего о ботанике. Когда вы попытаетесь посадить, прополоть растение или собрать урожай, вы скорее всего убьете его.
Общее: Вы не можете определить определить, что именно вредит растению: то ли это сорняки, то ли это вредители. Посадка растений может не получиться. При прополке растений от сорняков можно повредить посевы.
Биобаллистическая система доставки (Bioballistic Delivery System): Есть шанс неудачи при изъятии генов. Семена деградируют быстрее.
Лизис-изоляционная центрифуга (Lysis-isolation Centrifuge): Есть шанс неудачи при установке генов. Семена деградируют быстрее.",
+ "Базовый" = "У вас есть небольшой опыт садоводства. Вы можете поливать, пропалывать, удобрять, садить растения и собирать плоды, и вы можете обнаруживать и уничтожать паразитов. Садоводство может быть вашим хобби.
-Вы можете безопасно садить и прополоть обычные растения.
-Вы можете отличить сорняки от паразитов Общее: Полноценная работа с обычными растениями.",
+ "Тренированный" = " Вы являетесь достаточно опытным в ботанике, и можете растить растения для еды или производства кислорода. Ваши растения обычно долго, счастливо, цветут и пахнут. Вы знаете основы изменения генов растений.
-Вы можете безопасно садить и полоть экзотические растения. -Вы можете работать с консолью ксенофлоры. Деградация образцов уменьшается с уровнем навыка. Общее: Полноценная работа с экзотическими растениями.
Биобаллистическая система доставки (Bioballistic Delivery System): Полноценная работа.
Лизис-изоляционная центрифуга (Lysis-isolation Centrifuge): Полноценная работа.",
+ "Опытный" = "Вы ботаник или фермер, можете управлять фермами или делать исследование растений. Вы искусны в создании гибридных растений или модификации штаммов.
Биобаллистическая система доставки (Bioballistic Delivery System): Семена деградируют медленнее.
Лизис-изоляционная центрифуга (Lysis-isolation Centrifuge): Семена деградируют медленнее.",
+ "Мастер" = "Вы специализированный ботаник. Вы можете ухаживать даже за самыми экзотическими, хрупкими или опасными растениями. Вы можете использовать генную манипуляцию с высокой точностью, а так же намного чаще чем обычно избегать деградации образцов.")
+
+/singleton/hierarchy/skill/service/cooking
+ name = "Готовка"
+ desc = "Описывает навыки персонажа в приготовлении еды и других расходных материалов. Смешивание алкогольных напитков включено."
+ levels = list( "Необученный" = "Вы практически нечего не знаете о готовке, и по возможности используете торговые автоматы для утоления голода. Микроволновка является для Вас магическим устройством и вы стараетесь избегать её.",
+ "Базовый" = "Вы можете готовить простые блюда, накормив тем самым целую семью. Такие вещи как спагетти, жареный сыр или простые коктейли-ваше постоянное меню.
-Вы можете безопасно использовать блендер.",
+ "Тренированный" = " Вы можете делать большинство блюд следуя инструкциям, и обычно результат выглядит неплохо. Вы имеете небольшой опыт в обслуживании, организации питания и/или работе бармена.
-Вы можете полностью управлять раздатчиком напитков.",
+ "Опытный" = " Вы можете профессионально готовить, держа весь персонал сытыми и довольными. Приготовленная вами еда вкусная,а сложные рецепты не вызывают проблем. На Вас можно положиться в плане не-экзотических напитков.",
+ "Мастер" = " Ваши блюда божественны, а от коктейлей люди познают Дзен. Вы отлично справляетесь с персоналом кухни и обслуживающим персоналом в целом, во время особых случаев. Вы можете безопасно готовить необычные блюда и коктейли которые были бы ядовиты в случае неправильного приготовления.")
+
+// Category: Security
+
+/singleton/hierarchy/skill/security/combat
+ name = "Ближний бой"
+ desc = "Описывает способности рукопашного боя или боя с применением холодного оружия. Редкий и малоэффективный навык в эпоху доступного дальнобольного оружия."
+ levels = list( "Необученный" = "Вы можете ударить или пнуть, но это собьёт вас с ног. Вы не опытны, и скорее всего никогда не были в серьёзной драке. В бою, вы скорее запаникуете и убежите, возьмёте какой-нибудь ближайший предмет и ударите им. Или же, (если ваш противник такой же новичок.) выставите себя дураком.
- Вы можете обезоружить, схватить, и ударить. Успех этого зависит от различий вашего уровня навыка, с уровнем навыка противника.
- Вероятность падения при захвате уменьшается с уровнем.",
+ "Базовый" = " У вас есть некоторый опыт в драках, или вы имеете некоторый опыт в боевых искусствах. Вы можете постоять за себя, если вам это действительно нужно. Если вы офицер Службы Безопасности, то ваших навыков будет достаточно чтобы использовать дубинку для задержания преступника.
Кто может: Cрочные военные, хулиганы, кадеты Охраны.",
+ "Тренированный" = " У вас есть опыт в рукопашных схватках и вы с легкостью побеждаете неопытных оппонентов. Ближний бой может быть не вашей специальностью, и вы не используете его более чем необходимо. Но вы знаете как постоять за себя в бою.
- Вы можете парировать с оружием ближнего боя. Это возрастает с уровнем.
- Вы можете захватывать ваши цели когда вы прыгаете на них, при этом не падая. Если ваша раса, конечно, способна на это.
Кто может: Полицейские, отдел охраны, кандидаты мастера спорта.",
+ "Опытный" = "Вы хороши в рукопашных схватках. У вас есть приличный опыт в боевых искусствах, или опыт полученный с службы в армии или полиции. Вы можете использовать оружие ближнего боя грамотно, думать стратегически и быстро в рукопашном бою. Вы в хорошей форме, и регулярно тренируетесь.
Кто может: Боец состава по подавлению бунтов (Riot Police), военный десант. ",
+ "Мастер" = " Вы специализируетесь в ближнем бою. У вас есть большой опыт практики боевых искусств, и вы в хорошей форме. Вы проводите много времени, практикуясь. Вы можете справится с почти кем-угодно, с почти любым оружием, и выходить победителем. Вы возможно являетесь профессиональным атлетом, или членом специального отряда.
Кто может: Боец Спецназа, Мастер спорта по боевому искусству.")
+
+/singleton/hierarchy/skill/security/weapons
+ name = "Дальний бой"
+ desc = "Описывает умение орудовать оружием дальнего боя. Низкий-средний уровень этого навыка свойственен офицерам безопасности, высокий же уровень этого навыка свойственен солдатам и спец агентам."
+ levels = list( "Необученный" = "Вы понимаете как идентифицировать оружие. Вы можете целиться и стрелять с оружия, правда результаты будут сильно отличаться. Вы можете забыть о безопасности, вы не можете контролировать отдачу при автоматическом огне, и не имеете развитых навыков для перестрелок.
- Вы можете случайно выстрелить с оружия. (Если оно не на предохранителе.)",
+ "Базовый" = " Вы знаете как безопасно обращаться с огнестрельным оружием, и можете комфортно использовать простое оружие. Ваша точность удовлетворительная, и вы, вероятно, не сделаете что-нибудь глупое с оружием, с которым вы знакомы. Ваши рефлексы всё ещё не автоматические, и ваши умения снижаются в стрессовых ситуациях.
- Вы можете использовать огнестрельное оружие. Точность и разброс зависят от уровня навыка.
Кто может: Срочные военные, гражданские охранники, любители.
Механика: В инвентаре отображается значок о состоянии предохранителя оружия, можно определить, заклинило ли оно. В бою - сниженная точность при ощущении боли, меньшая точность при ведении автоматического огня.",
+ "Тренированный" = "Вы прошли расширенную подготовку по обращению с огнестрельным оружием, или использовали оружие в бою. Ваша точность улучшилась. Вы знакомы с большинством видов оружия, и можете использовать их. У вас есть понимание тактики. Вы вероятно служили в армии или полиции.
Кто может: Контрактные военные, полицейский, служба охраны.
Механика: Точность не снижается при ощущении боли. Можно определить, сколько зарядов осталось в оружии, нет потери точности при огне очередью.",
+ "Опытный" = "Вы использовали огнестрельное оружие и некоторое оружие дальнего боя в стрессовых ситуациях. Ваши навыки стали автоматическими, ваша точность хороша.
Кто может: Военный десант, Спецназ
Механика: Больший бонус к точности, выше шанс автоматически справиться с заеданием оружия, предохранитель оружия автоматически сбрасывается при доставании оружия с враждебным намерением (harm intent).",
+ "Мастер" = "Вы отлично стреляете с любого вида оружия, начиная от простого, заканчивая экзотическим. Вы используете оружие, как если бы оно было частью вашего тела. Вы возможно являетесь снайпером, или оперативником специального назначения.
Кто может: Снайпер спец. назначений, Военный спецназ
- Вы получаете дополнительную точность к стрельбе со снайперских винтовок.
- Вы автоматически извлекаете патрон из болтовых винтовок.")
+
+/singleton/hierarchy/skill/security/forensics
+ name = "Криминалистика"
+ desc = "Описывает ваши познания в осмотре мест преступления и идентификации вещественных доказательств. Не учитывает аналитические способности, также как и не является единственным индикатором ваших способностей в расследовании. Обратите внимание! Для того чтобы провести аутопсию, понадобится также и навык хирургии."
+ levels = list( "Необученный" = "Вы знаете что детективы раскрывают преступления. Вы имеете некоторое понимание, того что не стоит трогать место преступления, но вы не углублялись в детали.",
+ "Базовый" = "Вы знаете как избежать загрязнения места преступления. Вы знаете как помещать улики в пакеты без их загрязнения.",
+ "Тренированный" = " Вы имеете опыт в собирании улик - волокна, отпечатки пальцев, и прочее. Вы знаете как проводятся аутопсии, и возможно, помогали в проведении одной.
- Вы более легче замечаете отпечатки пальцев.
- Вы больше не пачкаете улики",
+ "Опытный" = "Вы патологоанатом или детектив. Вы видели долю странных дел, и потратили много времени складывая кусочки паззла вместе. Так что вы теперь быстрее раскрываете дела.
- Вы можете заметить дополнительные детали при осмотре, такие как: волокна, отпечатки и следы от выстрелов.",
+ "Мастер" = " Ваше имя является крупным в криминалистике. Вы можете быть расследователем который раскрыл крупное дело, или публикатором новых методов в криминалистике. В любом случае, если есть след, то вы обязательно найдёте его. -Вы можете попытаться построить предметы выше вашего уровня навыка. Шанс увеличивается с уровнем навыка.",
+ "Базовый" = "Вы можете разобрать или построить стену или окно, поменять интерьер в комнате и заменить пол и ковёр.
Вы понимаете как безопасно использовать горелку, чтобы не сжечь глаза, и использование инструментов это вторая натура для вас.
-Вы можете изготавливать предметы из стали, дерева и пластика.
-Вы можете видеть более точное описание аппаратуры при её осмотре.
-При осмотре электроплаты вы понимаете, для создания чего она применяется.",
+ "Тренированный" = "Вы можете строить, чинить или разбирать большинство вещей, но будете периодически совершать ошибки и делать вещи не так, как вы задумали.
-Вы можете конструировать вещи из бронзы, золота, осмия, пластали, платины, усиленного стекла, песчаника, серебра, дейтерия, металлического водорода, форона, форонного стекла, трития и урана.
-Вы можете конструировать мебель.
-Вы можете конструировать простые объекты, такие как осветительные приборы, самодельное оружие и настенные рамки.
-Вы можете безопасно использовать плазменный резак для деконструкции структур.
-При осмотре электроплаты вы понимаете, для создания чего она применяется, и какие еще компоненты необходимы.",
+ "Опытный" = "Вы понимаете как заделать пробоину, починить сломанную трубу и исправить серьёзный ущерб. Вы знаете основы структурной инженерии.
-Вы можете конструировать вещи из осмий-карбидной пластали, титана, алмаза, а также конструировать сложные объекты, как корпуса приборов и заготовки для оружия.",
+ "Мастер" = "Вы строитель или инженер. Вы вполне можете перестроить механизмы корабля с нуля, имея нужные материалы, и вы эффективны и опытны в ремонте поломок.")
+
+/singleton/hierarchy/skill/engineering/electrical
+ name = "Электротехника"
+ desc = "Этот навык описывает ваше знания об электронике и лежащей в основе её физике. Низкий уровень навыка подразумевает, что Вы знаете как проложить проводку и управлять энергосетями, высокий уровень навыка необходим для работы с сложными электронными устройствами, такими как платы или боты."
+ levels = list( "Необученный" = "Вы понимаете что провода под напряжением это опасно, Вы можете увидеть и доложить о оборванном проводе или нерабочем ЛКП. Вы можете поменять лампочку и знаете, как поменять батарейку или зарядить большинство оборудования, которое Вы обычно используете.
-Каждый раз, когда Вы открываете панель взлома, провода меняются местами.
-Каждый раз когда Вы подаёте ток на провод или обрезаете его, есть шанс, что вы зацепите другой провод.
-Вы можете неправильно подключить сигнальное устройство.",
+ "Базовый" = "Вы можете сделать базовую проводку, проложить проводку для солнечных панелей или двигателя. Вы можете чинить оборванную проводку и построить простые электронные устройства, такие как осветительные приборы или ЛКП. Вы знаете основы схем и понимаете, как защитить себя от удара током. Вы, возможно, сможете взломать торговый автомат.
-Каждый раз, когда Вы открываете панель взлома, некоторые провода могут быть продублированы.",
+ "Тренированный" = "Вы можете чинить и строить энергооборудование и Вы делаете это регулярно. Вы можете устранять неполадки энергосистем и контролировать устройства энергосети. Вы возможно сможете взломать шлюз.
-Вы можете безопасно взломать устройства.",
+ "Опытный" = "Вы можете чинить, строить и диагностировать любые энергоустройства с лёгкостью. Вы полностью знаете что можно делать с ЛКП, СКИНами и с оборудованием для контроля энергосетей, и можете разобрать или взломать большинство устройств.
-Вы можете безопасно устанавливать сигнальные устройства.
-Вы можете осмотреть один или два провода в панели взлома.",
+ "Мастер" = "Вы инженер-электрик или его эквивалент. Вы можете проектировать, улучшать и модифицировать энергооборудование, и Вы хороши в максимизации эффективности вашей энергосети. Вы можете взломать все устройства и можете разбираться с утечками энергии и проблемами с энергоустройствами с лёгкостью и эффективностью.
-Вы можете осмотреть большинство проводов в панели взлома.")
+
+/singleton/hierarchy/skill/engineering/atmos
+ name = "Атмосферика"
+ desc = "Описывает ваши познания в трубах, производстве воздуха, и динамике газов."
+ levels = list( "Необученный" = "Вы знаете что воздушная тревога горит оранжевым, когда кислорода в помещении недостаточно, и красным когда его практически нет. Вы знаете что мигающая аварийная створка означает опасность за ней. Вы понимаете что некоторые газы ядовиты, что давление должно быть на безопасном уровне и что многим существам нужен кислород для жизни. Вы знаете как использовать огнетушитель или устанавливать надувные барьеры.
-Ручной трубоукладчик (RPD) может выдавать случайные трубы. Шанс этого уменьшается с уровнем навыка.
-Вы не можете брать трубы при помощи RPD.",
+ "Базовый" = "Вы понимаете, как читать показания воздушной тревоги, использовать портативную помпу, анализировать атмосферу в космосе и как помочь заделать пробоину в обшивке. Вы можете проложить трубы, а также работать с баками и канистрами. Если вы работаете с двигателем, то вы сможете установить систему охлаждения. Вы легко можете использовать огнетушитель и ставить надувные барьеры так, чтобы они обеспечивали удобный доступ и герметичность.
-Вы можете брать трубы при помощи RPD.",
+ "Тренированный" = "Вы сможете запустить атмосферную систему. Вы понимаете как контролировать качество воздуха через воздушную тревогу, находить проблемы и устранять их. Вы обучены разбираться с пожарами, пробоинам и с утечками газа. Возможно что вы прошли обучение по использованию ИКС или по использованию противопожарного оборудования.
-Вы можете безопасно обращаться с RPD.",
+ "Опытный" = "Ваш опыт в атмосферном деле позволяет эффективно находить, диагностировать и устранять проблемы. Вы можете управлять комплексными атмосферными системами без страха совершения ошибки, и опытны со всеми отслеживающими и перекачивающими установками в вашем распоряжении.
-Вы можете выдавать большие секции труб из RPD.",
+ "Мастер" = "Вы - атмосферный специалист. Вы контролируете, модифицируете и оптимизируете атмосферные системы, и вы можете быстро и легко разбираться с чрезвычайными ситуациями. Вы можете модифицировать атмосферные системы, так, чтобы они смогли делать всё что вы захотите. Вы легко разбираетесь с пожарами или пробоинами, и опытны в контроле зоны и спасении гражданских, но скорее всего вы просто обезопасите зону от чрезвычайных ситуаций.")
+
+/singleton/hierarchy/skill/engineering/engines
+ name = "Генераторы"
+ desc = "Навык, описывающий Ваши знания о различных типах генераторов, распространённых на космических объектах, таких как ПАКМАН, сингулярность, суперматерия или R-UST."
+ levels = list( "Необученный" = "Вы знаете, что деламинация это плохая вещь и то, что вам стоит стоять подальше от сингулярности. Вы понимаете, что реактора производит энергию, но вы не понимаете его спецификации. Если вы попытаетесь запустить реактор, вам нужен кто-то, кто будет говорить вам каждую деталь, и даже так вы скорее всего сделаете смертельные ошибки.
-Вы читаете показания мониторинга суперматерии с 40-процентной погрешностью. Процент погрешности уменьшается с уровнем навыка.",
+ "Базовый" = "Вы знаете основную теорию о запуске реактора. Вы можете попытаться запустить двигатель сами, но скорее всего вам понадобится некоторая помощь и надсмотрщик, иначе вы сделаете ошибки. Вы полностью понимаете, как включить генератор ПАКМАН.",
+ "Тренированный" = "Вы можете включить реактор, и скорее всего сделаете это не так плохо. Вы понимаете, как защитить себя от радиоизлучения реактора. Вы можете читать показания реактора и поддерживать его работу. Поломки реактора могут застать вас врасплох, но вы, возможно, сможете понять как починить это... Будем надеться, что вы сделаете всё достаточно быстро, чтобы предотвратить серьёзный ущерб.",
+ "Опытный" = "У вас есть годы опыта с генераторами, и вы можете включить их быстро и надёжно. Вы знакомы с различными типами генераторов, помимо того, с которым вы работаете.
-Вы читаете показания показания мониторинга суперматерии без погрешности.
Вы можете определить на глаз целостность ядра суперматерии.",
+ "Мастер" = "Ваш реактор - это ваше дитя, и вы знаете каждую мелкую деталь его работы. Вы можете оптимизировать реактор и, возможно, имеете свою любимую конфигурацию. Вы можете построить реактор с нуля. Когда дела идут плохо, вы точно знаете, почему это случилось и как решить эту проблему. Вы умеете безопасно работать с сингулярностью и суперматерией.
-Вы можете на глаз определить примерный параметр ТЭВ (темпа энерговыработки) суперматерии.")
+
+// Category: Research
+
+/singleton/hierarchy/skill/research/devices
+ name = "Комплексные устройства"
+ desc = "Описывает способность конструировать Комплексные устройства такие как: компьютеры, принтеры, роботов или бомбы. Обратите внимание! Если устройство требует навык Электротехники или информационных технологий, то он тоже должен быть в дополнении к этому навыку."
+ levels = list( "Необученный" = "Вы знаете как использовать технологии что были представлены в любом сообществе в котором вы выросли. Вы знаете как определить когда что-то неисправно, но вам нужна помощь чтобы всё исправить.
-Вы можете работать с протолатом, принтером плат и автолатом. Их эффективность возрастает с уровнем навыка.",
+ "Базовый" = "Вы используете и чините высоко-технологичное оборудование на протяжении вашей работы. Вы можете исправить простые проблемы, и вы знаете как использовать принтер плат или автолат. Вы можете построить простых ботов таких как бот-уборщик и бот-медик.
-Вы можете безопасно работать с автолатом и принтером плат.",
+ "Тренированный" = "Вы можете построить или починить экзо-костюм или шасси киборга, использовать протолат и деструктивный анализатор, и произвести протезы. Вы можете безопасно перенести МИИ или позитронный мозг в шасси киборга.
-Вы можете устанавливать протезы. Скорость установки увеличивается с уровнем навыка.
-Вы можете проводить различные процедуры с протезами без ошибок. Если вам необходимо провести операцию для установки протеза, вам также необходим навык анатомии не ниже Тренированного.
-Вы можете безопасно работать с протолатом.",
+ "Опытный" = "У вас есть годы опыта постройки или реверс-инженерии сложных устройств. Ваше использование протолатов, автолатов и деструктивных анализаторов эффективно и методично. Вы можете проектировать сложные устройства на заказ и скорее всего они будут проданы с наибольший выгодой.",
+ "Мастер" = "Вы изобретатель или исследователь. Вы можете проектировать, строить и модифицировать оборудование о существовании которого люди даже не знают. В лаборатории и мастерской вы чувствуете себя как дома и вы некогда не встретите гаджет который вы не смогли бы разобрать, собрать и скопировать.")
+
+/singleton/hierarchy/skill/research/science
+ name = "Наука"
+ desc = "Ваши опыт и знания научных методов и процессов."
+ levels = list( "Необученный" = "Вы знаете что такое наука, и возможно имеете неопределённую идею научных методов из классов средней школы.",
+ "Базовый" = "Вы следите за научными открытиями. Вы знаете немного о большинстве областей науки. У вас есть базовые лабораторные навыки. Вы могли заниматься наукой в качестве хобби, или вы могли работать в сфере которая была связанна с наукой и могли узнать о науке таким путём. Вы можете провести простой эксперимент.
-С каждым уровнем науки, вы лучше и лучше пользуетесь детектором аномалий, с каждым уровнем растёт радиус гарантированной зоны обнаружения аномалий (По формуле 3 + 2*уровень) и шансовый (по формуле 4 + 3*уровень).",
+ "Тренированный" = "Вы учёный или аспирант-исследователь. Вы можете провести эксперимент, проанализировать ваши результаты, опубликовать ваши данные и соединить ваши данные с работами других учёных. Ваши лабораторные навыки приемлемы, и вы знаете как найти информацию которая вам нужна, когда вы изучаете новую научную тему.
-Вы можете извлекать экзотическую ксенофауну без ошибок.
-начиная с этого уровня вы начинаете на глаз определять тип аномалии при обнаружении детектором. Чем выше навык, тем больше аномалий вы умеете определять.",
+ "Опытный" = "Вы младший исследователь. Вы можете формулировать свои вопросы, использовать инструменты под рукой чтобы проверить ваши гипотезы, и исследовать абсолютно новое явление. У вас возможно есть список достижений в публикации ваших суждений и привлечении финансирования.
-Вы можете работать с теленаукой. Эффективность возрастает с уровнем навыка..",
+ "Мастер" = "Вы профессиональный исследователь и вы сделали множество открытий в вашей области. Ваши эксперименты хорошо продуманны. Вы известны как авторитет в вашей специальности и ваши работы часто появляются в престижных журналах. Вы можете координировать исследовательскую работу команды учёных, и вы скорее всего знаете как сделать ваши полученные данные привлекательными для инвесторов.
-Вы можете взаимодействовать с другими уровнями используя консоль теленауки.")
+
+// Category: Medical
+
+/singleton/hierarchy/skill/medical/medical
+ name = "Медицина"
+ desc = "Медицина охватывает понимание человеческого тела и медицины. Низкие уровни дают общие знания основных лекарств и простых медицинских устройств. Высокие уровни дают точное знание лекарств и медицинских изделий. Опасно использовать лекарства и медицинские устройства с низким уровнем квалификации."
+ levels = list( "Необученный" = "Вы знаете как проводить первую помощь такую как: применение бинтов и нанесение мази на рану. Вы можете использовать авто-инжекторы, читая инструкции на них. Вы можете сказать когда у кого-то что-то болит и ему нужен врач, вы сможете увидеть у кого есть открытый перелом, вы можете определить что у человека имеются проблемы с дыханием или что человек без сознания. У вас есть проблемы с различием мёртвого человека и человека без сознания на расстоянии.
-Вы можете использовать предметы первой помощи (таблетки, бинты, мазь), включая авто-инжекторы.
-Анализатор здоровья отображает частичные, плохо отформатированные результаты.
-Сканер тела отображает частичные, плохо отформатированные результаты.
-Шприцы инъекция всегда действует как на харме; взятие крови может травмировать пациента.
-Капельница снятие капельницы всегда происходит насильно, при установке капельницы, вы можете навредить пациенту.
-Слипер не отображает состояние пациента, диализ и откачка желудка недоступны.
-Дефибриллятор может ударить электричеством пациента или пользователя.",
+ "Базовый" = "У вас есть опыт работы медсестрой/медбратом или вы брали курсы по оказанию первой помощи. Вы можете остановить кровотечение, сделать СЛР, применить шину, проверить чей-то пульс, применить комплекты помощи от травм или ожогов, и также вы понимаете как прочитать показания анализатора здоровья.
Вы примерно понимаете, что Диволвен помогает при отравлении и что Дексалин помогает при нехватке кислорода. Вы можете использовать шприцы или подсоединить капельницу. Вы про проинформированы о симптомах типичных травм, таких как: повреждённое лёгкое, аппендицит, алкогольное отравление или перелом и не смотря на то что вы не можете их вылечить, вы знаете что тогда нужна медицинская помощь. Вы можете определить большинство чрезвычайных ситуации как чрезвычайные и безопасно стабилизировать и транспортировать пациента.
-Анализатор здоровья, Шприцы, Капельница, и Дефибриллятор работают корректно.
-Слипер может сделать диализ и перекачку желудка.",
+ "Тренированный" = " Вы опытный парамедик, медсестра/медбрат или медицинский ординатор. Вы знаете как вылечить большинство болезней или травм, но экзотические болезни или комплексные травмы могут застать вас врасплох. Вы возможно стали специализироваться в какой-то области медицины. В чрезвычайных ситуациях вы можете думать быстро чтобы ваши пациенты не умерли, и даже когда вы не можете вылечить пациента, вы найдёте того кто сможет это. Вы знаете как управлять сканером тела, и вы немного знаете о пациентах с инопланетным паразитом или мозговым червём.
-Вы можете полностью управлять слипером.
-Накладывание шины всегда удается при обращении к другим.
-Вы можете проводить простые операции, если ваш навык анатомии не ниже Опытного.",
+ "Опытный" = "Вы страшный/ая медсестра/медбрат, парамедик или доктор. Вы знаете как использовать все доступные медицинские устройства для лечения пациентов. Ваши глубокие познания в медицине позволяют вам диагностировать и лечить большинство травм. Вы можете провести полное сканирование тела и найти важную информацию.
-Вы можете полностью управлять сканером тела. Вы можете проводить большинство операций, если ваш навык анатомии не ниже Опытного.",
+ "Мастер" = "Вы опытный врач, медсестра/медбрат или парамедик. Вы можете увидеть большинство того что бывает при травмах или болезнях, также то что нельзя увидеть. Вы используете свои обширные знания для лечения пациентов. В крайнем случае, вы сможете сделать любое задание относящиеся к медицине, но ваша специальность, какой она не была, это то где вы действительно сияете.")
+
+/singleton/hierarchy/skill/medical/anatomy
+ name = "Анатомия"
+ desc = "Навык, который охватывает знание структуру строения тела человека и его органов. Так же влияет на скорость операции. Категорически не рекомендуется проводить операции с низким уровнем анатомии. Этот навык может также помочь при изучении биологии ксеносов."
+ levels = list( "Необученный" = " Вы знаете что такое органы, кости и прочее и вы примерно знаете где они расположены. Вы понимаете, что если кто-то получил серьёзные ранения или заболел, то им может понадобится медицинская помощь.
-Высокий шанс нанести какие-либо увечья в ходе операции. Во время сложных операций (таких, как пересадка органов) получение травм еще больше.",
+ "Базовый" = "Вы брали курсы анатомии и некоторое время копались в настоящих людях. Вы знаете где всё расположено, ни больше, ни меньше. Вы можете помогать при операциях, если у вас достаточно знаний в медицине. Если у вас есть навыки в криминалистике, то вы сможете провести аутопсию.
Если вам действительно это надо, вы можете попробовать провести такие простые операции как аппендэктомия (удаление аппендицита), но вы не классифицированный хирург, и не должны это делать, если, конечно, это не чрезвычайная ситуация. Если вы ксенобиолог, то вы знаете как извлекать ядра слаймов.",
+ "Тренированный" = "У вас есть некоторый опыт в анатомии. Вы полностью понимаете как диагностировать переломы, поврежденные сухожилия, рваные раны и прочее. Вы можете накладывать на конечность шину с большим шансом на успех, а также полностью уметь работать с дефибриллятором и проводить СЛР. Хирургия всё ещё вне ваших знаний.
-Вы можете проводить операции (требуется также навык Медицины не ниже Тренированного), но вы скорее всего провалите каждый шаг. Скорость операции возрастает с уровнем навыка. Вы можете проводить кибернетические процедуры, если у ваш навык Комплексных устройств не ниже Тренированного.",
+ "Опытный" = "Вы хирург-ординатор или опытный врач. Вы можете вправить сломанные кости, вылечить повреждённые лёгкие, подлатать печень или удалить аппендикс без проблем. Но сложные операции с нестабильными пациентами, или манипулирование с важными органами, такими как сердце или мозг находятся за гранью ваших умений, и лучше оставить их опытным хирургам. Вы можете понять, когда чья-то анатомия не обычна. Вы умеете работать с несколькими расами, но вы предпочитаете проводить операции на своей расе.
-Вы можете делать все шаги операции правильно, если навык медицина не ниже Опытного.",
+ "Мастер" = "Вы опытный хирург. Вы можете справится с любым что толкается или тащится в операционную и вы можете поддерживать пациента в сознании и стабильности. Вы можете справится с множественными травмами или с множественном отказом органов, вылечить урон мозга и провести операцию на сердце. На данный момент, вы скорее всего специалист в одной сфере, где вы можете сделать новые предложения в техники операций.
Вы можете увидеть даже самые мелкие изменения в анатомии пациента, возможно даже генокрад не обойдёт ваше внимание, возможно вы сможете получить одного на вашем операционном столе.
-Уменьшен фактор ошибок из-за неподходящих условий (например операция проводится не на операционном столе).")
+
+/singleton/hierarchy/skill/medical/chemistry
+ name = "Химия"
+ desc = "Ваши знания и практические навыки работы с реагентами и химическим оборудованием. Это не включает в себя знания о влиянии реагентов на организм.Чрезвычайно опасно работать с химикатами или химическим оборудованием с низким уровнем данного навыка."
+ levels = list( "Необученный" = "Вы знаете что химики работают с химикатам, и вы знаете что они могут сделать лекарства или яды, а также полезные химикаты. Вы возможно знаете назначение некоторых химикатов и имеете не точную идею химических реакций из уроков химии в старших классах.
-Индустриальный блендер может отрезать или травмировать ваши руки, и имеет низкий выход. Выход увеличивается с уровнем навыка.
-ChemMaster, Thorough Mode буферные передачи теряют реагенты. Шанс уменьшается вместе с вашим уровнем.
-ChemMaster, Quick Mode буферные передачи могут передать другие реагенты. Шанс уменьшается вместе с вашим уровнем.
-Раздатчик химикатов может выдать до двух загрязняющих веществ. Количество выданного является неточным.
-Science glasses/HUD позволяет вам видеть химикаты внутри контейнера через осмотр. Точность увеличивается вместе с уровнем.",
+ "Базовый" = "Вы можете сделать базовые химикаты или лекарства, такие как очиститель или анти-токсин. У вас есть некоторые знания техники безопасности и вы возможно не взорвёте лабораторию.
-Индустриальный блендер больше не может навредить вашим рукам.
-Раздатчик химикатов может добавить одно загрязняющее вещество. Количество выдаваемого более точное.",
+ "Тренированный" = "Вы аккуратно отмеряете химикаты, перемалываете порошки, и проводите химические реакции. Вы всё ещё можете потерять некоторое количество химикатов при реакции, но вы не подвергните опасности себя или других людей вокруг вас.
-Вы можете полностью работать с раздатчиком химикатов.",
+ "Опытный" = "Вы работаете химиком, или вы доктор с хорошими познаниями в химии. Если вы химик, то вы сможете делать самые полезные химикаты, если вы фармацевт, то вы сможете делать самые полезные лекарства. На этой стадии, в большинстве случаев вы работаете как по книжке. Вы можете военизировать ваши химикаты, делая гранаты, дымовые бомбы и похожие устройства.
-Осмотр контейнера в руке показывается сканируемые вещества в нем.",
+ "Мастер" = "Вы специалист в химии или фармацевтике, вы также медицинский исследователь или профессиональный химик. Вы можете создавать свои смеси и легко делать самые сложные лекарства. Вы понимаете как ваши лекарства действуют на тела ваших пациентов. Возможно, вы организатор хотя бы одной инновации в химии.
-Осмотр контейнера в руке показывает все вещества в нем.")
+
+/singleton/hierarchy/skill/medical/chemistry/virology
+ name = "Вирусология"
+ desc = "Virology requires a specialist to have not only a deep knowledge of viruses, but also the ability to work with them, similar to how a chemist works with chemicals. This means not only understanding chemical reactions and their effects, but also knowing how these reactions will affect the human body. Thus, a virologist must have not only knowledge of virology, but also medical skills. An analogy can be drawn with a medical chemist, who must have experience working with chemicals and understand what effect they will have in order to use them safely in medicine."
+ levels = list( "Необученный" = "You know that virologist work with viruses; you know that they can be very dangerous. You probably know basic defence against viruses..",
+ "Тренированный" = "You can engeener viruses. You have some training in safety and you won't infect yourself while work... probably. You can almost safely use the virologist equipment.")
diff --git a/mods/utility_items/icons/money.dmi b/mods/utility_items/icons/money.dmi
new file mode 100644
index 0000000000000..c246b3091fae5
Binary files /dev/null and b/mods/utility_items/icons/money.dmi differ
diff --git a/mods/virusology/_virusology_includes.dm b/mods/virusology/_virusology_includes.dm
index f7dc8fbb0364b..0f56f2e9c887d 100644
--- a/mods/virusology/_virusology_includes.dm
+++ b/mods/virusology/_virusology_includes.dm
@@ -3,19 +3,21 @@
#include "_virusology.dm"
#include "code\admin.dm"
-#include "code\analyser.dm"
#include "code\antibodies.dm"
-#include "code\antibodyanalyser.dm"
-#include "code\centrifuge.dm"
#include "code\curer.dm"
#include "code\disease2.dm"
-#include "code\diseasesplicer.dm"
-#include "code\dishincubator.dm"
#include "code\effect.dm"
#include "code\helpers.dm"
-#include "code\isolator.dm"
#include "code\items_devices.dm"
#include "code\general.dm"
#include "code\lar_maria.dm"
#include "code\pre_made_viruses.dm"
+#include "code\human_process.dm"
+//Машинерия
+#include "code\machinery\analyser.dm"
+#include "code\machinery\antibodyanalyser.dm"
+#include "code\machinery\centrifuge.dm"
+#include "code\machinery\diseasesplicer.dm"
+#include "code\machinery\dishincubator.dm"
+#include "code\machinery\isolator.dm"
#endif
diff --git a/mods/virusology/code/human_process.dm b/mods/virusology/code/human_process.dm
new file mode 100644
index 0000000000000..542a3ee583afd
--- /dev/null
+++ b/mods/virusology/code/human_process.dm
@@ -0,0 +1,55 @@
+/mob/living/carbon/handle_viruses()
+ if(status_flags & GODMODE) //godmode
+ return FALSE
+ if(bodytemperature > 406)
+ for (var/ID in virus2)
+ var/datum/disease2/disease/V = virus2[ID]
+ V.cure(src)
+
+ if(life_tick % 3) //don't spam checks over all objects in view every tick.
+ for(var/obj/decal/cleanable/O in view(1,src))
+ if(istype(O,/obj/decal/cleanable/blood))
+ var/obj/decal/cleanable/blood/B = O
+ if(isnull(B.virus2))
+ B.virus2 = list()
+ if(LAZYLEN(B.virus2))
+ for (var/ID in B.virus2)
+ var/datum/disease2/disease/V = B.virus2[ID]
+ infect_virus2(src,V)
+
+ else if(istype(O,/obj/decal/cleanable/mucus))
+ var/obj/decal/cleanable/mucus/M = O
+ if(isnull(M.virus2))
+ M.virus2 = list()
+ if(LAZYLEN(M.virus2))
+ for (var/ID in M.virus2)
+ var/datum/disease2/disease/V = M.virus2[ID]
+ infect_virus2(src,V)
+
+ if(LAZYLEN(virus2))
+ for (var/ID in virus2)
+ var/datum/disease2/disease/V = virus2[ID]
+ if(isnull(V)) // Trying to figure out a runtime error that keeps repeating
+ CRASH("virus2 nulled before calling activate()")
+ else
+ V.process(src)
+ // activate may have deleted the virus
+ if(!V) continue
+
+ // check if we're immune
+ var/list/common_antibodies = V.antigen & src.antibodies
+ if(LAZYLEN(common_antibodies))
+ V.dead = 1
+ if(immunity > 0.2 * immunity_norm && immunity < immunity_norm)
+ immunity = min(immunity + 0.25, immunity_norm)
+ if(life_tick % 5 && immunity < 15 && chem_effects[CE_ANTIVIRAL] < VIRUS_COMMON && !LAZYLEN(virus2))
+ var/infection_prob = 5 - immunity
+ var/turf/simulated/T = get_turf(src)
+ if(istype(T))
+ infection_prob += T.dirt
+ if(T.dirt >= 50)
+ if(prob(infection_prob))
+ infect_mob_random_greater(src)
+ else
+ if(prob(infection_prob))
+ infect_mob_random_lesser(src)
diff --git a/mods/virusology/code/analyser.dm b/mods/virusology/code/machinery/analyser.dm
similarity index 100%
rename from mods/virusology/code/analyser.dm
rename to mods/virusology/code/machinery/analyser.dm
diff --git a/mods/virusology/code/antibodyanalyser.dm b/mods/virusology/code/machinery/antibodyanalyser.dm
similarity index 100%
rename from mods/virusology/code/antibodyanalyser.dm
rename to mods/virusology/code/machinery/antibodyanalyser.dm
diff --git a/mods/virusology/code/centrifuge.dm b/mods/virusology/code/machinery/centrifuge.dm
similarity index 100%
rename from mods/virusology/code/centrifuge.dm
rename to mods/virusology/code/machinery/centrifuge.dm
diff --git a/mods/virusology/code/diseasesplicer.dm b/mods/virusology/code/machinery/diseasesplicer.dm
similarity index 100%
rename from mods/virusology/code/diseasesplicer.dm
rename to mods/virusology/code/machinery/diseasesplicer.dm
diff --git a/mods/virusology/code/dishincubator.dm b/mods/virusology/code/machinery/dishincubator.dm
similarity index 100%
rename from mods/virusology/code/dishincubator.dm
rename to mods/virusology/code/machinery/dishincubator.dm
diff --git a/mods/virusology/code/isolator.dm b/mods/virusology/code/machinery/isolator.dm
similarity index 100%
rename from mods/virusology/code/isolator.dm
rename to mods/virusology/code/machinery/isolator.dm
diff --git a/mods/weather/code/aurora_objects.dm b/mods/weather/code/aurora_objects.dm
index 4520d17598ce1..80e257cf59816 100644
--- a/mods/weather/code/aurora_objects.dm
+++ b/mods/weather/code/aurora_objects.dm
@@ -9,6 +9,7 @@
icon = 'mods/weather/icons/aurora_objects.dmi'
var/wake_up_icon_state
var/waked_up = FALSE
+ var/can_wakeup = TRUE
/obj/structure/aurora/Initialize()
.=..()
@@ -18,7 +19,7 @@
/obj/structure/aurora/proc/wake_up(wake_up_time)
set waitfor = FALSE
set background = TRUE
- if(waked_up)
+ if(waked_up || !can_wakeup)
return
sleep(rand(2,10)) //Для того чтоб техника не зажигалась одновременно
waked_up = TRUE
@@ -136,3 +137,38 @@
electroanomaly_act(picked_atom, src)
beam = src.Beam(BeamTarget = picked_turf, icon_state = "electra_long",icon='mods/anomaly/icons/effects.dmi',time = 0.3 SECONDS)
playsound(src, 'mods/anomaly/sounds/electra_blast.ogg', 100, FALSE )
+
+/obj/structure/aurora/vault_door
+ name = "Broken vault door"
+ desc = "The door is badly damaged but still won’t let just anyone in. Upon closer inspection, you can see that the number 1 on the keypad is completely worn out."
+ icon_state = "old_vault_door"
+ var/opened = FALSE
+ anchored = TRUE
+ density = TRUE
+ //Пароль, после ввода которого дверь откроется
+ var/password = 1111
+
+/obj/structure/aurora/vault_door/attack_hand(mob/living/user)
+ if(opened)
+ return
+ if(!waked_up)
+ to_chat(user, SPAN_BAD("Дверь не реагирует на нажатия клавиши. Видимо, нет электричества!."))
+ return
+ var/input_number = input("Перед вами стандартная 10-и кнопочная клавиатура для ввода цифр, похоже, что пин-код здесь четырёхзначный. Что введём?", "ПИН-код") as null | num
+ if(input_number == password)
+ open_door()
+ else
+ to_chat(user, SPAN_BAD("Похоже, пароль неверный. Дверь не реагирует."))
+
+/obj/structure/aurora/vault_door/proc/open_door()
+ flick("door_opening_animation", src)
+ density = FALSE
+ STOP_PROCESSING(SSweather,src)
+ icon_state = "old_vault_door_opened"
+ can_wakeup = FALSE
+ opened = TRUE
+
+/obj/structure/aurora/vault_door/go_sleep()
+ if(opened)
+ return
+ .=..()
diff --git a/mods/weather/code/snow.dm b/mods/weather/code/snow.dm
index 8d55c87d4d3e4..20febd0e9afe1 100644
--- a/mods/weather/code/snow.dm
+++ b/mods/weather/code/snow.dm
@@ -54,20 +54,17 @@
flick("[icon_state]_to_[state]", src)
-/obj/weather_manager/snow/prepare_to_blowout()
- .=..()
- if(!.) //Родитель сказал Баста, выброс не нужен
- return
- for(var/obj/weather/weather in connected_weather_turfs)
- weather.icon_state = "void_storm"
- weather.play_monitor_effect = FALSE
- weather.play_sound = FALSE
- weather.update()
-
/obj/weather_manager/snow/start_blowout()
.=..()
if(!.) //Родитель сказал Баста, выброс не нужен
return
+ change_stage("calm", FALSE, FALSE)
+ sleep(delay_between_message_and_blowout)
+ report_progress("DEBUG ANOM: Начинается выброс. Стадия - начало.")
+ for(var/mob/living/carbon/human/picked_human in GLOB.living_players)
+ if(get_z(picked_human) == get_z(src))
+ if(must_message_about_blowout)
+ message_about_blowout(picked_human)
//Выброс в виде белой мглы медленно перекатывается слева направо
var/start_x
var/list/blowout_weather_turfs = connected_weather_turfs.Copy()
@@ -82,13 +79,11 @@
weather.update()
weather.blowout_check_turf()
LAZYREMOVE(blowout_weather_turfs, weather)
- sleep(15)
+ sleep(1.5 SECONDS)
start_x++
sleep(rand(10 SECONDS,20 SECONDS))
- report_progress("DEBUG ANOM: Выброс в процессе. Начинается стадия авроры.")
- for(var/obj/weather/weather in connected_weather_turfs)
- weather.blowout_status = FALSE
- weather.icon_state = "void_storm"
+ report_progress("DEBUG ANOM: Выброс в процессе. Начинается стадия авроры, пробуждаем технику и устройва..")
+ change_stage("calm", FALSE, FALSE)
for(var/obj/structure/aurora/aurora_structure in SSweather.aurora_sctructures)
if(z == aurora_structure.z)
aurora_structure.wake_up(rand(5 MINUTES, 9 MINUTES))
diff --git a/mods/weather/code/weather_manager.dm b/mods/weather/code/weather_manager.dm
index 0ba48bd22db84..76324ee37ea6a 100644
--- a/mods/weather/code/weather_manager.dm
+++ b/mods/weather/code/weather_manager.dm
@@ -88,15 +88,6 @@
calculate_blowout_time()
last_blowout_time = world.time
return FALSE
- for(var/obj/weather/connected_weather in connected_weather_turfs)
- if(connected_weather.blowout_status)
- change_stage(connected_weather.blowout_status, FALSE, FALSE)
- sleep(delay_between_message_and_blowout)
- report_progress("DEBUG ANOM: Начинается выброс. Стадия - начало.")
- for(var/mob/living/carbon/human/picked_human in GLOB.living_players)
- if(get_z(picked_human) == get_z(src))
- if(must_message_about_blowout)
- message_about_blowout(picked_human)
return TRUE
/obj/weather_manager/proc/message_about_blowout_prepare(mob/living/input_mob)
@@ -108,7 +99,7 @@
to_chat(input_mob, SPAN_DANGER(pick(blowout_messages)))
/obj/weather_manager/proc/prepare_to_blowout()
- return
+ return TRUE
/obj/weather_manager/proc/stop_blowout()
if(!is_processing)
diff --git a/mods/weather/icons/aurora_objects.dmi b/mods/weather/icons/aurora_objects.dmi
index ceceac26ee384..96204621d84d6 100644
Binary files a/mods/weather/icons/aurora_objects.dmi and b/mods/weather/icons/aurora_objects.dmi differ