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( "Необученный" = "Вы знаете что детективы раскрывают преступления. Вы имеете некоторое понимание, того что не стоит трогать место преступления, но вы не углублялись в детали.", + "Базовый" = "Вы знаете как избежать загрязнения места преступления. Вы знаете как помещать улики в пакеты без их загрязнения.", + "Тренированный" = " Вы имеете опыт в собирании улик - волокна, отпечатки пальцев, и прочее. Вы знаете как проводятся аутопсии, и возможно, помогали в проведении одной.
- Вы более легче замечаете отпечатки пальцев.
- Вы больше не пачкаете улики", + "Опытный" = "Вы патологоанатом или детектив. Вы видели долю странных дел, и потратили много времени складывая кусочки паззла вместе. Так что вы теперь быстрее раскрываете дела.
- Вы можете заметить дополнительные детали при осмотре, такие как: волокна, отпечатки и следы от выстрелов.", + "Мастер" = " Ваше имя является крупным в криминалистике. Вы можете быть расследователем который раскрыл крупное дело, или публикатором новых методов в криминалистике. В любом случае, если есть след, то вы обязательно найдёте его. 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