From fb77d07d52a9d20d4d8ea8a942bc8d72b9837927 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 23 Dec 2019 16:56:43 -0800 Subject: [PATCH 001/172] plushies woohoo --- .../configuration/entries/plushies.dm | 6 + code/game/objects/items/plushes.dm | 472 +++--------------- config/config.txt | 1 + config/plushies/defines.txt | 0 config/plushies/plushie_config.txt | 2 + config/plushies/sprites.dmi | Bin 0 -> 364 bytes icons/obj/custom.dmi | Bin 26970 -> 27428 bytes icons/obj/plushes.dmi | Bin 47353 -> 11558 bytes .../code/modules/client/loadout/backpack.dm | 2 +- .../modules/custom_loadout/custom_items.dm | 8 + tgstation.dme | 1 + 11 files changed, 81 insertions(+), 411 deletions(-) create mode 100644 code/controllers/configuration/entries/plushies.dm create mode 100644 config/plushies/defines.txt create mode 100644 config/plushies/plushie_config.txt create mode 100644 config/plushies/sprites.dmi diff --git a/code/controllers/configuration/entries/plushies.dm b/code/controllers/configuration/entries/plushies.dm new file mode 100644 index 0000000000..20ad02d399 --- /dev/null +++ b/code/controllers/configuration/entries/plushies.dm @@ -0,0 +1,6 @@ +/datum/config_entry/number/snowflake_plushie_prob + config_entry_value = 50 + +/datum/config_entry/keyed_list/snowflake_plushies + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_TEXT diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 705dcad6c6..99e30346d0 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -31,7 +31,15 @@ var/normal_desc //--end of love :'(-- -/obj/item/toy/plush/Initialize() + var/snowflake_id //if we set from a config snowflake plushie. + +/obj/item/toy/plush/random_snowflake/Initialize(mapload, set_snowflake_id) + . = ..() + var/list/configlist = CONFIG_GET(keyed_list/snowflake_plushies) + var/id = pick(configlist) + set_snowflake_from_config(id) + +/obj/item/toy/plush/Initialize(mapload, set_snowflake_id) . = ..() AddComponent(/datum/component/squeak, squeak_override) @@ -50,6 +58,9 @@ normal_desc = desc + if(set_snowflake_id) + set_snowflake_from_config(set_snowflake_id) + /obj/item/toy/plush/Destroy() QDEL_NULL(grenade) @@ -97,6 +108,43 @@ return ..() +/obj/item/toy/plush/proc/set_snowflake_from_config(id) + var/list/configlist = CONFIG_GET(keyed_list/snowflake_plushies) + var/list/jsonlist = configlist[id] + ASSERT(jsonlist) + jsonlist = json_decode(jsonlist) + if(jsonlist["inherit_from"]) + var/path = text2path(jsonlist["inherit_from"]) + if(!ispath(path, /obj/item/toy/plush)) + stack_trace("Invalid path for inheritance") + else + var/obj/item/toy/plush/P = new path //can't initial() lists + name = P.name + desc = P.desc + icon_state = P.icon_state + item_state = P.item_state + icon = P.icon + squeak_override = P.squeak_override + attack_verb = P.attack_verb + gender = P.gender + if(jsonlist["name"]) + name = jsonlist["name"] + if(jsonlist["desc"]) + desc = jsonlist["desc"] + if(jsonlist["gender"]) + gender = jsonlist["gender"] + if(jsonlist["icon_state"]) + icon_state = jsonlist["icon_state"] + item_state = jsonlist["item_state"] + icon = 'config/plushies/sprites.dmi' + if(jsonlist["attack_verb"]) + attack_verb = jsonlist["attack_verb"] + if(jsonlist["squeak_override"]) + squeak_override = jsonlist["squeak_override"] + if(squeak_override) + var/datum/component/squeak/S = GetComponent(/datum/component/squeak) + S?.override_squeak_sounds = squeak_override + /obj/item/toy/plush/handle_atom_del(atom/A) if(A == grenade) grenade = null @@ -373,7 +421,7 @@ var/blacklisted_plushes = list(/obj/item/toy/plush/carpplushie/dehy_carp, /obj/item/toy/plush/awakenedplushie, /obj/item/toy/plush/random) /obj/item/toy/plush/random/Initialize() - var/newtype = pick(subtypesof(/obj/item/toy/plush) - typecacheof(blacklisted_plushes)) + var/newtype = prob(CONFIG_GET(number/snowflake_plushie_prob))? /obj/item/toy/plush/random_snowflake : (pick(subtypesof(/obj/item/toy/plush) - typecacheof(blacklisted_plushes))) new newtype(loc) return INITIALIZE_HINT_QDEL @@ -504,115 +552,12 @@ attack_verb = list("clawed", "hissed", "tail slapped") squeak_override = list('sound/weapons/slash.ogg' = 1) -/obj/item/toy/plush/lizardplushie/durgit - icon_state = "durgit" - item_state = "durgit" - squeak_override = list('modular_citadel/sound/voice/weh.ogg' = 1) //Durgit's the origin of the sound - -/obj/item/toy/plush/lizardplushie/rio - icon_state = "rio" - item_state = "rio" - -/obj/item/toy/plush/lizardplushie/dan - icon_state = "dan" - item_state = "dan" - -/obj/item/toy/plush/lizardplushie/urinsu - icon_state = "urinsu" - item_state = "urinsu" - -/obj/item/toy/plush/lizardplushie/arfrehn - icon_state = "arfrehn" - item_state = "arfrehn" - -/obj/item/toy/plush/lizardplushie/soars - icon_state = "soars" - item_state = "soars" - -/obj/item/toy/plush/lizardplushie/ghostie - icon_state = "ghostie" - item_state = "ghostie" - -/obj/item/toy/plush/lizardplushie/amber - icon_state = "amber" - item_state = "amber" - -/obj/item/toy/plush/lizardplushie/cyan - icon_state = "cyan" - item_state = "cyan" - -/obj/item/toy/plush/lizardplushie/meena - icon_state = "meena" - item_state = "meena" - -/obj/item/toy/plush/lizardplushie/stalks - icon_state = "stalks" - item_state = "stalks" - /obj/item/toy/plush/lizardplushie/kobold + name = "kobold plushie" + desc = "An adorable stuffed toy that resembles a kobold." icon_state = "kobold" item_state = "kobold" -/obj/item/toy/plush/lizardplushie/gorgi - icon_state = "gorgi" - item_state = "gorgi" - -/obj/item/toy/plush/lizardplushie/almaz - icon_state = "almaz" - item_state = "almaz" - squeak_override = list('modular_citadel/sound/voice/raptor_purr.ogg' = 1) - -/obj/item/toy/plush/lizardplushie/garou - icon_state = "garou" - item_state = "garou" - -/obj/item/toy/plush/lizardplushie/augments - icon_state = "augments" - item_state = "augments" - squeak_override = list('modular_citadel/sound/voice/weh.ogg' = 1) //I have no mouth and I must weh - attack_verb = list("hugged", "patted", "snugged", "booped") - -/obj/item/toy/plush/lizardplushie/xekov - icon_state = "xekov" - item_state = "xekov" - -/obj/item/toy/plush/lizardplushie/greg - icon_state = "greg" - item_state = "greg" - -/obj/item/toy/plush/lizardplushie/sin - icon_state = "sin" - item_state = "sin" - desc = "An adorable stuffed toy that resembles a lizardperson.. It faintly smells of sulfur." - -/obj/item/toy/plush/lizardplushie/ends - icon_state = "ends" - item_state = "ends" - -/obj/item/toy/plush/lizardplushie/lyssa - icon_state = "lyssa" - item_state = "lyssa" - -/obj/item/toy/plush/snakeplushie - name = "snake plushie" - desc = "An adorable stuffed toy that resembles a snake. Not to be mistaken for the real thing." - icon_state = "plushie_snake" - item_state = "plushie_snake" - attack_verb = list("bitten", "hissed", "tail slapped") - squeak_override = list('modular_citadel/sound/voice/hiss.ogg' = 1) - -/obj/item/toy/plush/snakeplushie/sasha - icon_state = "sasha" - item_state = "sasha" - -/obj/item/toy/plush/snakeplushie/shay - icon_state = "shay" - item_state = "shay" - -/obj/item/toy/plush/snakeplushie/vulken - icon_state = "vulken" - item_state = "vulken" - /obj/item/toy/plush/nukeplushie name = "operative plushie" desc = "A stuffed toy that resembles a syndicate nuclear operative. The tag claims operatives to be purely fictitious." @@ -630,18 +575,6 @@ squeak_override = list('sound/effects/blobattack.ogg' = 1) gender = FEMALE //given all the jokes and drawings, I'm not sure the xenobiologists would make a slimeboy -/obj/item/toy/plush/slimeplushie/annie - desc = "An adorable stuffed toy that resembles a slimey crewmember." - icon_state = "annie" - item_state = "annie" - -/obj/item/toy/plush/slimeplushie/paxton - desc = "An adorable stuffed toy that resembles a slimey crewmember." - icon_state = "paxton" - item_state = "paxton" - attack_verb = list("CQC'd", "jabroni'd", "powergamed", "robusted", "cakehatted") - gender = MALE - /obj/item/toy/plush/awakenedplushie name = "awakened plushie" desc = "An ancient plushie that has grown enlightened to the true nature of reality." @@ -652,7 +585,6 @@ . = ..() AddComponent(/datum/component/edit_complainer) - /obj/item/toy/plush/beeplushie name = "bee plushie" desc = "A cute toy that resembles an even cuter bee." @@ -669,21 +601,6 @@ item_state = "bumble" squeak_override = list('modular_citadel/sound/voice/mothsqueak.ogg' = 1) -/obj/item/toy/plush/mothplushie/nameko - icon_state = "nameko" - item_state = "nameko" - -/obj/item/toy/plush/mothplushie/suru - icon_state = "suru" - item_state = "suru" - -/obj/item/toy/plush/xeno - name = "xenohybrid plushie" - desc = "An adorable stuffed toy that resmembles a xenomorphic crewmember." - icon_state = "seras" - item_state = "seras" - squeak_override = list('sound/voice/hiss2.ogg' = 1) - /obj/item/toy/plush/lampplushie name = "lamp plushie" desc = "A toy lamp plushie, doesn't actually make light, but it still toggles on and off. Click clack!" @@ -736,20 +653,6 @@ icon_state = "scrubpuppy" item_state = "scrubpuppy" -/obj/item/toy/plush/borgplushie/seeking - icon_state = "seeking" - item_state = "seeking" - -/obj/item/toy/plush/borgplushie/neeb - icon_state = "neeb" - item_state = "neeb" - -/obj/item/toy/plush/borgplushie/bhijn - desc = "An adorable stuffed toy of a IPC." - icon_state = "bhijn" - item_state = "bhijn" - attack_verb = list("closed", "reworked", "merged") - /obj/item/toy/plush/aiplush name = "AI plushie" desc = "A little stuffed toy AI core... it appears to be malfunctioning." @@ -758,269 +661,18 @@ attack_verb = list("hacked", "detonated", "overloaded") squeak_override = list('sound/machines/beep.ogg' = 9, 'sound/machines/buzz-two.ogg' = 1) -/obj/item/toy/plush/bird - name = "bird plushie" - desc = "An adorable stuffed plushie that resembles an avian." - icon_state = "sylas" - item_state = "sylas" - attack_verb = list("peeped", "beeped", "poofed") - squeak_override = list('modular_citadel/sound/voice/peep.ogg' = 1) - -/obj/item/toy/plush/bird/esela - icon_state = "esela" - item_state = "esela" - -/obj/item/toy/plush/bird/jahonna - icon_state = "jahonna" - item_state = "jahonna" - -/obj/item/toy/plush/bird/krick - icon_state = "krick" - item_state = "krick" - -/obj/item/toy/plush/bird/birddi - icon_state = "birddi" - item_state = "birddi" - -/obj/item/toy/plush/bird/jewel - icon_state = "jewel" - item_state = "jewel" - -/obj/item/toy/plush/sergal - name = "sergal plushie" - desc = "An adorable stuffed plushie that resembles a sagaru." - icon_state = "faux" - item_state = "faux" - squeak_override = list('modular_citadel/sound/voice/merp.ogg' = 1) - -/obj/item/toy/plush/sergal/gladwyn - icon_state = "gladwyn" - item_state = "gladwyn" - -/obj/item/toy/plush/sergal/jermaine - icon_state = "jermaine" - item_state = "jermaine" - -/obj/item/toy/plush/mammal - name = "mammal plushie" - desc = "An adorable stuffed toy resembling some sort of crew member." - icon_state = "dubious" - item_state = "dubious" - -/obj/item/toy/plush/mammal/gavin - icon_state = "gavin" - item_state = "gavin" - -/obj/item/toy/plush/mammal/blep - icon_state = "blep" - item_state = "blep" - -/obj/item/toy/plush/mammal/circe - desc = "A luxuriously soft toy that resembles a nine-tailed kitsune." - icon_state = "circe" - item_state = "circe" - attack_verb = list("medicated", "tailhugged", "kissed") - -/obj/item/toy/plush/mammal/robin - icon_state = "robin" - item_state = "robin" - -/obj/item/toy/plush/mammal/pavel - icon_state = "pavel" - item_state = "pavel" - -/obj/item/toy/plush/mammal/mason - icon_state = "mason" - item_state = "mason" - -/obj/item/toy/plush/mammal/oten - icon_state = "oten" - item_state = "oten" - -/obj/item/toy/plush/mammal/ray - icon_state = "ray" - item_state = "ray" - -/obj/item/toy/plush/mammal/redtail - icon_state = "redtail" - item_state = "redtail" - -/obj/item/toy/plush/mammal/dawud - icon_state = "dawud" - item_state = "dawud" - -/obj/item/toy/plush/mammal/edgar - icon_state = "edgar" - item_state = "edgar" - attack_verb = list("collared", "tricked", "headpatted") - -/obj/item/toy/plush/mammal/frank - icon_state = "frank" - item_state = "frank" - -/obj/item/toy/plush/mammal/poojawa - icon_state = "poojawa" - item_state = "poojawa" - -/obj/item/toy/plush/mammal/hazel - icon_state = "hazel" - item_state = "hazel" - -/obj/item/toy/plush/mammal/joker - icon_state = "joker" - item_state = "joker" - -/obj/item/toy/plush/mammal/gunther - icon_state = "gunther" - item_state = "gunther" - /obj/item/toy/plush/mammal/fox icon_state = "fox" item_state = "fox" -/obj/item/toy/plush/mammal/rae - desc = "An adorable stuffed toy of an artic fox." - icon_state = "rae" - item_state = "rae" +/obj/item/toy/plush/snakeplushie + name = "snake plushie" + desc = "An adorable stuffed toy that resembles a snake. Not to be mistaken for the real thing." + icon_state = "plushie_snake" + item_state = "plushie_snake" + attack_verb = list("bitten", "hissed", "tail slapped") + squeak_override = list('modular_citadel/sound/voice/hiss.ogg' = 1) -/obj/item/toy/plush/mammal/zed - desc = "A masked stuffed toy that resembles a fierce miner. He even comes with his own little crusher!" - icon_state = "zed" - item_state = "zed" - attack_verb = list("ENDED", "CRUSHED", "GNOMED") - -/obj/item/toy/plush/mammal/justin - icon_state = "justin" - item_state = "justin" - attack_verb = list("buttslapped", "fixed") - -/obj/item/toy/plush/mammal/reece - icon_state = "reece" - item_state = "reece" - attack_verb = list("healed", "cured", "demoted") - -/obj/item/toy/plush/mammal/redwood - desc = "An adorable stuffed toy resembling a Nanotrasen Captain. That just happens to be a bunny." - icon_state = "redwood" - item_state = "redwood" - attack_verb = list("ordered", "bapped", "reprimanded") - -/obj/item/toy/plush/mammal/marisol - desc = "An adorable stuffed toy resembling a demi-wolf security officer." - icon_state = "marisol" - item_state = "marisol" - attack_verb = list("arrested", "harmbattoned", "lasered") - -/obj/item/toy/plush/mammal/minty - desc = "An adorable stuffed toy resembling some sort of crew member. It smells like mint.." - icon_state = "minty" - item_state = "minty" - attack_verb = list("freshened", "brushed") - -/obj/item/toy/plush/mammal/dog - desc = "An adorable stuffed toy that resembles a canine." - icon_state = "katlin" - item_state = "katlin" - attack_verb = list("barked", "boofed", "borked") - squeak_override = list( - 'modular_citadel/sound/voice/bark1.ogg' = 1, - 'modular_citadel/sound/voice/bark2.ogg' = 1 - ) - -/obj/item/toy/plush/mammal/dog/frost - icon_state = "frost" - item_state = "frost" - -/obj/item/toy/plush/mammal/dog/atticus - icon_state = "atticus" - item_state = "atticus" - -/obj/item/toy/plush/mammal/dog/fletch - icon_state = "fletch" - item_state = "fletch" - -/obj/item/toy/plush/mammal/dog/vincent - icon_state = "vincent" - item_state = "vincent" - -/obj/item/toy/plush/mammal/dog/zigfried - desc = "An adorable stuffed toy of a very good boy." - icon_state = "zigfried" - item_state = "zigfried" - -/obj/item/toy/plush/mammal/dog/nikolai - icon_state = "nikolai" - item_state = "nikolai" - -/obj/item/toy/plush/mammal/dog/flynn - icon_state = "flynn" - item_state = "flynn" - -/obj/item/toy/plush/mammal/dog/fritz - icon_state = "fritz" - item_state = "fritz" - attack_verb = list("barked", "boofed", "shotgun'd") - obj_flags = UNIQUE_RENAME - unique_reskin = list("Goodboye" = "fritz", "Badboye" = "fritz_bad") - -/obj/item/toy/plush/mammal/dog/jesse - desc = "An adorable wolf toy that resembles a cream-colored wolf. He has a little pride flag!" - icon_state = "jesse" - item_state = "jesse" - attack_verb = list("greeted", "merc'd", "howdy'd") - -/obj/item/toy/plush/catgirl - name = "feline plushie" - desc = "An adorable stuffed toy that resembles a feline." - icon_state = "bailey" - item_state = "bailey" - attack_verb = list("headbutt", "scritched", "bit") - squeak_override = list('modular_citadel/sound/voice/nya.ogg' = 1) - -/obj/item/toy/plush/catgirl/mikeel - desc = "An adorable stuffed toy of some tauric cat person." - icon_state = "mikeel" - item_state = "mikeel" - -/obj/item/toy/plush/catgirl/skylar - desc = "An adorable stuffed toy that resembles a degenerate." - icon_state = "skylar2" - item_state = "skylar2" - attack_verb = list("powergamed", "merged", "tabled") - squeak_override = list('sound/effects/meow1.ogg' = 1) - -/obj/item/toy/plush/catgirl/drew - icon_state = "drew" - item_state = "drew" - -/obj/item/toy/plush/catgirl/trilby - desc = "A masked stuffed toy that resembles a feline scientist." - icon_state = "trilby" - item_state = "trilby" - attack_verb = list("PR'd", "coded", "remembered") - -/obj/item/toy/plush/catgirl/fermis - name = "medcat plushie" - desc = "An affectionate stuffed toy that resembles a certain medcat, comes complete with battery operated wagging tail!! You get the impression she's cheering you on to to find happiness and be kind to people." - icon_state = "fermis" - item_state = "fermis" - attack_verb = list("cuddled", "petpatted", "wigglepurred") - squeak_override = list('modular_citadel/sound/voice/merowr.ogg' = 1) - -/obj/item/toy/plush/catgirl/mariaf - desc = "An adorable stuffed toy that resembles a very tall cat girl." - icon_state = "mariaf" - item_state = "mariaf" - attack_verb = list("hugged", "stabbed", "licked") - -/obj/item/toy/plush/catgirl/maya - desc = "An adorable stuffed toy that resembles an angry cat girl. She has her own tiny nuke disk!" - icon_state = "maya" - item_state = "maya" - attack_verb = list("nuked", "arrested", "harmbatonned") - -/obj/item/toy/plush/catgirl/marisa - desc = "An adorable stuffed toy that resembles a crew member, or maybe a witch. Having it makes you feel you can win." - icon_state = "marisa" - item_state = "marisa" - attack_verb = list("blasted", "sparked", "dazzled") +/obj/item/toy/plush/mammal + name = "mammal plushie" + desc = "An adorable stuffed toy resembling some sort of crew member." diff --git a/config/config.txt b/config/config.txt index e71c2587b7..d06f82457d 100644 --- a/config/config.txt +++ b/config/config.txt @@ -6,6 +6,7 @@ $include comms.txt $include antag_rep.txt $include donator_groupings.txt $include dynamic_config.txt +$include plushies/defines.txt # You can use the @ character at the beginning of a config option to lock it from being edited in-game # Example usage: diff --git a/config/plushies/defines.txt b/config/plushies/defines.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/config/plushies/plushie_config.txt b/config/plushies/plushie_config.txt new file mode 100644 index 0000000000..7cd1d88f3e --- /dev/null +++ b/config/plushies/plushie_config.txt @@ -0,0 +1,2 @@ +# EXAMPLE +# SNOWFLAKE_PLUSHIES example {"name":"example","desc":"thanks, coders.","icon_state":"","attack_verb":["thumped","whomped","bumped"],"squeak_override":{"sound/weapons/magout.ogg":1}} diff --git a/config/plushies/sprites.dmi b/config/plushies/sprites.dmi new file mode 100644 index 0000000000000000000000000000000000000000..2970010b2b7ec63dd0020c2c08106f70417051a5 GIT binary patch literal 364 zcmV-y0h9iTP)00006P)t-sz`(%& z05d9|^j!b|00DGTPE!Ct=GbNc004!0R9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0 z_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3K9+#KSW<-p$j; zHQv)N#MLjv)8Eh0$0su0)i)p{Qi+Q*C9|j)sLqg!Gp#5wHx&B%(S;5uM1?(OG z4Mi!J(;C#40001kNkl~nGXvZ?@8B5+&=7vWK-hpUAs`8abu=?!adskjpIJs*2&!6;_kwg6ST8V6 zFN#cGMJuQ)L7xlul(BfrSe@Y-VNAH#C$^3G1D(!kbYS_iJ>ml707IoI@Awx00000< KMNUMnLSTZ1k&`z7 literal 0 HcmV?d00001 diff --git a/icons/obj/custom.dmi b/icons/obj/custom.dmi index 7f42c7e25022e7823088cdd74cfc61ce95d5f479..185d9793ca142da3618623549fa94e6ed8589bf8 100644 GIT binary patch delta 8809 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 delta 8347 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 diff --git a/modular_citadel/code/modules/client/loadout/backpack.dm b/modular_citadel/code/modules/client/loadout/backpack.dm index 82fe89eb6e..17f5f9f5a1 100644 --- a/modular_citadel/code/modules/client/loadout/backpack.dm +++ b/modular_citadel/code/modules/client/loadout/backpack.dm @@ -95,7 +95,7 @@ name = "Newspaper" category = SLOT_IN_BACKPACK path = /obj/item/newspaper - + /datum/gear/paperbin name = "Paper Bin" category = SLOT_IN_BACKPACK diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm index 3d88dae26c..5db63ae070 100644 --- a/modular_citadel/code/modules/custom_loadout/custom_items.dm +++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm @@ -556,3 +556,11 @@ icon = 'icons/obj/custom.dmi' alternate_worn_icon = 'icons/mob/custom_w.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION + +/obj/item/toy/plush/mammal/dog/fritz + icon = 'icons/obj/custom.dmi' + icon_state = "fritz" + item_state = "fritz" + attack_verb = list("barked", "boofed", "shotgun'd") + obj_flags = UNIQUE_RENAME + unique_reskin = list("Goodboye" = "fritz", "Badboye" = "fritz_bad") diff --git a/tgstation.dme b/tgstation.dme index 20cbea540c..5c4405fd61 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -229,6 +229,7 @@ #include "code\controllers\configuration\entries\dynamic.dm" #include "code\controllers\configuration\entries\game_options.dm" #include "code\controllers\configuration\entries\general.dm" +#include "code\controllers\configuration\entries\plushies.dm" #include "code\controllers\subsystem\acid.dm" #include "code\controllers\subsystem\adjacent_air.dm" #include "code\controllers\subsystem\air.dm" From 976c725de2eadf128c08b041e0513143658aba21 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 23 Dec 2019 18:32:08 -0800 Subject: [PATCH 002/172] ok fermis stays --- code/controllers/subsystem/nightshift.dm | 2 +- code/game/objects/items/plushes.dm | 8 ++++++++ icons/obj/plushes.dmi | Bin 11558 -> 12729 bytes 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/code/controllers/subsystem/nightshift.dm b/code/controllers/subsystem/nightshift.dm index df406eed3c..7eb89ff79d 100644 --- a/code/controllers/subsystem/nightshift.dm +++ b/code/controllers/subsystem/nightshift.dm @@ -35,7 +35,7 @@ SUBSYSTEM_DEF(nightshift) if(!emergency) announce("Restoring night lighting configuration to normal operation.") else - announce("Disabling night lighting: Station is in a state of emergency.") + announce("Disabling night lighting: Station is in a state of emergency.") if(emergency) night_time = FALSE if(nightshift_active != night_time) diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 99e30346d0..bd8dda85ee 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -676,3 +676,11 @@ /obj/item/toy/plush/mammal name = "mammal plushie" desc = "An adorable stuffed toy resembling some sort of crew member." + +/obj/item/toy/plush/catgirl/fermis + name = "medcat plushie" + desc = "An affectionate stuffed toy that resembles a certain medcat, comes complete with battery operated wagging tail!! You get the impression she's cheering you on to to find happiness and be kind to people." + icon_state = "fermis" + item_state = "fermis" + attack_verb = list("cuddled", "petpatted", "wigglepurred") + squeak_override = list('modular_citadel/sound/voice/merowr.ogg' = 1) diff --git a/icons/obj/plushes.dmi b/icons/obj/plushes.dmi index fcae4e86f96337466f8fcf0d197bf975c8f1c27c..3abb25d8b285a92a63f3e42071ce0ca3b435fb0f 100644 GIT binary patch literal 12729 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 W15luB%)$SX0Vv9<%2Y@h2mcq75}KU= literal 11558 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 Date: Fri, 10 Jan 2020 06:12:03 -0800 Subject: [PATCH 003/172] subtypes --- code/game/objects/items/plushes.dm | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index bd8dda85ee..0d9363f95e 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -684,3 +684,33 @@ item_state = "fermis" attack_verb = list("cuddled", "petpatted", "wigglepurred") squeak_override = list('modular_citadel/sound/voice/merowr.ogg' = 1) + +/obj/item/toy/plush/xeno + name = "xenohybrid plushie" + desc = "An adorable stuffed toy that resmembles a xenomorphic crewmember." + squeak_override = list('sound/voice/hiss2.ogg' = 1) + +/obj/item/toy/plush/bird + name = "bird plushie" + desc = "An adorable stuffed plushie that resembles an avian." + attack_verb = list("peeped", "beeped", "poofed") + squeak_override = list('modular_citadel/sound/voice/peep.ogg' = 1) + +/obj/item/toy/plush/sergal + name = "sergal plushie" + desc = "An adorable stuffed plushie that resembles a sagaru." + squeak_override = list('modular_citadel/sound/voice/merp.ogg' = 1) + +/obj/item/toy/plush/mammal/dog + desc = "An adorable stuffed toy that resembles a canine." + attack_verb = list("barked", "boofed", "borked") + squeak_override = list( + 'modular_citadel/sound/voice/bark1.ogg' = 1, + 'modular_citadel/sound/voice/bark2.ogg' = 1 + ) + +/obj/item/toy/plush/catgirl + name = "feline plushie" + desc = "An adorable stuffed toy that resembles a feline." + attack_verb = list("headbutt", "scritched", "bit") + squeak_override = list('modular_citadel/sound/voice/nya.ogg' = 1) From 7ace9f0203a454eec68166c5b736c59288d308a4 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 10 Jan 2020 06:25:23 -0800 Subject: [PATCH 004/172] abstract types --- code/game/objects/items/plushes.dm | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 0d9363f95e..21056ce6ee 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -31,7 +31,8 @@ var/normal_desc //--end of love :'(-- - var/snowflake_id //if we set from a config snowflake plushie. + var/snowflake_id //if we set from a config snowflake plushie. + var/abstract_type = /obj/item/toy/plush //to prevent us from spawning "base" plushies. set this to a plush's own type. only use this if a plush is not meant to be standalone/spawned, ever. /obj/item/toy/plush/random_snowflake/Initialize(mapload, set_snowflake_id) . = ..() @@ -127,6 +128,7 @@ squeak_override = P.squeak_override attack_verb = P.attack_verb gender = P.gender + qdel(P) if(jsonlist["name"]) name = jsonlist["name"] if(jsonlist["desc"]) @@ -415,13 +417,22 @@ if(mood_message) desc += mood_message +GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) +/proc/valid_plushie_paths() + . = list() + for(var/i in subtypesof(/obj/item/toy/plush)) + var/obj/item/toy/plush/abstract = i + if(initial(abstract.abstract_type) == i) + continue + . += i + /obj/item/toy/plush/random name = "Illegal plushie" desc = "Something fucked up" var/blacklisted_plushes = list(/obj/item/toy/plush/carpplushie/dehy_carp, /obj/item/toy/plush/awakenedplushie, /obj/item/toy/plush/random) /obj/item/toy/plush/random/Initialize() - var/newtype = prob(CONFIG_GET(number/snowflake_plushie_prob))? /obj/item/toy/plush/random_snowflake : (pick(subtypesof(/obj/item/toy/plush) - typecacheof(blacklisted_plushes))) + var/newtype = prob(CONFIG_GET(number/snowflake_plushie_prob))? /obj/item/toy/plush/random_snowflake : pick(GLOB.valid_plushie_paths) new newtype(loc) return INITIALIZE_HINT_QDEL @@ -676,6 +687,7 @@ /obj/item/toy/plush/mammal name = "mammal plushie" desc = "An adorable stuffed toy resembling some sort of crew member." + abstract_type = /obj/item/toy/plush/mammal /obj/item/toy/plush/catgirl/fermis name = "medcat plushie" @@ -689,17 +701,20 @@ name = "xenohybrid plushie" desc = "An adorable stuffed toy that resmembles a xenomorphic crewmember." squeak_override = list('sound/voice/hiss2.ogg' = 1) + abstract_type = /obj/item/toy/plush/xeno /obj/item/toy/plush/bird name = "bird plushie" desc = "An adorable stuffed plushie that resembles an avian." attack_verb = list("peeped", "beeped", "poofed") squeak_override = list('modular_citadel/sound/voice/peep.ogg' = 1) + abstract_type = /obj/item/toy/plush/bird /obj/item/toy/plush/sergal name = "sergal plushie" desc = "An adorable stuffed plushie that resembles a sagaru." squeak_override = list('modular_citadel/sound/voice/merp.ogg' = 1) + abstract_type = /obj/item/toy/plush/sergal /obj/item/toy/plush/mammal/dog desc = "An adorable stuffed toy that resembles a canine." @@ -708,9 +723,11 @@ 'modular_citadel/sound/voice/bark1.ogg' = 1, 'modular_citadel/sound/voice/bark2.ogg' = 1 ) + abstract_type = /obj/item/toy/plush/mammal/dog /obj/item/toy/plush/catgirl name = "feline plushie" desc = "An adorable stuffed toy that resembles a feline." attack_verb = list("headbutt", "scritched", "bit") squeak_override = list('modular_citadel/sound/voice/nya.ogg' = 1) + abstract_type = /obj/item/toy/plush/catgirl From d287835d1427a4a9b7a9f448676d046e5d51318d Mon Sep 17 00:00:00 2001 From: Putnam Date: Sat, 18 Jan 2020 21:29:27 -0800 Subject: [PATCH 005/172] Made quirk blacklisting antag-sided --- code/datums/traits/_quirk.dm | 1 + code/datums/traits/negative.dm | 13 +++---------- code/modules/antagonists/_common/antag_datum.dm | 10 ++++++++++ 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/code/datums/traits/_quirk.dm b/code/datums/traits/_quirk.dm index 12e34b0c90..d73fa3c825 100644 --- a/code/datums/traits/_quirk.dm +++ b/code/datums/traits/_quirk.dm @@ -8,6 +8,7 @@ var/gain_text var/lose_text var/medical_record_text //This text will appear on medical records for the trait. Not yet implemented + var/antag_removal_text // Text will be given to the quirk holder if they get an antag that has it blacklisted. var/mood_quirk = FALSE //if true, this quirk affects mood and is unavailable if moodlets are disabled var/mob_trait //if applicable, apply and remove this mob trait var/mob/living/quirk_holder diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index c5217d8e4b..d556d02ebb 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -6,6 +6,7 @@ value = -2 gain_text = "You feel your vigor slowly fading away." lose_text = "You feel vigorous again." + antag_removal_text = "Your antagonistic nature has removed your blood deficiency." medical_record_text = "Patient requires regular treatment for blood loss due to low production of blood." /datum/quirk/blooddeficiency/on_process() @@ -188,11 +189,7 @@ gain_text = "You feel repulsed by the thought of violence!" lose_text = "You think you can defend yourself again." medical_record_text = "Patient is unusually pacifistic and cannot bring themselves to cause physical harm." - -/datum/quirk/nonviolent/on_process() - if(quirk_holder.mind && LAZYLEN(quirk_holder.mind.antag_datums)) - to_chat(quirk_holder, "Your antagonistic nature has caused you to renounce your pacifism.") - qdel(src) + antag_removal_text = "Your antagonistic nature has caused you to renounce your pacifism." /datum/quirk/paraplegic name = "Paraplegic" @@ -355,6 +352,7 @@ gain_text = "You find yourself unable to speak!" lose_text = "You feel a growing strength in your vocal chords." medical_record_text = "Functionally mute, patient is unable to use their voice in any capacity." + antag_removal_text = "Your antagonistic nature has caused your voice to be heard." var/datum/brain_trauma/severe/mute/mute /datum/quirk/mute/add() @@ -366,11 +364,6 @@ var/mob/living/carbon/human/H = quirk_holder H?.cure_trauma_type(mute, TRAUMA_RESILIENCE_ABSOLUTE) -/datum/quirk/mute/on_process() - if(quirk_holder.mind && LAZYLEN(quirk_holder.mind.antag_datums)) - to_chat(quirk_holder, "Your antagonistic nature has caused your voice to be heard.") - qdel(src) - /datum/quirk/unstable name = "Unstable" desc = "Due to past troubles, you are unable to recover your sanity if you lose it. Be very careful managing your mood!" diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 1894d8c7ae..064ae9043e 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -20,6 +20,7 @@ GLOBAL_LIST_EMPTY(antagonists) var/show_in_antagpanel = TRUE //This will hide adding this antag type in antag panel, use only for internal subtypes that shouldn't be added directly but still show if possessed by mind var/antagpanel_category = "Uncategorized" //Antagpanel will display these together, REQUIRED var/show_name_in_check_antagonists = FALSE //Will append antagonist name in admin listings - use for categories that share more than one antag type + var/list/quirk_blacklist = list("Pacifist","Mute") // Quirks that will be removed upon gaining this antag. Pacifist and mute are default. /datum/antagonist/New() GLOB.antagonists += src @@ -70,6 +71,7 @@ GLOBAL_LIST_EMPTY(antagonists) greet() apply_innate_effects() give_antag_moodies() + remove_blacklisted_quirks() if(is_banned(owner.current) && replace_banned) replace_banned_player() @@ -117,6 +119,14 @@ GLOBAL_LIST_EMPTY(antagonists) return SEND_SIGNAL(owner.current, COMSIG_CLEAR_MOOD_EVENT, "antag_moodlet") +/datum/antagonist/proc/remove_blacklisted_quirks() + for(var/q in owner.roundstart_quirks) + var/datum/quirk/Q = q + if(Q.name in quirk_blacklist) + if(Q.antag_removal_text) + to_chat(owner, "[Q.antag_removal_text]") + owner.remove_quirk(Q.type) + //Returns the team antagonist belongs to if any. /datum/antagonist/proc/get_team() return From e1cf63e0ac1663ffb3079581f2d3bc1491fe02f5 Mon Sep 17 00:00:00 2001 From: Putnam Date: Sat, 18 Jan 2020 21:32:42 -0800 Subject: [PATCH 006/172] Greentext tweaked --- code/game/gamemodes/objective.dm | 7 ++++--- code/modules/admin/antag_panel.dm | 4 ++-- code/modules/antagonists/_common/antag_datum.dm | 2 +- code/modules/antagonists/_common/antag_team.dm | 11 +++++++---- code/modules/antagonists/brother/brother.dm | 13 ++++++++----- code/modules/antagonists/changeling/changeling.dm | 11 +++++++---- code/modules/antagonists/traitor/datum_traitor.dm | 11 +++++++---- code/modules/antagonists/valentines/valentine.dm | 2 +- code/modules/antagonists/wizard/wizard.dm | 2 +- 9 files changed, 38 insertions(+), 25 deletions(-) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index f99fe5c3e4..4c82046e07 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -9,9 +9,10 @@ GLOBAL_LIST_EMPTY(objectives) var/explanation_text = "Nothing" //What that person is supposed to do. var/team_explanation_text //For when there are multiple owners. var/datum/mind/target = null //If they are focused on a particular person. - var/target_amount = 0 //If they are focused on a particular number. Steal objectives have their own counter. - var/completed = 0 //currently only used for custom objectives. - var/martyr_compatible = 0 //If the objective is compatible with martyr objective, i.e. if you can still do it while dead. + var/target_amount = FALSE //If they are focused on a particular number. Steal objectives have their own counter. + var/completed = FALSE //currently only used for custom objectives. + var/completable = TRUE //Whether this objective shows greentext when completed + var/martyr_compatible = FALSE //If the objective is compatible with martyr objective, i.e. if you can still do it while dead. /datum/objective/New(var/text) GLOB.objectives += src // CITADEL EDIT FOR CRYOPODS diff --git a/code/modules/admin/antag_panel.dm b/code/modules/admin/antag_panel.dm index 1672310567..ffb086a18d 100644 --- a/code/modules/admin/antag_panel.dm +++ b/code/modules/admin/antag_panel.dm @@ -47,7 +47,7 @@ GLOBAL_VAR(antag_prototypes) else var/obj_count = 1 for(var/datum/objective/objective in objectives) - result += "[obj_count]: [objective.explanation_text] Edit Delete [objective.completed ? "Mark as incomplete" : "Mark as complete"]
" + result += "[obj_count]: [objective.explanation_text] Edit Delete [objective.completed ? "Mark as incomplete" : "Mark as complete"]
" obj_count++ result += "Add objective
" result += "Announce objectives
" @@ -214,4 +214,4 @@ GLOBAL_VAR(antag_prototypes) var/datum/browser/panel = new(usr, "traitorpanel", "", 600, 600) panel.set_content(out) panel.open() - return \ No newline at end of file + return diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 064ae9043e..4587a3c8ab 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -144,7 +144,7 @@ GLOBAL_LIST_EMPTY(antagonists) if(objectives.len) report += printobjectives(objectives) for(var/datum/objective/objective in objectives) - if(!objective.check_completion()) + if(objective.completable && !objective.check_completion()) objectives_complete = FALSE break diff --git a/code/modules/antagonists/_common/antag_team.dm b/code/modules/antagonists/_common/antag_team.dm index 486b5b0414..b376287f7a 100644 --- a/code/modules/antagonists/_common/antag_team.dm +++ b/code/modules/antagonists/_common/antag_team.dm @@ -36,11 +36,14 @@ var/win = TRUE var/objective_count = 1 for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - report += "Objective #[objective_count]: [objective.explanation_text] Success!" + if(objective.completable) + if(objective.check_completion()) + report += "Objective #[objective_count]: [objective.explanation_text] Success!" + else + report += "Objective #[objective_count]: [objective.explanation_text] Fail." + win = FALSE else - report += "Objective #[objective_count]: [objective.explanation_text] Fail." - win = FALSE + report += "Objective #[objective_count]: [objective.explanation_text]" objective_count++ if(win) report += "The [name] was successful!" diff --git a/code/modules/antagonists/brother/brother.dm b/code/modules/antagonists/brother/brother.dm index 7c589bb3ab..1388ba745c 100644 --- a/code/modules/antagonists/brother/brother.dm +++ b/code/modules/antagonists/brother/brother.dm @@ -108,13 +108,16 @@ var/win = TRUE var/objective_count = 1 for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - parts += "Objective #[objective_count]: [objective.explanation_text] Success!" + if(objective.completable) + if(objective.check_completion()) + report += "Objective #[objective_count]: [objective.explanation_text] Success!" + else + report += "Objective #[objective_count]: [objective.explanation_text] Fail." + win = FALSE else - parts += "Objective #[objective_count]: [objective.explanation_text] Fail." - win = FALSE + report += "Objective #[objective_count]: [objective.explanation_text]" objective_count++ - if(win) +if(win) parts += "The blood brothers were successful!" else parts += "The blood brothers have failed!" diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index 0d68660d9d..e76c0ed054 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -552,11 +552,14 @@ if(objectives.len) var/count = 1 for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - parts += "Objective #[count]: [objective.explanation_text] Success!" + if(objective.completable) + if(objective.check_completion()) + report += "Objective #[count]: [objective.explanation_text] Success!" + else + report += "Objective #[count]: [objective.explanation_text] Fail." + win = FALSE else - parts += "Objective #[count]: [objective.explanation_text] Fail." - changelingwin = 0 + report += "Objective #[count]: [objective.explanation_text]" count++ if(changelingwin) diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 595ce5bb90..25fe24b605 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -369,11 +369,14 @@ if(objectives.len)//If the traitor had no objectives, don't need to process this. var/count = 1 for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - objectives_text += "
Objective #[count]: [objective.explanation_text] Success!" + if(objective.completable) + if(objective.check_completion()) + report += "Objective #[count]: [objective.explanation_text] Success!" + else + report += "Objective #[count]: [objective.explanation_text] Fail." + traitorwin = FALSE else - objectives_text += "
Objective #[count]: [objective.explanation_text] Fail." - traitorwin = FALSE + report += "Objective #[count]: [objective.explanation_text]" count++ if(uplink_true) diff --git a/code/modules/antagonists/valentines/valentine.dm b/code/modules/antagonists/valentines/valentine.dm index 19c08f3076..d3bcdf0c04 100644 --- a/code/modules/antagonists/valentines/valentine.dm +++ b/code/modules/antagonists/valentines/valentine.dm @@ -35,7 +35,7 @@ var/objectives_complete = TRUE if(objectives.len) for(var/datum/objective/objective in objectives) - if(!objective.check_completion()) + if(objective.completable && !objective.check_completion()) objectives_complete = FALSE break diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index a88eb1e42a..d89d6a2744 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -62,7 +62,7 @@ /datum/antagonist/wizard/proc/create_objectives() var/datum/objective/new_objective = new("Cause as much creative mayhem as you can aboard the station! The more outlandish your methods of achieving this, the better! Make sure there's a decent amount of crew alive to tell of your tale.") - new_objective.completed = TRUE //So they can greentext without admin intervention. + new_objective.completable = FALSE new_objective.owner = owner objectives += new_objective From 5eba760aa8b37d600ef7445127d3ca43af1efe73 Mon Sep 17 00:00:00 2001 From: Putnam Date: Sat, 18 Jan 2020 22:07:54 -0800 Subject: [PATCH 007/172] Reworked survivalist --- code/game/gamemodes/objective.dm | 61 +++++++++---------- .../antagonists/survivalist/survivalist.dm | 7 ++- .../spells/spell_types/rightandwrong.dm | 13 ++++ 3 files changed, 47 insertions(+), 34 deletions(-) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 4c82046e07..bb18b89678 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -787,40 +787,10 @@ GLOBAL_LIST_EMPTY(possible_items_special) /datum/objective/destroy/internal var/stolen = FALSE //Have we already eliminated this target? -/datum/objective/steal_five_of_type - name = "steal five of" - explanation_text = "Steal at least five items!" - var/list/wanted_items = list(/obj/item) - -/datum/objective/steal_five_of_type/New() - ..() - wanted_items = typecacheof(wanted_items) - -/datum/objective/steal_five_of_type/summon_guns - name = "steal guns" - explanation_text = "Steal at least five guns!" - wanted_items = list(/obj/item/gun) - -/datum/objective/steal_five_of_type/summon_magic - name = "steal magic" - explanation_text = "Steal at least five magical artefacts!" - wanted_items = list(/obj/item/spellbook, /obj/item/gun/magic, /obj/item/clothing/suit/space/hardsuit/wizard, /obj/item/scrying, /obj/item/antag_spawner/contract, /obj/item/necromantic_stone) - -/datum/objective/steal_five_of_type/check_completion() - var/list/datum/mind/owners = get_owners() - var/stolen_count = 0 - for(var/datum/mind/M in owners) - if(!isliving(M.current)) - continue - var/list/all_items = M.current.GetAllContents() //this should get things in cheesewheels, books, etc. - for(var/obj/I in all_items) //Check for wanted items - if(is_type_in_typecache(I, wanted_items)) - stolen_count++ - return stolen_count >= 5 - //Created by admin tools /datum/objective/custom name = "custom" + completable = FALSE /datum/objective/custom/admin_edit(mob/admin) var/expl = stripped_input(admin, "Custom objective:", "Objective", explanation_text) @@ -998,4 +968,33 @@ GLOBAL_LIST_EMPTY(possible_items_special) command_staff_only = TRUE +/datum/objective/horde + name = "horde" + var/obj/item/horded_item = null +/datum/objective/horde/get_target() + return horded_item + +/datum/objective/horde/proc/set_target(obj/item/I) + if(item) + horded_item = I + explanation_text = "Keep [I] on your person at all costs." + return horded_item + else + explanation_text = "Free objective" + return + +/datum/objective/horde/check_completion() + var/list/datum/mind/owners = get_owners() + if(!horded_item) + return TRUE + for(var/datum/mind/M in owners) + if(!isliving(M.current)) + continue + + var/list/all_items = M.current.GetAllContents() //this should get things in cheesewheels, books, etc. + + for(var/obj/I in all_items) //Check for items + if(I == horded_item) + return TRUE + return FALSE diff --git a/code/modules/antagonists/survivalist/survivalist.dm b/code/modules/antagonists/survivalist/survivalist.dm index 4e0184b7b6..5334bb0f41 100644 --- a/code/modules/antagonists/survivalist/survivalist.dm +++ b/code/modules/antagonists/survivalist/survivalist.dm @@ -2,6 +2,7 @@ name = "Survivalist" show_in_antagpanel = FALSE show_name_in_check_antagonists = TRUE + blacklisted_quirks = list("Pacifist") // mutes are allowed var/greet_message = "" /datum/antagonist/survivalist/proc/forge_objectives() @@ -19,7 +20,7 @@ owner.announce_objectives() /datum/antagonist/survivalist/guns - greet_message = "Your own safety matters above all else, and the only way to ensure your safety is to stockpile weapons! Grab as many guns as possible, by any means necessary. Kill anyone who gets in your way." + greet_message = "Your own safety matters above all else, and the only way to ensure your safety is to stockpile weapons! Grab as many guns as possible, and don't let anyone take them!" /datum/antagonist/survivalist/guns/forge_objectives() var/datum/objective/steal_five_of_type/summon_guns/guns = new @@ -29,10 +30,10 @@ /datum/antagonist/survivalist/magic name = "Amateur Magician" - greet_message = "Grow your newfound talent! Grab as many magical artefacts as possible, by any means necessary. Kill anyone who gets in your way." + greet_message = "This magic stuff is... so powerful. You want more. More! They want your power. They can't have it! Don't let them have it!" /datum/antagonist/survivalist/magic/forge_objectives() var/datum/objective/steal_five_of_type/summon_magic/magic = new magic.owner = owner objectives += magic - ..() \ No newline at end of file + ..() diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm index e5e856c630..b73929fc44 100644 --- a/code/modules/spells/spell_types/rightandwrong.dm +++ b/code/modules/spells/spell_types/rightandwrong.dm @@ -102,6 +102,12 @@ GLOBAL_VAR_INIT(summon_magic_triggered, FALSE) var/gun_type = pick(GLOB.summoned_guns) var/obj/item/gun/G = new gun_type(get_turf(H)) G.unlock() + var/datum/antagonist/survalist/guns/our_antag_datum = has_antag_datum(/datum/antagonist/survivalist/guns) + if(our_antag_datum) + var/datum/objective/horde_item/O = new() + O.owner = H + O.set_target(G) + our_antag_datum.objectives += O playsound(get_turf(H),'sound/magic/summon_guns.ogg', 50, 1) var/in_hand = H.put_in_hands(G) // not always successful @@ -128,6 +134,13 @@ GLOBAL_VAR_INIT(summon_magic_triggered, FALSE) var/obj/item/M = new magic_type(get_turf(H)) playsound(get_turf(H),'sound/magic/summon_magic.ogg', 50, 1) + var/datum/antagonist/survalist/magic/our_antag_datum = has_antag_datum(/datum/antagonist/survivalist/magic) + if(our_antag_datum) + var/datum/objective/horde_item/O = new() + O.owner = H + O.set_target(M) + our_antag_datum.objectives += O + var/in_hand = H.put_in_hands(M) to_chat(H, "\A [M] appears [in_hand ? "in your hand" : "at your feet"]!") From 06c66617e6c6cebfd58ad1c9f5638b2a44cf25c4 Mon Sep 17 00:00:00 2001 From: Putnam Date: Sun, 19 Jan 2020 18:58:10 -0800 Subject: [PATCH 008/172] m o r e traitor objectives --- code/__HELPERS/roundend.dm | 6 +- code/controllers/subsystem/ticker.dm | 2 + code/datums/traits/negative.dm | 3 + code/game/gamemodes/objective.dm | 88 ++++++++++++++- code/game/gamemodes/objective_sabotage.dm | 106 ++++++++++++++++++ code/modules/admin/antag_panel.dm | 2 +- .../antagonists/traitor/datum_traitor.dm | 28 +++-- 7 files changed, 223 insertions(+), 12 deletions(-) create mode 100644 code/game/gamemodes/objective_sabotage.dm diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 49825bcb50..5102eb4802 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -3,6 +3,9 @@ #define POPCOUNT_SHUTTLE_ESCAPEES "shuttle_escapees" //Emergency shuttle only. /datum/controller/subsystem/ticker/proc/gather_roundend_feedback() + var/datum/station_state/end_state = new /datum/station_state() + end_state.count() + station_integrity = min(PERCENT(GLOB.start_state.score(end_state)), 100) gather_antag_data() record_nuke_disk_location() var/json_file = file("[GLOB.log_directory]/round_end_data.json") @@ -71,9 +74,6 @@ mob_data += list("name" = m.name, "typepath" = m.type) var/pos = length(file_data["[escaped]"]["[category]"]) + 1 file_data["[escaped]"]["[category]"]["[pos]"] = mob_data - var/datum/station_state/end_state = new /datum/station_state() - end_state.count() - var/station_integrity = min(PERCENT(GLOB.start_state.score(end_state)), 100) file_data["additional data"]["station integrity"] = station_integrity WRITE_FILE(json_file, json_encode(file_data)) SSblackbox.record_feedback("nested tally", "round_end_stats", num_survivors, list("survivors", "total")) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index c9562bcfd1..ceb003210e 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -68,6 +68,8 @@ SUBSYSTEM_DEF(ticker) var/modevoted = FALSE //Have we sent a vote for the gamemode? + var/station_integrity = 100 // stored at roundend for use in some antag goals + /datum/controller/subsystem/ticker/Initialize(timeofday) load_mode() diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index d556d02ebb..f1d394ee2e 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -39,6 +39,8 @@ var/obj/item/heirloom var/where +GLOBAL_LIST_EMPTY(family_heirlooms) + /datum/quirk/family_heirloom/on_spawn() var/mob/living/carbon/human/H = quirk_holder var/obj/item/heirloom_type @@ -77,6 +79,7 @@ /obj/item/lighter, /obj/item/dice/d20) heirloom = new heirloom_type(get_turf(quirk_holder)) + GLOB.family_heirlooms += heirloom var/list/slots = list( "in your left pocket" = SLOT_L_STORE, "in your right pocket" = SLOT_R_STORE, diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index bb18b89678..4b7eebb5b9 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -366,6 +366,28 @@ GLOBAL_LIST_EMPTY(objectives) return FALSE return TRUE +/datum/objective/breakout + name = "breakout" + martyr_compatible = 1 + var/target_role_type = 0 + var/human_check = TRUE + +/datum/objective/breakout/check_completion() + return !target || considered_escaped(target, enforce_human = human_check) + +/datum/objective/breakout/find_target_by_role(role, role_type=0, invert=0) + if(!invert) + target_role_type = role_type + ..() + return target + +/datum/objective/breakout/update_explanation_text() + ..() + if(target && target.current) + explanation_text = "Make sure [target.name], the [!target_role_type ? target.assigned_role : target.special_role] escapes on the shuttle or an escape pod alive and without being in custody." + else + explanation_text = "Free Objective" + /datum/objective/escape/escape_with_identity name = "escape with identity" var/target_real_name // Has to be stored because the target's real_name can change over the course of the round @@ -583,7 +605,6 @@ GLOBAL_LIST_EMPTY(possible_items_special) explanation_text = "Do not give up or lose [targetinfo.name]." steal_target = targetinfo.targetitem - /datum/objective/download name = "download" @@ -998,3 +1019,68 @@ GLOBAL_LIST_EMPTY(possible_items_special) if(I == horded_item) return TRUE return FALSE + +/datum/objective/horde/heirloom + name = "steal heirloom" + +/datum/objective/horde/heirloom/proc/find_target() + set_target(pick(GLOB.family_heirlooms)) + +GLOBAL_LIST_EMPTY(possible_sabotages) +// For saboteurs. Go in and cause some trouble somewhere. Not necessarily breaking things, just sufficiently troublemaking. +/datum/objective/sabotage + name = "sabotage" + var/datum/sabotage_objective/targetinfo = null //composition > inheritance. + +/datum/objective/sabotage/get_target() + return targetinfo.sabotage_type + +/datum/objective/sabotage/New() + ..() + if(!GLOB.possible_sabotages.len)//Only need to fill the list when it's needed. + for(var/I in subtypesof(/datum/sabotage_objective)) + new I + +/datum/objective/sabotage/find_target() + var/list/datum/mind/owners = get_owners() + var/approved_targets = list() + check_sabotages: + for(var/datum/sabotage_objective/possible_sabotage in GLOB.possible_sabotages) + if(!is_unique_objective(possible_sabotage.sabotage_type) || possible_sabotage.check_conditions()) + continue + for(var/datum/mind/M in owners) + if(M.current.mind.assigned_role in possible_sabotage.excludefromjob) + continue check_sabotages + approved_targets += possible_sabotage + return set_target(safepick(approved_targets)) + +/datum/objective/sabotage/proc/set_target(datum/sabotage_objective/sabo) + if(sabo) + targetinfo = sabo + explanation_text = "[targetinfo.name]" + give_special_equipment(targetinfo.special_equipment) + return sabo + else + explanation_text = "Free objective" + return + +/datum/objective/sabotage/check_completion() + return targetinfo.check_conditions() + +/datum/objective/flavor + name = "Flavor" + completable = FALSE + +/datum/objective/flavor/proc/forge_objective() + +/datum/objective/flavor/traitor/forge_objective() + explanation_text = pickweight( + "Teach the heads of staff a lesson they will never forget." = 1, + "Show Nanotrasen the utility of a pure oxygen atmosphere." = 2, + "The Donk Corporation has hired you with the task to maim the crew in whatever way you can. Strain the resources of medical staff, and create a hostile working enviroment for human resources." = 3, + "The Waffle Corporation has given you the task to create the biggest prank the station's security force has seen! Harass security, and don't stop while you can still honk!" = 4, + "Kill one of the station's beloved pets. Make a show of it." = 3, + "Get illegal technology spread through the station." = 3, + "Slow down the process of research as much as possible." = (owner.assigned_role in list("Research Director", "Scientist", "Roboticist") ? 6 : 0), + "Channel your inner rat. Cut wires throughout the station" = (owner.assigned_role in list("Station Engineer", "Atmos Technician", "Assistant") ? 6 : 0), + ) diff --git a/code/game/gamemodes/objective_sabotage.dm b/code/game/gamemodes/objective_sabotage.dm new file mode 100644 index 0000000000..0ede317626 --- /dev/null +++ b/code/game/gamemodes/objective_sabotage.dm @@ -0,0 +1,106 @@ +/datum/sabotage_objective + var/name = "Free Objective" + var/sabotage_type = "nothing" + var/special_equipment = list() + var/list/excludefromjob = list() + +/datum/sabotage_objective/New() + ..() + if(sabotage_type!="nothing") + GLOB.possible_sabotages += src + +/datum/sabotage_objective/proc/check_conditions() + return TRUE + +/datum/sabotage_objective/processing + var/won = FALSE + +/datum/sabotage_objective/processing/New() + ..() + START_PROCESSING(SSprocessing, src) + +/datum/sabotage_objective/processing/proc/check_condition_processing() + return TRUE + +/datum/sabotage_objective/processing/process() + won = check_condition_processing() + if(won) + STOP_PROCESSING(SSprocessing,src) + +/datum/sabotage_objective/processing/power_sink + name = "Drain at least 1 gigajoule of power using a power sink." + sabotage_type = "powersink" + special_equipment = list(/obj/item/powersink) + var/sink_found = FALSE + var/count = 0 + +/datum/sabotage_objective/processing/power_sink/check_condition_processing() + count += 1 + if(count==10 || sink_found) // doesn't need to fire that often unless a sink exists + var/sink_found_this_time = FALSE + for(var/datum/powernet/PN in GLOB.powernets) + for(var/obj/item/powersink/sink in PN.nodes) + sink_found_this_time = TRUE + if(sink.power_drained>1e9) + return TRUE + sink_found = sink_found_this_time + count = 0 + return FALSE + +/obj/item/paper/guides/antag/supermatter_sabotage + info = "Ways to sabotage a supermatter:
\ +
    \ +
  • Set the air alarm's operating mode to anything that isn't 'draught' (yes, anything, though 'off' works best). Or just smash the air alarm, that works too.
  • \ +
  • Wrench a pipe (the junction to the cold loop is most effective, but some setups will robust through this no issue; best to try for multiple)
  • \ +
  • Pump in as much carbon dioxide, oxygen, plasma or tritium as you can find (this will likely also cause a singularity or tesla delamination, so watch out!)
  • \ +
  • Unset the filters on the cooling loop, or, perhaps more insidious, set them to oxygen/plasma.
  • \ +
  • Deactivate the digital valve that sends the exhaust gases to space (note: only works on box station; others you must unwrench).
  • \ +
  • There are many other ways; be creative!
  • \ +
" + +/datum/sabotage_objective/processing/supermatter + name = "Sabotage the supermatter so that it goes under 50% integrity." + sabotage_type = "supermatter" + special_equipment = list(/obj/item/paper/guides/antag/supermatter_sabotage) + var/list/supermatters = list() + excludefromjob = list("Chief Engineer", "Station Engineer", "Atmospheric Technician") + +/datum/sabotage_objective/processing/supermatter/check_condition_processing() + if(!supermatters.len) + supermatters = list() + for(var/obj/machinery/power/supermatter_crystal/S in GLOB.machines) + // Delaminating, not within coverage, not on a tile. + if (!isturf(S.loc) || !(is_station_level(S.z) || is_mining_level(S.z))) + continue + supermatters.Add(S) + for(var/obj/machinery/power/supermatter_crystal/S in supermatters) + if(S.get_integrity() < 50) + return TRUE + return FALSE + +/datum/sabotage_objective/station_integrity + name = "Make sure the station is at less than 80% integrity by the end. Smash walls, windows etc. to reach this goal." + sabotage_type = "integrity" + +/datum/sabotage_objective/station_integrity/check_conditions() + return SSticker.station_integrity < 80 + +/datum/sabotage_objective/cloner + name = "Destroy all Nanotrasen cloning machines." + sabotage_type = "cloner" + +/datum/sabotage_objective/cloner/check_conditions() + return !(locate(/obj/machinery/clonepod) in GLOB.machines) + +/datum/sabotage_objective/ai_law + name = "Upload a hacked law to the AI." + sabotage_type = "ailaw" + special_equipment = list(/obj/item/aiModule/syndicate) + excludefromjob = list("Chief Engineer","Research Director","Head of Personnel","Captain","Chief Medical Officer","Head Of Security") + +/datum/sabotage_objective/ai_law/check_conditions() + for (var/i in GLOB.ai_list) + var/mob/living/silicon/ai/aiPlayer = i + if(aiPlayer.mind && length(aiPlayer.laws.hacked)) + return TRUE + return FALSE diff --git a/code/modules/admin/antag_panel.dm b/code/modules/admin/antag_panel.dm index ffb086a18d..19e53b09b4 100644 --- a/code/modules/admin/antag_panel.dm +++ b/code/modules/admin/antag_panel.dm @@ -47,7 +47,7 @@ GLOBAL_VAR(antag_prototypes) else var/obj_count = 1 for(var/datum/objective/objective in objectives) - result += "[obj_count]: [objective.explanation_text] Edit Delete [objective.completed ? "Mark as incomplete" : "Mark as complete"]
" + result += "[obj_count]: [objective.explanation_text] Edit Delete [objective.completed ? "Mark as incomplete" : "Mark as complete"]
" obj_count++ result += "Add objective
" result += "Announce objectives
" diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 25fe24b605..62fdf56b71 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -77,19 +77,23 @@ var/is_hijacker = FALSE var/datum/game_mode/dynamic/mode var/is_dynamic = FALSE + var/hijack_prob = 0 if(istype(SSticker.mode,/datum/game_mode/dynamic)) mode = SSticker.mode is_dynamic = TRUE - if(mode.storyteller.flags & NO_ASSASSIN) - is_hijacker = FALSE + if(mode.threat >= CONFIG_GET(number/dynamic_hijack_cost)) + hijack_prob = CLAMP(mode.threat_level-50,0,20) if(GLOB.joined_player_list.len>=GLOB.dynamic_high_pop_limit) - is_hijacker = (prob(10) && mode.threat_level > CONFIG_GET(number/dynamic_hijack_high_population_requirement)) + is_hijacker = (prob(hijack_prob) && mode.threat_level > CONFIG_GET(number/dynamic_hijack_high_population_requirement)) else var/indice_pop = min(10,round(GLOB.joined_player_list.len/mode.pop_per_requirement)+1) - is_hijacker = (prob(10) && (mode.threat_level >= CONFIG_GET(number_list/dynamic_hijack_requirements)[indice_pop])) + is_hijacker = (prob(hijack_prob) && (mode.threat_level >= CONFIG_GET(number_list/dynamic_hijack_requirements)[indice_pop])) + if(mode.storyteller.flags & NO_ASSASSIN) + is_hijacker = FALSE else if (GLOB.joined_player_list.len >= 30) // Less murderboning on lowpop thanks + hijack_prob = 10 is_hijacker = prob(10) - var/martyr_chance = prob(20) + var/martyr_chance = prob(hijack_prob*2) var/objective_count = is_hijacker //Hijacking counts towards number of objectives if(!SSticker.mode.exchange_blue && SSticker.mode.traitors.len >= 8) //Set up an exchange if there are enough traitors if(!SSticker.mode.exchange_red) @@ -170,7 +174,7 @@ if(istype(SSticker.mode,/datum/game_mode/dynamic)) mode = SSticker.mode is_dynamic = TRUE - assassin_prob = mode.threat_level*(2/3) + assassin_prob = max(0,mode.threat_level-20) if(prob(assassin_prob)) if(is_dynamic) var/threat_spent = CONFIG_GET(number/dynamic_assassinate_cost) @@ -198,11 +202,21 @@ download_objective.owner = owner download_objective.gen_amount_goal() add_objective(download_objective) - else + else if(prob(40)) var/datum/objective/steal/steal_objective = new steal_objective.owner = owner steal_objective.find_target() add_objective(steal_objective) + else if(prob(40)) + var/datum/objective/sabotage/sabotage_objective = new + sabotage_objective.owner = owner + sabotage_objective.find_target() + add_objective(sabotage_objective) + else + var/datum/objective/flavor/traitor/flavor_objective = new + flavor_objective.owner = owner + flavor_objective.forge_objective() + add_objective(flavor_objective) /datum/antagonist/traitor/proc/forge_single_AI_objective() .=1 From 8e674817a9995beebaccf192b6464e7c8d07ecf8 Mon Sep 17 00:00:00 2001 From: Putnam Date: Mon, 20 Jan 2020 00:30:18 -0800 Subject: [PATCH 009/172] errors --- code/game/gamemodes/objective.dm | 4 ++-- code/modules/antagonists/_common/antag_datum.dm | 16 +++++++++------- code/modules/antagonists/brother/brother.dm | 8 ++++---- .../modules/antagonists/changeling/changeling.dm | 8 ++++---- .../antagonists/survivalist/survivalist.dm | 12 ------------ .../modules/antagonists/traitor/datum_traitor.dm | 6 +++--- code/modules/spells/spell_types/rightandwrong.dm | 10 +++++----- tgstation.dme | 1 + 8 files changed, 28 insertions(+), 37 deletions(-) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 4b7eebb5b9..ff5649f5fd 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -997,7 +997,7 @@ GLOBAL_LIST_EMPTY(possible_items_special) return horded_item /datum/objective/horde/proc/set_target(obj/item/I) - if(item) + if(I) horded_item = I explanation_text = "Keep [I] on your person at all costs." return horded_item @@ -1023,7 +1023,7 @@ GLOBAL_LIST_EMPTY(possible_items_special) /datum/objective/horde/heirloom name = "steal heirloom" -/datum/objective/horde/heirloom/proc/find_target() +/datum/objective/horde/heirloom/find_target() set_target(pick(GLOB.family_heirlooms)) GLOBAL_LIST_EMPTY(possible_sabotages) diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 4587a3c8ab..eafe4f4ec7 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -20,7 +20,7 @@ GLOBAL_LIST_EMPTY(antagonists) var/show_in_antagpanel = TRUE //This will hide adding this antag type in antag panel, use only for internal subtypes that shouldn't be added directly but still show if possessed by mind var/antagpanel_category = "Uncategorized" //Antagpanel will display these together, REQUIRED var/show_name_in_check_antagonists = FALSE //Will append antagonist name in admin listings - use for categories that share more than one antag type - var/list/quirk_blacklist = list("Pacifist","Mute") // Quirks that will be removed upon gaining this antag. Pacifist and mute are default. + var/list/blacklisted_quirks = list("Pacifist","Mute") // Quirks that will be removed upon gaining this antag. Pacifist and mute are default. /datum/antagonist/New() GLOB.antagonists += src @@ -120,12 +120,14 @@ GLOBAL_LIST_EMPTY(antagonists) SEND_SIGNAL(owner.current, COMSIG_CLEAR_MOOD_EVENT, "antag_moodlet") /datum/antagonist/proc/remove_blacklisted_quirks() - for(var/q in owner.roundstart_quirks) - var/datum/quirk/Q = q - if(Q.name in quirk_blacklist) - if(Q.antag_removal_text) - to_chat(owner, "[Q.antag_removal_text]") - owner.remove_quirk(Q.type) + var/mob/living/L = owner + if(istype(L)) + for(var/q in L.roundstart_quirks) + var/datum/quirk/Q = q + if(Q.name in blacklisted_quirks) + if(Q.antag_removal_text) + to_chat(L, "[Q.antag_removal_text]") + L.remove_quirk(Q.type) //Returns the team antagonist belongs to if any. /datum/antagonist/proc/get_team() diff --git a/code/modules/antagonists/brother/brother.dm b/code/modules/antagonists/brother/brother.dm index 1388ba745c..22a343fb5f 100644 --- a/code/modules/antagonists/brother/brother.dm +++ b/code/modules/antagonists/brother/brother.dm @@ -110,14 +110,14 @@ for(var/datum/objective/objective in objectives) if(objective.completable) if(objective.check_completion()) - report += "Objective #[objective_count]: [objective.explanation_text] Success!" + parts += "Objective #[objective_count]: [objective.explanation_text] Success!" else - report += "Objective #[objective_count]: [objective.explanation_text] Fail." + parts += "Objective #[objective_count]: [objective.explanation_text] Fail." win = FALSE else - report += "Objective #[objective_count]: [objective.explanation_text]" + parts += "Objective #[objective_count]: [objective.explanation_text]" objective_count++ -if(win) + if(win) parts += "The blood brothers were successful!" else parts += "The blood brothers have failed!" diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index e76c0ed054..7d702ac25d 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -554,12 +554,12 @@ for(var/datum/objective/objective in objectives) if(objective.completable) if(objective.check_completion()) - report += "Objective #[count]: [objective.explanation_text] Success!" + parts += "Objective #[count]: [objective.explanation_text] Success!" else - report += "Objective #[count]: [objective.explanation_text] Fail." - win = FALSE + parts += "Objective #[count]: [objective.explanation_text] Fail." + changelingwin = FALSE else - report += "Objective #[count]: [objective.explanation_text]" + parts += "Objective #[count]: [objective.explanation_text]" count++ if(changelingwin) diff --git a/code/modules/antagonists/survivalist/survivalist.dm b/code/modules/antagonists/survivalist/survivalist.dm index 5334bb0f41..1b870ec389 100644 --- a/code/modules/antagonists/survivalist/survivalist.dm +++ b/code/modules/antagonists/survivalist/survivalist.dm @@ -22,18 +22,6 @@ /datum/antagonist/survivalist/guns greet_message = "Your own safety matters above all else, and the only way to ensure your safety is to stockpile weapons! Grab as many guns as possible, and don't let anyone take them!" -/datum/antagonist/survivalist/guns/forge_objectives() - var/datum/objective/steal_five_of_type/summon_guns/guns = new - guns.owner = owner - objectives += guns - ..() - /datum/antagonist/survivalist/magic name = "Amateur Magician" greet_message = "This magic stuff is... so powerful. You want more. More! They want your power. They can't have it! Don't let them have it!" - -/datum/antagonist/survivalist/magic/forge_objectives() - var/datum/objective/steal_five_of_type/summon_magic/magic = new - magic.owner = owner - objectives += magic - ..() diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 62fdf56b71..3385991116 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -385,12 +385,12 @@ for(var/datum/objective/objective in objectives) if(objective.completable) if(objective.check_completion()) - report += "Objective #[count]: [objective.explanation_text] Success!" + objectives_text += "Objective #[count]: [objective.explanation_text] Success!" else - report += "Objective #[count]: [objective.explanation_text] Fail." + objectives_text += "Objective #[count]: [objective.explanation_text] Fail." traitorwin = FALSE else - report += "Objective #[count]: [objective.explanation_text]" + objectives_text += "Objective #[count]: [objective.explanation_text]" count++ if(uplink_true) diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm index b73929fc44..996e2e3168 100644 --- a/code/modules/spells/spell_types/rightandwrong.dm +++ b/code/modules/spells/spell_types/rightandwrong.dm @@ -102,9 +102,9 @@ GLOBAL_VAR_INIT(summon_magic_triggered, FALSE) var/gun_type = pick(GLOB.summoned_guns) var/obj/item/gun/G = new gun_type(get_turf(H)) G.unlock() - var/datum/antagonist/survalist/guns/our_antag_datum = has_antag_datum(/datum/antagonist/survivalist/guns) + var/datum/antagonist/survivalist/guns/our_antag_datum = H.mind.has_antag_datum(/datum/antagonist/survivalist/guns) if(our_antag_datum) - var/datum/objective/horde_item/O = new() + var/datum/objective/horde/O = new() O.owner = H O.set_target(G) our_antag_datum.objectives += O @@ -134,9 +134,9 @@ GLOBAL_VAR_INIT(summon_magic_triggered, FALSE) var/obj/item/M = new magic_type(get_turf(H)) playsound(get_turf(H),'sound/magic/summon_magic.ogg', 50, 1) - var/datum/antagonist/survalist/magic/our_antag_datum = has_antag_datum(/datum/antagonist/survivalist/magic) - if(our_antag_datum) - var/datum/objective/horde_item/O = new() + var/datum/antagonist/survivalist/magic/our_antag_datum = H.mind.has_antag_datum(/datum/antagonist/survivalist/magic) + if(istype(our_antag_datum)) + var/datum/objective/horde/O = new() O.owner = H O.set_target(M) our_antag_datum.objectives += O diff --git a/tgstation.dme b/tgstation.dme index 1c7d5112e7..1e881df6a7 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -567,6 +567,7 @@ #include "code\game\gamemodes\game_mode.dm" #include "code\game\gamemodes\objective.dm" #include "code\game\gamemodes\objective_items.dm" +#include "code\game\gamemodes\objective_sabotage.dm" #include "code\game\gamemodes\bloodsucker\bloodsucker.dm" #include "code\game\gamemodes\bloodsucker\hunter.dm" #include "code\game\gamemodes\brother\traitor_bro.dm" From 67c2fdca52151b9d9407612efaed9aea2ff1a427 Mon Sep 17 00:00:00 2001 From: Putnam Date: Mon, 20 Jan 2020 01:20:42 -0800 Subject: [PATCH 010/172] more flavor objectives --- code/game/gamemodes/objective.dm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index ff5649f5fd..cbee7a79ef 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -1077,10 +1077,11 @@ GLOBAL_LIST_EMPTY(possible_sabotages) explanation_text = pickweight( "Teach the heads of staff a lesson they will never forget." = 1, "Show Nanotrasen the utility of a pure oxygen atmosphere." = 2, - "The Donk Corporation has hired you with the task to maim the crew in whatever way you can. Strain the resources of medical staff, and create a hostile working enviroment for human resources." = 3, - "The Waffle Corporation has given you the task to create the biggest prank the station's security force has seen! Harass security, and don't stop while you can still honk!" = 4, - "Kill one of the station's beloved pets. Make a show of it." = 3, + "Waffle Co. wants you! That’s right, YOU! To cause as much humerous terrorism against Nanotrasen as possible! How? We don’t care as long as it’s entertaining! Be as creative and exciting as possible when carrying out your dirty deeds. Have fun!" = 2, + "Kill one of the station's beloved pets. Make a show of it, though you don't have to reveal yourself." = 3, "Get illegal technology spread through the station." = 3, "Slow down the process of research as much as possible." = (owner.assigned_role in list("Research Director", "Scientist", "Roboticist") ? 6 : 0), - "Channel your inner rat. Cut wires throughout the station" = (owner.assigned_role in list("Station Engineer", "Atmos Technician", "Assistant") ? 6 : 0), + "Channel your inner rat. Cut wires throughout the station." = (owner.assigned_role in list("Station Engineer", "Atmos Technician", "Assistant") ? 6 : 0), + "The Animal Rights Consortium needs you to save the innocent non-humanoid creatures aboard Citadel Station by any means necessary. Use your best judgement to decide whether an animal or xenobiological is abused, but if they are, ensure the abuser is punished. Avoid killing too many people if possible, and if you do harm any creatures, you will be terminated upon extraction." = 2, + "Donk Co. wants ransom money, and you are going to get it. Your goal is to kidnap and crewmember you can get your hands on and hold them hostage until you get something of significant value. Try to work out the best deal you can. Remember that Higher Value Targets are generally going to get a better deal so try to prioritize heads of staff if possible. We do not approve of mindless killing of Nanotrasen employees, so don’t do it." = 2 ) From dfaa3bf15cc96df4f8343a5002d34ab810c1ed9c Mon Sep 17 00:00:00 2001 From: Putnam Date: Mon, 20 Jan 2020 03:46:44 -0800 Subject: [PATCH 011/172] Added another flavor obj, "horde" to "hoard" --- code/game/gamemodes/objective.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index cbee7a79ef..bd8baf17db 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -1077,11 +1077,12 @@ GLOBAL_LIST_EMPTY(possible_sabotages) explanation_text = pickweight( "Teach the heads of staff a lesson they will never forget." = 1, "Show Nanotrasen the utility of a pure oxygen atmosphere." = 2, - "Waffle Co. wants you! That’s right, YOU! To cause as much humerous terrorism against Nanotrasen as possible! How? We don’t care as long as it’s entertaining! Be as creative and exciting as possible when carrying out your dirty deeds. Have fun!" = 2, + "Waffle Co. wants you! That’s right, YOU! To cause as much humorous terrorism against Nanotrasen as possible! How? We don’t care as long as it’s entertaining! Be as creative and exciting as possible when carrying out your dirty deeds. Have fun!" = 1, "Kill one of the station's beloved pets. Make a show of it, though you don't have to reveal yourself." = 3, "Get illegal technology spread through the station." = 3, "Slow down the process of research as much as possible." = (owner.assigned_role in list("Research Director", "Scientist", "Roboticist") ? 6 : 0), "Channel your inner rat. Cut wires throughout the station." = (owner.assigned_role in list("Station Engineer", "Atmos Technician", "Assistant") ? 6 : 0), "The Animal Rights Consortium needs you to save the innocent non-humanoid creatures aboard Citadel Station by any means necessary. Use your best judgement to decide whether an animal or xenobiological is abused, but if they are, ensure the abuser is punished. Avoid killing too many people if possible, and if you do harm any creatures, you will be terminated upon extraction." = 2, - "Donk Co. wants ransom money, and you are going to get it. Your goal is to kidnap and crewmember you can get your hands on and hold them hostage until you get something of significant value. Try to work out the best deal you can. Remember that Higher Value Targets are generally going to get a better deal so try to prioritize heads of staff if possible. We do not approve of mindless killing of Nanotrasen employees, so don’t do it." = 2 + "Donk Co. wants ransom money, and you are going to get it. Your goal is to kidnap and crewmember you can get your hands on and hold them hostage until you get something of significant value. Try to work out the best deal you can. Remember that Higher Value Targets are generally going to get a better deal so try to prioritize heads of staff if possible. We do not approve of mindless killing of Nanotrasen employees, so don’t do it." = 1, + "Steal as many shoes as possible. Lay broken glass everywhere." = 2 ) From 815b4f033dff14be2a60c67e05641f65cdc1bca6 Mon Sep 17 00:00:00 2001 From: Putnam Date: Mon, 20 Jan 2020 04:13:54 -0800 Subject: [PATCH 012/172] made flavor things a game option + more hoard --- .../configuration/entries/game_options.dm | 6 +++ code/datums/mind.dm | 3 +- code/game/gamemodes/objective.dm | 48 +++++++++---------- .../antagonists/traitor/datum_traitor.dm | 1 - .../spells/spell_types/rightandwrong.dm | 4 +- config/game_options.txt | 11 +++++ 6 files changed, 43 insertions(+), 30 deletions(-) diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index aeca31ebd2..cf5e0f7db1 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -408,3 +408,9 @@ /datum/config_entry/number/dropped_modes config_entry_value = 3 + +/datum/config_entry/keyed_list/flavor_objective_traitor + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM + splitter = "=" + lowercase = FALSE diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 464ea37d02..c25f5d5199 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -471,7 +471,8 @@ /datum/objective/nuclear, /datum/objective/capture, /datum/objective/absorb, - /datum/objective/custom + /datum/objective/custom, + /datum/objective/flavor/traitor ) for(var/T in allowed_types) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index bd8baf17db..5b3e6a1164 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -989,25 +989,25 @@ GLOBAL_LIST_EMPTY(possible_items_special) command_staff_only = TRUE -/datum/objective/horde - name = "horde" - var/obj/item/horded_item = null +/datum/objective/hoard + name = "hoard" + var/obj/item/hoarded_item = null -/datum/objective/horde/get_target() - return horded_item +/datum/objective/hoard/get_target() + return hoarded_item -/datum/objective/horde/proc/set_target(obj/item/I) +/datum/objective/hoard/proc/set_target(obj/item/I) if(I) - horded_item = I + hoarded_item = I explanation_text = "Keep [I] on your person at all costs." - return horded_item + return hoarded_item else explanation_text = "Free objective" return -/datum/objective/horde/check_completion() +/datum/objective/hoard/check_completion() var/list/datum/mind/owners = get_owners() - if(!horded_item) + if(!hoarded_item) return TRUE for(var/datum/mind/M in owners) if(!isliving(M.current)) @@ -1016,14 +1016,14 @@ GLOBAL_LIST_EMPTY(possible_items_special) var/list/all_items = M.current.GetAllContents() //this should get things in cheesewheels, books, etc. for(var/obj/I in all_items) //Check for items - if(I == horded_item) + if(I == hoarded_item) return TRUE return FALSE -/datum/objective/horde/heirloom +/datum/objective/hoard/heirloom name = "steal heirloom" -/datum/objective/horde/heirloom/find_target() +/datum/objective/hoard/heirloom/find_target() set_target(pick(GLOB.family_heirlooms)) GLOBAL_LIST_EMPTY(possible_sabotages) @@ -1068,21 +1068,17 @@ GLOBAL_LIST_EMPTY(possible_sabotages) return targetinfo.check_conditions() /datum/objective/flavor - name = "Flavor" + name = "flavor" completable = FALSE +/datum/objective/flavor/New() + ..() + forge_objective() + /datum/objective/flavor/proc/forge_objective() +/datum/objective/flavor/traitor + name = "traitor flavor" + /datum/objective/flavor/traitor/forge_objective() - explanation_text = pickweight( - "Teach the heads of staff a lesson they will never forget." = 1, - "Show Nanotrasen the utility of a pure oxygen atmosphere." = 2, - "Waffle Co. wants you! That’s right, YOU! To cause as much humorous terrorism against Nanotrasen as possible! How? We don’t care as long as it’s entertaining! Be as creative and exciting as possible when carrying out your dirty deeds. Have fun!" = 1, - "Kill one of the station's beloved pets. Make a show of it, though you don't have to reveal yourself." = 3, - "Get illegal technology spread through the station." = 3, - "Slow down the process of research as much as possible." = (owner.assigned_role in list("Research Director", "Scientist", "Roboticist") ? 6 : 0), - "Channel your inner rat. Cut wires throughout the station." = (owner.assigned_role in list("Station Engineer", "Atmos Technician", "Assistant") ? 6 : 0), - "The Animal Rights Consortium needs you to save the innocent non-humanoid creatures aboard Citadel Station by any means necessary. Use your best judgement to decide whether an animal or xenobiological is abused, but if they are, ensure the abuser is punished. Avoid killing too many people if possible, and if you do harm any creatures, you will be terminated upon extraction." = 2, - "Donk Co. wants ransom money, and you are going to get it. Your goal is to kidnap and crewmember you can get your hands on and hold them hostage until you get something of significant value. Try to work out the best deal you can. Remember that Higher Value Targets are generally going to get a better deal so try to prioritize heads of staff if possible. We do not approve of mindless killing of Nanotrasen employees, so don’t do it." = 1, - "Steal as many shoes as possible. Lay broken glass everywhere." = 2 - ) + explanation_text = pickweight(CONFIG_GET(keyed_list/flavor_objective_traitor)) diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 3385991116..e0044d8c23 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -215,7 +215,6 @@ else var/datum/objective/flavor/traitor/flavor_objective = new flavor_objective.owner = owner - flavor_objective.forge_objective() add_objective(flavor_objective) /datum/antagonist/traitor/proc/forge_single_AI_objective() diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm index 996e2e3168..ea131fb996 100644 --- a/code/modules/spells/spell_types/rightandwrong.dm +++ b/code/modules/spells/spell_types/rightandwrong.dm @@ -104,7 +104,7 @@ GLOBAL_VAR_INIT(summon_magic_triggered, FALSE) G.unlock() var/datum/antagonist/survivalist/guns/our_antag_datum = H.mind.has_antag_datum(/datum/antagonist/survivalist/guns) if(our_antag_datum) - var/datum/objective/horde/O = new() + var/datum/objective/hoard/O = new() O.owner = H O.set_target(G) our_antag_datum.objectives += O @@ -136,7 +136,7 @@ GLOBAL_VAR_INIT(summon_magic_triggered, FALSE) var/datum/antagonist/survivalist/magic/our_antag_datum = H.mind.has_antag_datum(/datum/antagonist/survivalist/magic) if(istype(our_antag_datum)) - var/datum/objective/horde/O = new() + var/datum/objective/hoard/O = new() O.owner = H O.set_target(M) our_antag_datum.objectives += O diff --git a/config/game_options.txt b/config/game_options.txt index b8b89de17c..5d1f871058 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -597,3 +597,14 @@ MODETIER_VOTING ## Number of modes dropped by the modetier vote during mode selection, after vote. DROPPED_MODES 3 + +FLAVOR_OBJECTIVE_TRAITOR Teach the heads of staff a lesson they will never forget.=1 +FLAVOR_OBJECTIVE_TRAITOR Show Nanotrasen the utility of a pure oxygen atmosphere.=2 +FLAVOR_OBJECTIVE_TRAITOR Waffle Co. wants you! That’s right, YOU! To cause as much humorous terrorism against Nanotrasen as possible! How? We don’t care as long as it’s entertaining! Be as creative and exciting as possible when carrying out your dirty deeds. Have fun!=1 +FLAVOR_OBJECTIVE_TRAITOR Kill one of the station's beloved pets. Make a show of it, though you don't have to reveal yourself.=3 +FLAVOR_OBJECTIVE_TRAITOR Get illegal technology spread through the station.=3 +FLAVOR_OBJECTIVE_TRAITOR Slow down the process of research as much as possible." = (owner.assigned_role in list("Research Director", "Scientist", "Roboticist") ? 6 : 0), +FLAVOR_OBJECTIVE_TRAITOR Channel your inner rat. Cut wires throughout the station." = (owner.assigned_role in list("Station Engineer", "Atmos Technician", "Assistant") ? 6 : 0), +FLAVOR_OBJECTIVE_TRAITOR The Animal Rights Consortium needs you to save the innocent non-humanoid creatures aboard Citadel Station by any means necessary. Use your best judgement to decide whether an animal or xenobiological is abused, but if they are, ensure the abuser is punished. Avoid killing too many people if possible, and if you do harm any creatures, you will be terminated upon extraction.=2 +FLAVOR_OBJECTIVE_TRAITOR Donk Co. wants ransom money, and you are going to get it. Your goal is to kidnap and crewmember you can get your hands on and hold them hostage until you get something of significant value. Try to work out the best deal you can. Remember that Higher Value Targets are generally going to get a better deal so try to prioritize heads of staff if possible. We do not approve of mindless killing of Nanotrasen employees, so don’t do it.=1 +FLAVOR_OBJECTIVE_TRAITOR Steal as many shoes as possible. Lay broken glass everywhere." = 2 From ccf66eb04ae976390cdc3750e7f55f0343e31163 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 20 Jan 2020 17:59:21 -0700 Subject: [PATCH 013/172] bools --- code/game/objects/items/dehy_carp.dm | 1 + code/game/objects/items/plushes.dm | 15 +++++---------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm index 55d1a2c78a..03ff354ffb 100644 --- a/code/game/objects/items/dehy_carp.dm +++ b/code/game/objects/items/dehy_carp.dm @@ -8,6 +8,7 @@ var/mob/owner = null //Carp doesn't attack owner, set when using in hand var/owned = 0 //Boolean, no owner to begin with var/mobtype = /mob/living/simple_animal/hostile/carp //So admins can change what mob spawns via var fuckery + can_random_spawn = FALSE //Attack self /obj/item/toy/plush/carpplushie/dehy_carp/attack_self(mob/user) diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 21056ce6ee..775978d53c 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -31,8 +31,8 @@ var/normal_desc //--end of love :'(-- - var/snowflake_id //if we set from a config snowflake plushie. - var/abstract_type = /obj/item/toy/plush //to prevent us from spawning "base" plushies. set this to a plush's own type. only use this if a plush is not meant to be standalone/spawned, ever. + var/snowflake_id //if we set from a config snowflake plushie. + var/can_random_spawn = TRUE //if this is FALSE, don't spawn this for random plushies. /obj/item/toy/plush/random_snowflake/Initialize(mapload, set_snowflake_id) . = ..() @@ -422,14 +422,14 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) . = list() for(var/i in subtypesof(/obj/item/toy/plush)) var/obj/item/toy/plush/abstract = i - if(initial(abstract.abstract_type) == i) + if(!initial(abstract.can_random_spawn)) continue . += i /obj/item/toy/plush/random name = "Illegal plushie" desc = "Something fucked up" - var/blacklisted_plushes = list(/obj/item/toy/plush/carpplushie/dehy_carp, /obj/item/toy/plush/awakenedplushie, /obj/item/toy/plush/random) + can_random_spawn = FALSE /obj/item/toy/plush/random/Initialize() var/newtype = prob(CONFIG_GET(number/snowflake_plushie_prob))? /obj/item/toy/plush/random_snowflake : pick(GLOB.valid_plushie_paths) @@ -591,6 +591,7 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) desc = "An ancient plushie that has grown enlightened to the true nature of reality." icon_state = "plushie_awake" item_state = "plushie_awake" + can_random_spawn = FALSE /obj/item/toy/plush/awakenedplushie/ComponentInitialize() . = ..() @@ -687,7 +688,6 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) /obj/item/toy/plush/mammal name = "mammal plushie" desc = "An adorable stuffed toy resembling some sort of crew member." - abstract_type = /obj/item/toy/plush/mammal /obj/item/toy/plush/catgirl/fermis name = "medcat plushie" @@ -701,20 +701,17 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) name = "xenohybrid plushie" desc = "An adorable stuffed toy that resmembles a xenomorphic crewmember." squeak_override = list('sound/voice/hiss2.ogg' = 1) - abstract_type = /obj/item/toy/plush/xeno /obj/item/toy/plush/bird name = "bird plushie" desc = "An adorable stuffed plushie that resembles an avian." attack_verb = list("peeped", "beeped", "poofed") squeak_override = list('modular_citadel/sound/voice/peep.ogg' = 1) - abstract_type = /obj/item/toy/plush/bird /obj/item/toy/plush/sergal name = "sergal plushie" desc = "An adorable stuffed plushie that resembles a sagaru." squeak_override = list('modular_citadel/sound/voice/merp.ogg' = 1) - abstract_type = /obj/item/toy/plush/sergal /obj/item/toy/plush/mammal/dog desc = "An adorable stuffed toy that resembles a canine." @@ -723,11 +720,9 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) 'modular_citadel/sound/voice/bark1.ogg' = 1, 'modular_citadel/sound/voice/bark2.ogg' = 1 ) - abstract_type = /obj/item/toy/plush/mammal/dog /obj/item/toy/plush/catgirl name = "feline plushie" desc = "An adorable stuffed toy that resembles a feline." attack_verb = list("headbutt", "scritched", "bit") squeak_override = list('modular_citadel/sound/voice/nya.ogg' = 1) - abstract_type = /obj/item/toy/plush/catgirl From 93310b8d4fbb7eae8ae8a1fae8a115d2f625ed2a Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Thu, 23 Jan 2020 19:42:21 +0100 Subject: [PATCH 014/172] can_random_spawn = FALSE for icon-less plushes --- code/game/objects/items/plushes.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 775978d53c..a2a8cb3150 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -612,6 +612,7 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) icon_state = "bumble" item_state = "bumble" squeak_override = list('modular_citadel/sound/voice/mothsqueak.ogg' = 1) + can_random_spawn = FALSE /obj/item/toy/plush/lampplushie name = "lamp plushie" @@ -688,6 +689,7 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) /obj/item/toy/plush/mammal name = "mammal plushie" desc = "An adorable stuffed toy resembling some sort of crew member." + can_random_spawn = FALSE /obj/item/toy/plush/catgirl/fermis name = "medcat plushie" @@ -701,17 +703,20 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) name = "xenohybrid plushie" desc = "An adorable stuffed toy that resmembles a xenomorphic crewmember." squeak_override = list('sound/voice/hiss2.ogg' = 1) + can_random_spawn = FALSE /obj/item/toy/plush/bird name = "bird plushie" desc = "An adorable stuffed plushie that resembles an avian." attack_verb = list("peeped", "beeped", "poofed") squeak_override = list('modular_citadel/sound/voice/peep.ogg' = 1) + can_random_spawn = FALSE /obj/item/toy/plush/sergal name = "sergal plushie" desc = "An adorable stuffed plushie that resembles a sagaru." squeak_override = list('modular_citadel/sound/voice/merp.ogg' = 1) + can_random_spawn = FALSE /obj/item/toy/plush/mammal/dog desc = "An adorable stuffed toy that resembles a canine." @@ -726,3 +731,4 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) desc = "An adorable stuffed toy that resembles a feline." attack_verb = list("headbutt", "scritched", "bit") squeak_override = list('modular_citadel/sound/voice/nya.ogg' = 1) + can_random_spawn = FALSE From 847b3c0a09234044531119ea2b98ca2c8cc8c0ef Mon Sep 17 00:00:00 2001 From: Putnam Date: Fri, 24 Jan 2020 10:46:07 -0800 Subject: [PATCH 015/172] Fixed flavor objectives and added more. --- .../configuration/entries/game_options.dm | 6 ---- code/datums/mind.dm | 3 +- code/game/gamemodes/objective.dm | 31 ++++++++++++++++--- code/modules/antagonists/ninja/ninja.dm | 21 +++++-------- .../antagonists/traitor/datum_traitor.dm | 1 + code/modules/antagonists/wizard/wizard.dm | 5 +-- config/game_options.txt | 11 ------- strings/flavor_objectives/ninja_helping.txt | 6 ++++ strings/flavor_objectives/ninja_syndie.txt | 5 +++ strings/flavor_objectives/traitor.txt | 9 ++++++ .../flavor_objectives/traitor/assistant.txt | 0 .../flavor_objectives/traitor/engineering.txt | 0 strings/flavor_objectives/traitor/medical.txt | 0 strings/flavor_objectives/traitor/science.txt | 1 + strings/flavor_objectives/wizard.txt | 4 +++ 15 files changed, 63 insertions(+), 40 deletions(-) create mode 100644 strings/flavor_objectives/ninja_helping.txt create mode 100644 strings/flavor_objectives/ninja_syndie.txt create mode 100644 strings/flavor_objectives/traitor.txt create mode 100644 strings/flavor_objectives/traitor/assistant.txt create mode 100644 strings/flavor_objectives/traitor/engineering.txt create mode 100644 strings/flavor_objectives/traitor/medical.txt create mode 100644 strings/flavor_objectives/traitor/science.txt create mode 100644 strings/flavor_objectives/wizard.txt diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index cf5e0f7db1..aeca31ebd2 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -408,9 +408,3 @@ /datum/config_entry/number/dropped_modes config_entry_value = 3 - -/datum/config_entry/keyed_list/flavor_objective_traitor - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_NUM - splitter = "=" - lowercase = FALSE diff --git a/code/datums/mind.dm b/code/datums/mind.dm index c25f5d5199..464ea37d02 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -471,8 +471,7 @@ /datum/objective/nuclear, /datum/objective/capture, /datum/objective/absorb, - /datum/objective/custom, - /datum/objective/flavor/traitor + /datum/objective/custom ) for(var/T in allowed_types) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 5b3e6a1164..11933c2717 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -1070,15 +1070,36 @@ GLOBAL_LIST_EMPTY(possible_sabotages) /datum/objective/flavor name = "flavor" completable = FALSE + var/flavor_file -/datum/objective/flavor/New() - ..() - forge_objective() +/datum/objective/flavor/proc/get_flavor_list() + return world.file2list(flavor_file) /datum/objective/flavor/proc/forge_objective() + var/flavor_list = get_flavor_list() + explanation_text = pick(flavor_list) /datum/objective/flavor/traitor name = "traitor flavor" + flavor_file = "strings/flavor_objectives/traitor.txt" -/datum/objective/flavor/traitor/forge_objective() - explanation_text = pickweight(CONFIG_GET(keyed_list/flavor_objective_traitor)) +/datum/objective/flavor/traitor/get_flavor_list() + . = ..() + switch(owner.assigned_role) + if("Station Engineer", "Atmospheric Technician") + . += world.file2list("strings/flavor_objectives/traitor/engineering.txt") + if("Medical Doctor","Chemist","Virologist","Geneticist") + . += world.file2list("strings/flavor_objectives/traitor/medical.txt") + if("Scientist","Roboticist","Geneticist") + . += world.file2list("strings/flavor_objectives/traitor/science.txt") + if("Assistant") + . += world.file2list("strings/flavor_objectives/traitor/assistant.txt") + +/datum/objective/flavor/ninja_helping + flavor_file = "strings/flavor_objectives/ninja_helping.txt" + +/datum/objective/flavor/ninja_syndie + flavor_file = "strings/flavor_objectives/ninja_syndie.txt" + +/datum/objective/flavor/wizard + flavor_file = "strings/flavor_objectives/wizard.txt" diff --git a/code/modules/antagonists/ninja/ninja.dm b/code/modules/antagonists/ninja/ninja.dm index 52e13bdc69..fe83e2fb2b 100644 --- a/code/modules/antagonists/ninja/ninja.dm +++ b/code/modules/antagonists/ninja/ninja.dm @@ -73,23 +73,16 @@ O.target = M O.explanation_text = "Protect \the [M.current.real_name], the [M.assigned_role], from harm." objectives += O - if(4) //debrain/capture - if(!possible_targets.len) continue - var/selected = rand(1,possible_targets.len) - var/datum/mind/M = possible_targets[selected] - var/is_bad_guy = possible_targets[M] - possible_targets.Cut(selected,selected+1) - - if(is_bad_guy ^ helping_station) //debrain (good-ninja + bad-guy or bad-ninja + good-guy) - var/datum/objective/debrain/O = new /datum/objective/debrain() + if(4) //flavor + if(helping_station) + var/datum/objective/flavor/ninja_helping/O = new /datum/objective/flavor/ninja_helping O.owner = owner - O.target = M - O.explanation_text = "Steal the brain of [M.current.real_name]." + O.forge_objective() objectives += O - else //capture - var/datum/objective/capture/O = new /datum/objective/capture() + else + var/datum/objective/flavor/ninja_syndie/O = new /datum/objective/flavor/ninja_helping O.owner = owner - O.gen_amount_goal() + O.forge_objective() objectives += O else break diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index e0044d8c23..3385991116 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -215,6 +215,7 @@ else var/datum/objective/flavor/traitor/flavor_objective = new flavor_objective.owner = owner + flavor_objective.forge_objective() add_objective(flavor_objective) /datum/antagonist/traitor/proc/forge_single_AI_objective() diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index d89d6a2744..cc3cde79e4 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -61,9 +61,9 @@ owner.current.forceMove(pick(GLOB.wizardstart)) /datum/antagonist/wizard/proc/create_objectives() - var/datum/objective/new_objective = new("Cause as much creative mayhem as you can aboard the station! The more outlandish your methods of achieving this, the better! Make sure there's a decent amount of crew alive to tell of your tale.") - new_objective.completable = FALSE + var/datum/objective/flavor/wizard/new_objective = new new_objective.owner = owner + new_objective.forge_objective() objectives += new_objective if (!(locate(/datum/objective/escape) in objectives)) @@ -94,6 +94,7 @@ to_chat(owner, "You are the Space Wizard!") to_chat(owner, "The Space Wizards Federation has given you the following tasks:") owner.announce_objectives() + to_chat(owner, "These are merely guidelines! The federation are your masters, but you forge your own path!") to_chat(owner, "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.") to_chat(owner, "The spellbook is bound to you, and others cannot use it.") to_chat(owner, "In your pockets you will find a teleport scroll. Use it as needed.") diff --git a/config/game_options.txt b/config/game_options.txt index 5d1f871058..b8b89de17c 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -597,14 +597,3 @@ MODETIER_VOTING ## Number of modes dropped by the modetier vote during mode selection, after vote. DROPPED_MODES 3 - -FLAVOR_OBJECTIVE_TRAITOR Teach the heads of staff a lesson they will never forget.=1 -FLAVOR_OBJECTIVE_TRAITOR Show Nanotrasen the utility of a pure oxygen atmosphere.=2 -FLAVOR_OBJECTIVE_TRAITOR Waffle Co. wants you! That’s right, YOU! To cause as much humorous terrorism against Nanotrasen as possible! How? We don’t care as long as it’s entertaining! Be as creative and exciting as possible when carrying out your dirty deeds. Have fun!=1 -FLAVOR_OBJECTIVE_TRAITOR Kill one of the station's beloved pets. Make a show of it, though you don't have to reveal yourself.=3 -FLAVOR_OBJECTIVE_TRAITOR Get illegal technology spread through the station.=3 -FLAVOR_OBJECTIVE_TRAITOR Slow down the process of research as much as possible." = (owner.assigned_role in list("Research Director", "Scientist", "Roboticist") ? 6 : 0), -FLAVOR_OBJECTIVE_TRAITOR Channel your inner rat. Cut wires throughout the station." = (owner.assigned_role in list("Station Engineer", "Atmos Technician", "Assistant") ? 6 : 0), -FLAVOR_OBJECTIVE_TRAITOR The Animal Rights Consortium needs you to save the innocent non-humanoid creatures aboard Citadel Station by any means necessary. Use your best judgement to decide whether an animal or xenobiological is abused, but if they are, ensure the abuser is punished. Avoid killing too many people if possible, and if you do harm any creatures, you will be terminated upon extraction.=2 -FLAVOR_OBJECTIVE_TRAITOR Donk Co. wants ransom money, and you are going to get it. Your goal is to kidnap and crewmember you can get your hands on and hold them hostage until you get something of significant value. Try to work out the best deal you can. Remember that Higher Value Targets are generally going to get a better deal so try to prioritize heads of staff if possible. We do not approve of mindless killing of Nanotrasen employees, so don’t do it.=1 -FLAVOR_OBJECTIVE_TRAITOR Steal as many shoes as possible. Lay broken glass everywhere." = 2 diff --git a/strings/flavor_objectives/ninja_helping.txt b/strings/flavor_objectives/ninja_helping.txt new file mode 100644 index 0000000000..1280939b5c --- /dev/null +++ b/strings/flavor_objectives/ninja_helping.txt @@ -0,0 +1,6 @@ +Nanotrasen want to make sure that their employees are on the up-and-up. Try to find any blackmail you can. +Increase productivity however you can. +You are a security ninja. Answer to the Head of Security, and follow space law. +You are a cargo ninja. Answer to the Quartermaster, and do what they say. +Nanotrasen want you to ensure maximum morale. Protect the members of the crew who are on break. +Ensure that all the paperwork is being done. \ No newline at end of file diff --git a/strings/flavor_objectives/ninja_syndie.txt b/strings/flavor_objectives/ninja_syndie.txt new file mode 100644 index 0000000000..4527c693f4 --- /dev/null +++ b/strings/flavor_objectives/ninja_syndie.txt @@ -0,0 +1,5 @@ +The Gorlex Marauders want you to teach the heads of staff a lesson they will never forget. +Waffle Co. wants you To cause as much humorous terrorism against Nanotrasen as possible! How? We don’t care as long as it’s entertaining! Be as creative and exciting as possible when carrying out your dirty deeds. Have fun! +The Tiger Cooperative want you to kill one of the station's beloved pets. Make a show of it, though you don't have to reveal yourself. +The Animal Rights Consortium needs you to save the innocent non-humanoid creatures aboard Citadel Station by any means necessary. Use your best judgement to decide whether an animal or xenobiological is abused, but if they are, ensure the abuser is punished. Avoid killing too many people if possible, and if you do harm any creatures, you will be terminated upon extraction. +Donk Co. wants ransom money, and you are going to get it. Your goal is to kidnap and crewmember you can get your hands on and hold them hostage until you get something of significant value. Try to work out the best deal you can. Remember that Higher Value Targets are generally going to get a better deal so try to prioritize heads of staff if possible. We do not approve of mindless killing of Nanotrasen employees, so don’t do it. \ No newline at end of file diff --git a/strings/flavor_objectives/traitor.txt b/strings/flavor_objectives/traitor.txt new file mode 100644 index 0000000000..fcbbc588e9 --- /dev/null +++ b/strings/flavor_objectives/traitor.txt @@ -0,0 +1,9 @@ +The Gorlex Marauders want you to teach the heads of staff a lesson they will never forget. +Show Nanotrasen the utility of a 40% oxygen atmosphere. +Waffle Co. wants you To cause as much humorous terrorism against Nanotrasen as possible! How? We don’t care as long as it’s entertaining! Be as creative and exciting as possible when carrying out your dirty deeds. Have fun! +Kill one of the station's beloved pets. Make a show of it, though you don't have to reveal yourself. +The Tiger Cooperative want you to get their illegal technology spread through the station. +The Animal Rights Consortium want you to channel your inner rat. Cut wires throughout the station. +The Animal Rights Consortium needs you to save the innocent non-humanoid creatures aboard Citadel Station by any means necessary. Use your best judgement to decide whether an animal or xenobiological is abused, but if they are, ensure the abuser is punished. Avoid killing too many people if possible, and if you do harm any creatures, you will be terminated upon extraction. +Donk Co. wants ransom money, and you are going to get it. Your goal is to kidnap and crewmember you can get your hands on and hold them hostage until you get something of significant value. Try to work out the best deal you can. Remember that Higher Value Targets are generally going to get a better deal so try to prioritize heads of staff if possible. We do not approve of mindless killing of Nanotrasen employees, so don’t do it. +The Gorlex Marauders want you to steal as many shoes as possible. Lay broken glass everywhere. \ No newline at end of file diff --git a/strings/flavor_objectives/traitor/assistant.txt b/strings/flavor_objectives/traitor/assistant.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/strings/flavor_objectives/traitor/engineering.txt b/strings/flavor_objectives/traitor/engineering.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/strings/flavor_objectives/traitor/medical.txt b/strings/flavor_objectives/traitor/medical.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/strings/flavor_objectives/traitor/science.txt b/strings/flavor_objectives/traitor/science.txt new file mode 100644 index 0000000000..6367e78da2 --- /dev/null +++ b/strings/flavor_objectives/traitor/science.txt @@ -0,0 +1 @@ +The Tiger Cooperative want you to slow down the process of research as much as possible. \ No newline at end of file diff --git a/strings/flavor_objectives/wizard.txt b/strings/flavor_objectives/wizard.txt new file mode 100644 index 0000000000..e65a6052bc --- /dev/null +++ b/strings/flavor_objectives/wizard.txt @@ -0,0 +1,4 @@ +Cause as much creative mayhem as you can aboard the station! The more outlandish your methods of achieving this, the better! Make sure there's a decent amount of crew alive to tell of your tale. +The Wizard Federation have sent you to take over the station by force. Kill the captain and take their place. The magocracy starts now. +You are the slipperiest wizard there ever was. Be loud, cause a ruckus, start a manhunt, and keep it going for as long as you can. +The crew must be shown the wonders of magic. Do some tricks for them. If they stop moving, that means they're in awe. \ No newline at end of file From c58b4daa35e28a26728e9f6aeb7dbbec5d0ed430 Mon Sep 17 00:00:00 2001 From: Putnam Date: Fri, 24 Jan 2020 11:58:58 -0800 Subject: [PATCH 016/172] collectors too this doesn't compile but like. it's a draft --- code/game/gamemodes/objective.dm | 30 ++++++++++++++++++- code/game/objects/items/cards_ids.dm | 5 +++- code/game/objects/items/storage/book.dm | 3 ++ .../antagonists/collector/collector.dm | 19 ++++++++++++ 4 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 code/modules/antagonists/collector/collector.dm diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 11933c2717..fa302eeca8 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -999,7 +999,7 @@ GLOBAL_LIST_EMPTY(possible_items_special) /datum/objective/hoard/proc/set_target(obj/item/I) if(I) hoarded_item = I - explanation_text = "Keep [I] on your person at all costs." + explanation_text = "Keep [I] on your person at all times." return hoarded_item else explanation_text = "Free objective" @@ -1026,6 +1026,34 @@ GLOBAL_LIST_EMPTY(possible_items_special) /datum/objective/hoard/heirloom/find_target() set_target(pick(GLOB.family_heirlooms)) +GLOBAL_LIST_EMPTY(traitor_contraband) + +GLOBAL_LIST_EMPTY(cult_contraband) + +/datum/objective/hoard/collector + name = "Hoard contraband" + +/datum/objective/collector/New() + ..() + if(!GLOB.traitor_contraband.len)//Only need to fill the list when it's needed. + GLOB.traitor_contraband = list(/obj/item/card/emag/empty,/obj/item/clothing/glasses/phantomthief,/obj/item/storage/book/bible/syndicate/empty,/obj/item/clothing/gloves/chameleon/broken) + if(!GLOB.cult_contraband.len) + GLOB.cult_contraband = list(/obj/item/clockwork/slab,/obj/item/clockwork/component/belligerent_eye,/obj/item/clockwork/component/belligerent_eye/lens_gem,/obj/item/restraints/legcuffs/bola/cult,/obj/item/shuttle_curse,/obj/item/cult_shift) + +/datum/objective/hoard/collector/find_target() + var/obj/item/I + if(prob(50)) + I = new pick_and_take(GLOB.traitor_contraband) + else + I = new pick_and_take(GLOB.cult_contraband) + I.forceMove(get_turf(owner)) + if(ishuman(owner)) + var/mob/living/carbon/human/H = owner + H.equip_in_one_of_slots(I, list("backpack" = SLOT_IN_BACKPACK)) + hoarded_item = I + + + GLOBAL_LIST_EMPTY(possible_sabotages) // For saboteurs. Go in and cause some trouble somewhere. Not necessarily breaking things, just sufficiently troublemaking. /datum/objective/sabotage diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 48dac6a08b..5ec989ab73 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -128,6 +128,9 @@ return . = ..() +/obj/item/card/emag/empty + uses = 0 + /obj/item/emagrecharge name = "electromagnet charging device" desc = "A small cell with two prongs lazily jabbed into it. It looks like it's made for charging the small batteries found in electromagnetic devices, sadly this can't be recharged like a normal cell." @@ -541,4 +544,4 @@ update_label("John Doe", "Clowny") id_color = "#0000FF" /obj/item/card/id/knight/captain - id_color = "#FFD700" \ No newline at end of file + id_color = "#FFD700" diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm index e47021c1f6..2762be8edf 100644 --- a/code/game/objects/items/storage/book.dm +++ b/code/game/objects/items/storage/book.dm @@ -244,3 +244,6 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible", /obj/item/storage/book/bible/syndicate/add_blood_DNA(list/blood_dna) return FALSE + +/obj/item/storage/book/bible/syndicate/empty + uses = 0 diff --git a/code/modules/antagonists/collector/collector.dm b/code/modules/antagonists/collector/collector.dm new file mode 100644 index 0000000000..0e7a3a52e7 --- /dev/null +++ b/code/modules/antagonists/collector/collector.dm @@ -0,0 +1,19 @@ +/datum/antagonist/collector + name = "Contraband Collector" + show_in_antagpanel = FALSE + show_name_in_check_antagonists = FALSE + blacklisted_quirks = list() // no blacklist, these guys are harmless + +/datum/antagonist/collector/proc/forge_objectives() + var/datum/objective/hoard/collector/O = new + O.owner = owner + O.find_target() + objectives += O + +/datum/antagonist/collector/on_gain() + forge_objectives() + . = ..() + +/datum/antagonist/collector/greet() + to_chat(owner, "You are a contraband collector!") + owner.announce_objectives() From 32ee2f61977630e829bce31e335a87541dd47d31 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Fri, 24 Jan 2020 21:48:59 +0100 Subject: [PATCH 017/172] minor pet peeve with the anomalous honking crystal & co. --- code/__DEFINES/traits.dm | 2 +- code/modules/antagonists/nukeop/clownop.dm | 4 ++-- code/modules/jobs/job_types/mime.dm | 1 + .../mob/living/simple_animal/hostile/megafauna/colossus.dm | 1 + 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index d707f7e58a..e41dc27509 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -232,9 +232,9 @@ #define SLEEPING_CARP_TRAIT "sleeping_carp" #define RISING_BASS_TRAIT "rising_bass" #define ABDUCTOR_ANTAGONIST "abductor-antagonist" -#define NUKEOP_ANTAGONIST "nukeop-antagonist" #define MADE_UNCLONEABLE "made-uncloneable" #define TIMESTOP_TRAIT "timestop" #define NUKEOP_TRAIT "nuke-op" +#define CLOWNOP_TRAIT "clown-op" #define MEGAFAUNA_TRAIT "megafauna" #define DEATHSQUAD_TRAIT "deathsquad" diff --git a/code/modules/antagonists/nukeop/clownop.dm b/code/modules/antagonists/nukeop/clownop.dm index 58b492b578..a3ccdee2b5 100644 --- a/code/modules/antagonists/nukeop/clownop.dm +++ b/code/modules/antagonists/nukeop/clownop.dm @@ -7,10 +7,10 @@ /datum/antagonist/nukeop/clownop/on_gain() . = ..() - ADD_TRAIT(owner, TRAIT_CLOWN_MENTALITY, NUKEOP_ANTAGONIST) + ADD_TRAIT(owner, TRAIT_CLOWN_MENTALITY, CLOWNOP_TRAIT) /datum/antagonist/nukeop/clownop/on_removal() - REMOVE_TRAIT(owner, TRAIT_CLOWN_MENTALITY, NUKEOP_ANTAGONIST) + REMOVE_TRAIT(owner, TRAIT_CLOWN_MENTALITY, CLOWNOP_TRAIT) return ..() /datum/antagonist/nukeop/leader/clownop diff --git a/code/modules/jobs/job_types/mime.dm b/code/modules/jobs/job_types/mime.dm index 4e6e982fb9..a5eb2032fa 100644 --- a/code/modules/jobs/job_types/mime.dm +++ b/code/modules/jobs/job_types/mime.dm @@ -17,6 +17,7 @@ display_order = JOB_DISPLAY_ORDER_MIME /datum/job/mime/after_spawn(mob/living/carbon/human/H, mob/M) + . = ..() H.apply_pref_name("mime", M.client) /datum/outfit/job/mime diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 71465f23f9..eabb88f1ab 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -432,6 +432,7 @@ Difficulty: Very Hard H.dropItemToGround(W) var/datum/job/clown/C = new /datum/job/clown() C.equip(H) + C.after_spawn(H, H, TRUE) qdel(C) affected_targets.Add(H) From 37777c4cc7a3a73f54a557fe0b97eddb9f93c32a Mon Sep 17 00:00:00 2001 From: Putnam Date: Sat, 25 Jan 2020 13:37:40 -0800 Subject: [PATCH 018/172] Removed the wirecutting one --- code/game/gamemodes/objective.dm | 2 +- strings/flavor_objectives/traitor.txt | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index fa302eeca8..e01ff61229 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -1043,7 +1043,7 @@ GLOBAL_LIST_EMPTY(cult_contraband) /datum/objective/hoard/collector/find_target() var/obj/item/I if(prob(50)) - I = new pick_and_take(GLOB.traitor_contraband) + I = new pick_and_take(GLOB.traitor_contraband) // always unique unless it's run out, in which case we refill it anyway else I = new pick_and_take(GLOB.cult_contraband) I.forceMove(get_turf(owner)) diff --git a/strings/flavor_objectives/traitor.txt b/strings/flavor_objectives/traitor.txt index fcbbc588e9..6d54c8ed9d 100644 --- a/strings/flavor_objectives/traitor.txt +++ b/strings/flavor_objectives/traitor.txt @@ -3,7 +3,6 @@ Show Nanotrasen the utility of a 40% oxygen atmosphere. Waffle Co. wants you To cause as much humorous terrorism against Nanotrasen as possible! How? We don’t care as long as it’s entertaining! Be as creative and exciting as possible when carrying out your dirty deeds. Have fun! Kill one of the station's beloved pets. Make a show of it, though you don't have to reveal yourself. The Tiger Cooperative want you to get their illegal technology spread through the station. -The Animal Rights Consortium want you to channel your inner rat. Cut wires throughout the station. The Animal Rights Consortium needs you to save the innocent non-humanoid creatures aboard Citadel Station by any means necessary. Use your best judgement to decide whether an animal or xenobiological is abused, but if they are, ensure the abuser is punished. Avoid killing too many people if possible, and if you do harm any creatures, you will be terminated upon extraction. Donk Co. wants ransom money, and you are going to get it. Your goal is to kidnap and crewmember you can get your hands on and hold them hostage until you get something of significant value. Try to work out the best deal you can. Remember that Higher Value Targets are generally going to get a better deal so try to prioritize heads of staff if possible. We do not approve of mindless killing of Nanotrasen employees, so don’t do it. The Gorlex Marauders want you to steal as many shoes as possible. Lay broken glass everywhere. \ No newline at end of file From 233aeaa456918827bd5336946024cc57f3257a2e Mon Sep 17 00:00:00 2001 From: Putnam Date: Sun, 26 Jan 2020 19:03:09 -0800 Subject: [PATCH 019/172] removed some suggested bad possible contraband --- code/game/gamemodes/objective.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index e01ff61229..7105e45ddd 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -1036,9 +1036,9 @@ GLOBAL_LIST_EMPTY(cult_contraband) /datum/objective/collector/New() ..() if(!GLOB.traitor_contraband.len)//Only need to fill the list when it's needed. - GLOB.traitor_contraband = list(/obj/item/card/emag/empty,/obj/item/clothing/glasses/phantomthief,/obj/item/storage/book/bible/syndicate/empty,/obj/item/clothing/gloves/chameleon/broken) + GLOB.traitor_contraband = list(/obj/item/card/emag/empty,/obj/item/clothing/glasses/phantomthief,/obj/item/clothing/gloves/chameleon/broken) if(!GLOB.cult_contraband.len) - GLOB.cult_contraband = list(/obj/item/clockwork/slab,/obj/item/clockwork/component/belligerent_eye,/obj/item/clockwork/component/belligerent_eye/lens_gem,/obj/item/restraints/legcuffs/bola/cult,/obj/item/shuttle_curse,/obj/item/cult_shift) + GLOB.cult_contraband = list(/obj/item/clockwork/slab,/obj/item/clockwork/component/belligerent_eye,/obj/item/clockwork/component/belligerent_eye/lens_gem,/obj/item/shuttle_curse,/obj/item/cult_shift) /datum/objective/hoard/collector/find_target() var/obj/item/I From 0eb13d8f23d36756aad24cf7eabc58ad24dd4511 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 27 Jan 2020 17:39:49 -0700 Subject: [PATCH 020/172] refactors guns a bit --- .../mob/living/silicon/robot/robot_modules.dm | 2 +- .../mob/living/simple_animal/hostile/mimic.dm | 7 +- .../projectiles/ammunition/energy/plasma.dm | 2 +- code/modules/projectiles/gun.dm | 58 +++++---- .../projectiles/guns/ballistic/automatic.dm | 21 ++-- code/modules/projectiles/guns/energy.dm | 115 +++++++++++++----- code/modules/projectiles/guns/energy/laser.dm | 8 +- .../projectiles/guns/energy/special.dm | 6 +- .../modules/projectiles/guns/pumpenergy.dm | 28 ++--- 9 files changed, 142 insertions(+), 105 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index a079a9985c..e304f13d1d 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -191,7 +191,7 @@ else if(istype(I, /obj/item/gun/energy)) var/obj/item/gun/energy/EG = I if(EG.cell?.charge < EG.cell.maxcharge) - var/obj/item/ammo_casing/energy/S = EG.ammo_type[EG.select] + var/obj/item/ammo_casing/energy/S = EG.ammo_type[EG.current_firemode_index] EG.cell.give(S.e_cost * coeff) if(!EG.chambered) EG.recharge_newshot(TRUE) diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index bbdd7ab4b0..5e159e8517 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -197,8 +197,6 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca return 0 return ..() - - /mob/living/simple_animal/hostile/mimic/copy/ranged var/obj/item/gun/TrueGun = null var/obj/item/gun/magic/Zapstick @@ -229,14 +227,13 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca casingtype = initial(M.ammo_type) if(istype(G, /obj/item/gun/energy)) Zapgun = G - var/selectfiresetting = Zapgun.select - var/obj/item/ammo_casing/energy/E = Zapgun.ammo_type[selectfiresetting] + var/obj/item/ammo_casing/energy/E = Zapgun.ammo_type[Zapgun.current_firemode_index] projectiletype = initial(E.projectile_type) /mob/living/simple_animal/hostile/mimic/copy/ranged/OpenFire(the_target) if(Zapgun) if(Zapgun.cell) - var/obj/item/ammo_casing/energy/shot = Zapgun.ammo_type[Zapgun.select] + var/obj/item/ammo_casing/energy/shot = Zapgun.ammo_type[Zapgun.current_firemode_index] if(Zapgun.cell.charge >= shot.e_cost) Zapgun.cell.use(shot.e_cost) Zapgun.update_icon() diff --git a/code/modules/projectiles/ammunition/energy/plasma.dm b/code/modules/projectiles/ammunition/energy/plasma.dm index 42b03e4245..c7e3820177 100644 --- a/code/modules/projectiles/ammunition/energy/plasma.dm +++ b/code/modules/projectiles/ammunition/energy/plasma.dm @@ -12,4 +12,4 @@ /obj/item/ammo_casing/energy/plasma/weak projectile_type = /obj/item/projectile/plasma/weak - e_cost = 100 \ No newline at end of file + e_cost = 100 diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 531c6082b0..54f96c491c 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -28,10 +28,19 @@ trigger_guard = TRIGGER_GUARD_NORMAL //trigger guard on the weapon, hulks can't fire them with their big meaty fingers var/sawn_desc = null //description change if weapon is sawn-off var/sawn_off = FALSE - var/burst_size = 1 //how large a burst is - var/fire_delay = 0 //rate of fire for burst firing and semi auto - var/firing_burst = 0 //Prevent the weapon from firing again while already firing - var/semicd = 0 //cooldown handler + + /// Weapon is burst fire if this is above 1 + var/burst_size = 1 + /// The time between shots in burst. + var/burst_shot_delay = 3 + /// The time between firing actions, this means between bursts if this is burst weapon. + var/fire_delay = 0 + /// Last world.time this was fired + var/last_fire = 0 + /// don't fire two bursts at the same time + var/firing_burst = FALSE + /// Used in gun-in-mouth execution/suicide and similar, while TRUE nothing should work on this like firing or modification and so on and so forth. + var/busy_action = FALSE var/weapon_weight = WEAPON_LIGHT //currently only used for inaccuracy var/spread = 0 //Spread induced by the gun itself. var/burst_spread = 0 //Spread induced by the gun itself during burst fire per iteration. Only checked if spread is 0. @@ -110,7 +119,6 @@ to_chat(user, "*click*") playsound(src, "gun_dry_fire", 30, 1) - /obj/item/gun/proc/shoot_live_shot(mob/living/user as mob|obj, pointblank = 0, mob/pbtarget = null, message = 1) if(recoil) shake_camera(user, recoil + 1, recoil) @@ -136,6 +144,9 @@ /obj/item/gun/afterattack(atom/target, mob/living/user, flag, params) . = ..() + process_afterattack(target, user, flag, params) + +/obj/item/gun/proc/process_afterattack(atom/target, mob/living/user, flag, params) if(!target) return if(firing_burst) @@ -162,7 +173,6 @@ handle_suicide(user, target, params) return - //Exclude lasertag guns from the TRAIT_CLUMSY check. if(clumsy_check) if(istype(user)) @@ -194,8 +204,6 @@ process_fire(target, user, TRUE, params, null, bonus_spread) - - /obj/item/gun/can_trigger_gun(mob/living/user) . = ..() if(!.) @@ -220,6 +228,9 @@ /obj/item/gun/proc/recharge_newshot() return +/obj/item/gun/proc/on_cooldown() + return busy_action || firing_burst || (last_fire > world.time + fire_delay) + /obj/item/gun/proc/process_burst(mob/living/user, atom/target, message = TRUE, params=null, zone_override = "", sprd = 0, randomized_gun_spread = 0, randomized_bonus_spread = 0, rand_spr = 0, iteration = 0) if(!user || !firing_burst) firing_burst = FALSE @@ -260,14 +271,14 @@ /obj/item/gun/proc/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) add_fingerprint(user) - if(semicd) + if(on_cooldown()) return var/sprd = 0 var/randomized_gun_spread = 0 var/rand_spr = rand() if(spread) - randomized_gun_spread = rand(0, spread) + randomized_gun_spread = rand(0, spread) else if(burst_size > 1 && burst_spread) randomized_gun_spread = rand(0, burst_spread) if(HAS_TRAIT(user, TRAIT_POOR_AIM)) //nice shootin' tex @@ -276,8 +287,12 @@ if(burst_size > 1) firing_burst = TRUE - for(var/i = 1 to burst_size) - addtimer(CALLBACK(src, .proc/process_burst, user, target, message, params, zone_override, sprd, randomized_gun_spread, randomized_bonus_spread, rand_spr, i), fire_delay * (i - 1)) + process_burst(user, target, message, params, zone_override, sprd, randomized_gun_spread, randomized_bonus_spread, rand_spr, 1) + for(var/i in 2 to burst_size) + sleep(burst_shot_delay) + if(QDELETED(src)) + break + process_burst(user, target, message, params, zone_override, sprd, randomized_gun_spread, randomized_bonus_spread, rand_spr, i) else if(chambered) sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread)) @@ -294,8 +309,8 @@ return process_chamber() update_icon() - semicd = TRUE - addtimer(CALLBACK(src, .proc/reset_semicd), fire_delay) + + last_fire = world.time if(user) user.update_inv_hands() @@ -303,13 +318,6 @@ SSblackbox.record_feedback("tally", "gun_fired", 1, type) return TRUE -/obj/item/gun/update_icon() - ..() - - -/obj/item/gun/proc/reset_semicd() - semicd = FALSE - /obj/item/gun/attack(mob/M as mob, mob/user) if(user.a_intent == INTENT_HARM) //Flogging if(bayonet) @@ -429,7 +437,7 @@ if(!ishuman(user) || !ishuman(target)) return - if(semicd) + if(on_cooldown()) return if(user == target) @@ -439,7 +447,7 @@ target.visible_message("[user] points [src] at [target]'s head, ready to pull the trigger...", \ "[user] points [src] at your head, ready to pull the trigger...") - semicd = TRUE + busy_action = TRUE if(!bypass_timer && (!do_mob(user, target, 120) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH)) if(user) @@ -447,10 +455,10 @@ user.visible_message("[user] decided not to shoot.") else if(target && target.Adjacent(user)) target.visible_message("[user] has decided to spare [target]", "[user] has decided to spare your life!") - semicd = FALSE + busy_action = FALSE return - semicd = FALSE + busy_action = FALSE target.visible_message("[user] pulls the trigger!", "[user] pulls the trigger!") diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index bcb212a031..0ff0c79f1e 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -5,7 +5,7 @@ var/automatic_burst_overlay = TRUE can_suppress = TRUE burst_size = 3 - fire_delay = 2 + burst_shot_delay = 2 actions_types = list(/datum/action/item_action/toggle_firemode) /obj/item/gun/ballistic/automatic/proto @@ -77,11 +77,9 @@ /obj/item/gun/ballistic/automatic/proc/enable_burst() burst_size = initial(burst_size) - fire_delay = initial(fire_delay) /obj/item/gun/ballistic/automatic/proc/disable_burst() burst_size = 1 - fire_delay = 0 /obj/item/gun/ballistic/automatic/can_shoot() return get_ammo() @@ -100,7 +98,7 @@ item_state = "c20r" mag_type = /obj/item/ammo_box/magazine/smgm45 fire_sound = 'sound/weapons/gunshot_smg.ogg' - fire_delay = 2 + burst_shot_delay = 2 burst_size = 2 pin = /obj/item/firing_pin/implant/pindicate can_bayonet = TRUE @@ -130,7 +128,7 @@ mag_type = /obj/item/ammo_box/magazine/wt550m9 can_suppress = FALSE burst_size = 2 - fire_delay = 1 + burst_shot_delay = 1 can_bayonet = TRUE knife_x_offset = 25 knife_y_offset = 12 @@ -165,7 +163,7 @@ can_suppress = FALSE var/obj/item/gun/ballistic/revolver/grenadelauncher/underbarrel burst_size = 3 - fire_delay = 2 + burst_shot_delay = 2 pin = /obj/item/firing_pin/implant/pindicate /obj/item/gun/ballistic/automatic/m90/Initialize() @@ -212,7 +210,6 @@ if(0) select = 1 burst_size = initial(burst_size) - fire_delay = initial(fire_delay) to_chat(user, "You switch to [burst_size]-rnd burst.") if(1) select = 2 @@ -220,7 +217,6 @@ if(2) select = 0 burst_size = 1 - fire_delay = 0 to_chat(user, "You switch to semi-auto.") playsound(user, 'sound/weapons/empty.ogg', 100, 1) update_icon() @@ -237,7 +233,7 @@ fire_sound = 'sound/weapons/gunshot_smg.ogg' can_suppress = FALSE burst_size = 4 - fire_delay = 1 + burst_shot_delay = 1 /obj/item/gun/ballistic/automatic/ar name = "\improper NT-ARG 'Boarder'" @@ -249,7 +245,7 @@ fire_sound = 'sound/weapons/gunshot_smg.ogg' can_suppress = FALSE burst_size = 3 - fire_delay = 1 + burst_shot_delay = 1 // Bulldog shotgun // @@ -264,7 +260,6 @@ fire_sound = 'sound/weapons/gunshot.ogg' can_suppress = FALSE burst_size = 1 - fire_delay = 0 pin = /obj/item/firing_pin/implant/pindicate actions_types = list() @@ -301,7 +296,7 @@ var/cover_open = FALSE can_suppress = FALSE burst_size = 3 - fire_delay = 1 + burst_shot_delay = 1 spread = 7 pin = /obj/item/firing_pin/implant/pindicate @@ -421,7 +416,7 @@ mag_type = /obj/item/ammo_box/magazine/recharge fire_delay = 2 can_suppress = FALSE - burst_size = 0 + burst_size = 1 actions_types = list() fire_sound = 'sound/weapons/laser.ogg' casing_ejector = FALSE diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 1329e5418f..e77a52dfb3 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -1,3 +1,16 @@ +/* + * Energy guns that draw from a cell to fire. + * + * This is a bit weird but this is how it currently works: + * When switching shots, it clears the chamber, and loads the correct energy ammo casing if there is enough energy to fire it. + * If there's no projectile in the casing, it creates it now. + * Otherwise the chamber stays null. + * After firing, it actually deducts the energy and then clears the chamber and does the above again. + * It detects if a successful fire is done by checking if the chambered energy ammo casing still has its projectile intact. + * + * It might be good in the future to move away from ammo casinsgs and instead use a datum-firemode system, but that would make handling firing, + * which the casing does as of now, a little interesting to implement. + */ /obj/item/gun/energy icon_state = "energy" name = "energy gun" @@ -8,7 +21,8 @@ var/cell_type = /obj/item/stock_parts/cell var/modifystate = 0 var/list/ammo_type = list(/obj/item/ammo_casing/energy) - var/select = 1 //The state of the select fire switch. Determines from the ammo_type list what kind of shot is fired next. + /// The index of the ammo_types/firemodes which we're using right now + var/current_firemode_index = 1 var/can_charge = 1 //Can it be charged in a recharger? var/automatic_charge_overlays = TRUE //Do we handle overlays with base update_icon()? var/charge_sections = 4 @@ -46,16 +60,6 @@ START_PROCESSING(SSobj, src) update_icon() -/obj/item/gun/energy/proc/update_ammo_types() - var/obj/item/ammo_casing/energy/shot - for (var/i = 1, i <= ammo_type.len, i++) - var/shottype = ammo_type[i] - shot = new shottype(src) - ammo_type[i] = shot - shot = ammo_type[select] - fire_sound = shot.fire_sound - fire_delay = shot.delay - /obj/item/gun/energy/Destroy() QDEL_NULL(cell) STOP_PROCESSING(SSobj, src) @@ -81,13 +85,14 @@ recharge_newshot(TRUE) update_icon() -/obj/item/gun/energy/attack_self(mob/living/user as mob) - if(ammo_type.len > 1) +// ATTACK SELF IGNORING PARENT RETURN VALUE +/obj/item/gun/energy/attack_self(mob/living/user) + . = ..() + if(can_select_fire(user)) select_fire(user) - update_icon() /obj/item/gun/energy/can_shoot() - var/obj/item/ammo_casing/energy/shot = ammo_type[select] + var/obj/item/ammo_casing/energy/shot = ammo_type[current_firemode_index] return !QDELETED(cell) ? (cell.charge >= shot.e_cost) : FALSE /obj/item/gun/energy/recharge_newshot(no_cyborg_drain) @@ -97,11 +102,11 @@ if(iscyborg(loc)) var/mob/living/silicon/robot/R = loc if(R.cell) - var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot + var/obj/item/ammo_casing/energy/shot = ammo_type[current_firemode_index] //Necessary to find cost of shot if(R.cell.use(shot.e_cost)) //Take power from the borg... cell.give(shot.e_cost) //... to recharge the shot if(!chambered) - var/obj/item/ammo_casing/energy/AC = ammo_type[select] + var/obj/item/ammo_casing/energy/AC = ammo_type[current_firemode_index] if(cell.charge >= AC.e_cost) //if there's enough power in the cell cell... chambered = AC //...prepare a new shot based on the current ammo type selected if(!chambered.BB) @@ -124,19 +129,60 @@ process_chamber() // Ditto. return ..() -/obj/item/gun/energy/proc/select_fire(mob/living/user) - select++ - if (select > ammo_type.len) - select = 1 - var/obj/item/ammo_casing/energy/shot = ammo_type[select] - fire_sound = shot.fire_sound - fire_delay = shot.delay - if (shot.select_name) - to_chat(user, "[src] is now set to [shot.select_name].") - chambered = null - recharge_newshot(TRUE) +// Firemodes/Ammotypes + +/obj/item/gun/energy/proc/update_ammo_types() + var/obj/item/ammo_casing/energy/C + for(var/i in 1 to length(ammo_type)) + var/v = ammo_type[i] + if(istype(v, /obj/item/ammo_casing/energy)) //already set + continue + else + C = new v //if you put non energycasing/type stuff in here you deserve the runtime + ammo_type[i] = C + set_firemode_index(initial(current_firemode_index)) + +/obj/item/gun/energy/proc/set_firemode_index(index, mob/user_for_feedback) + chambered = null //unchamber whatever we have chambered + if(index > length(ammo_type)) + index = 1 + else if(index < 1) + index = length(ammo_type) + var/obj/item/ammo_casing/energy/C = ammo_type[index] //energy weapons should not have no casings, if it does you deserve the runtime. + current_firemode_index = index + fire_sound = C.fire_sound + fire_delay = C.delay + if(user_for_feedback) + to_chat(user_for_feedback, "[src] is now set to [C.select_name || C].") + post_set_firemode() update_icon(TRUE) - return + +/obj/item/gun/energy/proc/post_set_firemode(recharge_newshot = TRUE) + if(recharge_newshot) + recharge_newshot(TRUE) + +/obj/item/gun/energy/proc/set_firemode_to_next(mob/user_for_feedback) + return set_firemode_index(current_firemode_index++, user_for_feedback) + +/obj/item/gun/energy/proc/set_firemode_to_prev(mob/user_for_feedback) + return set_firemode_index(current_firemode_index--, user_for_feedback) + +/obj/item/gun/energy/proc/get_firemode_index(casing_type) + var/obj/item/ammo_casing/energy/E = locate(casing_type) in ammo_type + if(E) + return ammo_type.Find(E) + +/obj/item/gun/energy/proc/set_firemode_to_type(casing_type) + var/index = get_firemode_index(casing_type) + if(index) + set_firemode_index(index) + +/// This is the proc used in general for when a user switches firemodes. Just goes to next firemode by default. +/obj/item/gun/energy/proc/select_fire(mob/living/user) + return set_firemode_to_next(user) + +/obj/item/gun/energy/proc/can_select_fire(mob/living/user) + return TRUE /obj/item/gun/energy/update_icon(force_update) if(QDELETED(src)) @@ -156,7 +202,7 @@ if(!initial(item_state)) itemState = icon_state if (modifystate) - var/obj/item/ammo_casing/energy/shot = ammo_type[select] + var/obj/item/ammo_casing/energy/shot = ammo_type[current_firemode_index] add_overlay("[icon_state]_[shot.select_name]") iconState += "_[shot.select_name]" if(itemState) @@ -175,6 +221,9 @@ if(itemState) itemState += "[ratio]" item_state = itemState + if(ismob(loc)) //forces inhands to update + var/mob/M = loc + M.update_inv_hands() /obj/item/gun/energy/suicide_act(mob/living/user) if (istype(user) && can_shoot() && can_trigger_gun(user) && user.get_bodypart(BODY_ZONE_HEAD)) @@ -184,7 +233,7 @@ user.visible_message("[user] melts [user.p_their()] face off with [src]!") playsound(loc, fire_sound, 50, 1, -1) playsound(src, 'sound/weapons/dink.ogg', 30, 1) - var/obj/item/ammo_casing/energy/shot = ammo_type[select] + var/obj/item/ammo_casing/energy/shot = ammo_type[current_firemode_index] cell.use(shot.e_cost) update_icon() return(FIRELOSS) @@ -208,11 +257,11 @@ /obj/item/gun/energy/ignition_effect(atom/A, mob/living/user) - if(!can_shoot() || !ammo_type[select]) + if(!can_shoot() || !ammo_type[current_firemode_index]) shoot_with_empty_chamber() . = "" else - var/obj/item/ammo_casing/energy/E = ammo_type[select] + var/obj/item/ammo_casing/energy/E = ammo_type[current_firemode_index] var/obj/item/projectile/energy/BB = E.BB if(!BB) . = "" diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 1e1af62d5a..542794a281 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -189,7 +189,7 @@ if(!ishuman(user) || !ishuman(target)) return - if(semicd) + if(on_cooldown()) return if(user == target) @@ -199,7 +199,7 @@ target.visible_message("[user] points [src] at [target]'s head, ready to pull the trigger...", \ "[user] points [src] at your head, ready to pull the trigger...") - semicd = TRUE + busy_action = TRUE if(!bypass_timer && (!do_mob(user, target, 120) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH)) if(user) @@ -207,10 +207,10 @@ user.visible_message("[user] decided not to shoot.") else if(target && target.Adjacent(user)) target.visible_message("[user] has decided to spare [target]", "[user] has decided to spare your life!") - semicd = FALSE + busy_action = FALSE return - semicd = FALSE + busy_action = FALSE target.visible_message("[user] pulls the trigger!", "[user] pulls the trigger!") diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index eeb272f8d9..c6a666e777 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -36,7 +36,7 @@ /obj/item/gun/energy/decloner/update_icon() ..() - var/obj/item/ammo_casing/energy/shot = ammo_type[select] + var/obj/item/ammo_casing/energy/shot = ammo_type[current_firemode_index] if(!QDELETED(cell) && (cell.charge > shot.e_cost)) add_overlay("decloner_spin") @@ -183,7 +183,7 @@ var/atmos_link = FALSE /obj/item/gun/energy/wormhole_projector/update_icon() - icon_state = "[initial(icon_state)][select]" + icon_state = "[initial(icon_state)][current_firemode_index]" item_state = icon_state /obj/item/gun/energy/wormhole_projector/update_ammo_types() @@ -318,7 +318,7 @@ /obj/item/gun/energy/emitter/update_icon() ..() - var/obj/item/ammo_casing/energy/shot = ammo_type[select] + var/obj/item/ammo_casing/energy/shot = ammo_type[current_firemode_index] if(!QDELETED(cell) && (cell.charge > shot.e_cost)) add_overlay("emitter_carbine_empty") else diff --git a/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm index 47de736c3b..f7c0b343c3 100644 --- a/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm +++ b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm @@ -46,34 +46,22 @@ cell.use(shot.e_cost)//... drain the cell cell chambered = 0 //either way, released the prepared shot -/obj/item/gun/energy/pumpaction/select_fire(mob/living/user) //makes it so that it doesn't rack itself when changing firing modes unless already racked - select++ - if (select > ammo_type.len) - select = 1 - var/obj/item/ammo_casing/energy/shot = ammo_type[select] - fire_sound = shot.fire_sound - fire_delay = shot.delay - if (shot.select_name) - to_chat(user, "[src] is now set to [shot.select_name].") - if(chambered) - chambered = 0 - recharge_newshot(1) - update_icon() - if(ismob(loc)) //forces inhands to update - var/mob/M = loc - M.update_inv_hands() - return +/obj/item/gun/energy/pumpaction/post_set_firemode() + var/has_shot = chambered + . = ..(recharge_newshot = FALSE) + if(has_shot) + recharge_newshot(TRUE) /obj/item/gun/energy/pumpaction/update_icon() //adds racked indicators ..() - var/obj/item/ammo_casing/energy/shot = ammo_type[select] + var/obj/item/ammo_casing/energy/shot = ammo_type[current_firemode_index] if(chambered) add_overlay("[icon_state]_rack_[shot.select_name]") else add_overlay("[icon_state]_rack_empty") /obj/item/gun/energy/pumpaction/proc/pump(mob/M) //pumping proc. Checks if the gun is empty and plays a different sound if it is. - var/obj/item/ammo_casing/energy/shot = ammo_type[select] + var/obj/item/ammo_casing/energy/shot = ammo_type[current_firemode_index] if(cell.charge < shot.e_cost) playsound(M, 'sound/weapons/laserPumpEmpty.ogg', 100, 1) //Ends with three beeps made from highly processed knife honing noises else @@ -102,7 +90,7 @@ /obj/item/gun/energy/pumpaction/worn_overlays(isinhands, icon_file, style_flags = NONE) //ammo counter for inhands . = ..() var/ratio = CEILING((cell.charge / cell.maxcharge) * charge_sections, 1) - var/obj/item/ammo_casing/energy/shot = ammo_type[select] + var/obj/item/ammo_casing/energy/shot = ammo_type[current_firemode_index] if(isinhands) if(cell.charge < shot.e_cost) var/mutable_appearance/ammo_inhand = mutable_appearance(icon_file, "[item_state]_empty") From 7ae43a224943258a499e9e896cb64055373353ea Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 27 Jan 2020 17:51:59 -0700 Subject: [PATCH 021/172] fix --- code/modules/projectiles/gun.dm | 2 +- code/modules/projectiles/guns/energy.dm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 54f96c491c..bcf1df44bc 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -33,7 +33,7 @@ var/burst_size = 1 /// The time between shots in burst. var/burst_shot_delay = 3 - /// The time between firing actions, this means between bursts if this is burst weapon. + /// The time between firing actions, this means between bursts if this is burst weapon. The reason this is 0 is because you are still, by default, limited by clickdelay. var/fire_delay = 0 /// Last world.time this was fired var/last_fire = 0 diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index e77a52dfb3..b56664fe03 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -162,10 +162,10 @@ recharge_newshot(TRUE) /obj/item/gun/energy/proc/set_firemode_to_next(mob/user_for_feedback) - return set_firemode_index(current_firemode_index++, user_for_feedback) + return set_firemode_index(++current_firemode_index, user_for_feedback) /obj/item/gun/energy/proc/set_firemode_to_prev(mob/user_for_feedback) - return set_firemode_index(current_firemode_index--, user_for_feedback) + return set_firemode_index(--current_firemode_index, user_for_feedback) /obj/item/gun/energy/proc/get_firemode_index(casing_type) var/obj/item/ammo_casing/energy/E = locate(casing_type) in ammo_type From 8df9a051ec672edffa2a900d43a8147526c5c19e Mon Sep 17 00:00:00 2001 From: Putnam Date: Mon, 27 Jan 2020 19:09:04 -0800 Subject: [PATCH 022/172] it compiles now, ready for testmerge probs --- code/game/gamemodes/objective.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 7105e45ddd..b22e12291b 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -1042,10 +1042,12 @@ GLOBAL_LIST_EMPTY(cult_contraband) /datum/objective/hoard/collector/find_target() var/obj/item/I + var/I_type if(prob(50)) - I = new pick_and_take(GLOB.traitor_contraband) // always unique unless it's run out, in which case we refill it anyway + I_type = pick_n_take(GLOB.traitor_contraband) // always unique unless it's run out, in which case we refill it anyway else - I = new pick_and_take(GLOB.cult_contraband) + I_type = pick_n_take(GLOB.cult_contraband) + I = new I_type I.forceMove(get_turf(owner)) if(ishuman(owner)) var/mob/living/carbon/human/H = owner From 7d53d6e162556ac455df4cbe72ced3861a9a036b Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 27 Jan 2020 20:24:02 -0700 Subject: [PATCH 023/172] s --- code/__DEFINES/flags.dm | 11 ++-- code/__DEFINES/status_effects.dm | 4 +- code/datums/status_effects/debuffs.dm | 40 +++++++++++---- .../projectiles/ammunition/energy/stun.dm | 2 +- code/modules/projectiles/guns/energy.dm | 50 +++++++++++++++++-- code/modules/projectiles/guns/energy/stun.dm | 17 ++++++- .../projectiles/projectile/energy/stun.dm | 12 ++++- 7 files changed, 111 insertions(+), 25 deletions(-) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index a7d2670747..317066f673 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -56,11 +56,12 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 //Movement Types -#define GROUND (1<<0) -#define FLYING (1<<1) -#define VENTCRAWLING (1<<2) -#define FLOATING (1<<3) -#define UNSTOPPABLE (1<<4) //When moving, will Bump()/Cross()/Uncross() everything, but won't be stopped. +#define GROUND (1<<0) +#define FLYING (1<<1) +#define VENTCRAWLING (1<<2) +#define FLOATING (1<<3) +#define UNSTOPPABLE (1<<4) //When moving, will Bump()/Cross()/Uncross() everything, but won't be stopped. +#define CRAWLING (1<<5) //Applied if you're crawling around on the ground/resting. //Fire and Acid stuff, for resistance_flags #define LAVA_PROOF (1<<0) diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 6d52f4640c..f42948f4ae 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -46,7 +46,9 @@ #define STATUS_EFFECT_SLEEPING /datum/status_effect/incapacitating/sleeping //the affected is asleep -#define STATUS_EFFECT_TASED /datum/status_effect/no_combat_mode/electrode/ //the affected has been tased, preventing fine muscle control +#define STATUS_EFFECT_TASED_WEAK /datum/status_effect/electrode //not as crippling, just slows down + +#define STATUS_EFFECT_TASED /datum/status_effect/electrode/no_combat_mode //the affected has been tased, preventing fine muscle control #define STATUS_EFFECT_PACIFY /datum/status_effect/pacify //the affected is pacified, preventing direct hostile actions diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 2e46046a7e..56fbc1659e 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -33,7 +33,6 @@ if(owner.getStaminaLoss()) owner.adjustStaminaLoss(-0.3) //reduce stamina loss by 0.3 per tick, 6 per 2 seconds - //UNCONSCIOUS /datum/status_effect/incapacitating/unconscious id = "unconscious" @@ -113,10 +112,16 @@ icon = 'icons/mob/actions/bloodsucker.dmi' icon_state = "power_mez" -/datum/status_effect/no_combat_mode/electrode +/datum/status_effect/electrode id = "tased" + var/slowdown = 1.5 + var/slowdown_priority = 50 //to make sure the stronger effect overrides + var/affect_crawl = FALSE + var/nextmove_modifier = 1 + var/stamdmg_per_ds = 1 //a 20 duration would do 20 stamdmg, disablers do 24 or something + var/last_tick = 0 //fastprocess processing speed is a goddamn sham, don't trust it. -/datum/status_effect/no_combat_mode/electrode/on_creation(mob/living/new_owner, set_duration) +/datum/status_effect/electrode/on_creation(mob/living/new_owner, set_duration) if(isnum(set_duration)) //TODO, figure out how to grab from subtype duration = set_duration . = ..() @@ -124,20 +129,35 @@ var/mob/living/carbon/C = owner if(C.combatmode) C.toggle_combat_mode(TRUE) - C.add_movespeed_modifier(MOVESPEED_ID_TASED_STATUS, TRUE, override = TRUE, multiplicative_slowdown = 8) + C.add_movespeed_modifier("[MOVESPEED_ID_TASED_STATUS]_[id]", TRUE, priority = slowdown_priority, override = TRUE, multiplicative_slowdown = slowdown, blacklisted_movetypes = affected_crawl? NONE : CRAWLING) -/datum/status_effect/no_combat_mode/electrode/on_remove() +/datum/status_effect/electrode/on_remove() if(iscarbon(owner)) var/mob/living/carbon/C = owner - C.remove_movespeed_modifier(MOVESPEED_ID_TASED_STATUS) + C.remove_movespeed_modifier("[MOVESPEED_ID_TASED_STATUS]_[id]") . = ..() -/datum/status_effect/no_combat_mode/electrode/tick() +/datum/status_effect/electrode/tick() + var/diff = world.time - last_tick if(owner) - owner.adjustStaminaLoss(5) //if you really want to try to stamcrit someone with a taser alone, you can, but it'll take time and good timing. + owner.adjustStaminaLoss(max(0, stamdmg_per_ds * diff)) //if you really want to try to stamcrit someone with a taser alone, you can, but it'll take time and good timing. + last_tick = world.time -/datum/status_effect/no_combat_mode/electrode/nextmove_modifier() //why is this a proc. its no big deal since this doesnt get called often at all but literally w h y - return 2 +/datum/status_effect/electrode/no_combat_mode + id = "tased_strong" + slowdown = 8 + slowdown_priority = 100 + nextmove_modifier = 2 + +/datum/status_effect/electrode/no_combat_mode/on_creation(mob/living/new_owner, set_duration) + . = ..() + if(iscarbon(owner)) + var/mob/living/carbon/C = owner + if(C.combatmode) + C.toggle_combat_mode(TRUE) + +/datum/status_effect/electrode/no_combat_mode/nextmove_modifier() //why is this a proc. its no big deal since this doesnt get called often at all but literally w h y + return nextmove_modifier //OTHER DEBUFFS /datum/status_effect/his_wrath //does minor damage over time unless holding His Grace diff --git a/code/modules/projectiles/ammunition/energy/stun.dm b/code/modules/projectiles/ammunition/energy/stun.dm index 7c2b62c02c..f81064220f 100644 --- a/code/modules/projectiles/ammunition/energy/stun.dm +++ b/code/modules/projectiles/ammunition/energy/stun.dm @@ -27,4 +27,4 @@ click_cooldown_override = 3.5 /obj/item/ammo_casing/energy/disabler/secborg - e_cost = 50 \ No newline at end of file + e_cost = 50 diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index b56664fe03..d612383a95 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -20,7 +20,8 @@ var/obj/item/stock_parts/cell/cell //What type of power cell this uses var/cell_type = /obj/item/stock_parts/cell var/modifystate = 0 - var/list/ammo_type = list(/obj/item/ammo_casing/energy) + /// = TRUE/FALSE decides if the user can switch to it of their own accord + var/list/ammo_type = list(/obj/item/ammo_casing/energy = TRUE) /// The index of the ammo_types/firemodes which we're using right now var/current_firemode_index = 1 var/can_charge = 1 //Can it be charged in a recharger? @@ -35,6 +36,9 @@ var/use_cyborg_cell = FALSE //whether the gun drains the cyborg user's cell instead, not to be confused with EGUN_SELFCHARGE_BORG var/dead_cell = FALSE //set to true so the gun is given an empty cell + /// SET THIS TO TRUE IF YOU OVERRIDE altafterattack() or ANY right click action! If this is FALSE, the gun will show in examine its default right click behavior, which is to switch modes. + var/right_click_overridden = FALSE + /obj/item/gun/energy/emp_act(severity) . = ..() if(!(. & EMP_PROTECT_CONTENTS)) @@ -65,6 +69,11 @@ STOP_PROCESSING(SSobj, src) return ..() +/obj/item/gun/energy/examine(mob/user) + . = ..() + if(!right_click_overridden) + . += "Right click in combat mode to switch modes." + /obj/item/gun/energy/process() if(selfcharge && cell?.charge < cell.maxcharge) charge_tick++ @@ -135,11 +144,13 @@ var/obj/item/ammo_casing/energy/C for(var/i in 1 to length(ammo_type)) var/v = ammo_type[i] + var/user_can_select = ammo_type[v] if(istype(v, /obj/item/ammo_casing/energy)) //already set - continue + ammo_type[v] = isnull(user_can_select)? TRUE : user_can_select else C = new v //if you put non energycasing/type stuff in here you deserve the runtime ammo_type[i] = C + ammo_type[C] = isnull(user_can_select)? TRUE : user_can_select set_firemode_index(initial(current_firemode_index)) /obj/item/gun/energy/proc/set_firemode_index(index, mob/user_for_feedback) @@ -179,11 +190,37 @@ /// This is the proc used in general for when a user switches firemodes. Just goes to next firemode by default. /obj/item/gun/energy/proc/select_fire(mob/living/user) - return set_firemode_to_next(user) + return user_set_firemode_to_next(user) /obj/item/gun/energy/proc/can_select_fire(mob/living/user) return TRUE +#define INCREMENT_OR_WRAP(i) i = (i >= length(ammo_type))? 1 : (i + 1) +#define DECREMENT_OR_WRAP(i) i = (i <= 1)? length(ammo_type) : (i - 1) +#define IS_VALID_INDEX(i) (ammo_type[ammo_type[i]]) +/obj/item/gun/energy/proc/user_set_firemode_to_next(mob/user_for_feedback) + var/current_index = current_firemode_index + var/new_index = current_index + INCREMENT_OR_WRAP(new_index) + if(!IS_VALID_INDEX(new_index)) + var/initial_index = new_index + while(!IS_VALID_INDEX(new_index) && (new_index != initial_index)) + new_index = INCREMENT_OR_WRAP(new_index) + set_firemode_index(new_index, user_for_feedback) + +/obj/item/gun/energy/proc/user_set_firemode_to_next(mob/user_for_feedback) + var/current_index = current_firemode_index + var/new_index = current_index + DECREMENT_OR_WRAP(new_index) + if(!IS_VALID_INDEX(new_index)) + var/initial_index = new_index + while(!IS_VALID_INDEX(new_index) && (new_index != initial_index)) + new_index = DECREMENT_OR_WRAP(new_index) + set_firemode_index(new_index, user_for_feedback) +#undef INCREMENT_OR_WRAP +#undef DECREMENT_OR_WRAP +#undef IS_VALID_INDEX + /obj/item/gun/energy/update_icon(force_update) if(QDELETED(src)) return @@ -255,7 +292,6 @@ STOP_PROCESSING(SSobj, src) . = ..() - /obj/item/gun/energy/ignition_effect(atom/A, mob/living/user) if(!can_shoot() || !ammo_type[current_firemode_index]) shoot_with_empty_chamber() @@ -283,3 +319,9 @@ playsound(user, BB.hitsound, 50, 1) cell.use(E.e_cost) . = "[user] casually lights their [A.name] with [src]. Damn." + +/obj/item/gun/energy/altafterattack(atom/target, mob/user, proximity_flags, params) + if(!right_click_overridden) + select_fire(user) + return TRUE + return ..() diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 55d11c52d1..1b272bfbaa 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -18,10 +18,23 @@ /obj/item/gun/energy/e_gun/advtaser name = "hybrid taser" - desc = "A dual-mode taser designed to fire both short-range high-power electrodes and long-range disabler beams." + desc = "A dual-mode taser designed to fire both short-range high-power electrodes and long-range disabler beams. Right click in combat mode to fire a taser shot with a cooldown."" icon_state = "advtaser" - ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/electrode) + ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/electrode = FALSE) ammo_x_offset = 2 + // Not enough guns have altfire systems like this yet for this to be a universal framework. + var/last_altfire = 0 + var/altfire_delay = 40 + +/obj/item/gun/energy/e_gun/advtaser/altafterattack(atom/target, mob/user, proximity_flag, params) + if(last_altfire > world.time + altfire_delay) + return FALSE + var/current_index = current_firemode_index + set_firemode_to_type(/obj/item/ammo_casing/energy/electrode) + process_afterattack(target, user, proximity_flag, params) + set_firemode_index(current_index) + last_altfire = world.time + return TRUE /obj/item/gun/energy/e_gun/advtaser/cyborg name = "cyborg taser" diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index 88e70154d1..1addfa2001 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -14,6 +14,7 @@ muzzle_type = /obj/effect/projectile/muzzle/stun impact_type = /obj/effect/projectile/impact/stun var/tase_duration = 50 + var/strong_tase = TRUE /obj/item/projectile/energy/electrode/on_hit(atom/target, blocked = FALSE) . = ..() @@ -26,10 +27,17 @@ C.IgniteMob() if(C.dna && C.dna.check_mutation(HULK)) C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") - else if((C.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(C, TRAIT_STUNIMMUNE)) - C.apply_status_effect(STATUS_EFFECT_TASED, tase_duration) + else if(tase_duration && (C.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(C, TRAIT_STUNIMMUNE)) + C.apply_status_effect(strong_tase? STATUS_EFFECT_TASED : STATUS_EFFECT_TASED_WEAK, tase_duration) addtimer(CALLBACK(C, /mob/living/carbon.proc/do_jitter_animation, jitter), 5) /obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet do_sparks(1, TRUE, src) ..() + +/obj/item/projectile/energy/electrode/security + tase_duration = 20 + knockdown = 0 + knockdown_stamoverride = 5 + knockdown_stam_max = 15 + strong_tase = FALSE From 57b977c2e51987848f5b6175c9054d74c0dd3b68 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 27 Jan 2020 20:41:45 -0700 Subject: [PATCH 024/172] why --- code/datums/status_effects/debuffs.dm | 2 +- code/modules/mob/living/living.dm | 4 ++++ .../projectiles/ammunition/energy/stun.dm | 5 +++++ code/modules/projectiles/guns/energy.dm | 2 +- .../projectiles/guns/energy/energy_gun.dm | 19 +++++++++++-------- code/modules/projectiles/guns/energy/stun.dm | 4 ++-- .../projectiles/projectile/energy/stun.dm | 5 +++++ 7 files changed, 29 insertions(+), 12 deletions(-) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 56fbc1659e..86d7e43e1b 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -129,7 +129,7 @@ var/mob/living/carbon/C = owner if(C.combatmode) C.toggle_combat_mode(TRUE) - C.add_movespeed_modifier("[MOVESPEED_ID_TASED_STATUS]_[id]", TRUE, priority = slowdown_priority, override = TRUE, multiplicative_slowdown = slowdown, blacklisted_movetypes = affected_crawl? NONE : CRAWLING) + C.add_movespeed_modifier("[MOVESPEED_ID_TASED_STATUS]_[id]", TRUE, priority = slowdown_priority, override = TRUE, multiplicative_slowdown = slowdown, blacklisted_movetypes = affect_crawl? NONE : CRAWLING) /datum/status_effect/electrode/on_remove() if(iscarbon(owner)) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 90ada3d718..90eb17716e 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1087,6 +1087,10 @@ fall(forced = 1) canmove = !(ko || recoveringstam || pinned || IsStun() || IsFrozen() || chokehold || buckled || (!has_legs && !ignore_legs && !has_arms)) //Cit change - makes it plausible to move while resting, adds pinning and stamina crit density = !lying + if(resting) + ENABLE_BITFIELD(movement_type, CRAWLING) + else + DISABLE_BITFIELD(movement_type, CRAWLING) if(lying) if(layer == initial(layer)) //to avoid special cases like hiding larvas. layer = LYING_MOB_LAYER //so mob lying always appear behind standing mobs diff --git a/code/modules/projectiles/ammunition/energy/stun.dm b/code/modules/projectiles/ammunition/energy/stun.dm index f81064220f..2abc472138 100644 --- a/code/modules/projectiles/ammunition/energy/stun.dm +++ b/code/modules/projectiles/ammunition/energy/stun.dm @@ -5,6 +5,10 @@ e_cost = 200 harmful = FALSE +/obj/item/ammo_casing/energy/electrode/security + projectile_type = /obj/item/projectile/energy/electrode/security + e_cost = 100 + /obj/item/ammo_casing/energy/electrode/spec e_cost = 100 @@ -13,6 +17,7 @@ e_cost = 100 /obj/item/ammo_casing/energy/electrode/hos + projectile_type = /obj/item/projectile/energy/electrode/security/hos e_cost = 200 /obj/item/ammo_casing/energy/electrode/old diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index d612383a95..ae69c3993f 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -208,7 +208,7 @@ new_index = INCREMENT_OR_WRAP(new_index) set_firemode_index(new_index, user_for_feedback) -/obj/item/gun/energy/proc/user_set_firemode_to_next(mob/user_for_feedback) +/obj/item/gun/energy/proc/user_set_firemode_to_prev(mob/user_for_feedback) var/current_index = current_firemode_index var/new_index = current_index DECREMENT_OR_WRAP(new_index) diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index 163deae0ed..efe107a3f8 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -97,7 +97,7 @@ pin = null can_charge = 0 ammo_x_offset = 1 - ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser) + ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser) selfcharge = EGUN_SELFCHARGE var/fail_tick = 0 var/fail_chance = 0 @@ -113,18 +113,21 @@ ..() /obj/item/gun/energy/e_gun/nuclear/proc/failcheck() - if(prob(fail_chance) && isliving(loc)) - var/mob/living/M = loc + if(prob(fail_chance)) switch(fail_tick) if(0 to 200) fail_tick += (2*(fail_chance)) - M.rad_act(400) - to_chat(M, "Your [name] feels warmer.") + radiation_pulse(src, 50) + var/mob/M = (ismob(loc) && loc) || (ismob(loc.loc) && loc.loc) //thank you short circuiting. if you powergame and nest these guns deeply you get to suffer no-warning radiation death. + if(M) + to_chat(M, "Your [name] feels warmer.") if(201 to INFINITY) SSobj.processing.Remove(src) - M.rad_act(800) - crit_fail = 1 - to_chat(M, "Your [name]'s reactor overloads!") + radiation_pulse(src, 200) + crit_fail = TRUE + var/mob/M = (ismob(loc) && loc) || (ismob(loc.loc) && loc.loc) + if(M) + to_chat(M, "Your [name]'s reactor overloads!") /obj/item/gun/energy/e_gun/nuclear/emp_act(severity) . = ..() diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 1b272bfbaa..997930170a 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -18,9 +18,9 @@ /obj/item/gun/energy/e_gun/advtaser name = "hybrid taser" - desc = "A dual-mode taser designed to fire both short-range high-power electrodes and long-range disabler beams. Right click in combat mode to fire a taser shot with a cooldown."" + desc = "A dual-mode taser designed to fire both short-range high-power electrodes and long-range disabler beams. Right click in combat mode to fire a taser shot with a cooldown." icon_state = "advtaser" - ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/electrode = FALSE) + ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/electrode/security = FALSE) ammo_x_offset = 2 // Not enough guns have altfire systems like this yet for this to be a universal framework. var/last_altfire = 0 diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index 1addfa2001..5c4827d0a7 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -41,3 +41,8 @@ knockdown_stamoverride = 5 knockdown_stam_max = 15 strong_tase = FALSE + +/obj/item/projectile/energy/electrode/security/hos + knockdown = 100 + knockdown_stamoverride = 30 + knockdown_stam_max = null From 9d047f07f862f111f2cd19ff4407a7856f9c11dc Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 27 Jan 2020 21:08:47 -0700 Subject: [PATCH 025/172] separate this a bit --- code/modules/projectiles/gun.dm | 97 ++++++++++---------- code/modules/projectiles/guns/energy.dm | 6 ++ code/modules/projectiles/guns/energy/stun.dm | 4 +- 3 files changed, 58 insertions(+), 49 deletions(-) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index bcf1df44bc..510fe0f3a6 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -37,8 +37,8 @@ var/fire_delay = 0 /// Last world.time this was fired var/last_fire = 0 - /// don't fire two bursts at the same time - var/firing_burst = FALSE + /// Currently firing, whether or not it's a burst or not. + var/firing = FALSE /// Used in gun-in-mouth execution/suicide and similar, while TRUE nothing should work on this like firing or modification and so on and so forth. var/busy_action = FALSE var/weapon_weight = WEAPON_LIGHT //currently only used for inaccuracy @@ -124,7 +124,7 @@ shake_camera(user, recoil + 1, recoil) if(isliving(user)) //CIT CHANGE - makes gun recoil cause staminaloss - user.adjustStaminaLossBuffered(getstamcost(user)*(firing_burst && burst_size >= 2 ? 1/burst_size : 1)) //CIT CHANGE - ditto + user.adjustStaminaLossBuffered(getstamcost(user)*(firing && burst_size >= 2 ? 1/burst_size : 1)) //CIT CHANGE - ditto if(suppressed) playsound(user, fire_sound, 10, 1) @@ -149,7 +149,7 @@ /obj/item/gun/proc/process_afterattack(atom/target, mob/living/user, flag, params) if(!target) return - if(firing_burst) + if(firing) return if(flag) //It's adjacent, is the user, or is on the user's person if(target in user.contents) //can't shoot stuff inside us. @@ -229,51 +229,20 @@ return /obj/item/gun/proc/on_cooldown() - return busy_action || firing_burst || (last_fire > world.time + fire_delay) - -/obj/item/gun/proc/process_burst(mob/living/user, atom/target, message = TRUE, params=null, zone_override = "", sprd = 0, randomized_gun_spread = 0, randomized_bonus_spread = 0, rand_spr = 0, iteration = 0) - if(!user || !firing_burst) - firing_burst = FALSE - return FALSE - if(!issilicon(user)) - if(iteration > 1 && !(user.is_holding(src))) //for burst firing - firing_burst = FALSE - return FALSE - if(chambered && chambered.BB) - if(HAS_TRAIT(user, TRAIT_PACIFISM)) // If the user has the pacifist trait, then they won't be able to fire [src] if the round chambered inside of [src] is lethal. - if(chambered.harmful) // Is the bullet chambered harmful? - to_chat(user, " [src] is lethally chambered! You don't want to risk harming anyone...") - return - if(randomspread) - sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread), 1) - else //Smart spread - sprd = round((((rand_spr/burst_size) * iteration) - (0.5 + (rand_spr * 0.25))) * (randomized_gun_spread + randomized_bonus_spread), 1) - - if(!chambered.fire_casing(target, user, params, ,suppressed, zone_override, sprd, src)) - shoot_with_empty_chamber(user) - firing_burst = FALSE - return FALSE - else - if(get_dist(user, target) <= 1) //Making sure whether the target is in vicinity for the pointblank shot - shoot_live_shot(user, 1, target, message) - else - shoot_live_shot(user, 0, target, message) - if (iteration >= burst_size) - firing_burst = FALSE - else - shoot_with_empty_chamber(user) - firing_burst = FALSE - return FALSE - process_chamber() - update_icon() - return TRUE + return busy_action || firing || (last_fire > world.time + fire_delay) /obj/item/gun/proc/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) add_fingerprint(user) if(on_cooldown()) return + firing = TRUE + . = do_fire(target, user, message, params, zone_override, bonus_spread) + firing = FALSE + last_fire = world.time +/obj/item/gun/proc/do_fire(atom/target, mob/living/user, message = TRUE, params, zone_override = "", bonus_spread = 0) + set waitfor = FALSE var/sprd = 0 var/randomized_gun_spread = 0 var/rand_spr = rand() @@ -286,13 +255,12 @@ var/randomized_bonus_spread = rand(0, bonus_spread) if(burst_size > 1) - firing_burst = TRUE - process_burst(user, target, message, params, zone_override, sprd, randomized_gun_spread, randomized_bonus_spread, rand_spr, 1) + do_burst_shot(user, target, message, params, zone_override, sprd, randomized_gun_spread, randomized_bonus_spread, rand_spr, 1) for(var/i in 2 to burst_size) sleep(burst_shot_delay) if(QDELETED(src)) break - process_burst(user, target, message, params, zone_override, sprd, randomized_gun_spread, randomized_bonus_spread, rand_spr, i) + do_burst_shot(user, target, message, params, zone_override, sprd, randomized_gun_spread, randomized_bonus_spread, rand_spr, i) else if(chambered) sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread)) @@ -310,14 +278,49 @@ process_chamber() update_icon() - last_fire = world.time - if(user) user.update_inv_hands() SEND_SIGNAL(user, COMSIG_LIVING_GUN_PROCESS_FIRE, target, params, zone_override) SSblackbox.record_feedback("tally", "gun_fired", 1, type) return TRUE +/obj/item/gun/proc/do_burst_shot(mob/living/user, atom/target, message = TRUE, params=null, zone_override = "", sprd = 0, randomized_gun_spread = 0, randomized_bonus_spread = 0, rand_spr = 0, iteration = 0) + if(!user || !firing) + firing = FALSE + return FALSE + if(!issilicon(user)) + if(iteration > 1 && !(user.is_holding(src))) //for burst firing + firing = FALSE + return FALSE + if(chambered && chambered.BB) + if(HAS_TRAIT(user, TRAIT_PACIFISM)) // If the user has the pacifist trait, then they won't be able to fire [src] if the round chambered inside of [src] is lethal. + if(chambered.harmful) // Is the bullet chambered harmful? + to_chat(user, " [src] is lethally chambered! You don't want to risk harming anyone...") + return + if(randomspread) + sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread), 1) + else //Smart spread + sprd = round((((rand_spr/burst_size) * iteration) - (0.5 + (rand_spr * 0.25))) * (randomized_gun_spread + randomized_bonus_spread), 1) + + if(!chambered.fire_casing(target, user, params, ,suppressed, zone_override, sprd, src)) + shoot_with_empty_chamber(user) + firing = FALSE + return FALSE + else + if(get_dist(user, target) <= 1) //Making sure whether the target is in vicinity for the pointblank shot + shoot_live_shot(user, 1, target, message) + else + shoot_live_shot(user, 0, target, message) + if (iteration >= burst_size) + firing = FALSE + else + shoot_with_empty_chamber(user) + firing = FALSE + return FALSE + process_chamber() + update_icon() + return TRUE + /obj/item/gun/attack(mob/M as mob, mob/user) if(user.a_intent == INTENT_HARM) //Flogging if(bayonet) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index ae69c3993f..6f46e976c3 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -206,6 +206,9 @@ var/initial_index = new_index while(!IS_VALID_INDEX(new_index) && (new_index != initial_index)) new_index = INCREMENT_OR_WRAP(new_index) + if(initial_index == new_index) //cycled through without finding another + new_index = current_index + set_firemode_index(new_index, user_for_feedback) /obj/item/gun/energy/proc/user_set_firemode_to_prev(mob/user_for_feedback) @@ -216,6 +219,9 @@ var/initial_index = new_index while(!IS_VALID_INDEX(new_index) && (new_index != initial_index)) new_index = DECREMENT_OR_WRAP(new_index) + if(initial_index == new_index) //cycled through without finding another + new_index = current_index + set_firemode_index(new_index, user_for_feedback) #undef INCREMENT_OR_WRAP #undef DECREMENT_OR_WRAP diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 997930170a..28b099e548 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -27,14 +27,14 @@ var/altfire_delay = 40 /obj/item/gun/energy/e_gun/advtaser/altafterattack(atom/target, mob/user, proximity_flag, params) + . = TRUE if(last_altfire > world.time + altfire_delay) - return FALSE + return var/current_index = current_firemode_index set_firemode_to_type(/obj/item/ammo_casing/energy/electrode) process_afterattack(target, user, proximity_flag, params) set_firemode_index(current_index) last_altfire = world.time - return TRUE /obj/item/gun/energy/e_gun/advtaser/cyborg name = "cyborg taser" From 3ce1fe2585898ff4f3737836fc6703b791c145cb Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 27 Jan 2020 22:26:43 -0700 Subject: [PATCH 026/172] changes --- code/modules/projectiles/gun.dm | 7 ++++--- code/modules/projectiles/guns/energy.dm | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 510fe0f3a6..8b28262dfe 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -241,6 +241,10 @@ firing = FALSE last_fire = world.time + if(user) + user.update_inv_hands() + SEND_SIGNAL(user, COMSIG_LIVING_GUN_PROCESS_FIRE, target, params, zone_override) + /obj/item/gun/proc/do_fire(atom/target, mob/living/user, message = TRUE, params, zone_override = "", bonus_spread = 0) set waitfor = FALSE var/sprd = 0 @@ -278,9 +282,6 @@ process_chamber() update_icon() - if(user) - user.update_inv_hands() - SEND_SIGNAL(user, COMSIG_LIVING_GUN_PROCESS_FIRE, target, params, zone_override) SSblackbox.record_feedback("tally", "gun_fired", 1, type) return TRUE diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 6f46e976c3..c96aa297ca 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -128,12 +128,12 @@ chambered = null //either way, released the prepared shot recharge_newshot() //try to charge a new shot -/obj/item/gun/energy/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) +/obj/item/gun/energy/do_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) if(!chambered && can_shoot()) process_chamber() // If the gun was drained and then recharged, load a new shot. return ..() -/obj/item/gun/energy/process_burst(mob/living/user, atom/target, message = TRUE, params = null, zone_override="", sprd = 0, randomized_gun_spread = 0, randomized_bonus_spread = 0, rand_spr = 0, iteration = 0) +/obj/item/gun/energy/do_burst_shot(mob/living/user, atom/target, message = TRUE, params = null, zone_override="", sprd = 0, randomized_gun_spread = 0, randomized_bonus_spread = 0, rand_spr = 0, iteration = 0) if(!chambered && can_shoot()) process_chamber() // Ditto. return ..() From d89b8d95cfa2e79ec48a8efcff58046c3dba9b7b Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 27 Jan 2020 22:44:51 -0700 Subject: [PATCH 027/172] BRAINLETMOMENT --- code/modules/projectiles/gun.dm | 3 +-- code/modules/projectiles/guns/energy/stun.dm | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 8b28262dfe..7e125e9614 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -229,7 +229,7 @@ return /obj/item/gun/proc/on_cooldown() - return busy_action || firing || (last_fire > world.time + fire_delay) + return busy_action || firing || (last_fire + fire_delay > world.time) /obj/item/gun/proc/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) add_fingerprint(user) @@ -246,7 +246,6 @@ SEND_SIGNAL(user, COMSIG_LIVING_GUN_PROCESS_FIRE, target, params, zone_override) /obj/item/gun/proc/do_fire(atom/target, mob/living/user, message = TRUE, params, zone_override = "", bonus_spread = 0) - set waitfor = FALSE var/sprd = 0 var/randomized_gun_spread = 0 var/rand_spr = rand() diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 28b099e548..9b749bbead 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -28,7 +28,7 @@ /obj/item/gun/energy/e_gun/advtaser/altafterattack(atom/target, mob/user, proximity_flag, params) . = TRUE - if(last_altfire > world.time + altfire_delay) + if(last_altfire + altfire_delay > world.time) return var/current_index = current_firemode_index set_firemode_to_type(/obj/item/ammo_casing/energy/electrode) From 4c2b0a826a90662e6141a700fce122f93dc043fe Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 27 Jan 2020 23:26:24 -0700 Subject: [PATCH 028/172] WEW LAD --- code/datums/status_effects/debuffs.dm | 1 + code/modules/projectiles/projectile/energy/stun.dm | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 86d7e43e1b..7319945f49 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -125,6 +125,7 @@ if(isnum(set_duration)) //TODO, figure out how to grab from subtype duration = set_duration . = ..() + last_tick = world.time if(iscarbon(owner)) var/mob/living/carbon/C = owner if(C.combatmode) diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index 5c4827d0a7..ea7c013cbd 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -2,7 +2,7 @@ name = "electrode" icon_state = "spark" color = "#FFFF00" - nodamage = 1 + nodamage = TRUE knockdown = 60 knockdown_stamoverride = 36 knockdown_stam_max = 50 @@ -38,8 +38,9 @@ /obj/item/projectile/energy/electrode/security tase_duration = 20 knockdown = 0 - knockdown_stamoverride = 5 - knockdown_stam_max = 15 + stamina = 5 + knockdown_stamoverride = 0 + knockdown_stam_max = 0 strong_tase = FALSE /obj/item/projectile/energy/electrode/security/hos From f430fbcbd620ed8f61f342d036fcef1eb4736da6 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Tue, 28 Jan 2020 17:48:56 -0700 Subject: [PATCH 029/172] doubles stutter --- code/modules/projectiles/projectile/energy/stun.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index ea7c013cbd..929578df1e 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -6,7 +6,7 @@ knockdown = 60 knockdown_stamoverride = 36 knockdown_stam_max = 50 - stutter = 5 + stutter = 10 jitter = 20 hitsound = 'sound/weapons/taserhit.ogg' range = 7 From d358913bde7e754204b5ddd37ae42bb1f5245302 Mon Sep 17 00:00:00 2001 From: Putnam Date: Tue, 28 Jan 2020 17:26:32 -0800 Subject: [PATCH 030/172] linter is right, whoops --- code/game/gamemodes/objective.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index b22e12291b..a9c9e227df 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -373,7 +373,7 @@ GLOBAL_LIST_EMPTY(objectives) var/human_check = TRUE /datum/objective/breakout/check_completion() - return !target || considered_escaped(target, enforce_human = human_check) + return !target || considered_escaped(target) /datum/objective/breakout/find_target_by_role(role, role_type=0, invert=0) if(!invert) From 20e08d992f86c375bb257e4afa90c374facbabe1 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Wed, 29 Jan 2020 06:38:09 +0100 Subject: [PATCH 031/172] Removing unused vore files and commented out code. --- .../mob/living/carbon/human/examine_vr.dm | 45 ---- code/modules/vore/eating/belly_obj.dm | 3 - code/modules/vore/eating/digest_act.dm | 17 -- code/modules/vore/eating/living.dm | 6 - code/modules/vore/eating/voreitems.dm | 30 --- code/modules/vore/resizing/grav_pull_vr.dm | 63 ------ code/modules/vore/resizing/holder_micro_vr.dm | 34 --- code/modules/vore/resizing/resize_vr.dm | 207 ------------------ code/modules/vore/resizing/sizechemicals.dm | 110 ---------- code/modules/vore/resizing/sizegun_vr.dm | 173 --------------- tgstation.dme | 1 - 11 files changed, 689 deletions(-) delete mode 100644 code/modules/mob/living/carbon/human/examine_vr.dm delete mode 100644 code/modules/vore/resizing/grav_pull_vr.dm delete mode 100644 code/modules/vore/resizing/holder_micro_vr.dm delete mode 100644 code/modules/vore/resizing/resize_vr.dm delete mode 100644 code/modules/vore/resizing/sizechemicals.dm delete mode 100644 code/modules/vore/resizing/sizegun_vr.dm diff --git a/code/modules/mob/living/carbon/human/examine_vr.dm b/code/modules/mob/living/carbon/human/examine_vr.dm deleted file mode 100644 index 6ef1b687c2..0000000000 --- a/code/modules/mob/living/carbon/human/examine_vr.dm +++ /dev/null @@ -1,45 +0,0 @@ -/mob/living/carbon/human/proc/examine_nutrition() - var/message = "" - var/nutrition_examine = round(nutrition) - var/t_He = "It" //capitalised for use at the start of each line. - var/t_His = "Its" - var/t_his = "its" - var/t_is = "is" - var/t_has = "has" - switch(gender) - if(MALE) - t_He = "He" - t_his = "his" - t_His = "His" - if(FEMALE) - t_He = "She" - t_his = "her" - t_His = "Her" - if(PLURAL) - t_He = "They" - t_his = "their" - t_His = "Their" - t_is = "are" - t_has = "have" - if(NEUTER) - t_He = "It" - t_his = "its" - t_His = "Its" - switch(nutrition_examine) - if(0 to 49) - message = "[t_He] [t_is] starving! You can hear [t_his] stomach snarling from across the room!\n" - if(50 to 99) - message = "[t_He] [t_is] extremely hungry. A deep growl occasionally rumbles from [t_his] empty stomach.\n" - if(100 to 499) - return message //Well that's pretty normal, really. - if(500 to 864) // Fat. - message = "[t_He] [t_has] a stuffed belly, bloated fat and round from eating too much.\n" - if(1200 to 1934) // One person fully digested. - message = "[t_He] [t_is] sporting a large, round, sagging stomach. It's contains at least their body weight worth of glorping slush.\n" - if(1935 to 3004) // Two people. - message = "[t_He] [t_is] engorged with a huge stomach that sags and wobbles as they move. [t_He] must have consumed at least twice their body weight. It looks incredibly soft.\n" - if(3005 to 4074) // Three people. - message = "[t_His] stomach is firmly packed with digesting slop. [t_He] must have eaten at least a few times worth their body weight! It looks hard for them to stand, and [t_his] gut jiggles when they move.\n" - if(4075 to 10000) // Four or more people. - message = "[t_He] [t_is] so absolutely stuffed that you aren't sure how it's possible to move. [t_He] can't seem to swell any bigger. The surface of [t_his] belly looks sorely strained!\n" - return message \ No newline at end of file diff --git a/code/modules/vore/eating/belly_obj.dm b/code/modules/vore/eating/belly_obj.dm index f88f6bd6e8..460ea74225 100644 --- a/code/modules/vore/eating/belly_obj.dm +++ b/code/modules/vore/eating/belly_obj.dm @@ -533,9 +533,6 @@ //Yes, it's ""safe"" to drop items here /obj/belly/AllowDrop() return TRUE -/* -/obj/belly/onDropInto(var/atom/movable/AM) - return null */ //Handle a mob struggling // Called from /mob/living/carbon/relaymove() diff --git a/code/modules/vore/eating/digest_act.dm b/code/modules/vore/eating/digest_act.dm index ce67a3d296..c0c9423d10 100644 --- a/code/modules/vore/eating/digest_act.dm +++ b/code/modules/vore/eating/digest_act.dm @@ -71,14 +71,6 @@ ///////////// // Some special treatment ///////////// -/* -//PDAs need to lose their ID to not take it with them, so we can get a digested ID -/obj/item/pda/digest_act(var/atom/movable/item_storage = null) - if(id) - id = null - - . = ..() -*/ /obj/item/reagent_containers/food/digest_act(var/atom/movable/item_storage = null) if(isbelly(item_storage)) @@ -92,15 +84,6 @@ . = ..() -/* -/obj/item/holder/digest_act(var/atom/movable/item_storage = null) - for(var/mob/living/M in contents) - if(item_storage) - M.forceMove(item_storage) - held_mob = null - - . = ..() */ - /obj/item/organ/digest_act(var/atom/movable/item_storage = null) if((. = ..())) . += 70 //Organs give a little more diff --git a/code/modules/vore/eating/living.dm b/code/modules/vore/eating/living.dm index 9fdb7aa764..33af8d06e5 100644 --- a/code/modules/vore/eating/living.dm +++ b/code/modules/vore/eating/living.dm @@ -400,10 +400,4 @@ taste_message += "they haven't bothered to set their flavor text" else taste_message += "a plain old normal [src]" - -/* if(ishuman(src)) - var/mob/living/carbon/human/H = src - if(H.touching.reagent_list.len) //Just the first one otherwise I'll go insane. - var/datum/reagent/R = H.touching.reagent_list[1] - taste_message += " You also get the flavor of [R.taste_description] from something on them"*/ return taste_message diff --git a/code/modules/vore/eating/voreitems.dm b/code/modules/vore/eating/voreitems.dm index 4e6bdaa1e0..3ec4ba1956 100644 --- a/code/modules/vore/eating/voreitems.dm +++ b/code/modules/vore/eating/voreitems.dm @@ -30,33 +30,3 @@ H.visible_message("[H] contracts strangely, spewing out contents on the floor!", \ "You spew out everything inside you on the floor!") return BULLET_ACT_HIT - - -////////////////////////// Anti-Noms Drugs ////////////////////////// -/* -/datum/reagent/medicine/ickypak - name = "Ickypak" - description = "A foul-smelling green liquid, for inducing muscle contractions to expel accidentally ingested things." - reagent_state = LIQUID - color = "#0E900E" - metabolization_rate = 0.25 * REAGENTS_METABOLISM - -/datum/reagent/medicine/ickypak/on_mob_life(var/mob/living/M, method=INGEST) - if(prob(10)) - M.visible_message("[M] retches!", \ - "You don't feel good...") - for(var/I in M.vore_organs) - var/datum/belly/B = M.vore_organs[I] - for(var/atom/movable/A in B.internal_contents) - if(prob(55)) - playsound(M, 'sound/effects/splat.ogg', 50, 1) - B.release_specific_contents(A) - M.visible_message("[M] contracts strangely, spewing out something!", \ - "You spew out something from inside you!") - return ..() - -/datum/chemical_reaction/ickypak - name = "Ickypak" - id = /datum/reagent/medicine/ickypak - results = list(/datum/reagent/medicine/ickypak = 2) - required_reagents = list(/datum/reagent/chlorine = 2 , /datum/reagent/oil = 1) */ \ No newline at end of file diff --git a/code/modules/vore/resizing/grav_pull_vr.dm b/code/modules/vore/resizing/grav_pull_vr.dm deleted file mode 100644 index 921d1ab2b9..0000000000 --- a/code/modules/vore/resizing/grav_pull_vr.dm +++ /dev/null @@ -1,63 +0,0 @@ -// -// Gravity Pull effect which draws in movable objects to its center. -// In this case, "number" refers to the range. directions is ignored. -// -/datum/effect/effect/system/grav_pull - var/pull_radius = 3 - var/pull_anchored = 0 - var/break_windows = 0 - -/datum/effect/effect/system/grav_pull/set_up(range, num, loca) - pull_radius = range - number = num - if(istype(loca, /turf/)) - location = loca - else - location = get_turf(loca) - -/datum/effect/effect/system/grav_pull/start() - spawn(0) - if(holder) - src.location = get_turf(holder) - for(var/i=0, i < number, i++) - do_pull() - sleep(25) - -/datum/effect/effect/system/grav_pull/proc/do_pull() - //following is adapted from supermatter and singulo code - if(defer_powernet_rebuild != 2) - defer_powernet_rebuild = 1 - - // Let's just make this one loop. - for(var/atom/X in orange(pull_radius, location)) - // Movable atoms only - if(istype(X, /atom/movable)) - if(istype(X, /obj/effect/overlay)) continue - if(X && !istype(X, /mob/living/carbon/human)) - if(break_windows && istype(X, /obj/structure/window)) //shatter windows - var/obj/structure/window/W = X - W.ex_act(2.0) - - if(istype(X, /obj)) - var/obj/O = X - if(O.anchored) - if (!pull_anchored) continue // Don't pull anchored stuff unless configured - step_towards(X, location) // step just once if anchored - continue - - step_towards(X, location) // Step twice - step_towards(X, location) - - else if(istype(X,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = X - if(istype(H.shoes,/obj/item/clothing/shoes/magboots)) - var/obj/item/clothing/shoes/magboots/M = H.shoes - if(M.magpulse) - step_towards(H, location) //step just once with magboots - continue - step_towards(H, location) //step twice - step_towards(H, location) - - if(defer_powernet_rebuild != 2) - defer_powernet_rebuild = 0 - return diff --git a/code/modules/vore/resizing/holder_micro_vr.dm b/code/modules/vore/resizing/holder_micro_vr.dm deleted file mode 100644 index 1f1aacf98d..0000000000 --- a/code/modules/vore/resizing/holder_micro_vr.dm +++ /dev/null @@ -1,34 +0,0 @@ -// Micro Holders - Extends /obj/item/holder - -/obj/item/holder/micro - name = "micro" - desc = "Another crewmember, small enough to fit in your hand." - icon_state = "micro" - slot_flags = SLOT_FEET | SLOT_HEAD | SLOT_ID - w_class = 2 - item_icons = null // Override value from parent. We don't have magic sprites. - pixel_y = 0 // Override value from parent. - -/obj/item/holder/micro/examine(var/mob/user) - . = list() - for(var/mob/living/M in contents) - . += M.examine(user) - -/obj/item/holder/MouseDrop(mob/M as mob) - ..() - if(M != usr) return - if(usr == src) return - if(!Adjacent(usr)) return - if(istype(M,/mob/living/silicon/ai)) return - for(var/mob/living/carbon/human/O in contents) - O.show_inv(usr) - -/obj/item/holder/micro/attack_self(var/mob/living/user) - for(var/mob/living/carbon/human/M in contents) - M.help_shake_act(user) - -/obj/item/holder/micro/update_state() - // If any items have been dropped by contained mob, drop them to floor. - for(var/obj/O in contents) - O.forceMove(get_turf(src)) - ..() diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm deleted file mode 100644 index 052be48c2d..0000000000 --- a/code/modules/vore/resizing/resize_vr.dm +++ /dev/null @@ -1,207 +0,0 @@ -/* -//these aren't defines so they can stay in this file -GLOBAL_VAR_CONST(SIZESCALE_HUGE, 2) -GLOBAL_VAR_CONST(SIZESCALE_BIG, 1.5) -GLOBAL_VAR_CONST(SIZESCALE_NORMAL, 1) -GLOBAL_VAR_CONST(SIZESCALE_SMALL, 0.85) -GLOBAL_VAR_CONST(SIZESCALE_TINY, 0.60) - -GLOBAL_VAR_CONST(SIZESCALE_A_HUGEBIG, (GLOB.SIZESCALE_HUGE + GLOB.SIZESCALE_BIG) / 2) -GLOBAL_VAR_CONST(SIZESCALE_A_BIGNORMAL, (GLOB.SIZESCALE_BIG + GLOB.SIZESCALE_NORMAL) / 2) -GLOBAL_VAR_CONST(SIZESCALE_A_NORMALSMALL,(GLOB.SIZESCALE_NORMAL + GLOB.SIZESCALE_SMALL) / 2) -GLOBAL_VAR_CONST(SIZESCALE_A_SMALLTINY,(GLOB.SIZESCALE_SMALL + GLOB.SIZESCALE_TINY) / 2) -*/ -// Adding needed defines to /mob/living -// Note: Polaris had this on /mob/living/carbon/human We need it higher up for animals and stuff. -/mob/living - var/size_multiplier = 1 //multiplier for the mob's icon size - -// Define holder_type on types we want to be scoop-able -//mob/living/carbon/human -// holder_type = /obj/item/holder/micro - -/** - * Scale up the size of a mob's icon by the size_multiplier. - * NOTE: mob/living/carbon/human/update_transform() has a more complicated system and - * is already applying this transform. BUT, it does not call ..() - * as long as that is true, we should be fine. If that changes we need to - * re-evaluate. - */ -/mob/living/update_transform() - ASSERT(!iscarbon(src)) - var/matrix/M = matrix() - M.Scale(size_multiplier) - M.Translate(0, 16*(size_multiplier-1)) - src.transform = M - -/** - * Get the effective size of a mob. - * Currently this is based only on size_multiplier for micro/macro stuff, - * but in the future we may also incorporate the "mob_size", so that - * a macro mouse is still only effectively "normal" or a micro dragon is still large etc. - */ -/mob/living/proc/get_effective_size() - return src.size_multiplier - -/** - * Resizes the mob immediately to the desired mod, animating it growing/shrinking. - * It can be used by anything that calls it. - */ -/mob/living/proc/sizescale(var/new_size) - var/matrix/sizescale = matrix() // Defines the matrix to change the player's size - sizescale.Scale(new_size) //Change the size of the matrix - - if(new_size >= SIZESCALE_NORMAL) - sizescale.Translate(0, -1 * (1 - new_size) * 16) //Move the player up in the tile so their feet align with the bottom - - animate(src, transform = sizescale, time = 5) //Animate the player resizing - size_multiplier = new_size //Change size_multiplier so that other items can interact with them - -/* - * Verb proc for a command that lets players change their size OOCly. - * Ace was here! Redid this a little so we'd use math for shrinking characters. This is the old code. - -/mob/living/proc/set_size() - set name = "Set Character Size" - set category = "Vore" - var/nagmessage = "DO NOT ABUSE THESE COMMANDS. They are not here for you to play with. \ - We were originally going to remove them but kept them for popular demand. \ - Do not abuse their existence outside of ERP scenes where they apply, \ - or reverting OOCly unwanted changes like someone lolshooting the crew with a shrink ray. -Ace" - - var/size_name = input(nagmessage, "Pick a Size") in player_sizes_list - if (size_name && player_sizes_list[size_name]) - src.sizescale(player_sizes_list[size_name]) - message_admins("[key_name(src)] used the sizescale command in-game to be [size_name]. \ - ([src ? "JMP" : "null"])") - -/** Add the set_size() proc to usable verbs. */ -/hook/living_new/proc/sizescale_setup(mob/living/M) - M.verbs += /mob/living/proc/set_size - return 1 - - - * Attempt to scoop up this mob up into M's hands, if the size difference is large enough. - * @return false if normal code should continue, 1 to prevent normal code. - -/mob/living/proc/attempt_to_scoop(var/mob/living/carbon/human/M) - if(!istype(M)) - return 0; - if(M.buckled) - usr << "You have to unbuckle \the [M] before you pick them up." - return 0 - if(M.get_effective_size() - src.get_effective_size() >= 0.75) - var/obj/item/holder/m_holder = get_scooped(M) - if (m_holder) - return 1 - else - return 0; // Unable to scoop, let other code run -*/ -/* - * Handle bumping into someone with helping intent. - * Called from /mob/living/Bump() in the 'brohugs all around' section. - * @return false if normal code should continue, 1 to prevent normal code. - * // TODO - can the now_pushing = 0 be moved up? What does it do anyway? - */ -/mob/living/proc/handle_micro_bump_helping(var/mob/living/tmob) - if(src.get_effective_size() <= SIZESCALE_A_SMALLTINY && tmob.get_effective_size() <= SIZESCALE_A_SMALLTINY) - // Both small! Go ahead and - now_pushing = 0 - src.forceMove(tmob.loc) - return 1 - if(abs(src.get_effective_size() - tmob.get_effective_size()) >= 0.20) - now_pushing = 0 - src.forceMove(tmob.loc) - - if(src.get_effective_size() > tmob.get_effective_size()) -/* var/mob/living/carbon/human/tmob = src - if(istype(tmob) && istype(tmob.tail_style, /datum/sprite_accessory/tail/taur/naga)) - src << "You carefully slither around [tmob]." - M << "[src]'s huge tail slithers past beside you!" - else -*/ - src.forceMove(tmob.loc) - src << "You carefully step over [tmob]." - tmob << "[src] steps over you carefully!" - if(tmob.get_effective_size() > src.get_effective_size()) -/* var/mob/living/carbon/human/M = M - if(istype(M) && istype(M.tail_style, /datum/sprite_accessory/tail/taur/naga)) - src << "You jump over [M]'s thick tail." - M << "[src] bounds over your tail." - else -*/ - src.forceMove(tmob.loc) - src << "You run between [tmob]'s legs." - tmob << "[src] runs between your legs." - return 1 - -/** - * Handle bumping into someone without mutual help intent. - * Called from /mob/living/Bump() - * NW was here, adding even more options for stomping! - * - * @return false if normal code should continue, 1 to prevent normal code. - */ -/mob/living/proc/handle_micro_bump_other(var/mob/living/tmob) - ASSERT(isliving(tmob)) // Baby don't hurt me - - if(src.a_intent == "disarm" && src.canmove && !src.buckled) - // If bigger than them by at least 0.75, move onto them and print message. - if((src.get_effective_size() - tmob.get_effective_size()) >= 0.20) - now_pushing = 0 - src.forceMove(tmob.loc) - tmob.Stun(4) -/* - var/mob/living/carbon/human/H = src - if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga)) - src << "You carefully squish [tmob] under your tail!" - tmob << "[src] pins you under their tail!" - else -*/ - src << "You pin [tmob] beneath your foot!" - tmob << "[src] pins you beneath their foot!" - return 1 - - if(src.a_intent == "harm" && src.canmove && !src.buckled) - if((src.get_effective_size() - tmob.get_effective_size()) >= 0.20) - now_pushing = 0 - src.forceMove(tmob.loc) - tmob.adjustStaminaLoss(35) - tmob.adjustBruteLoss(5) -/* var/mob/living/carbon/human/M = src - if(istype(M) && istype(M.tail_style, /datum/sprite_accessory/tail/taur/naga)) - src << "You steamroller over [tmob] with your heavy tail!" - tmob << "[src] ploughs you down mercilessly with their heavy tail!" - else -*/ - src << "You bring your foot down heavily upon [tmob]!" - tmob << "[src] steps carelessly on your body!" - return 1 - - // until I figure out grabbing micros with the godawful pull code... - if(src.a_intent == "grab" && src.canmove && !src.buckled) - if((src.get_effective_size() - tmob.get_effective_size()) >= 0.20) - now_pushing = 0 - tmob.adjustStaminaLoss(15) - src.forceMove(tmob.loc) - src << "You press [tmob] beneath your foot!" - tmob << "[src] presses you beneath their foot!" -/* - var/mob/living/carbon/human/M = src - if(istype(M) && !M.shoes) - // User is a human (capable of scooping) and not wearing shoes! Scoop into foot slot! - equip_to_slot_if_possible(tmob.get_scooped(M), slot_shoes, 0, 1) - if(istype(M.tail_style, /datum/sprite_accessory/tail/taur/naga)) - src << "You wrap up [tmob] with your powerful tail!" - tmob << "[src] binds you with their powerful tail!" - else - src << "You clench your toes around [tmob]'s body!" - tmob << "[src] grabs your body with their toes!" - else if(istype(M) && istype(M.tail_style, /datum/sprite_accessory/tail/taur/naga)) - src << "You carefully squish [tmob] under your tail!" - tmob << "[src] pins you under their tail!" - else - src << "You pin [tmob] beneath your foot!" - tmob << "[src] pins you beneath their foot!" - return 1 -*/ diff --git a/code/modules/vore/resizing/sizechemicals.dm b/code/modules/vore/resizing/sizechemicals.dm deleted file mode 100644 index 612e8c9fde..0000000000 --- a/code/modules/vore/resizing/sizechemicals.dm +++ /dev/null @@ -1,110 +0,0 @@ - -//////////////////////////// -/// shrinking serum /// -//////////////////////////// - -/datum/reagent/medicine/macrocillin - name = "Macrocillin" - description = "Glowing yellow liquid." - reagent_state = LIQUID - color = "#FFFF00" // rgb: 255, 255, 0 - overdose_threshold = 20 - -/datum/reagent/medicine/macrocillin/on_mob_life(mob/living/M, method=INGEST) - for(var/size in list(SIZESCALE_SMALL, SIZESCALE_NORMAL, SIZESCALE_BIG, SIZESCALE_HUGE)) - if(M.size_multiplier < size) - M.sizescale(size) - M << "You grow!" - break - if(M.reagents.has_reagent(/datum/reagent/medicine/macrocillin)) - M.reagents.remove_reagent(/datum/reagent/medicine/macrocillin, 20) - ..() - -/datum/reagent/medicine/microcillin - name = "Microcillin" - description = "Murky purple liquid." - reagent_state = LIQUID - color = "#800080" - overdose_threshold = 20 - -/datum/reagent/microcillin/on_mob_life(mob/living/M, method=INGEST) - for(var/size in list(SIZESCALE_BIG, SIZESCALE_NORMAL, SIZESCALE_SMALL, SIZESCALE_TINY)) - if(M.size_multiplier > size) - M.sizescale(size) - M << "You shrink!" - break; - if(M.reagents.has_reagent(/datum/reagent/medicine/microcillin)) - M.reagents.remove_reagent(/datum/reagent/medicine/microcillin, 20) - - ..() - -/datum/reagent/medicine/normalcillin - name = "Normalcillin" - description = "Translucent cyan liquid." - reagent_state = LIQUID - color = "#00FFFF" - overdose_threshold = 20 - -/datum/reagent/medicine/normalcillin/on_mob_life(mob/living/M, method=INGEST) - if(M.size_multiplier > SIZESCALE_BIG) - M.sizescale(SIZESCALE_BIG) - M << "You shrink!" - else if(M.size_multiplier > SIZESCALE_NORMAL) - M.sizescale(SIZESCALE_NORMAL) - M << "You shrink!" - else if(M.size_multiplier < SIZESCALE_NORMAL) - M.sizescale(SIZESCALE_NORMAL) - M << "You grow!" - else if(M.size_multiplier < SIZESCALE_SMALL) - M.sizescale(SIZESCALE_SMALL) - M << "You grow!" - - if(M.reagents.has_reagent(/datum/reagent/medicine/normalcillin)) - M.reagents.remove_reagent(/datum/reagent/medicine/normalcillin, 20) - ..() - - -/datum/reagent/medicine/sizeoxadone - name = "Sizeoxadone" - description = "A volatile liquid used as a precursor to size-altering chemicals. Causes dizziness if taken unprocessed." - reagent_state = LIQUID - color = "#1E90FF" - overdose_threshold = 30 - metabolization_rate = 0.8 * REAGENTS_METABOLISM - -/datum/reagent/sizeoxadone/on_mob_life(var/mob/living/carbon/M, var/removed) - if(M.hallucination < volume && prob(20)) - M.hallucination += 5 - if(!M.confused) M.confused = 1 - M.confused = max(M.confused, 20) - return - -/datum/reagent/medicine/sizeoxadone/overdose_process(mob/living/M) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1) - M.adjustToxLoss(1) - ..() - . = 1 - -////////////////////////// Anti-Noms Drugs ////////////////////////// - -/datum/reagent/medicine/ickypak - name = "Ickypak" - description = "A foul-smelling green liquid, for inducing muscle contractions to expel accidentally ingested things." - reagent_state = LIQUID - color = "#0E900E" - metabolization_rate = 0.25 * REAGENTS_METABOLISM - -/datum/reagent/medicine/ickypak/on_mob_life(var/mob/living/M, method=INGEST) - ..() - if(M.hallucination < volume && prob(20)) - M.hallucination += 5 - M.adjustToxLoss(-5) - - for(var/I in M.vore_organs) - var/datum/belly/B = M.vore_organs[I] - for(var/atom/movable/A in B.internal_contents) - if(prob(55)) - playsound(M, 'sound/effects/splat.ogg', 50, 1) - B.release_vore_contents(A) - ..() - . = 1 \ No newline at end of file diff --git a/code/modules/vore/resizing/sizegun_vr.dm b/code/modules/vore/resizing/sizegun_vr.dm deleted file mode 100644 index 156b220df3..0000000000 --- a/code/modules/vore/resizing/sizegun_vr.dm +++ /dev/null @@ -1,173 +0,0 @@ -// -// Size Gun -// -/* -/obj/item/gun/energy/sizegun - name = "shrink ray" - desc = "A highly advanced ray gun with two settings: Shrink and Grow. Warning: Do not insert into mouth." - icon = 'icons/obj/gun_vr.dmi' - icon_state = "sizegun-shrink100" // Someone can probably do better. -Ace - item_state = null //so the human update icon uses the icon_state instead - fire_sound = 'sound/weapons/wave.ogg' - charge_cost = 100 - projectile_type = /obj/item/projectile/beam/shrinklaser - modifystate = "sizegun-shrink" - selfcharge = EGUN_SELFCHARGE - firemodes = list( - list(mode_name = "grow", - projectile_type = /obj/item/projectile/beam/growlaser, - modifystate = "sizegun-grow", - fire_sound = 'sound/weapons/pulse3.ogg' - ), - list(mode_name = "shrink", - projectile_type = /obj/item/projectile/beam/shrinklaser, - modifystate = "sizegun-shrink", - fire_sound = 'sound/weapons/wave.ogg' - )) - -// -// Beams for size gun -// -// tracers TBD - -/obj/item/projectile/beam/shrinklaser - name = "shrink beam" - icon_state = "xray" - nodamage = 1 - damage = 0 - check_armour = "laser" - - muzzle_type = /obj/effect/projectile/xray/muzzle - tracer_type = /obj/effect/projectile/xray/tracer - impact_type = /obj/effect/projectile/xray/impact - -/obj/item/projectile/beam/shrinklaser/on_hit(var/atom/target, var/blocked = 0) - . = ..() - if(isliving(target)) - var/mob/living/M = target - switch(M.size_multiplier) - if(SIZESCALE_HUGE to INFINITY) - M.sizescale(SIZESCALE_BIG) - if(SIZESCALE_BIG to SIZESCALE_HUGE) - M.sizescale(SIZESCALE_NORMAL) - if(SIZESCALE_NORMAL to SIZESCALE_BIG) - M.sizescale(SIZESCALE_SMALL) - if((0 - INFINITY) to SIZESCALE_NORMAL) - M.sizescale(SIZESCALE_TINY) - M.update_transform() - return BULLET_ACT_HIT - -/obj/item/projectile/beam/growlaser - name = "growth beam" - icon_state = "bluelaser" - nodamage = 1 - damage = 0 - check_armour = "laser" - - muzzle_type = /obj/effect/projectile/laser_blue/muzzle - tracer_type = /obj/effect/projectile/laser_blue/tracer - impact_type = /obj/effect/projectile/laser_blue/impact - -/obj/item/projectile/beam/growlaser/on_hit(var/atom/target, var/blocked = 0) - . = ..() - if(isliving(target)) - var/mob/living/M = target - switch(M.size_multiplier) - if(SIZESCALE_BIG to SIZESCALE_HUGE) - M.sizescale(SIZESCALE_HUGE) - if(SIZESCALE_NORMAL to SIZESCALE_BIG) - M.sizescale(SIZESCALE_BIG) - if(SIZESCALE_SMALL to SIZESCALE_NORMAL) - M.sizescale(SIZESCALE_NORMAL) - if((0 - INFINITY) to SIZESCALE_TINY) - M.sizescale(SIZESCALE_SMALL) - M.update_transform() - return BULLET_ACT_HIT -*/ - -datum/design/sizeray - name = "Size Ray" - desc = "Abuse bluespace tech to alter living matter scale." - id = "sizeray" - build_type = PROTOLATHE - materials = list(MAT_METAL = 1000, MAT_GLASS = 1000, MAT_DIAMOND = 2500, MAT_URANIUM = 2500, MAT_TITANIUM = 1000) - build_path = /obj/item/gun/energy/laser/sizeray - category = list("Weapons") - -/obj/item/projectile/sizeray - name = "sizeray beam" - icon_state = "omnilaser" - hitsound = null - damage = 0 - damage_type = STAMINA - flag = "laser" - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE - -/obj/item/projectile/sizeray/shrinkray - icon_state="bluelaser" - -/obj/item/projectile/sizeray/growthray - icon_state="laser" - -/obj/item/projectile/sizeray/shrinkray/on_hit(var/atom/target, var/blocked = 0) - . = ..() - if(isliving(target)) - var/mob/living/M = target - switch(M.size_multiplier) - if(SIZESCALE_HUGE to INFINITY) - M.sizescale(SIZESCALE_BIG) - if(SIZESCALE_BIG to SIZESCALE_HUGE) - M.sizescale(SIZESCALE_NORMAL) - if(SIZESCALE_NORMAL to SIZESCALE_BIG) - M.sizescale(SIZESCALE_SMALL) - if((0 - INFINITY) to SIZESCALE_NORMAL) - M.sizescale(SIZESCALE_TINY) - M.update_transform() - return BULLET_ACT_ - -/obj/item/projectile/sizeray/growthray/on_hit(var/atom/target, var/blocked = 0) - . = ..() - if(isliving(target)) - var/mob/living/M = target - switch(M.size_multiplier) - if(SIZESCALE_BIG to SIZESCALE_HUGE) - M.sizescale(SIZESCALE_HUGE) - if(SIZESCALE_NORMAL to SIZESCALE_BIG) - M.sizescale(SIZESCALE_BIG) - if(SIZESCALE_SMALL to SIZESCALE_NORMAL) - M.sizescale(SIZESCALE_NORMAL) - if((0 - INFINITY) to SIZESCALE_TINY) - M.sizescale(SIZESCALE_SMALL) - M.update_transform() - return BULLET_ACT_HIT - -/obj/item/ammo_casing/energy/laser/growthray - projectile_type = /obj/item/projectile/sizeray/growthray - select_name = "Growth" - -/obj/item/ammo_casing/energy/laser/shrinkray - projectile_type = /obj/item/projectile/sizeray/shrinkray - select_name = "Shrink" - - -//Gun here -/obj/item/gun/energy/laser/sizeray - name = "size ray" - icon_state = "bluetag" - desc = "Size manipulator using bluespace breakthroughs." - item_state = null //so the human update icon uses the icon_state instead. - ammo_type = list(/obj/item/ammo_casing/energy/laser/shrinkray, /obj/item/ammo_casing/energy/laser/growthray) - selfcharge = EGUN_SELFCHARGE - charge_delay = 5 - ammo_x_offset = 2 - clumsy_check = 1 - - attackby(obj/item/W, mob/user) - if(W==src) - if(icon_state=="bluetag") - icon_state="redtag" - ammo_type = list(/obj/item/ammo_casing/energy/laser/growthray) - else - icon_state="bluetag" - ammo_type = list(/obj/item/ammo_casing/energy/laser/shrinkray) - return ..() \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index 8fda1f85cb..af0ef6fc9b 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2202,7 +2202,6 @@ #include "code\modules\mob\living\carbon\human\dummy.dm" #include "code\modules\mob\living\carbon\human\emote.dm" #include "code\modules\mob\living\carbon\human\examine.dm" -#include "code\modules\mob\living\carbon\human\examine_vr.dm" #include "code\modules\mob\living\carbon\human\human.dm" #include "code\modules\mob\living\carbon\human\human_defense.dm" #include "code\modules\mob\living\carbon\human\human_defines.dm" From b26d6c443f2a9bb86af8e47c8c51ee35b6edcb34 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 29 Jan 2020 02:23:54 -0700 Subject: [PATCH 032/172] Update ticker.dm --- code/controllers/subsystem/ticker.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index c9562bcfd1..41b199a1d0 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -363,7 +363,7 @@ SUBSYSTEM_DEF(ticker) var/turf/epi = bomb.loc qdel(bomb) if(epi) - explosion(epi, 0, 256, 512, 0, TRUE, TRUE, 0, TRUE) + explosion(epi, 512, 0, 0, 0, TRUE, TRUE, 0, TRUE) /datum/controller/subsystem/ticker/proc/create_characters() for(var/mob/dead/new_player/player in GLOB.player_list) From 0612649eb7f7e55e66986b788345089d98ab510a Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 29 Jan 2020 20:50:06 -0700 Subject: [PATCH 033/172] Update stun.dm --- code/modules/projectiles/guns/energy/stun.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 9b749bbead..d700db817c 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -24,7 +24,7 @@ ammo_x_offset = 2 // Not enough guns have altfire systems like this yet for this to be a universal framework. var/last_altfire = 0 - var/altfire_delay = 40 + var/altfire_delay = 15 /obj/item/gun/energy/e_gun/advtaser/altafterattack(atom/target, mob/user, proximity_flag, params) . = TRUE From 1a439b87588f81a7f14355a1569659dd608a01cd Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 29 Jan 2020 20:51:31 -0700 Subject: [PATCH 034/172] Update stun.dm --- code/modules/projectiles/projectile/energy/stun.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index 929578df1e..8852d754ce 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -38,7 +38,7 @@ /obj/item/projectile/energy/electrode/security tase_duration = 20 knockdown = 0 - stamina = 5 + stamina = 10 knockdown_stamoverride = 0 knockdown_stam_max = 0 strong_tase = FALSE From bf47daf0990163c8af80a6e22732359c6762fdb8 Mon Sep 17 00:00:00 2001 From: Seris02 Date: Thu, 30 Jan 2020 17:00:14 +0800 Subject: [PATCH 035/172] MY PRECIOUS! GONE!! GOOOOOONE!!! --- code/modules/clothing/gloves/_gloves.dm | 2 ++ code/modules/clothing/gloves/boxing.dm | 1 + code/modules/clothing/gloves/color.dm | 2 ++ code/modules/clothing/gloves/miscellaneous.dm | 15 +++++++++++++++ code/modules/mob/living/living.dm | 18 +++++++++++++++--- .../uplink/uplink_items/uplink_clothing.dm | 6 ++++++ icons/obj/clothing/gloves.dmi | Bin 14376 -> 14851 bytes 7 files changed, 41 insertions(+), 3 deletions(-) diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index 8ab897f5d9..0729317eac 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -11,6 +11,8 @@ var/transfer_blood = 0 strip_delay = 20 equip_delay_other = 40 + var/strip_mod = 1 //how much they alter stripping items time by, higher is quicker + var/strip_silence = FALSE //if it shows a warning when stripping /obj/item/clothing/gloves/ComponentInitialize() . = ..() diff --git a/code/modules/clothing/gloves/boxing.dm b/code/modules/clothing/gloves/boxing.dm index a76ff7c583..fe07cc7ab9 100644 --- a/code/modules/clothing/gloves/boxing.dm +++ b/code/modules/clothing/gloves/boxing.dm @@ -5,6 +5,7 @@ item_state = "boxing" equip_delay_other = 60 species_exception = list(/datum/species/golem) // now you too can be a golem boxing champion + strip_mod = 0.5 /obj/item/clothing/gloves/boxing/green icon_state = "boxinggreen" diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index b630b121a9..f4b04f5bfe 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -41,6 +41,7 @@ permeability_coefficient = 1 resistance_flags = NONE transfer_prints = TRUE + strip_mod = 0.8 /obj/item/clothing/gloves/cut/family desc = "The old gloves your great grandfather stole from Engineering, many moons ago. They've seen some tough times recently." @@ -76,6 +77,7 @@ max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE var/can_be_cut = 1 + strip_mod = 1.2 /obj/item/clothing/gloves/color/black/hos item_color = "hosred" //Exists for washing machines. Is not different from black gloves in any way. diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index efe32a1473..1e58f6b0e2 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -10,6 +10,7 @@ equip_delay_other = 20 cold_protection = HANDS min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + strip_mod = 0.9 /obj/item/clothing/gloves/botanic_leather name = "botanist's leather gloves" @@ -23,6 +24,7 @@ max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 30) + strip_mod = 0.9 /obj/item/clothing/gloves/combat name = "combat gloves" @@ -38,6 +40,7 @@ max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50) + strip_mod = 1.5 /obj/item/clothing/gloves/bracer @@ -103,3 +106,15 @@ /obj/item/clothing/gloves/rapid/hug/attack_self(mob/user) return FALSE + +/obj/item/clothing/gloves/thief + name = "thief's gloves" + desc = "Gloves made with completely frictionless, insulated cloth, easier to steal from people with." + icon_state = "thief" + item_state = "blackgloves" + siemens_coefficient = 0 + permeability_coefficient = 0.05 + strip_delay = 80 + transfer_prints = FALSE + strip_mod = 5 + strip_silence = TRUE \ No newline at end of file diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 90ada3d718..02056ff947 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -763,10 +763,22 @@ if(HAS_TRAIT(what, TRAIT_NODROP)) to_chat(src, "You can't remove \the [what.name], it appears to be stuck!") return - who.visible_message("[src] tries to remove [who]'s [what.name].", \ + var/strip_mod = 1 + var/strip_silence = FALSE + if (ishuman(src)) //carbon doesn't actually wear gloves + var/mob/living/carbon/C = src + var/obj/item/clothing/gloves/g = C.gloves + if (istype(g)) + strip_mod = g.strip_mod + strip_silence = g.strip_silence + if (!strip_silence) + who.visible_message("[src] tries to remove [who]'s [what.name].", \ "[src] tries to remove [who]'s [what.name].") - what.add_fingerprint(src) - if(do_mob(src, who, what.strip_delay, ignorehelditem = TRUE)) + what.add_fingerprint(src) + else + to_chat(src,"You try to remove [who]'s [what.name].") + what.add_fingerprint(src) + if(do_mob(src, who, round(what.strip_delay / strip_mod), ignorehelditem = TRUE)) if(what && Adjacent(who)) if(islist(where)) var/list/L = where diff --git a/code/modules/uplink/uplink_items/uplink_clothing.dm b/code/modules/uplink/uplink_items/uplink_clothing.dm index 3a3c53288a..e8d01a5465 100644 --- a/code/modules/uplink/uplink_items/uplink_clothing.dm +++ b/code/modules/uplink/uplink_items/uplink_clothing.dm @@ -78,3 +78,9 @@ cost = 30 include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) exclude_modes = list() + +/datum/uplink_item/suits/thiefgloves + name = "Thief's Gloves" + desc = "A pair of gloves that are insulated and frictionless, allowing you to steal easily from anyone you see." + item = /obj/item/clothing/gloves/thief + cost = 4 \ No newline at end of file diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index 7e0d03abd56bcd7fa2e543382d0b42845405ca2b..515d6212c0da783a6680e76ea0f0a70999a5b77a 100644 GIT binary patch literal 14851 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 literal 14376 zcmb8W1yCH_)-^mp2myizw_w5Dg9b=&3oe7Z6WrY$g1aRUT!J$Y+%-UOcXu0xuXFEn z-}>LGzrMO(6+`#*Io*BEK6~$8z4n?2B?U<|6e1K52!tjrCGi>9t^uFUS1*D8qyhGG zAP}5@r>ds2gsGG97fT0cOM5#I$UQ6Ow}4$Y+v}HW^THwVBlHj2?Qf6+Uk~EKYk#Ae zjWkjEa&GJ#{KqQ6hzN-tx zGJDiR07a1&dZ3bE?cN2;XXwj{C~Z2o9(KVkf-P@L{?Us#m!U3Af0IVn&G$INXwaW{ z;_-^ZsotHFe4^3G_c8S)g z{igETn6al%#XVWd``lf^nDS!`N8P)odF5|(%Owp;2;o(tyj)oE)R zci8aC-^n7~(f8hnOwU$>KyN|P5+79EvyQX9yj5q~_c{d9<;bWhDBu#$P+nluL=XfT z>7Ysq78GN|ZIsQf6s~yvI+!8D9X~#Iw~+n0Ff}zxR_1UjDfGP}&Z@}Ws;r?ea0QPG zIgYxJ0xncEF<=DqLg5|G?31zi@zFe|7YDMmXe%TagWPOZ&+F+XM{Bjbf29te?hQ(a zSiTb7o1{qBN(|9_0&^Hz6TjTUaOds2d(BT0$R&4N=k}eWfxQ&OT)GZqG9@omy)#OX zX>(1ax(cKPGU&qj=aBN0knd9f@Anvn$t*NB+cI&XErA3-tC+G04amCX*#QUiWm6a*;=nmDdZk+EqG?OLg z>TlS?9S*e{2+cS^}!%|1E)VYd^3Y>+#J*|j{pV-EtwCiC-qk6ec<5<>D zBTDM}B%5{nn~2`&=}=CXS#H`ZM#n)~*BWwbjCrz~;x!IXHu) z+T5($c3{PECr)wY@Z&(0d6SK-K50aXH~X1^0ZmI1+pz}&FoeEEM&C#}XS%RYOTx*u zr=_JO1tTLP9k@X$@!;Sf9?zOfb5lb@gVW_ebzyN4E<7sA*uVhP8L!w^Ra#1+8^up# zQr2j<{62*RY*nP8rdDIS$TM>BVeh_5zk`gRHN1AFPG)DHxM#-mJ@vB8Jv%v@E0$@Q zTQ9Cgwaxq)y{fwUXFWZ#L_5>Vozc!eAEEt+Lp_vhQTTcTh?gqj8T_SVVPQd8`t7E5#wTTEWhH1v29bd#wd4$rfYLlvW zRf8v>P;bM7A;M&->H7E~Q@Zn;xShxh?NP%k8(XQZszEZ~EOGCbb^Ih9= zq|?09ViAGjJG}5$KoQoFn9N}GXnTFmsw{N}1S(dHYN6rGgV9REv>MIj^9Al1m;ZL7S4W{x&aRaUZi z3+J-GOnwYtS&hJ<9T*zw+P(aU`)sp~>IPF&Qv)eW^I=^`7bLK0-y3Y5>VMYKLYAOi zk1?H#n6Zuwc$db5abbkzvv$4*-&e>Uqnn2>Uxv`uvqlpp_YeRB={nsb=w7ap`+L6~ z3tN2Rd0etfsnY6J9KyVnjCY{iGTwt~RIs8Yu z&K=TFQ6a?j2aWF*R##8#>1ng~j{{@eJSSKl0H#!UNH49RfKJRSEG#SqvDlQo|MBC; zYs-QU>eUYW$;rt~;Fhnpiw(+ZYQ3D}f;e26R-cA;ff$(+&S zAFf0tUX8D+or-@qgwZM7UW+XwOJC(6W?H<0onfYe28W7*BB88|C7c_Vl7h#%Yi+xkYvQ&|Dm+fa=sKdZ_vxkwej_9eWski4_hYo4mPCs+rF;egp zgm3qIH)$(QJ52XxWLdxkUYOJLY*-1|hSTbYbu;OEc<>h&7h`?=de39KP?VgS8Yc8? zI-G(S0W=rdT)J%Ba9ejC_Z@yo$jl61Y{zMA6>DU`_e@$Na3Cph@^Wm3mM=rVPR%e7 z2_>OOkR5LwNRoI2|I)F2v+MZ8bTq?$?MwF7bMtajcMtEdhTi&bT6M|@zOSc4tx#=` z5Kg+~PRbl_+dfRCSB9!EAR8414p)-C7^Y$DxNZW>!_Ce8Nsm4Na2f%DMOTs5yDxr# z>)dll72WwK@Gji3F(s=>T)IYl9oOyytf1N9+pav>V7F`){x|O~KD~AS+{;wp(VFf6 zmex45Ec}TO*rOvTG#byN>wQ@y^YLQ{1<)!nWX@dJ)|NGz$&2J7033*@3Ys#k{uUD zd9wjpl2fnHyV;||9t=$|F>YN5#D6|GT%7Gz1UbsSLwJn(ejw#xjOS@*pc}w z_p`MR6~)CNM@KeodR3Ew{w#X(@@P9LebFv#EIKr0!Rr^FaP)_`63$I!f$6op#rlAM zTG@KiwKVlnEX6dL4I7OYTs}CAGCMD?xSBV)@iB;Ln8A?RM7F_dhJk^R(c^a6EoOcc z2m&7amFVW;sBcVV!3mm=SFWSi`YbF%+H#%8-yRF&nhZx7)(Grwy`a9k)=dw(Y{c4= zG$dyEf=+o6UX4{VExIf%OLlzd)-1X~he6$)NBMsF11UB$9DaL8W~MaTI%UXK`;-Rt zk?P3Zm|QQvf;s0eL>)B7S@PPb4f_}Zn0Tj{wwhyEYliSkXA(7A)zy(rnDH$0jY*$t?3cOGM5Pe9qt&* zpm-!o)WGLA8@H>Bo|3;myj{mQ&~Dzdi`UU^z4E2R)S z;yITj63YjJw;R=6DS{{ExptGcW2h(Q`x>J-7w*Kr5a3X|UW5?$58{nw&FSiKZE!C+ z*MwRI_9#FcHu(TQ(tY73Yw9uUED*ZIwy`*fZ%3l>_d%_Zf*;cfveuukOyyVZ*Wcy<@YLX6q9@)fm;{oK>9CyPIZRn^lNw&)vls z-gHE0YE>=vQ&;#tlrc*Q%e!Knu8I=MEgJ4Xp|`SRQ_+;5^wQI1Dl6IJFuV7Jh$!PbnafDGtj9QQu!A93r?XmKl4D zX}`UL>tKT%;>5mLZEuP8um}5%ZB)4zW@KAOzN3cxg_yLo{eNbcmgI~JVOwM8*pmPb z%~5Zf_~Y8r5RmciiN9o%rr>WsVYj>d$tOFElN(=ytyzbjprneGBRQ!|co?XNT6CHo z+*MD{#z~63u{J_zaTw|`o!?6S0Bs4T4b4Foz{5J8rCplV{glX>3m|iJj3bU0z*n=j z&~tEZ^`mv`fR7hnEEt;JXuL%{erGLmR(%-NOV#IRVGl_-wb>k2A6MY8Zb@Elbwe=5 zS8nihP1KsMXnSseVYb#p(&-2Z43_V!AKZ{59(}AAqN88wvT^7UlcBtOPa%Z7L9%uj z7)xex8c@(YAp&amP2*;6$~y6F=RP```53J(cK8sSr%@?eSH(-VMr`TRg`utY*LKFq z-!n2Y*eew2hFz;zHhV4|EN`w!+8?;Ttm+YC|F!2*<6LNui08Gnvn@Se*&X9biJ8;j z2bNJtPI5<;;T(RH_`i$|)@MSG=(xD$h8nHxQGeY4yUv?7coYRETu8Z|t_b}Fl&Mt> zeiw!Rf{%~(8qqRh^m@M%J^twg%nOatFq+%YL)b`--Dt&`E~^lg+lhgi-%#P@9a4TX z+Gm`%LRzVnbr|1h!iJF8X!I0w6Z0AiW(PAI255%1rfY7wQYnHBJjNFCLewaM8R-NA zlN5jTL0LKB_=nW`#&<(fK1-#zl-K3pxqvKC%Ri{bnyf_%R+@I@SqlQM^knvsPZb3iQ^J4E!X(uPn(a}+5X}WD< zMTI#Yhn5BkU4PfY0t7-AETZRB3UJ(C$^6dyAk?aG~70Yfu z&cs6gut~AKXs&@{&mIm(e|w8VjGj+N5~*j@Zum^E6L64kF_VHF@um?m72nQBv}!I2 zz`z-*337c8!Gjo;J%`ssl(Fx8Pd2T`-@`&Ze1Qi)#fHU(h;qjJ9{|V$a^K+KU<6&k z$nBETxaF5Vm2a};8-sJ}Y{MGU&KdPxA%9^TnTKQQJ99zPmL7&2Z&LI+Zy@_@IMq=C z(D3QU59K7z91gG%t|Ej72f?8aV@$%mgH*vK2(NJ506q(=MecK@3izR;Pu(H+H?3M5 zY5ZC+Vd>kB#jh`%-?>jV3XeVT~@*xXwK+9Y6g(7O~pm zj!G5a7B=Z10FA=I^v-TYL&&}1wHK~mr0|2b;c zLJB%=h8CyOhppdW;YMvYe*VA~jH3j{Qlj!Q^Azl$aT>;vCNzY!Me| zuo$Y9AwZr_+*XLeNMAm3^D0^Nd*dXFFRukaAuNOm9};HHJla=q$rUZ(TAcZ17_nKP zIrjG6%#`wHff;UHsZKaQK15U7vk$ynuSI(;|D1&4XRa-SdiuoT@Zp~@jXB-0k01PN ze{!Ct?&=bL<;g$9NeMkkg|2P&@(#bdU1S^gn?0vdzb|O6>s|O+FGDvRv-3Gv4PtR( zQ{&29fj#u4u=$N)GHZr_PB~b%EVx$Jn!oSCU;Fjz2g5w_jSUKZ1if3)wb!q2ehpGt zII&1T(a+q(qbzkx&_wN#-ip3>%Z;ZUTOgkvvu6{+8N^25uh}_?Si!trh4`se*dWJ= zhHM%;CaGQ6@FIwD|9#lsNJOeo;@3Oh&St)7&-PyLa|9xe!o$>KGLrVxCgJpW3zavv z%ovWNP$}L*08=lL9!9IZzTNFl_^`z%q$2f(JE zZzdVWOqQLQKh{Tb0!Zlim5%6zZtxLTOI{P{DbjEqcy=S_iF zJ^@X_3r2c+EU}{SgH-PG?9*uI88}3Y9R+epDserWfk{atAx6JC+3_wiF%i4w%eKr6 zHp3fb%$ceMSs57#D=P+4Qc~y*J~`(t2a;?mi^=IqySB7+M9B}UJV!TwB;Wd%{@r01 zRF|jAtr|~X^zy3>CHO}!m^G_G{>;R__EPT0KfU1GZ_(x^JH-L<*n!yNT_pD6x)JWv+$ zBTq!(U_>cLU)}&}iSg>;p)UkHg}SHthUI6=4wcz)>&Qt{VE@aT+nj1@WbLxm4wg37aau0&3~@g<%!il4(~E*0OPw`nv*K(~yVo^y4N(Mf!}8vH8H zl16yokd#^wGh-Zmul_?%95Mzl7hM*7Vjded2`>BA-5f8F`^~($W3w)W$5<$N&>cm% zai?E?Rn__F-UZwUk}tX-stH;#FT5g~0*(;|g*)gMy#cEO_8+t*#Jfq;M}!F!5;$QD zD6XcE!Z|A}C-1B^a7>-A1_#=ocbR(jT{b|R&5woTS?DzcwLP8f`5oUzh%6a->fLG^ zqT{Ljt166GE-@W|0$uk~4Em0%4u+S^%)h9b@FA*fem!NpzUU??{9Ns-0IXWLmNPDU zEagimYXRxSTGN>?Jo!_ww`3B{Y3v9>$UGOu?8 z4oJIhWMTKuwIH3rIkiBcs1MS8AcQ?;BaDgHOfPoeEISuFb=UfhpO_#4Qn~y7a2AZO zMM)f}99kj#Lccy_^5&6Ckh8rqfmd*5ANC)I7w9MO`^Af><#dhod+bU7ZJQDg(#12{ z#Fd(%u~BI5O%?${#O0c5ZO)D-V#-L^Q(PQ9EL;DRoOG}#NZ5(J2>$lz6%1DQuuH!C zI~OHa7!BR;g)oL(E=nUT2$r?%2F{ZY$c1u1?*+<{X=rE)3?VF&2726%V^tjSx0C^K zzJV#p{U0#4-1e|je5haN1F0hTYt>^kj#aLa)w)pMBlaoFj~_&uE%g%7>Rlxv+RhOM z_dnb2$|M7ClA_h5=;wCrn?uYss=hTg;?FNgv$X6{+HUs6Y~*;ItOp?3?Ie=?=^8dh zHb1k)OvMw3h=?$jmLx%Xe0f&?=t1C9;1v9ZTMJ3v%sBR%#;0WsMVFF7muX7Fo8EXr2dVkBOI(~Cpmaye2)SBt z`gbIPkNP+4fiJ#tX2_-rD}wdt7bq|gJXo=bRbEF$#@NwF=9uq}WiO0ncR!v0`7jeZ zjfMn&1>>h89Om5~Egwr;?kN)_(cVuWq*xaJ3maP$eQ%va5qrK`7XEhBA{p+{Jlr*T z=!pO|xtDA8dV{3p!wgmTWBQO#ruumz2^@E|>F{uqE{k3Bc1m9DUvA8HsY%&pz90&p zW!%C-&XuELRPo{~-@>AT%3S4KT`#i2j=U^|nfm)DdgPuRQ_MNu&b|Udu31m_iS13a zHHxd6^)y81?s8LhHa00qYml%+sx{V@87&(#&c)}={d0`Z6YMc9tT$^nx4&H1HuKkr zTEdOFT>(KtWr3r9Wt+X^;S0#OyL-|kQ-%tUiuwBIW(cK_!1GtbtV4n#P;Fe zWp`-7Sy-SD=1heJywSUtCuJ5+6G37DXLKEnyqVe^Uz5uVgN(7TXnvtbBlqb^$>psn zM1i6=EIQK7wOcdVJOaCKmfYW@(XivzJ*_tNayI9PP|1lAHI-K z*Nb`E^eC;W|gw3e!B zSL&STjg3?$9BG9FG>QCb8L-rmt?R||>B;uEUnO96v`@0HS`3&NLJw9$nB|F9{!{K~K(`F4|j0Yf_uB%+qJFKaY!iA%_Az2Sx-ua~petV2c+{l)biILzVd z-STgdLe&$6RP%S8_}(6VcJQQVMu1(}rllB}MB&K?(S$r?(62PO!nZT`O?j!PTwSwo zB6TXVW|MbFVtlOkd_Oo8P3t$wr1uEM0e6l)#gmv7TSibAKnf#*$kMdkMFd<)4Exam z+_V--j8|>CC@|7K0(V3WlpGsEm@iH?nAIm{yrZ|Wa69#$0^9wBRRqJN#t0!rSg{Tl zwxH2H&#r0{*Vk@}h>b!FJi)0Ba?xR$lT$CC8wMD>iZhJAf^4f%e7sXn4%Z713A6UD zaB${^MU9w`8HTI3ibROIes@_IyE=#ASL)BG5%_(dpu@W~ z2o?XJE_Y=XJ=p)xFB1ilLkbrDr0=;RBZ#P8e_+a_jjQUN37Zo$sOi&d*SAOGB3m3i z28)M43fMR+AW!g~ltCvKmRs+0DO!f=d{$qTh7=CoS-@ES}}D9(u}s~J=>clKl`cMg`EOvKLrUKX@~ z-~zG`%XPl4|HbZxB)P;~|MQA%V!3-NB<$|e3%rGoH{n|l0!6I;PIeq4q^yUu)aq81 za%y4ZGQ=*5ul&X3z>!6`hW^L!E3ey=8P_8^b~`oBRFAEJ1gzV}WT3RTT_eSplS=b0 zNbst-BRj%jmFrG1uXR`vd<#;8pbJ}_6cslowII+&-_KTnePMGEc6hG$R9{JG>J0Nr zlO@dIy@gcBgTKL7tgS5e2l#+V-cODHhC{OLcs;R$+KD!Ct^h(A6Bb+$w3uKN@w>(R zEmFqHwZDQIcKa)VD16_aioAO))!$k3g8IlElLK}9Jv48E)^H=sVSCqL*ACoihH+%? zANfS;d=+r|Mpdo5boSj8PHTys6a}+bBj?_miod951HgY8tY3(_28hf0zo3nKGcK0g zG$x%kNcK+rIk6Aa5xtvag=D6fP~$ey&kw$h$DgQrF223LM>+HJe-_a5v$2cD59h4* z673kHweOZjR7Y>mLEHaMQa_5mHwSeERYj{nqpe@SK+dqiS_;yXrEmIi=`~8cd3@wM z<)O>t-TAq(ve0W@ikC?FztEP!6EkqOwrkFvwUptGqL#`Gr#^o^7*f31E&g277)0ym zh1XaRqeawP#E#noa-dLxr+&xRT(mka1pl74u($*C3-rKb&cX)T_uI`ot^xgF>U<9w zd4mb60C7ZJbHbpj;`8GEUR|4hJ7N-kB1N>~+CPMERXo|Du<^59pUK>g#KY+T4;z8| zRZF5kkSETvpTfcKiTi$#`8y%l1uB-9|1|O`xsn3?f3zk4#hd0oT{iogo;(}#@;dL- zT*2VwqGyJ?Io=+k^NyQ?wW9v#gnf;D^UJ;NnhVW!&QDOkigxR%&DHZgRe+n1t5<|o zb@8@yK~?=@jQxo2H3<)QMSdVK1M&;8SAQ$uOn}_M#N3?tURzt64=6`9`Mq*Ye0m7g ztZ|-nfc|($K~9)Zs3i|bvmTlo=#jFxr4doTi>6ax;=WM3RaXcPc1>Ic?p0Ir+j6U{ z>Pj&hIAH53&E|LR0HLZxPGDOYe`eI@f8zoz!I)C04Ge@&NKQ6o8lw;H+`XKfnu2Gu zqg;@FH_bZ0Z)fw^sEm9@1bP5ztH+2kA9Ln&mc?S!^!PFGcI znR5s>#lMvmhtUdR^eZ#ShqjjkGMMynTNRLs!bGJ=x9jX1#k6EVk73;7*I?`noWs(* zApGx>!t7&Yy8a4t^gVE5oLWtv14@9hJIHP<2Tt^U_MjR&6wLQm4f6&Um+-V$BI8@g zfT`Uv_3W|OD-=|~qr)v)iaH<^>Jn5l78Ao!xRX+MRG5=e+(e;6IKV#Ojg&;CpSpoj z%Os`(TNSF+U-lv_B(G#UJC2Ry+^y@w2qF>xo5kH ziOJfz`)jP@_zRyU!NvG@L`N4xUswkC71VrC$$1aS13h?VqQBaccTY(K0o?Og?;d!@ zXAc`TV3t5YuV1HbD20Remv81bBAjVY=Ca1s&8`-<;2DqpdJ2q1Jj0@Tm~mLEnmXV? zMkMU^*6}*K^g~_g2dVqE{?Ouxm#uBJStI1 zyyTo0FSg6de?LFr7Q(<62L=*jz*R}*1$JnjbKG(^h&TB!9{e<1 zHrIjO4bT}};!C!DYQhLSSVdLrIiQr0`;x4|7bA^3p8Ilrl@a*!SdY-uYjVt8iNw}@ z-q0g`eGdzIQ4TCpZCzbyY3X`T1kNYx?Q2h9|JTw~I+oarL3*8!=_x>FWh|FyFp+oz-${x?ZIO5^P6MBbtr!}GY1{8v6uOT(zZ^q1(KWpFREXWU6) z$@quoj*`iysLKSr?tHe6^glc|)_mfqKFRymJ)v*1rgr-U^nlpl#g-eMxfNo}!|fUJ z-$Ao%#arZv%#W*R9 zdZD1`N+U2hJAsEffvp{V!EB6}Wn5~{t)ZR(LA5n$t{BB`^2dQr$qx+3EbVaJw?&Ho zP}Q;4uakh%e}((S7|Q+1UyVQ$5CA`r#~A;2H{h`tww1j7kvXTW?xPW{ev{)8mWG9% zmfqJ5z;`uHLO#V3uY!lmf_``W@Ox%{(dcjd1RGy0{<`%~VPD%9YZk+<)~+RmQoA=D zsQ4F$t2@3s{$@>Ipq3@wvj3p#_xxYNiE#gxOr7(HwRI#rOinZEm&H%hjlTC0RUNr^ zI7;3R?8B*vB<4kKu4vvHH1$s(D#aXy&!%Z1ET0oM2gav!Avrlkj}6}+wweXY9jUew z-k|i}cPZxHwMgY|peCG72V*Na>Rp^6@P@;!dKotUyngk*_2s+!@OPn(hk<4$CIlig zxA)#juBhtLwVb4SpI==5?a!*4+<$VhX1-c~{X#_Xc584&nxE{Py_jluYLew` zi{u;{I|HB_9Ud6Kl$Ms>DgP@@Ei)2^E4V>1aErj>xMR^(OZ44W)X=l0(;!uE2hX zai)}G>SFvm)`x@aeO|Q0;E}Y}v~IMSPmqR_=)rh<&6YryXOinNmqkqSL)Jnp$DXA4 ziX63C7|hqx(^G7!qWK^*`4kSFFBWkZN(w~{ht^tGn;_R^?a%3kW z-(m*k!OpM@j&RStBRe*IeSZGZ$$_v_L%u408J^~imGx%)3@Kan&Rw+c$WG@pC&E5C zA~f(j1$FF`ElwZsh1f5EjW#C3}63GHXkyFe8LQvOxZI zE}@ZH4!M}@pyA13Z?rOjy51J9*nNM0->^}39~dzuip7GT>hfo;b3EoW3{2HutU}Id z7#DbK0<>Y9qobd42;?`TG1Hza2W+EjbzC96yr?%*yn5>?-|b&VkjK{aVf4$ZTuF+Z zoRS)BUu&E}txqqYm*Y;4$Bmc3eiwHt@qHgdetHAhFMNn|)Hy7K6wTW&aEsH0Uqh+d zPIhggj>2OD?`5D72GdzVBpzb1PN)P)jVzIRXLR&yL)sNhLIzd_WZ9?-i6$A` z%0OAbq-?(tN$h+^UMJ(L(Fp2qN^SrH;-XHjSk>GN>lR!=aG#p%PPAs(O)28D^E(DV zRCaXzX`p6D4{hl*#+noa))%XY*0RO>o82zp_MQ{x(bH)Y@#9R3qCr$pD+TcvyUVOs zDK#8Xz;X+IPUVv5jEJx5=pYYQ5NjRc{fwCE(KWgFy+7_7c23o~BsSCM2a64zgpCTh zNYwd;4vmgC)n7^;>9x||^bZyBrSmXg6%t+!MqMV3Rl=E#NNxQMTO58K5(|e{^g7h^ zVXZ$N>qx}0#qN+Z-oh1oe@>GE%W^(FJsDnR3?~@>lENMuqGgmb5_3pTU})m5l1ttG zO)lJZl$8~peC8cTE?s>dZvQUPeaD$T-`hw3(`Tt1icd!=!u9hNw!U;4SvDkkQZ!R( z_8v75yxcZH$1^2H5uc4iBf1mv=ED>>W-@ktk1H64|dO8NEWotkHFQIH}$aqRBo zq|`#qPLTt&UEN&QS^Vb%@~~rC&8LfQE*KJiG62Sn25pT}22g zRc9jsB#@8{s0hz@%nmTfkq=x4BWY=wk6;ha75!mr5qM6GU#PnVkq9^oWwAG#SgGh4 zkPGwctlw^RwV8C@l3|EAbeC+rc0qGfZajvQT*)5r!xl&%spVHdTChdftNX!Nj(;7) zvKRk`lAfMkN`e3nr{FMUsMZ8_b>$35uB&w=UmKNt4xi`e|A31X%J>e`v5!?(D+2kP zNtlzGNDW zpnJ(o$%K9r0|vozno_I3%sIPKqis{`o`X%zD%G3*eNnF>meS$%Ua z@`aY%6~SfRR54oRV8(gwsBbe$=PoJKeS{n3a*@W;Mp+c&Nf0vEo4tySB;lvHnzkKU znq-fht80P{nUi5D6lr3{)zyn1X6sMg~4KImBq_Cw%o()}xR2@xz$!l*R05>QIQxaxp)7Aw`!K z1gnx*BcjzQ7G0=9vF_w=^KLZF0@-9=1P|cHW(y&F;&qXdGp3YmDA;s#Tp1DZIZR#n zn*au?-a*cabpl(yxpw>rhgW<%3imd1k*QEl<n?R5Vz?=-p99#75Gn zaXPY?D`BzV1rOI-3A#(3`JqAN)N{P?p>B+&w|4EW`R6N4tLvdw3Op@G1f%%s69N@lbmJGEXG&=NJYZ+zF>1keZGSGgcA$D ztTNy?FaI5oaD-i!-t$ihjPu3l8|itZKC3wCMJn=6YW(hM70-R8_828yvFDoDei^M& zuD!#10RY_O;7G+6lWJ34t-Wn9VIL%Uzu4)-sMP9iH33U(;AOffHN%%&OH0}#1V^bN ze*U_aR}^o_OVhQ}xyc4O53;CgJq=a}lz~(O?-mop!0j5F1Wqh?*ZuIJUB* zFvkW;Gs40df>OmrwvABl&nVRSU&}^qG+aG8`Xs{Qmh@!=i4&iMFJY%j%wK~eFJlJa zwOex3?{C^xyI?+#zxaO???`TCn`d>Yx3Sk+`P3vTIj&&cOkTb8sSvI9&IPMuQs-jA zZAff1k;YT#Z}SO{f2+l2V01y2$KglmZSK?SEVu3vWTugTbg2GD9OTVO+fLeSEs>}n z=A5jVvCk=YT*r!P)Q!A-)JWV!Njt?0DGkBqYhCO2faO4 zuV8IpmCfgq3?^?g1yg-d*?Adr-}Td5@+0kUVPfjl$I}j05H>b8NVCCazGSO@$UGWR z{_`Lpw{Yqkq4OMW1m33sUGDX5$zf3BCF&yH#Pa+=>@AGZq>DxhB3|`EZD&r;OCAuQ zXYWscPfAP_laWEe#l=;QYc3)IP88o_taA8d_e*YBwor|$xHRfA@-krpCEX>)!Ig{1 z{;AZd`Q}m|J*BFQP|!YfKtogWRcEF>1i6!YP8UHG5MHI~``(u@bhy;^H0{}0kyf~M zr(I@De|3+%OpcG-m(wPhGP+mUP0ZxLr+_!yMgWU~=<|yj8u0uHIn6-P+7gU1487kY z;@Q^>@{)q-oe1~rQDx$&$vbO|`E!$F|>k}<^iVb%eQ+A8_{|g8Ls%P?5=f?evJAoeH7l0t?j|vi%Vg`Z# E2hBqr;{X5v From a415dbf31b1061a01d6f7a70f4183beb5f230e85 Mon Sep 17 00:00:00 2001 From: Seris02 Date: Fri, 31 Jan 2020 08:19:35 +0800 Subject: [PATCH 036/172] yas --- code/modules/clothing/gloves/miscellaneous.dm | 2 +- code/modules/uplink/uplink_items/uplink_clothing.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 1e58f6b0e2..9f4b89f607 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -108,7 +108,7 @@ return FALSE /obj/item/clothing/gloves/thief - name = "thief's gloves" + name = "black gloves" desc = "Gloves made with completely frictionless, insulated cloth, easier to steal from people with." icon_state = "thief" item_state = "blackgloves" diff --git a/code/modules/uplink/uplink_items/uplink_clothing.dm b/code/modules/uplink/uplink_items/uplink_clothing.dm index e8d01a5465..79272ada7b 100644 --- a/code/modules/uplink/uplink_items/uplink_clothing.dm +++ b/code/modules/uplink/uplink_items/uplink_clothing.dm @@ -80,7 +80,7 @@ exclude_modes = list() /datum/uplink_item/suits/thiefgloves - name = "Thief's Gloves" + name = "Thieving Gloves" desc = "A pair of gloves that are insulated and frictionless, allowing you to steal easily from anyone you see." item = /obj/item/clothing/gloves/thief cost = 4 \ No newline at end of file From 43c4debb4f5f8d883460640525faf2b050f415fb Mon Sep 17 00:00:00 2001 From: necromanceranne Date: Fri, 31 Jan 2020 11:54:18 +1100 Subject: [PATCH 037/172] Repaths the formal security items into armor vest subtypes and subtypes of their respective owner's armors. Probably has some really silly balance ramifications. Oh and russian officers have armor vests now I guess. Oh and the sec wardrobe no longer has the formal suits. --- code/modules/cargo/packs/security.dm | 14 +++++------ code/modules/clothing/suits/armor.dm | 25 ++++++++++++++++++- code/modules/clothing/suits/jobs.dm | 22 ---------------- code/modules/clothing/suits/miscellaneous.dm | 2 +- .../mob/living/simple_animal/corpse.dm | 4 +-- code/modules/vending/wardrobes.dm | 1 - .../code/modules/client/loadout/_security.dm | 8 +++--- 7 files changed, 38 insertions(+), 38 deletions(-) diff --git a/code/modules/cargo/packs/security.dm b/code/modules/cargo/packs/security.dm index 69967d65d1..4bbb400cd4 100644 --- a/code/modules/cargo/packs/security.dm +++ b/code/modules/cargo/packs/security.dm @@ -81,8 +81,8 @@ desc = "An old russian crate full of surplus armor that they used to use! Has two sets of bulletproff armor, a few union suits and some warm hats!" contraband = TRUE cost = 5750 // Its basicly sec suits, good boots/gloves - contains = list(/obj/item/clothing/suit/security/officer/russian, - /obj/item/clothing/suit/security/officer/russian, + contains = list(/obj/item/clothing/suit/armor/navyblue/russian, + /obj/item/clothing/suit/armor/navyblue/russian, /obj/item/clothing/shoes/combat, /obj/item/clothing/shoes/combat, /obj/item/clothing/head/ushanka, @@ -104,7 +104,7 @@ contraband = TRUE access = FALSE cost = 5500 // - contains = list(/obj/item/clothing/suit/security/officer/russian, + contains = list(/obj/item/clothing/suit/armor/navyblue/russian, /obj/item/clothing/shoes/combat, /obj/item/clothing/head/ushanka, /obj/item/clothing/suit/armor/bulletproof, @@ -141,15 +141,15 @@ cost = 3250 contains = list(/obj/item/clothing/under/rank/security/navyblue, /obj/item/clothing/under/rank/security/navyblue, - /obj/item/clothing/suit/security/officer, - /obj/item/clothing/suit/security/officer, + /obj/item/clothing/suit/armor/navyblue, + /obj/item/clothing/suit/armor/navyblue, /obj/item/clothing/head/beret/sec/navyofficer, /obj/item/clothing/head/beret/sec/navyofficer, /obj/item/clothing/under/rank/warden/navyblue, - /obj/item/clothing/suit/security/warden, + /obj/item/clothing/suit/armor/vest/warden/navyblue, /obj/item/clothing/head/beret/sec/navywarden, /obj/item/clothing/under/rank/head_of_security/navyblue, - /obj/item/clothing/suit/security/hos, + /obj/item/clothing/suit/armor/hos/navyblue, /obj/item/clothing/head/beret/sec/navyhos) crate_name = "security clothing crate" diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index e536d307ef..4591ba8b4e 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -15,6 +15,13 @@ if(!allowed) allowed = GLOB.security_vest_allowed +/obj/item/clothing/suit/armor/navyblue + name = "security officer's jacket" + desc = "This jacket is for those special occasions when a security officer isn't required to wear their armor." + icon_state = "officerbluejacket" + item_state = "officerbluejacket" + body_parts_covered = CHEST|ARMS + /obj/item/clothing/suit/armor/vest name = "armor vest" desc = "A slim Type I armored vest that provides decent protection against most types of damage." @@ -52,8 +59,17 @@ heat_protection = CHEST|GROIN|LEGS|ARMS strip_delay = 80 +/obj/item/clothing/suit/armor/hos/navyblue + name = "head of security's jacket" + desc = "This piece of clothing was specifically designed for asserting superior authority." + icon_state = "hosbluejacket" + item_state = "hosbluejacket" + body_parts_covered = CHEST|ARMS + cold_protection = CHEST|ARMS + heat_protection = CHEST|ARMS + /obj/item/clothing/suit/armor/hos/trenchcoat - name = "armored trenchoat" + name = "armored trenchcoat" desc = "A trenchcoat enhanced with a special lightweight kevlar. The epitome of tactical plainclothes." icon_state = "hostrench" item_state = "hostrench" @@ -78,6 +94,13 @@ desc = "A red jacket with silver rank pips and body armor strapped on top." icon_state = "warden_jacket" +/obj/item/clothing/suit/armor/vest/warden/navyblue + name = "warden's jacket" + desc = "Perfectly suited for the warden that wants to leave an impression of style on those who visit the brig." + icon_state = "wardenbluejacket" + item_state = "wardenbluejacket" + body_parts_covered = CHEST|ARMS + /obj/item/clothing/suit/armor/vest/leather name = "security overcoat" desc = "Lightly armored leather overcoat meant as casual wear for high-ranking officers. Bears the crest of Nanotrasen Security." diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 88bafc842b..48fd8ccf1c 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -155,28 +155,6 @@ blood_overlay_type = "armor" //it's the less thing that I can put here body_parts_covered = NONE -//Security -/obj/item/clothing/suit/security/officer - name = "security officer's jacket" - desc = "This jacket is for those special occasions when a security officer isn't required to wear their armor." - icon_state = "officerbluejacket" - item_state = "officerbluejacket" - body_parts_covered = CHEST|ARMS - -/obj/item/clothing/suit/security/warden - name = "warden's jacket" - desc = "Perfectly suited for the warden that wants to leave an impression of style on those who visit the brig." - icon_state = "wardenbluejacket" - item_state = "wardenbluejacket" - body_parts_covered = CHEST|ARMS - -/obj/item/clothing/suit/security/hos - name = "head of security's jacket" - desc = "This piece of clothing was specifically designed for asserting superior authority." - icon_state = "hosbluejacket" - item_state = "hosbluejacket" - body_parts_covered = CHEST|ARMS - //Surgeon /obj/item/clothing/suit/apron/surgical name = "surgical apron" diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 127d2e4f04..c5f99a6c53 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -317,7 +317,7 @@ flags_cover = HEADCOVERSEYES flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR -/obj/item/clothing/suit/security/officer/russian +/obj/item/clothing/suit/armor/navyblue/russian name = "\improper Russian officer's jacket" desc = "This jacket is for those special occasions when a russian officer isn't required to wear their armor." icon_state = "officertanjacket" diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm index 17d7530c29..9f3e44fee7 100644 --- a/code/modules/mob/living/simple_animal/corpse.dm +++ b/code/modules/mob/living/simple_animal/corpse.dm @@ -143,7 +143,7 @@ /datum/outfit/russiancorpse/officer name = "Russian Officer Corpse" uniform = /obj/item/clothing/under/rank/security/navyblue/russian - suit = /obj/item/clothing/suit/security/officer/russian + suit = /obj/item/clothing/suit/armor/navyblue/russian shoes = /obj/item/clothing/shoes/combat ears = /obj/item/radio/headset head = /obj/item/clothing/head/ushanka @@ -207,7 +207,7 @@ /obj/effect/mob_spawn/human/corpse/bee_terrorist name = "BLF Operative" outfit = /datum/outfit/bee_terrorist - + /datum/outfit/bee_terrorist name = "BLF Operative" uniform = /obj/item/clothing/under/color/yellow diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index cd643e4220..0a3ded63bd 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -20,7 +20,6 @@ /obj/item/clothing/under/rank/security/grey = 5, /obj/item/clothing/under/pants/khaki = 5) premium = list(/obj/item/clothing/under/rank/security/navyblue = 5, - /obj/item/clothing/suit/security/officer = 5, /obj/item/clothing/head/beret/sec/navyofficer = 5) refill_canister = /obj/item/vending_refill/wardrobe/sec_wardrobe diff --git a/modular_citadel/code/modules/client/loadout/_security.dm b/modular_citadel/code/modules/client/loadout/_security.dm index 7a49b1f049..c9591540e6 100644 --- a/modular_citadel/code/modules/client/loadout/_security.dm +++ b/modular_citadel/code/modules/client/loadout/_security.dm @@ -5,7 +5,7 @@ restricted_roles = list("Head of Security") /datum/gear/navybluehosberet - name = "Head of security's Naviblue beret" + name = "Head of security's navyblue beret" category = SLOT_HEAD path = /obj/item/clothing/head/beret/sec/navyhos restricted_roles = list("Head of Security") @@ -13,13 +13,13 @@ /datum/gear/navybluejackethos name = "head of security's navyblue jacket" category = SLOT_WEAR_SUIT - path = /obj/item/clothing/suit/security/hos + path = /obj/item/clothing/suit/armor/hos/navyblue restricted_roles = list("Head of Security") /datum/gear/navybluejacketofficer name = "security officer's navyblue jacket" category = SLOT_WEAR_SUIT - path = /obj/item/clothing/suit/security/officer + path = /obj/item/clothing/suit/armor/navyblue restricted_roles = list("Security Officer") /datum/gear/navyblueofficerberet @@ -37,7 +37,7 @@ /datum/gear/navybluejacketwarden name = "warden navyblue jacket" category = SLOT_WEAR_SUIT - path = /obj/item/clothing/suit/security/warden + path = /obj/item/clothing/suit/armor/vest/warden/navyblue restricted_roles = list("Warden") /datum/gear/navybluewardenberet From 29e0ac52c43bc5f8ff51506f9f09dfc6abb0470f Mon Sep 17 00:00:00 2001 From: Putnam Date: Fri, 31 Jan 2020 11:52:05 -0800 Subject: [PATCH 038/172] fuzzy objectives --- code/__HELPERS/roundend.dm | 9 +++++++- code/game/gamemodes/objective_sabotage.dm | 21 ++++++++++--------- .../modules/antagonists/_common/antag_team.dm | 7 +++++-- code/modules/antagonists/brother/brother.dm | 7 +++++-- .../antagonists/changeling/changeling.dm | 11 +++++++--- code/modules/antagonists/cult/cult.dm | 9 +++++--- .../antagonists/disease/disease_datum.dm | 11 ++++++---- .../antagonists/traitor/datum_traitor.dm | 11 ++++++---- code/modules/antagonists/wizard/wizard.dm | 11 ++++++---- interface/stylesheet.dm | 1 + 10 files changed, 65 insertions(+), 33 deletions(-) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 5102eb4802..906f60d65b 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -111,7 +111,14 @@ if(A.objectives.len) for(var/datum/objective/O in A.objectives) - var/result = O.check_completion() ? "SUCCESS" : "FAIL" + var/result = "UNKNOWN" + var/actual_result = O.check_completion() + if(actual_result >= 1) + result = "SUCCESS" + else if(actual_result <= 0) + result = "FAIL" + else + result = "[actual_result*100]%" antag_info["objectives"] += list(list("objective_type"=O.type,"text"=O.explanation_text,"result"=result)) SSblackbox.record_feedback("associative", "antagonists", 1, antag_info) diff --git a/code/game/gamemodes/objective_sabotage.dm b/code/game/gamemodes/objective_sabotage.dm index 0ede317626..467983a346 100644 --- a/code/game/gamemodes/objective_sabotage.dm +++ b/code/game/gamemodes/objective_sabotage.dm @@ -20,13 +20,16 @@ START_PROCESSING(SSprocessing, src) /datum/sabotage_objective/processing/proc/check_condition_processing() - return TRUE + return 100 /datum/sabotage_objective/processing/process() - won = check_condition_processing() - if(won) + check_condition_processing() + if(won >= 100) STOP_PROCESSING(SSprocessing,src) +/datum/sabotage_objective/processing/check_conditions() + return won + /datum/sabotage_objective/processing/power_sink name = "Drain at least 1 gigajoule of power using a power sink." sabotage_type = "powersink" @@ -41,8 +44,7 @@ for(var/datum/powernet/PN in GLOB.powernets) for(var/obj/item/powersink/sink in PN.nodes) sink_found_this_time = TRUE - if(sink.power_drained>1e9) - return TRUE + won = max(won,sink.power_drained/1e9) sink_found = sink_found_this_time count = 0 return FALSE @@ -59,7 +61,7 @@ " /datum/sabotage_objective/processing/supermatter - name = "Sabotage the supermatter so that it goes under 50% integrity." + name = "Sabotage the supermatter so that it goes under 50% integrity. If it is delaminated, you will fail." sabotage_type = "supermatter" special_equipment = list(/obj/item/paper/guides/antag/supermatter_sabotage) var/list/supermatters = list() @@ -73,9 +75,8 @@ if (!isturf(S.loc) || !(is_station_level(S.z) || is_mining_level(S.z))) continue supermatters.Add(S) - for(var/obj/machinery/power/supermatter_crystal/S in supermatters) - if(S.get_integrity() < 50) - return TRUE + for(var/obj/machinery/power/supermatter_crystal/S in supermatters) // you can win this with a wishgranter... lol. + won = max(1-((S.get_integrity()-50)/50),won) return FALSE /datum/sabotage_objective/station_integrity @@ -83,7 +84,7 @@ sabotage_type = "integrity" /datum/sabotage_objective/station_integrity/check_conditions() - return SSticker.station_integrity < 80 + return 100/(100-max(SSticker.station_integrity,80)) /datum/sabotage_objective/cloner name = "Destroy all Nanotrasen cloning machines." diff --git a/code/modules/antagonists/_common/antag_team.dm b/code/modules/antagonists/_common/antag_team.dm index b376287f7a..027abc7c94 100644 --- a/code/modules/antagonists/_common/antag_team.dm +++ b/code/modules/antagonists/_common/antag_team.dm @@ -37,11 +37,14 @@ var/objective_count = 1 for(var/datum/objective/objective in objectives) if(objective.completable) - if(objective.check_completion()) + var/completion = objective.check_completion() + if(completion >= 1) report += "Objective #[objective_count]: [objective.explanation_text] Success!" - else + else if(completion <= 0) report += "Objective #[objective_count]: [objective.explanation_text] Fail." win = FALSE + else + report += "Objective #[objective_count]: [objective.explanation_text] [completion*100]%" else report += "Objective #[objective_count]: [objective.explanation_text]" objective_count++ diff --git a/code/modules/antagonists/brother/brother.dm b/code/modules/antagonists/brother/brother.dm index 22a343fb5f..2292006da1 100644 --- a/code/modules/antagonists/brother/brother.dm +++ b/code/modules/antagonists/brother/brother.dm @@ -109,11 +109,14 @@ var/objective_count = 1 for(var/datum/objective/objective in objectives) if(objective.completable) - if(objective.check_completion()) + var/completion = objective.check_completion() + if(completion >= 1) parts += "Objective #[objective_count]: [objective.explanation_text] Success!" - else + else if(completion <= 0) parts += "Objective #[objective_count]: [objective.explanation_text] Fail." win = FALSE + else + parts += "Objective #[objective_count]: [objective.explanation_text] [completion*100]%" else parts += "Objective #[objective_count]: [objective.explanation_text]" objective_count++ diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index 7d702ac25d..a81c409233 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -54,8 +54,10 @@ var/honorific if(owner.current.gender == FEMALE) honorific = "Ms." - else + else if(owner.current.gender == MALE) honorific = "Mr." + else + honorific = "Mx." if(GLOB.possible_changeling_IDs.len) changelingID = pick(GLOB.possible_changeling_IDs) GLOB.possible_changeling_IDs -= changelingID @@ -553,11 +555,14 @@ var/count = 1 for(var/datum/objective/objective in objectives) if(objective.completable) - if(objective.check_completion()) + var/completion = objective.check_completion() + if(completion >= 1) parts += "Objective #[count]: [objective.explanation_text] Success!" - else + else if(completion <= 0) parts += "Objective #[count]: [objective.explanation_text] Fail." changelingwin = FALSE + else + parts += "Objective #[count]: [objective.explanation_text] [completion*100]%" else parts += "Objective #[count]: [objective.explanation_text]" count++ diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm index df2383f892..6f9cf78514 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -425,10 +425,13 @@ parts += "The cultists' objectives were:" var/count = 1 for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - parts += "Objective #[count]: [objective.explanation_text] Success!" + var/completion = objective.check_completion() + if(completion >= 1) + parts += "Objective #[count]: [objective.explanation_text] Success!" + else if(completion <= 0) + parts += "Objective #[count]: [objective.explanation_text] Fail." else - parts += "Objective #[count]: [objective.explanation_text] Fail." + parts += "Objective #[count]: [objective.explanation_text] [completion*100]%" count++ if(members.len) diff --git a/code/modules/antagonists/disease/disease_datum.dm b/code/modules/antagonists/disease/disease_datum.dm index 1aef9ceba6..3d3de3bab2 100644 --- a/code/modules/antagonists/disease/disease_datum.dm +++ b/code/modules/antagonists/disease/disease_datum.dm @@ -44,11 +44,14 @@ var/objectives_text = "" var/count = 1 for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - objectives_text += "
Objective #[count]: [objective.explanation_text] Success!" - else - objectives_text += "
Objective #[count]: [objective.explanation_text] Fail." + var/completion = objective.check_completion() + if(completion >= 1) + result += "Objective #[count]: [objective.explanation_text] Success!" + else if(completion <= 0) + result += "Objective #[count]: [objective.explanation_text] Fail." win = FALSE + else + result += "Objective #[count]: [objective.explanation_text] [completion*100]%" count++ result += objectives_text diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 3385991116..01d3dd5694 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -384,11 +384,14 @@ var/count = 1 for(var/datum/objective/objective in objectives) if(objective.completable) - if(objective.check_completion()) - objectives_text += "Objective #[count]: [objective.explanation_text] Success!" - else - objectives_text += "Objective #[count]: [objective.explanation_text] Fail." + var/completion = objective.check_completion() + if(completion >= 1) + result += "Objective #[count]: [objective.explanation_text] Success!" + else if(completion <= 0) + result += "Objective #[count]: [objective.explanation_text] Fail." traitorwin = FALSE + else + result += "Objective #[count]: [objective.explanation_text] [completion*100]%" else objectives_text += "Objective #[count]: [objective.explanation_text]" count++ diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index cc3cde79e4..3fd0d3263c 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -266,11 +266,14 @@ var/count = 1 var/wizardwin = 1 for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - parts += "Objective #[count]: [objective.explanation_text] Success!" - else + var/completion = objective.check_completion() + if(completion >= 1) + parts += "Objective #[count]: [objective.explanation_text] Success!" + else if(completion <= 0) parts += "Objective #[count]: [objective.explanation_text] Fail." - wizardwin = 0 + wizardwin = FALSE + else + parts += "Objective #[count]: [objective.explanation_text] [completion*100]%" count++ if(wizardwin) diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index 6ee9e6e824..9f3d8911ec 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -151,6 +151,7 @@ h1.alert, h2.alert {color: #000000;} .extremelybig {font-size: 5;} .greentext {color: #00FF00; font-size: 3;} .redtext {color: #FF0000; font-size: 3;} +.yellowtext {color: #FFCC00; font-size: 3;} .clown {color: #FF69Bf; font-size: 3; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} .spooky {color: #FF9100;} From 809f57a15d37fe2fb894214ea6b44d499f96c864 Mon Sep 17 00:00:00 2001 From: Putnam Date: Fri, 31 Jan 2020 12:25:19 -0800 Subject: [PATCH 039/172] also added kill-once objectives --- code/datums/mind.dm | 1 + code/game/gamemodes/objective.dm | 24 +++++++++++++++++++ code/modules/antagonists/ninja/ninja.dm | 4 ++-- .../antagonists/traitor/datum_traitor.dm | 13 ++++++---- 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 464ea37d02..628e698ae0 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -458,6 +458,7 @@ var/list/allowed_types = list( /datum/objective/assassinate, + /datum/objective/assassinate/once, /datum/objective/maroon, /datum/objective/debrain, /datum/objective/protect, diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index a9c9e227df..d7ee749f34 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -173,6 +173,30 @@ GLOBAL_LIST_EMPTY(objectives) /datum/objective/assassinate/admin_edit(mob/admin) admin_simple_target_pick(admin) +/datum/objective/assassinate/once + name = "kill once" + var/won = FALSE + +/datum/objective/assassinate/once/update_explanation_text() + ..() + if(target && target.current) + explanation_text = "Kill [target.name], the [!target_role_type ? target.assigned_role : target.special_role]. You only need to kill [target.p_them()] once; if they come back, you've still succeeded." + else + explanation_text = "Free Objective" + +/datum/objective/assassinate/once/find_target_by_role() + . = ..() + if(.) + START_PROCESSING(SSprocessing,src) + +/datum/objective/assassinate/once/check_completion() + return won || ..() + +/datum/objective/assassinate/once/process() + won = check_completion() + if(won) + STOP_PROCESSING(SSprocessing,src) + /datum/objective/assassinate/internal var/stolen = 0 //Have we already eliminated this target? diff --git a/code/modules/antagonists/ninja/ninja.dm b/code/modules/antagonists/ninja/ninja.dm index fe83e2fb2b..42412709fa 100644 --- a/code/modules/antagonists/ninja/ninja.dm +++ b/code/modules/antagonists/ninja/ninja.dm @@ -62,10 +62,10 @@ possible_targets.Cut(index,index+1) if(is_bad_guy ^ helping_station) //kill (good-ninja + bad-guy or bad-ninja + good-guy) - var/datum/objective/assassinate/O = new /datum/objective/assassinate() + var/datum/objective/assassinate/once/O = new /datum/objective/assassinate() O.owner = owner O.target = M - O.explanation_text = "Slay \the [M.current.real_name], the [M.assigned_role]." + O.explanation_text = "Slay \the [M.current.real_name], the [M.assigned_role]. You may let [M.p_they()] live, if they come back from death." objectives += O else //protect var/datum/objective/protect/O = new /datum/objective/protect() diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 01d3dd5694..f584b6c149 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -191,28 +191,33 @@ maroon_objective.owner = owner maroon_objective.find_target() add_objective(maroon_objective) - else + else if(prob(30)) var/datum/objective/assassinate/kill_objective = new kill_objective.owner = owner kill_objective.find_target() add_objective(kill_objective) + else + var/datum/objective/assassinate/once/kill_objective = new + kill_objective.owner = owner + kill_objective.find_target() + add_objective(kill_objective) else if(prob(15) && !(locate(/datum/objective/download) in objectives) && !(owner.assigned_role in list("Research Director", "Scientist", "Roboticist"))) var/datum/objective/download/download_objective = new download_objective.owner = owner download_objective.gen_amount_goal() add_objective(download_objective) - else if(prob(40)) + else if(prob(33)) // cum. not counting download: 33%. yes, i do know 33/33 won't be equal and that i want 33/50 for that var/datum/objective/steal/steal_objective = new steal_objective.owner = owner steal_objective.find_target() add_objective(steal_objective) - else if(prob(40)) + else if(prob(33)) // cum. not counting download: 22.11% var/datum/objective/sabotage/sabotage_objective = new sabotage_objective.owner = owner sabotage_objective.find_target() add_objective(sabotage_objective) - else + else // cum. not counting download: 44.89% var/datum/objective/flavor/traitor/flavor_objective = new flavor_objective.owner = owner flavor_objective.forge_objective() From 425f532f767bff16d66a986dea91e05ea8f0e93b Mon Sep 17 00:00:00 2001 From: Putnam Date: Fri, 31 Jan 2020 13:12:50 -0800 Subject: [PATCH 040/172] WHOOPS --- code/game/gamemodes/objective.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index d7ee749f34..1fdb621866 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -184,7 +184,7 @@ GLOBAL_LIST_EMPTY(objectives) else explanation_text = "Free Objective" -/datum/objective/assassinate/once/find_target_by_role() +/datum/objective/assassinate/once/find_target_by_role(role, role_type=0, invert=0) . = ..() if(.) START_PROCESSING(SSprocessing,src) From 3d9e84a3f8a9c5cfe1c160e17bf3be0ee7ef1901 Mon Sep 17 00:00:00 2001 From: Putnam Date: Sat, 1 Feb 2020 00:23:45 -0800 Subject: [PATCH 041/172] Tweaks and fixes --- code/__HELPERS/roundend.dm | 12 +++++++++--- code/game/gamemodes/objective_sabotage.dm | 2 +- code/modules/antagonists/cult/cult.dm | 15 +++++++++------ .../antagonists/disease/disease_datum.dm | 17 ++++++++++------- code/modules/antagonists/wizard/wizard.dm | 17 ++++++++++------- 5 files changed, 39 insertions(+), 24 deletions(-) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 906f60d65b..535f1154e7 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -557,10 +557,16 @@ var/list/objective_parts = list() var/count = 1 for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - objective_parts += "Objective #[count]: [objective.explanation_text] Success!" + if(objective.completable) + var/completion = objective.check_completion() + if(completion >= 1) + objective_parts += "Objective #[count]: [objective.explanation_text] Success!" + else if(completion <= 0) + objective_parts += "Objective #[count]: [objective.explanation_text] Fail." + else + objective_parts += "Objective #[count]: [objective.explanation_text] [completion*100]%" else - objective_parts += "Objective #[count]: [objective.explanation_text] Fail." + objective_parts += "Objective #[count]: [objective.explanation_text]" count++ return objective_parts.Join("
") diff --git a/code/game/gamemodes/objective_sabotage.dm b/code/game/gamemodes/objective_sabotage.dm index 467983a346..248524f1d2 100644 --- a/code/game/gamemodes/objective_sabotage.dm +++ b/code/game/gamemodes/objective_sabotage.dm @@ -84,7 +84,7 @@ sabotage_type = "integrity" /datum/sabotage_objective/station_integrity/check_conditions() - return 100/(100-max(SSticker.station_integrity,80)) + return 5-(max(SSticker.station_integrity*4,320)/80) /datum/sabotage_objective/cloner name = "Destroy all Nanotrasen cloning machines." diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm index 6f9cf78514..2b6c24f8dc 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -425,13 +425,16 @@ parts += "The cultists' objectives were:" var/count = 1 for(var/datum/objective/objective in objectives) - var/completion = objective.check_completion() - if(completion >= 1) - parts += "Objective #[count]: [objective.explanation_text] Success!" - else if(completion <= 0) - parts += "Objective #[count]: [objective.explanation_text] Fail." + if(objective.completable) + var/completion = objective.check_completion() + if(completion >= 1) + parts += "Objective #[count]: [objective.explanation_text] Success!" + else if(completion <= 0) + parts += "Objective #[count]: [objective.explanation_text] Fail." + else + parts += "Objective #[count]: [objective.explanation_text] [completion*100]%" else - parts += "Objective #[count]: [objective.explanation_text] [completion*100]%" + parts += "Objective #[count]: [objective.explanation_text]" count++ if(members.len) diff --git a/code/modules/antagonists/disease/disease_datum.dm b/code/modules/antagonists/disease/disease_datum.dm index 3d3de3bab2..3c7de589d9 100644 --- a/code/modules/antagonists/disease/disease_datum.dm +++ b/code/modules/antagonists/disease/disease_datum.dm @@ -44,14 +44,17 @@ var/objectives_text = "" var/count = 1 for(var/datum/objective/objective in objectives) - var/completion = objective.check_completion() - if(completion >= 1) - result += "Objective #[count]: [objective.explanation_text] Success!" - else if(completion <= 0) - result += "Objective #[count]: [objective.explanation_text] Fail." - win = FALSE + if(objective.completable) + var/completion = objective.check_completion() + if(completion >= 1) + result += "Objective #[count]: [objective.explanation_text] Success!" + else if(completion <= 0) + result += "Objective #[count]: [objective.explanation_text] Fail." + win = FALSE + else + result += "Objective #[count]: [objective.explanation_text] [completion*100]%" else - result += "Objective #[count]: [objective.explanation_text] [completion*100]%" + result += "Objective #[count]: [objective.explanation_text]" count++ result += objectives_text diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index 3fd0d3263c..c5e365d4eb 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -266,14 +266,17 @@ var/count = 1 var/wizardwin = 1 for(var/datum/objective/objective in objectives) - var/completion = objective.check_completion() - if(completion >= 1) - parts += "Objective #[count]: [objective.explanation_text] Success!" - else if(completion <= 0) - parts += "Objective #[count]: [objective.explanation_text] Fail." - wizardwin = FALSE + if(objective.completable) + var/completion = objective.check_completion() + if(completion >= 1) + parts += "Objective #[count]: [objective.explanation_text] Success!" + else if(completion <= 0) + parts += "Objective #[count]: [objective.explanation_text] Fail." + wizardwin = FALSE + else + parts += "Objective #[count]: [objective.explanation_text] [completion*100]%" else - parts += "Objective #[count]: [objective.explanation_text] [completion*100]%" + parts += "Objective #[count]: [objective.explanation_text]" count++ if(wizardwin) From 847e6382c0b53f958dc10bc723b3073384079a0f Mon Sep 17 00:00:00 2001 From: Putnam Date: Sat, 1 Feb 2020 00:32:08 -0800 Subject: [PATCH 042/172] fixes some quirk stuff --- code/controllers/subsystem/processing/quirks.dm | 6 +++--- code/modules/antagonists/_common/antag_datum.dm | 12 ++++++------ code/modules/antagonists/survivalist/survivalist.dm | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index a52bcf4607..10655981e5 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -35,7 +35,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) var/list/my_quirks = cli.prefs.all_quirks.Copy() var/list/cut if(job?.blacklisted_quirks) - cut = filter_quirks(my_quirks, job) + cut = filter_quirks(my_quirks, job.blacklisted_quirks) for(var/V in my_quirks) var/datum/quirk/Q = quirks[V] if(Q) @@ -63,11 +63,11 @@ PROCESSING_SUBSYSTEM_DEF(quirks) for(var/i in quirk_names) . += quirk_points_by_name(i) -/datum/controller/subsystem/processing/quirks/proc/filter_quirks(list/our_quirks, datum/job/job) +/datum/controller/subsystem/processing/quirks/proc/filter_quirks(list/our_quirks, list/blacklisted_quirks) var/list/cut = list() var/list/banned_names = list() var/pointscut = 0 - for(var/i in job.blacklisted_quirks) + for(var/i in blacklisted_quirks) var/name = quirk_name_by_path(i) if(name) banned_names += name diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index eafe4f4ec7..5921b465e2 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -20,7 +20,7 @@ GLOBAL_LIST_EMPTY(antagonists) var/show_in_antagpanel = TRUE //This will hide adding this antag type in antag panel, use only for internal subtypes that shouldn't be added directly but still show if possessed by mind var/antagpanel_category = "Uncategorized" //Antagpanel will display these together, REQUIRED var/show_name_in_check_antagonists = FALSE //Will append antagonist name in admin listings - use for categories that share more than one antag type - var/list/blacklisted_quirks = list("Pacifist","Mute") // Quirks that will be removed upon gaining this antag. Pacifist and mute are default. + var/list/blacklisted_quirks = list(/datum/quirk/nonviolent,/datum/quirk/mute) // Quirks that will be removed upon gaining this antag. Pacifist and mute are default. /datum/antagonist/New() GLOB.antagonists += src @@ -122,12 +122,12 @@ GLOBAL_LIST_EMPTY(antagonists) /datum/antagonist/proc/remove_blacklisted_quirks() var/mob/living/L = owner if(istype(L)) - for(var/q in L.roundstart_quirks) + var/list/cut = list() + cut = SSquirks.filter_quirks(L.roundstart_quirks,blacklisted_quirks) + for(var/q in cut) var/datum/quirk/Q = q - if(Q.name in blacklisted_quirks) - if(Q.antag_removal_text) - to_chat(L, "[Q.antag_removal_text]") - L.remove_quirk(Q.type) + if(Q.antag_removal_text) + to_chat(L, "[Q.antag_removal_text]") //Returns the team antagonist belongs to if any. /datum/antagonist/proc/get_team() diff --git a/code/modules/antagonists/survivalist/survivalist.dm b/code/modules/antagonists/survivalist/survivalist.dm index 1b870ec389..0b66e8cb23 100644 --- a/code/modules/antagonists/survivalist/survivalist.dm +++ b/code/modules/antagonists/survivalist/survivalist.dm @@ -2,7 +2,7 @@ name = "Survivalist" show_in_antagpanel = FALSE show_name_in_check_antagonists = TRUE - blacklisted_quirks = list("Pacifist") // mutes are allowed + blacklisted_quirks = list(/datum/quirk/nonviolent) // mutes are allowed var/greet_message = "" /datum/antagonist/survivalist/proc/forge_objectives() From 7e3ea27ff46e0e51c09194ace0a106509a1590d8 Mon Sep 17 00:00:00 2001 From: Putnam Date: Sat, 1 Feb 2020 00:42:25 -0800 Subject: [PATCH 043/172] dumb formatting. dumb dumb. --- code/modules/antagonists/traitor/datum_traitor.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index f584b6c149..830555e9a2 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -207,17 +207,17 @@ download_objective.owner = owner download_objective.gen_amount_goal() add_objective(download_objective) - else if(prob(33)) // cum. not counting download: 33%. yes, i do know 33/33 won't be equal and that i want 33/50 for that + else if(prob(40)) // cum. not counting download: 40%. var/datum/objective/steal/steal_objective = new steal_objective.owner = owner steal_objective.find_target() add_objective(steal_objective) - else if(prob(33)) // cum. not counting download: 22.11% + else if(prob(100/3)) // cum. not counting download: 20%. var/datum/objective/sabotage/sabotage_objective = new sabotage_objective.owner = owner sabotage_objective.find_target() add_objective(sabotage_objective) - else // cum. not counting download: 44.89% + else // cum. not counting download: 40% var/datum/objective/flavor/traitor/flavor_objective = new flavor_objective.owner = owner flavor_objective.forge_objective() @@ -391,12 +391,12 @@ if(objective.completable) var/completion = objective.check_completion() if(completion >= 1) - result += "Objective #[count]: [objective.explanation_text] Success!" + objectives_text += "Objective #[count]: [objective.explanation_text] Success!" else if(completion <= 0) - result += "Objective #[count]: [objective.explanation_text] Fail." + objectives_text += "Objective #[count]: [objective.explanation_text] Fail." traitorwin = FALSE else - result += "Objective #[count]: [objective.explanation_text] [completion*100]%" + objectives_text += "Objective #[count]: [objective.explanation_text] [completion*100]%" else objectives_text += "Objective #[count]: [objective.explanation_text]" count++ From 50a53c6558f156de3bd827bb05e190928425826a Mon Sep 17 00:00:00 2001 From: Putnam Date: Sat, 1 Feb 2020 00:47:44 -0800 Subject: [PATCH 044/172] aaand a formatting oddity --- code/game/gamemodes/objective.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 1fdb621866..db6d0a6672 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -180,7 +180,7 @@ GLOBAL_LIST_EMPTY(objectives) /datum/objective/assassinate/once/update_explanation_text() ..() if(target && target.current) - explanation_text = "Kill [target.name], the [!target_role_type ? target.assigned_role : target.special_role]. You only need to kill [target.p_them()] once; if they come back, you've still succeeded." + explanation_text = "Kill [target.name], the [!target_role_type ? target.assigned_role : target.special_role]. You only need to kill them once; if they come back, you've still succeeded." else explanation_text = "Free Objective" From d6d01d848cd6c6e78f40698d3e85fafe473c3bf8 Mon Sep 17 00:00:00 2001 From: Putnam Date: Sat, 1 Feb 2020 06:01:54 -0800 Subject: [PATCH 045/172] --- code/__HELPERS/roundend.dm | 2 +- code/datums/mind.dm | 8 ++++---- code/game/gamemodes/objective.dm | 3 +++ code/modules/antagonists/_common/antag_team.dm | 2 +- code/modules/antagonists/bloodsucker/datum_bloodsucker.dm | 2 +- code/modules/antagonists/brother/brother.dm | 2 +- code/modules/antagonists/changeling/changeling.dm | 2 +- code/modules/antagonists/cult/cult.dm | 2 +- code/modules/antagonists/disease/disease_datum.dm | 2 +- code/modules/antagonists/traitor/datum_traitor.dm | 2 +- code/modules/antagonists/wizard/wizard.dm | 2 +- 11 files changed, 16 insertions(+), 13 deletions(-) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 535f1154e7..c42d60c88f 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -566,7 +566,7 @@ else objective_parts += "Objective #[count]: [objective.explanation_text] [completion*100]%" else - objective_parts += "Objective #[count]: [objective.explanation_text]" + objective_parts += "Objective #[count]: [objective.explanation_text]" count++ return objective_parts.Join("
") diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 628e698ae0..aa1a2ed55f 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -374,7 +374,7 @@ output += "Objectives:" var/obj_count = 1 for(var/datum/objective/objective in all_objectives) - output += "
Objective #[obj_count++]: [objective.explanation_text]" + output += "
Objective #[obj_count++]: [objective.explanation_text]" var/list/datum/mind/other_owners = objective.get_owners() - src if(other_owners.len) output += "
    " @@ -523,8 +523,8 @@ to_chat(usr,"Invalid objective.") return qdel(objective) //TODO: Needs cleaning objective destroys (whatever that means) - message_admins("[key_name_admin(usr)] removed an objective for [current]: [objective.explanation_text]") - log_admin("[key_name(usr)] removed an objective for [current]: [objective.explanation_text]") + message_admins("[key_name_admin(usr)] removed an objective for [current]: [objective.explanation_text]") + log_admin("[key_name(usr)] removed an objective for [current]: [objective.explanation_text]") else if(href_list["obj_completed"]) var/datum/objective/objective @@ -537,7 +537,7 @@ to_chat(usr,"Invalid objective.") return objective.completed = !objective.completed - log_admin("[key_name(usr)] toggled the win state for [current]'s objective: [objective.explanation_text]") + log_admin("[key_name(usr)] toggled the win state for [current]'s objective: [objective.explanation_text]") else if (href_list["silicon"]) switch(href_list["silicon"]) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index db6d0a6672..c044680302 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -1157,3 +1157,6 @@ GLOBAL_LIST_EMPTY(possible_sabotages) /datum/objective/flavor/wizard flavor_file = "strings/flavor_objectives/wizard.txt" + +/datum/objective/flavor/bloodsucker + flavor_file = "strings/flavor_objectives/bloodsucker.txt" diff --git a/code/modules/antagonists/_common/antag_team.dm b/code/modules/antagonists/_common/antag_team.dm index 027abc7c94..958a50460c 100644 --- a/code/modules/antagonists/_common/antag_team.dm +++ b/code/modules/antagonists/_common/antag_team.dm @@ -46,7 +46,7 @@ else report += "Objective #[objective_count]: [objective.explanation_text] [completion*100]%" else - report += "Objective #[objective_count]: [objective.explanation_text]" + report += "Objective #[objective_count]: [objective.explanation_text]" objective_count++ if(win) report += "The [name] was successful!" diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index 844b523135..a768978583 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -372,7 +372,7 @@ datum/antagonist/bloodsucker/proc/SpendRank() protege_objective.generate_objective() add_objective(protege_objective) - if (rand(0,1) == 0) + if (prob(50)) // Heart Thief Objective var/datum/objective/bloodsucker/heartthief/heartthief_objective = new heartthief_objective.owner = owner diff --git a/code/modules/antagonists/brother/brother.dm b/code/modules/antagonists/brother/brother.dm index 2292006da1..7d2bd45827 100644 --- a/code/modules/antagonists/brother/brother.dm +++ b/code/modules/antagonists/brother/brother.dm @@ -118,7 +118,7 @@ else parts += "Objective #[objective_count]: [objective.explanation_text] [completion*100]%" else - parts += "Objective #[objective_count]: [objective.explanation_text]" + parts += "Objective #[objective_count]: [objective.explanation_text]" objective_count++ if(win) parts += "The blood brothers were successful!" diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index a81c409233..7afe336319 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -564,7 +564,7 @@ else parts += "Objective #[count]: [objective.explanation_text] [completion*100]%" else - parts += "Objective #[count]: [objective.explanation_text]" + parts += "Objective #[count]: [objective.explanation_text]" count++ if(changelingwin) diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm index 2b6c24f8dc..278746db5a 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -434,7 +434,7 @@ else parts += "Objective #[count]: [objective.explanation_text] [completion*100]%" else - parts += "Objective #[count]: [objective.explanation_text]" + parts += "Objective #[count]: [objective.explanation_text]" count++ if(members.len) diff --git a/code/modules/antagonists/disease/disease_datum.dm b/code/modules/antagonists/disease/disease_datum.dm index 3c7de589d9..b118aeb308 100644 --- a/code/modules/antagonists/disease/disease_datum.dm +++ b/code/modules/antagonists/disease/disease_datum.dm @@ -54,7 +54,7 @@ else result += "Objective #[count]: [objective.explanation_text] [completion*100]%" else - result += "Objective #[count]: [objective.explanation_text]" + result += "Objective #[count]: [objective.explanation_text]" count++ result += objectives_text diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 830555e9a2..480264297e 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -398,7 +398,7 @@ else objectives_text += "Objective #[count]: [objective.explanation_text] [completion*100]%" else - objectives_text += "Objective #[count]: [objective.explanation_text]" + objectives_text += "Objective #[count]: [objective.explanation_text]" count++ if(uplink_true) diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index c5e365d4eb..42b09abf38 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -276,7 +276,7 @@ else parts += "Objective #[count]: [objective.explanation_text] [completion*100]%" else - parts += "Objective #[count]: [objective.explanation_text]" + parts += "Objective #[count]: [objective.explanation_text]" count++ if(wizardwin) From e812844c704606c69d4480e760a70f72753f0b3e Mon Sep 17 00:00:00 2001 From: Putnam Date: Sat, 1 Feb 2020 21:05:27 -0800 Subject: [PATCH 046/172] Revert "" This reverts commit d6d01d848cd6c6e78f40698d3e85fafe473c3bf8. --- code/__HELPERS/roundend.dm | 2 +- code/datums/mind.dm | 8 ++++---- code/game/gamemodes/objective.dm | 3 --- code/modules/antagonists/_common/antag_team.dm | 2 +- code/modules/antagonists/bloodsucker/datum_bloodsucker.dm | 2 +- code/modules/antagonists/brother/brother.dm | 2 +- code/modules/antagonists/changeling/changeling.dm | 2 +- code/modules/antagonists/cult/cult.dm | 2 +- code/modules/antagonists/disease/disease_datum.dm | 2 +- code/modules/antagonists/traitor/datum_traitor.dm | 2 +- code/modules/antagonists/wizard/wizard.dm | 2 +- 11 files changed, 13 insertions(+), 16 deletions(-) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index c42d60c88f..535f1154e7 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -566,7 +566,7 @@ else objective_parts += "Objective #[count]: [objective.explanation_text] [completion*100]%" else - objective_parts += "Objective #[count]: [objective.explanation_text]" + objective_parts += "Objective #[count]: [objective.explanation_text]" count++ return objective_parts.Join("
    ") diff --git a/code/datums/mind.dm b/code/datums/mind.dm index aa1a2ed55f..628e698ae0 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -374,7 +374,7 @@ output += "Objectives:" var/obj_count = 1 for(var/datum/objective/objective in all_objectives) - output += "
    Objective #[obj_count++]: [objective.explanation_text]" + output += "
    Objective #[obj_count++]: [objective.explanation_text]" var/list/datum/mind/other_owners = objective.get_owners() - src if(other_owners.len) output += "
      " @@ -523,8 +523,8 @@ to_chat(usr,"Invalid objective.") return qdel(objective) //TODO: Needs cleaning objective destroys (whatever that means) - message_admins("[key_name_admin(usr)] removed an objective for [current]: [objective.explanation_text]") - log_admin("[key_name(usr)] removed an objective for [current]: [objective.explanation_text]") + message_admins("[key_name_admin(usr)] removed an objective for [current]: [objective.explanation_text]") + log_admin("[key_name(usr)] removed an objective for [current]: [objective.explanation_text]") else if(href_list["obj_completed"]) var/datum/objective/objective @@ -537,7 +537,7 @@ to_chat(usr,"Invalid objective.") return objective.completed = !objective.completed - log_admin("[key_name(usr)] toggled the win state for [current]'s objective: [objective.explanation_text]") + log_admin("[key_name(usr)] toggled the win state for [current]'s objective: [objective.explanation_text]") else if (href_list["silicon"]) switch(href_list["silicon"]) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index c044680302..db6d0a6672 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -1157,6 +1157,3 @@ GLOBAL_LIST_EMPTY(possible_sabotages) /datum/objective/flavor/wizard flavor_file = "strings/flavor_objectives/wizard.txt" - -/datum/objective/flavor/bloodsucker - flavor_file = "strings/flavor_objectives/bloodsucker.txt" diff --git a/code/modules/antagonists/_common/antag_team.dm b/code/modules/antagonists/_common/antag_team.dm index 958a50460c..027abc7c94 100644 --- a/code/modules/antagonists/_common/antag_team.dm +++ b/code/modules/antagonists/_common/antag_team.dm @@ -46,7 +46,7 @@ else report += "Objective #[objective_count]: [objective.explanation_text] [completion*100]%" else - report += "Objective #[objective_count]: [objective.explanation_text]" + report += "Objective #[objective_count]: [objective.explanation_text]" objective_count++ if(win) report += "The [name] was successful!" diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index a768978583..844b523135 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -372,7 +372,7 @@ datum/antagonist/bloodsucker/proc/SpendRank() protege_objective.generate_objective() add_objective(protege_objective) - if (prob(50)) + if (rand(0,1) == 0) // Heart Thief Objective var/datum/objective/bloodsucker/heartthief/heartthief_objective = new heartthief_objective.owner = owner diff --git a/code/modules/antagonists/brother/brother.dm b/code/modules/antagonists/brother/brother.dm index 7d2bd45827..2292006da1 100644 --- a/code/modules/antagonists/brother/brother.dm +++ b/code/modules/antagonists/brother/brother.dm @@ -118,7 +118,7 @@ else parts += "Objective #[objective_count]: [objective.explanation_text] [completion*100]%" else - parts += "Objective #[objective_count]: [objective.explanation_text]" + parts += "Objective #[objective_count]: [objective.explanation_text]" objective_count++ if(win) parts += "The blood brothers were successful!" diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index 7afe336319..a81c409233 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -564,7 +564,7 @@ else parts += "Objective #[count]: [objective.explanation_text] [completion*100]%" else - parts += "Objective #[count]: [objective.explanation_text]" + parts += "Objective #[count]: [objective.explanation_text]" count++ if(changelingwin) diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm index 278746db5a..2b6c24f8dc 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -434,7 +434,7 @@ else parts += "Objective #[count]: [objective.explanation_text] [completion*100]%" else - parts += "Objective #[count]: [objective.explanation_text]" + parts += "Objective #[count]: [objective.explanation_text]" count++ if(members.len) diff --git a/code/modules/antagonists/disease/disease_datum.dm b/code/modules/antagonists/disease/disease_datum.dm index b118aeb308..3c7de589d9 100644 --- a/code/modules/antagonists/disease/disease_datum.dm +++ b/code/modules/antagonists/disease/disease_datum.dm @@ -54,7 +54,7 @@ else result += "Objective #[count]: [objective.explanation_text] [completion*100]%" else - result += "Objective #[count]: [objective.explanation_text]" + result += "Objective #[count]: [objective.explanation_text]" count++ result += objectives_text diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 480264297e..830555e9a2 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -398,7 +398,7 @@ else objectives_text += "Objective #[count]: [objective.explanation_text] [completion*100]%" else - objectives_text += "Objective #[count]: [objective.explanation_text]" + objectives_text += "Objective #[count]: [objective.explanation_text]" count++ if(uplink_true) diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index 42b09abf38..c5e365d4eb 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -276,7 +276,7 @@ else parts += "Objective #[count]: [objective.explanation_text] [completion*100]%" else - parts += "Objective #[count]: [objective.explanation_text]" + parts += "Objective #[count]: [objective.explanation_text]" count++ if(wizardwin) From dd63e8cf84798b4df6e00d4dc9c2455ce42c7766 Mon Sep 17 00:00:00 2001 From: Putnam Date: Sat, 1 Feb 2020 21:07:21 -0800 Subject: [PATCH 047/172] oofies --- code/modules/antagonists/traitor/datum_traitor.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 830555e9a2..3180c1b305 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -391,14 +391,14 @@ if(objective.completable) var/completion = objective.check_completion() if(completion >= 1) - objectives_text += "Objective #[count]: [objective.explanation_text] Success!" + objectives_text += "
      Objective #[count]: [objective.explanation_text] Success!" else if(completion <= 0) - objectives_text += "Objective #[count]: [objective.explanation_text] Fail." + objectives_text += "
      Objective #[count]: [objective.explanation_text] Fail." traitorwin = FALSE else - objectives_text += "Objective #[count]: [objective.explanation_text] [completion*100]%" + objectives_text += "
      Objective #[count]: [objective.explanation_text] [completion*100]%" else - objectives_text += "Objective #[count]: [objective.explanation_text]" + objectives_text += "
      Objective #[count]: [objective.explanation_text]" count++ if(uplink_true) From 07a4515b2392be3e8f6a3aab16253ca06f7a00bc Mon Sep 17 00:00:00 2001 From: necromanceranne Date: Mon, 3 Feb 2020 15:03:16 +1100 Subject: [PATCH 048/172] Thankfully I didn't fuck it up this way --- _maps/map_files/MetaStation/MetaStation.dmm | 16 ++++++++-------- _maps/map_files/PubbyStation/PubbyStation.dmm | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index cd50d90edb..145d35f650 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -29753,15 +29753,15 @@ /obj/item/clothing/under/rank/security/navyblue, /obj/item/clothing/under/rank/security/navyblue, /obj/item/clothing/under/rank/security/navyblue, -/obj/item/clothing/suit/security/officer, -/obj/item/clothing/suit/security/officer, -/obj/item/clothing/suit/security/officer, -/obj/item/clothing/suit/security/officer, -/obj/item/clothing/suit/security/officer, -/obj/item/clothing/suit/security/officer, -/obj/item/clothing/under/rank/warden/navyblue, +/obj/item/clothing/suit/armor/navyblue, +/obj/item/clothing/suit/armor/navyblue, +/obj/item/clothing/suit/armor/navyblue, +/obj/item/clothing/suit/armor/navyblue, +/obj/item/clothing/suit/armor/navyblue, +/obj/item/clothing/suit/armor/navyblue, +/obj/item/clothing/suit/armor/vest/warden/navyblue, /obj/item/clothing/suit/security/warden, -/obj/item/clothing/under/rank/head_of_security/navyblue, +/obj/item/clothing/suit/armor/hos/navyblue, /obj/item/clothing/suit/security/hos, /obj/item/clothing/head/beret/sec/navyofficer, /obj/item/clothing/head/beret/sec/navyofficer, diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 2947395ccb..8967c9f0fa 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -2564,7 +2564,7 @@ "aij" = ( /obj/structure/closet/secure_closet/contraband/armory, /obj/item/poster/random_contraband, -/obj/item/clothing/suit/security/officer/russian, +/obj/item/clothing/suit/armor/navyblue/russian, /obj/item/grenade/plastic/c4, /turf/open/floor/plasteel/dark, /area/security/armory) From 0779b67accc1772154397ce16bdb5aefd348b720 Mon Sep 17 00:00:00 2001 From: necromanceranne Date: Mon, 3 Feb 2020 15:51:07 +1100 Subject: [PATCH 049/172] whoops --- _maps/map_files/MetaStation/MetaStation.dmm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 145d35f650..f030044712 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -29759,10 +29759,10 @@ /obj/item/clothing/suit/armor/navyblue, /obj/item/clothing/suit/armor/navyblue, /obj/item/clothing/suit/armor/navyblue, +/obj/item/clothing/under/rank/warden/navyblue, /obj/item/clothing/suit/armor/vest/warden/navyblue, -/obj/item/clothing/suit/security/warden, +/obj/item/clothing/under/rank/head_of_security/navyblue, /obj/item/clothing/suit/armor/hos/navyblue, -/obj/item/clothing/suit/security/hos, /obj/item/clothing/head/beret/sec/navyofficer, /obj/item/clothing/head/beret/sec/navyofficer, /obj/item/clothing/head/beret/sec/navyofficer, From f2fd48bfd9a2c2900d50f30a0f9357a1fd90d3cc Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Mon, 3 Feb 2020 08:31:12 +0100 Subject: [PATCH 050/172] Update holosign.dm --- code/game/objects/structures/holosign.dm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index 9d22f669d5..c20fbcfcca 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -8,14 +8,16 @@ max_integrity = 1 armor = list("melee" = 0, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20) var/obj/item/holosign_creator/projector + var/init_vis_overlay = TRUE /obj/structure/holosign/Initialize(mapload, source_projector) . = ..() if(source_projector) projector = source_projector projector.signs += src - SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, plane, dir, alpha, RESET_ALPHA) //you see mobs under it, but you hit them like they are above it - alpha = 0 + if(init_vis_overlay) + SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, plane, dir, alpha, RESET_ALPHA) //you see mobs under it, but you hit them like they are above it + alpha = 0 /obj/structure/holosign/Destroy() if(projector) @@ -76,6 +78,7 @@ anchored = TRUE CanAtmosPass = ATMOS_PASS_NO alpha = 150 + init_vis_overlay = FALSE /obj/structure/holosign/barrier/atmos/Initialize() . = ..() @@ -101,6 +104,7 @@ density = FALSE anchored = TRUE alpha = 150 + init_vis_overlay = FALSE CanAtmosPass = ATMOS_PASS_NO resistance_flags = FIRE_PROOF From ccd557122c730cfd6bb51766ec2a26bc52399e25 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Mon, 3 Feb 2020 08:35:47 +0100 Subject: [PATCH 051/172] Update holosign.dm --- code/game/objects/structures/holosign.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index c20fbcfcca..92fda29101 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -76,6 +76,7 @@ icon_state = "holo_fan" density = FALSE anchored = TRUE + layer = ABOVE_NORMAL_TURF_LAYER CanAtmosPass = ATMOS_PASS_NO alpha = 150 init_vis_overlay = FALSE @@ -103,6 +104,7 @@ max_integrity = 30 density = FALSE anchored = TRUE + layer = ABOVE_NORMAL_TURF_LAYER alpha = 150 init_vis_overlay = FALSE CanAtmosPass = ATMOS_PASS_NO From 76e34c7e0f95731527db6134999033388bfc34a4 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Mon, 3 Feb 2020 08:48:12 +0100 Subject: [PATCH 052/172] Update update_icons.dm --- code/modules/mob/living/carbon/human/update_icons.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index fa6cc44fca..f1b1570e24 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -182,10 +182,10 @@ There are several things that need to be remembered: if(!gloves && bloody_hands) var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER, color = blood_DNA_to_color()) - if(get_num_arms() < 2) - if(has_left_hand()) + if(get_num_arms(FALSE) < 2) + if(has_left_hand(FALSE)) bloody_overlay.icon_state = "bloodyhands_left" - else if(has_right_hand()) + else if(has_right_hand(FALSE)) bloody_overlay.icon_state = "bloodyhands_right" overlays_standing[GLOVES_LAYER] = bloody_overlay @@ -265,7 +265,7 @@ There are several things that need to be remembered: /mob/living/carbon/human/update_inv_shoes() remove_overlay(SHOES_LAYER) - if(get_num_legs() <2) + if(get_num_legs(FALSE) <2) return if(client && hud_used) From 52432ed0a760909eda17878d91321fd8d13a98e8 Mon Sep 17 00:00:00 2001 From: Putnam Date: Mon, 3 Feb 2020 07:12:27 -0800 Subject: [PATCH 053/172] too many dynamic changes for my sanity --- code/__DEFINES/dynamic.dm | 1 + code/__DEFINES/role_preferences.dm | 1 + code/__DEFINES/vote.dm | 1 + .../configuration/configuration.dm | 23 +++++++ .../configuration/entries/dynamic.dm | 4 ++ code/controllers/subsystem/persistence.dm | 7 +-- code/controllers/subsystem/vote.dm | 61 +++++++++++------- code/game/gamemodes/dynamic/dynamic.dm | 15 ++++- .../dynamic/dynamic_rulesets_latejoin.dm | 30 +++++++-- .../dynamic/dynamic_rulesets_midround.dm | 2 +- .../gamemodes/dynamic/dynamic_storytellers.dm | 62 ++++++++++++++----- config/dynamic_config.txt | 14 +++++ tgstation.dme | 1 + 13 files changed, 170 insertions(+), 52 deletions(-) diff --git a/code/__DEFINES/dynamic.dm b/code/__DEFINES/dynamic.dm index 45c1ba9cb2..0d57961f48 100644 --- a/code/__DEFINES/dynamic.dm +++ b/code/__DEFINES/dynamic.dm @@ -5,6 +5,7 @@ #define NO_ASSASSIN (1<<0) #define WAROPS_ALWAYS_ALLOWED (1<<1) +#define USE_PREF_WEIGHTS (1<<2) #define ONLY_RULESET (1<<0) #define HIGHLANDER_RULESET (1<<1) diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 28a04c2a51..7fabb74157 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -38,6 +38,7 @@ #define ROLE_BLOODSUCKER "bloodsucker" //#define ROLE_MONSTERHUNTER "monster hunter" Disabled for now #define ROLE_GHOSTCAFE "ghostcafe" +#define ROLE_MINOR_ANTAG "minorantag" //Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR. //The gamemode specific ones are just so the gamemodes can query whether a player is old enough //(in game days played) to play that role diff --git a/code/__DEFINES/vote.dm b/code/__DEFINES/vote.dm index 8fb2e6deab..6553447029 100644 --- a/code/__DEFINES/vote.dm +++ b/code/__DEFINES/vote.dm @@ -2,5 +2,6 @@ #define APPROVAL_VOTING 1 #define RANKED_CHOICE_VOTING 2 #define SCORE_VOTING 3 +#define MAJORITY_JUDGEMENT_VOTING 4 GLOBAL_LIST_INIT(vote_score_options,list("Bad","Poor","Acceptable","Good","Great")) diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index 79d125f608..974a0c0e88 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -364,6 +364,29 @@ runnable_modes[M] = final_weight return runnable_modes +/datum/controller/configuration/proc/get_runnable_storytellers() + var/list/datum/dynamic_storyteller/runnable_storytellers = new + var/list/probabilities = Get(/datum/config_entry/keyed_list/storyteller_weight) + var/list/repeated_mode_adjust = Get(/datum/config_entry/number_list/repeated_mode_adjust) + for(var/T in storyteller_cache) + var/datum/dynamic_storyteller/S = T + var/config_tag = initial(S.config_tag) + var/final_weight = initial(S.weight) + if(probabilities[config_tag]<=0) + continue + final_weight = probabilities[config_tag] + if(SSpersistence.saved_storytellers.len == 3 && repeated_mode_adjust.len == 3) + var/name = initial(S.name) + var/recent_round = min(SSpersistence.saved_storytellers.Find(name),3) + var/adjustment = 0 + while(recent_round) + adjustment += repeated_mode_adjust[recent_round] + recent_round = SSpersistence.saved_modes.Find(name,recent_round+1,0) + final_weight *= ((100-adjustment)/100) + runnable_storytellers[S] = final_weight + return runnable_storytellers + + /datum/controller/configuration/proc/get_runnable_midround_modes(crew) var/list/datum/game_mode/runnable_modes = new var/list/probabilities = Get(/datum/config_entry/keyed_list/probability) diff --git a/code/controllers/configuration/entries/dynamic.dm b/code/controllers/configuration/entries/dynamic.dm index 7f3e16d57e..4c03de4678 100644 --- a/code/controllers/configuration/entries/dynamic.dm +++ b/code/controllers/configuration/entries/dynamic.dm @@ -88,3 +88,7 @@ /datum/config_entry/number/dynamic_warops_cost config_entry_value = 10 min_val = 0 + +/datum/config_entry/keyed_list/storyteller_weight + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index e43c8f21a2..eecee740c9 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -13,7 +13,7 @@ SUBSYSTEM_DEF(persistence) var/list/saved_messages = list() var/list/saved_modes = list(1,2,3) var/list/saved_dynamic_rules = list(list(),list(),list()) - var/list/saved_storytellers = list("foo","bar","baz","foo again","bar again") + var/list/saved_storytellers = list("foo","bar","baz") var/list/saved_maps var/list/saved_trophies = list() var/list/spawned_objects = list() @@ -190,6 +190,7 @@ SUBSYSTEM_DEF(persistence) if(!json) return saved_storytellers = json["data"] + saved_storytellers.len = 3 /datum/controller/subsystem/persistence/proc/LoadRecentMaps() var/json_file = file("data/RecentMaps.json") @@ -411,9 +412,7 @@ SUBSYSTEM_DEF(persistence) WRITE_FILE(json_file, json_encode(file_data)) /datum/controller/subsystem/persistence/proc/CollectStoryteller(var/datum/game_mode/dynamic/mode) - saved_storytellers.len = 5 - saved_storytellers[5] = saved_storytellers[4] - saved_storytellers[4] = saved_storytellers[3] + saved_storytellers.len = 3 saved_storytellers[3] = saved_storytellers[2] saved_storytellers[2] = saved_storytellers[1] saved_storytellers[1] = mode.storyteller.name diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index c67a1620f1..67fc1cf237 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -197,11 +197,16 @@ SUBSYSTEM_DEF(vote) for(var/choice in choices) if("[choice]" in this_vote && "[choice]" in scores_by_choice) sorted_insert(scores_by_choice["[choice]"],this_vote["[choice]"],/proc/cmp_numeric_asc) - var/middle_score = round(GLOB.vote_score_options.len/2,1) + var/min_score = 100 + var/max_score = -100 for(var/score_name in scores_by_choice) var/list/score = scores_by_choice[score_name] for(var/S in score) - scores[score_name] += S-middle_score + scores[score_name] += S + max_score=max(max_score,scores[score_name]) + min_score=min(min_score,scores[score_name]) + for(var/score_name in scores) // normalize the scores from 0-1 + scores[score_name] = (scores[score_name]-min_score)/(max_score-min_score) SSblackbox.record_feedback("nested tally","voting",scores[score_name],list(blackbox_text,"Total scores",score_name)) @@ -217,16 +222,20 @@ SUBSYSTEM_DEF(vote) if(vote_system == RANKED_CHOICE_VOTING) calculate_condorcet_votes(vote_title_text) if(vote_system == SCORE_VOTING) - calculate_majority_judgement_vote(vote_title_text) calculate_scores(vote_title_text) + if(vote_system == MAJORITY_JUDGEMENT_VOTING) + calculate_majority_judgement_vote(vote_title_text) // nothing uses this at the moment var/list/winners = get_result() var/was_roundtype_vote = mode == "roundtype" || mode == "dynamic" if(winners.len > 0) if(was_roundtype_vote) stored_gamemode_votes = list() - if(!obfuscated && vote_system == RANKED_CHOICE_VOTING) - text += "\nIt should be noted that this is not a raw tally of votes (impossible in ranked choice) but the score determined by the schulze method of voting, so the numbers will look weird!" - if(mode == "mode tiers") + if(!obfuscated) + if(vote_system == RANKED_CHOICE_VOTING) + text += "\nIt should be noted that this is not a raw tally of votes (impossible in ranked choice) but the score determined by the schulze method of voting, so the numbers will look weird!" + if(vote_system == MAJORITY_JUDGEMENT_VOTING) + text += "\nIt should be noted that this is not a raw tally of votes but the number of runoffs done by majority judgement!" + if(vote_system == SCORE_VOTING) for(var/score_name in scores) var/score = scores[score_name] if(!score) @@ -266,13 +275,18 @@ SUBSYSTEM_DEF(vote) SSblackbox.record_feedback("nested tally","voting",1,list(vote_title_text,"[j]\th",choices[myvote[j]])) if(obfuscated) //CIT CHANGE - adds obfuscated votes. this messages admins with the vote's true results var/admintext = "Obfuscated results" - if(vote_system == RANKED_CHOICE_VOTING) - admintext += "\nIt should be noted that this is not a raw tally of votes (impossible in ranked choice) but the score determined by the schulze method of voting, so the numbers will look weird!" - else if(vote_system == SCORE_VOTING) - admintext += "\nIt should be noted that this is not a raw tally of votes but the number of runoffs done by majority judgement!" - for(var/i=1,i<=choices.len,i++) - var/votes = choices[choices[i]] - admintext += "\n[choices[i]]: [votes]" + if(vote_system != SCORE_VOTING) + if(vote_system == RANKED_CHOICE_VOTING) + admintext += "\nIt should be noted that this is not a raw tally of votes (impossible in ranked choice) but the score determined by the schulze method of voting, so the numbers will look weird!" + else if(vote_system == MAJORITY_JUDGEMENT_VOTING) + admintext += "\nIt should be noted that this is not a raw tally of votes but the number of runoffs done by majority judgement!" + for(var/i=1,i<=choices.len,i++) + var/votes = choices[choices[i]] + admintext += "\n[choices[i]]: [votes]" + else + for(var/i=1,i<=scores.len,i++) + var/score = scores[scores[i]] + admintext += "\n[scores[i]]: [score]" message_admins(admintext) return . @@ -323,7 +337,11 @@ SUBSYSTEM_DEF(vote) log_admin("Gamemode has been voted for and switched to: [GLOB.master_mode].") else GLOB.master_mode = "dynamic" - var/datum/dynamic_storyteller/S = config.pick_storyteller(.) + var/list/runnable_storytellers = config.get_runnable_storytellers() + for(var/T in runnable_storytellers) + var/datum/dynamic_storyteller/S = T + runnable_storytellers[S] *= scores[initial(S.name)] + var/datum/dynamic_storyteller/S = pickweightAllowZero(runnable_storytellers) GLOB.dynamic_storyteller_type = S if("map") var/datum/map_config/VM = config.maplist[.] @@ -444,11 +462,8 @@ SUBSYSTEM_DEF(vote) if("dynamic") for(var/T in config.storyteller_cache) var/datum/dynamic_storyteller/S = T - var/recent_rounds = 0 - for(var/i in 1 to SSpersistence.saved_storytellers.len) - if(SSpersistence.saved_storytellers[i] == initial(S.name)) - recent_rounds++ - if(recent_rounds < initial(S.weight)) + var/list/probabilities = CONFIG_GET(keyed_list/storyteller_weight) + if(probabilities[initial(S.config_tag)] > 0) choices.Add(initial(S.name)) choice_descs.Add(initial(S.desc)) choices.Add("Secret") @@ -516,7 +531,7 @@ SUBSYSTEM_DEF(vote) . += "

      Vote any number of choices.

      " if(RANKED_CHOICE_VOTING) . += "

      Vote by order of preference. Revoting will demote to the bottom. 1 is your favorite, and higher numbers are worse.

      " - if(SCORE_VOTING) + if(SCORE_VOTING,MAJORITY_JUDGEMENT_VOTING) . += "

      Grade the candidates by how much you like them.

      " . += "

      No-votes have no power--your opinion is only heard if you vote!

      " . += "Time Left: [DisplayTimeText(end_time-world.time)]
        " @@ -553,7 +568,7 @@ SUBSYSTEM_DEF(vote) . += "(Saved!)" . += "(Load vote from save)" . += "(Reset votes)" - if(SCORE_VOTING) + if(SCORE_VOTING,MAJORITY_JUDGEMENT_VOTING) var/list/myvote = voted[C.ckey] for(var/i=1,i<=choices.len,i++) . += "
      • [choices[i]]" @@ -656,7 +671,7 @@ SUBSYSTEM_DEF(vote) voted[usr.ckey] = SSpersistence.saved_votes[usr.ckey][mode] if(islist(voted[usr.ckey])) var/malformed = FALSE - if(vote_system == SCORE_VOTING) + if(vote_system == SCORE_VOTING || vote_system == MAJORITY_JUDGEMENT_VOTING) for(var/thing in voted[usr.ckey]) if(!(thing in choices)) malformed = TRUE @@ -670,7 +685,7 @@ SUBSYSTEM_DEF(vote) to_chat(usr,"Your saved vote was malformed! Start over!") voted -= usr.ckey else - if(vote_system == SCORE_VOTING) + if(vote_system == SCORE_VOTING || vote_system == MAJORITY_JUDGEMENT_VOTING) submit_vote(round(text2num(href_list["vote"])),round(text2num(href_list["score"]))) else submit_vote(round(text2num(href_list["vote"]))) diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index 821c819664..6fe52b0f8d 100644 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -239,12 +239,20 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, null) . += "Peaceful Waypoint
        " . += "Your station orbits deep within controlled, core-sector systems and serves as a waypoint for routine traffic through Nanotrasen's trade empire. Due to the combination of high security, interstellar traffic, and low strategic value, it makes any direct threat of violence unlikely. Your primary enemies will be incompetence and bored crewmen: try to organize team-building events to keep staffers interested and productive. However, even deep in our territory there may be subversive elements, especially for such a high-value target as your station. Keep an eye out, but don't expect much trouble." set_security_level(SEC_LEVEL_GREEN) + for(var/T in subtypesof(/datum/station_goal)) + var/datum/station_goal/G = new T + if(!(G in station_goals)) + station_goals += G if(21 to 79) var/perc_green = 100-round(100*((threat_level-21)/(79-21))) if(prob(perc_green)) . += "Core Territory
        " . += "Your station orbits within reliably mundane, secure space. Although Nanotrasen has a firm grip on security in your region, the valuable resources and strategic position aboard your station make it a potential target for infiltrations. Monitor crew for non-loyal behavior, but expect a relatively tame shift free of large-scale destruction. We expect great things from your station." set_security_level(SEC_LEVEL_GREEN) + for(var/T in subtypesof(/datum/station_goal)) + var/datum/station_goal/G = new T + if(!(G in station_goals)) + station_goals += G else if(prob(perc_green)) . += "Contested System
        " . += "Your station's orbit passes along the edge of Nanotrasen's sphere of influence. While subversive elements remain the most likely threat against your station, hostile organizations are bolder here, where our grip is weaker. Exercise increased caution against elite Syndicate strike forces, or Executives forbid, some kind of ill-conceived unionizing attempt." @@ -273,7 +281,7 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, null) if(GLOB.security_level >= SEC_LEVEL_BLUE) priority_announce("A summary has been copied and printed to all communications consoles.", "Security level elevated.", "intercept") else - priority_announce("Thanks to the tireless efforts of our security and intelligence divisions, there are currently no likely threats to [station_name()]. Have a secure shift!", "Security Report", "commandreport") + priority_announce("Thanks to the tireless efforts of our security and intelligence divisions, there are currently no likely threats to [station_name()]. All station construction projects have been authorized. Have a secure shift!", "Security Report", "commandreport") // Yes, this is copy pasted from game_mode /datum/game_mode/dynamic/check_finished(force_ending) @@ -346,7 +354,8 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, null) generate_threat() storyteller.start_injection_cooldowns() - + SSevents.frequency_lower = storyteller.event_frequency_lower // 6 minutes by default + SSevents.frequency_upper = storyteller.event_frequency_upper // 20 minutes by default log_game("DYNAMIC: Dynamic Mode initialized with a Threat Level of... [threat_level]!") initial_threat_level = threat_level return TRUE @@ -395,7 +404,7 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, null) /datum/game_mode/dynamic/post_setup(report) update_playercounts() - + for(var/datum/dynamic_ruleset/roundstart/rule in executed_rules) addtimer(CALLBACK(src, /datum/game_mode/dynamic/.proc/execute_roundstart_rule, rule), rule.delay) ..() diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm index f4e9971a05..f6755057e2 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm @@ -47,6 +47,8 @@ assigned += M.mind M.mind.special_role = antag_flag M.mind.add_antag_datum(antag_datum) + log_admin("[M.name] was made into a [name] by dynamic.") + message_admins("[M.name] was made into a [name] by dynamic.") return TRUE ////////////////////////////////////////////// @@ -72,12 +74,6 @@ property_weights = list("story_potential" = 2, "trust" = -1, "extended" = 1) always_max_weight = TRUE -/datum/dynamic_ruleset/latejoin/infiltrator/execute() - . = ..() - for(var/datum/mind/M in assigned) - log_admin("[M.name] was made into a traitor by dynamic.") - message_admins("[M.name] was made into a traitor by dynamic.") - ////////////////////////////////////////////// // // // REVOLUTIONARY PROVOCATEUR // @@ -225,3 +221,25 @@ log_admin("[M.name] was made into a bloodsucker by dynamic.") message_admins("[M.name] was made into a bloodsucker by dynamic.") return TRUE + +////////////////////////////////////////////// +// // +// COLLECTOR // +// // +////////////////////////////////////////////// + +/datum/dynamic_ruleset/latejoin/collector + name = "Contraband Collector" + config_tag = "latejoin_collector" + antag_datum = /datum/antagonist/collector + antag_flag = ROLE_MINOR_ANTAG + restricted_roles = list("AI", "Cyborg") + protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") + required_candidates = 1 + weight = 5 + cost = 1 + requirements = list(10,10,10,10,10,10,10,10,10,10) + high_population_requirement = 10 + repeatable = TRUE + flags = TRAITOR_RULESET + property_weights = list("story_potential" = 2, "trust" = -1, "extended" = 2) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index 92a02f5920..abd560171e 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -494,7 +494,7 @@ high_population_requirement = 50 repeatable_weight_decrease = 2 repeatable = TRUE - property_weights = list("story_potential" = 1, "trust" = 1, "extended" = 1, "valid" = 2, "integrity" = 2) + property_weights = list("story_potential" = 1, "trust" = 1, "extended" = 1, "valid" = 2, "integrity" = 1) var/list/spawn_locs = list() /datum/dynamic_ruleset/midround/from_ghosts/nightmare/execute() diff --git a/code/game/gamemodes/dynamic/dynamic_storytellers.dm b/code/game/gamemodes/dynamic/dynamic_storytellers.dm index afa6ed8ba7..303c436f99 100644 --- a/code/game/gamemodes/dynamic/dynamic_storytellers.dm +++ b/code/game/gamemodes/dynamic/dynamic_storytellers.dm @@ -1,5 +1,6 @@ /datum/dynamic_storyteller var/name = "none" + var/config_tag = null var/desc = "A coder's idiocy." var/list/property_weights = list() var/curve_centre = 0 @@ -7,6 +8,8 @@ var/forced_threat_level = -1 var/flags = 0 var/weight = 3 // how many rounds need to have been recently played for this storyteller to be left out of the vote + var/event_frequency_lower = 6 MINUTES + var/event_frequency_upper = 20 MINUTES var/datum/game_mode/dynamic/mode = null /** @@ -20,14 +23,6 @@ Property weights are: "conversion" -- Basically a bool. Conversion antags, well, convert. It's its own class for a good reason. */ -/datum/dynamic_storyteller/New() - ..() - if (istype(SSticker.mode, /datum/game_mode/dynamic)) - mode = SSticker.mode - GLOB.dynamic_curve_centre = curve_centre - GLOB.dynamic_curve_width = curve_width - GLOB.dynamic_forced_threat_level = forced_threat_level - /datum/dynamic_storyteller/proc/start_injection_cooldowns() var/latejoin_injection_cooldown_middle = 0.5*(GLOB.dynamic_first_latejoin_delay_max + GLOB.dynamic_first_latejoin_delay_min) mode.latejoin_injection_cooldown = round(CLAMP(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), GLOB.dynamic_first_latejoin_delay_min, GLOB.dynamic_first_latejoin_delay_max)) + world.time @@ -42,7 +37,28 @@ Property weights are: return /datum/dynamic_storyteller/proc/on_start() - return + if (istype(SSticker.mode, /datum/game_mode/dynamic)) + mode = SSticker.mode + GLOB.dynamic_curve_centre = curve_centre + GLOB.dynamic_curve_width = curve_width + if(flags & USE_PREF_WEIGHTS) + var/voters = 0 + var/mean = 0 + for(var/client/c in GLOB.clients) + var/vote = c.prefs.preferred_chaos + if(vote) + voters += 1 + switch(vote) + if(CHAOS_NONE) + mean -= 5 + if(CHAOS_LOW) + mean -= 2.5 + if(CHAOS_HIGH) + mean += 2.5 + if(CHAOS_MAX) + mean += 5 + GLOB.dynamic_curve_centre += (mean/voters) + GLOB.dynamic_forced_threat_level = forced_threat_level /datum/dynamic_storyteller/proc/get_midround_cooldown() var/midround_injection_cooldown_middle = 0.5*(GLOB.dynamic_midround_delay_max + GLOB.dynamic_midround_delay_min) @@ -154,12 +170,15 @@ Property weights are: /datum/dynamic_storyteller/cowabunga name = "Chaotic" + config_tag = "chaotic" curve_centre = 10 desc = "Chaos: high. Variation: high. Likely antags: clock cult, revs, wizard." property_weights = list("extended" = -1, "chaos" = 10) - weight = 2 + weight = 1 + event_frequency_lower = 2 MINUTES + event_frequency_upper = 10 MINUTES flags = WAROPS_ALWAYS_ALLOWED - var/refund_cooldown + var/refund_cooldown = 0 /datum/dynamic_storyteller/cowabunga/get_midround_cooldown() return ..() / 4 @@ -169,12 +188,13 @@ Property weights are: /datum/dynamic_storyteller/cowabunga/do_process() if(refund_cooldown < world.time) - mode.refund_threat(10) - mode.log_threat("Cowabunga it is. Refunded 10 threat. Threat is now [mode.threat].") - refund_cooldown = world.time + 300 SECONDS + mode.refund_threat(20) + mode.log_threat("Cowabunga it is. Refunded 20 threat. Threat is now [mode.threat].") + refund_cooldown = world.time + 600 SECONDS /datum/dynamic_storyteller/team name = "Teamwork" + config_tag = "teamwork" desc = "Chaos: high. Variation: low. Likely antags: nukies, clockwork cult, wizard, blob, xenomorph." curve_centre = 2 curve_width = 1.5 @@ -187,6 +207,7 @@ Property weights are: /datum/dynamic_storyteller/conversion name = "Conversion" + config_tag = "conversion" desc = "Chaos: high. Variation: medium. Likely antags: cults, bloodsuckers, revs." curve_centre = 3 curve_width = 1 @@ -196,24 +217,33 @@ Property weights are: /datum/dynamic_storyteller/classic name = "Random" + config_tag = "random" desc = "Chaos: varies. Variation: highest. No special weights attached." weight = 6 + flags = USE_PREF_WEIGHTS curve_width = 4 /datum/dynamic_storyteller/memes name = "Story" + config_tag = "story" desc = "Chaos: varies. Variation: high. Likely antags: abductors, nukies, wizard, traitor." + weight = 4 + flags = USE_PREF_WEIGHTS curve_width = 4 property_weights = list("story_potential" = 10) /datum/dynamic_storyteller/suspicion name = "Intrigue" + config_tag = "intrigue" desc = "Chaos: low. Variation: high. Likely antags: traitor, bloodsucker. Rare: revs, blood cult." + weight = 4 + flags = USE_PREF_WEIGHTS curve_width = 4 property_weights = list("trust" = -5) /datum/dynamic_storyteller/liteextended name = "Calm" + config_tag = "calm" desc = "Chaos: low. Variation: medium. Likely antags: bloodsuckers, traitors, sentient disease, revenant." curve_centre = -5 curve_width = 0.5 @@ -226,10 +256,12 @@ Property weights are: /datum/dynamic_storyteller/extended name = "Extended" + config_tag = "extended" desc = "Chaos: none. Variation: none. Likely antags: none." curve_centre = -20 - weight = 2 + weight = 0 curve_width = 0.5 /datum/dynamic_storyteller/extended/on_start() + ..() GLOB.dynamic_forced_extended = TRUE diff --git a/config/dynamic_config.txt b/config/dynamic_config.txt index 2ddebdf37a..25bc763d0b 100644 --- a/config/dynamic_config.txt +++ b/config/dynamic_config.txt @@ -1,3 +1,13 @@ +## Dynamic storytellers weights: how likely each storyteller is to show up. This is adjusted by voting and recency. +STORYTELLER_WEIGHT CHAOTIC 2 +STORYTELLER_WEIGHT TEAMWORK 4 +STORYTELLER_WEIGHT CONVERSION 2 +STORYTELLER_WEIGHT RANDOM 6 +STORYTELLER_WEIGHT INTRIGUE 6 +STORYTELLER_WEIGHT STORY 6 +STORYTELLER_WEIGHT CALM 6 +STORYTELLER_WEIGHT EXTENDED 0 + ## Injection delays: how long (in minutes) will pass before a midround or latejoin antag is injected. DYNAMIC_MIDROUND_DELAY_MIN 5 DYNAMIC_MIDROUND_DELAY_MAX 15 @@ -92,6 +102,7 @@ DYNAMIC_WEIGHT RADIATION_STORM 1 DYNAMIC_WEIGHT LATEJOIN_TRAITOR 7 DYNAMIC_WEIGHT LATEJOIN_REVOLUTION 2 DYNAMIC_WEIGHT LATEJOIN_BLOODSUCKER 4 +DYNAMIC_WEIGHT LATEJOIN_COLLECTOR 5 ## Threat cost. This is decreased from the mode's threat when the rule is executed. DYNAMIC_COST TRAITOR 10 @@ -153,6 +164,7 @@ DYNAMIC_COST RADIATION_STORM 3 DYNAMIC_COST LATEJOIN_TRAITOR 5 DYNAMIC_COST LATEJOIN_REVOLUTION 20 DYNAMIC_COST LATEJOIN_BLOODSUCKER 10 +DYNAMIC_COST LATEJOIN_COLLECTOR 1 ## Rule will not be generated with threat levels below requirement at a pop value. Pop values are determined by dynamic's pop-per-requirement. ## By default it's 0-8, 9-17, 18-26, 27-35, 36-44, 45-53, 54-60, 61-69, 70-78, 79+. @@ -210,6 +222,7 @@ DYNAMIC_REQUIREMENTS RADIATION_STORM 5 5 5 5 5 5 5 5 5 5 DYNAMIC_REQUIREMENTS LATEJOIN_TRAITOR 40 30 20 15 15 15 15 15 15 15 DYNAMIC_REQUIREMENTS LATEJOIN_REVOLUTION 101 101 70 40 40 40 40 40 40 40 DYNAMIC_REQUIREMENTS LATEJOIN_BLOODSUCKER 40 30 20 15 15 15 15 15 15 15 +DYNAMIC_REQUIREMENTS LATEJOIN_COLLECTOR 10 10 10 10 10 10 10 10 10 10 ## An alternative, static requirement used instead when pop is over mode's high_pop_limit. DYNAMIC_HIGH_POPULATION_REQUIREMENT TRAITOR 50 @@ -267,6 +280,7 @@ DYNAMIC_HIGH_POPULATION_REQUIREMENT RADIATION_STORM 5 DYNAMIC_HIGH_POPULATION_REQUIREMENT LATEJOIN_TRAITOR 15 DYNAMIC_HIGH_POPULATION_REQUIREMENT LATEJOIN_REVOLUTION 50 DYNAMIC_HIGH_POPULATION_REQUIREMENT LATEJOIN_BLOODSUCKER 15 +DYNAMIC_HIGH_POPULATION_REQUIREMENT LATEJOIN_COLLECTOR 10 ## Dynamic traitor stuff diff --git a/tgstation.dme b/tgstation.dme index 476f20cfe3..8552cbb7bc 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -1391,6 +1391,7 @@ #include "code\modules\antagonists\clockcult\clock_structures\traps\brass_skewer.dm" #include "code\modules\antagonists\clockcult\clock_structures\traps\power_null.dm" #include "code\modules\antagonists\clockcult\clock_structures\traps\steam_vent.dm" +#include "code\modules\antagonists\collector\collector.dm" #include "code\modules\antagonists\cult\blood_magic.dm" #include "code\modules\antagonists\cult\cult.dm" #include "code\modules\antagonists\cult\cult_comms.dm" From 72c1f60af776d996d0ff051e4a1bca8aa58278bb Mon Sep 17 00:00:00 2001 From: Putnam Date: Mon, 3 Feb 2020 08:10:34 -0800 Subject: [PATCH 054/172] and now the voting works --- code/controllers/subsystem/vote.dm | 54 ++++++++++++------------------ 1 file changed, 22 insertions(+), 32 deletions(-) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 67fc1cf237..49f1f3f851 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -188,24 +188,19 @@ SUBSYSTEM_DEF(vote) choices[score_name]++ /datum/controller/subsystem/vote/proc/calculate_scores(var/blackbox_text) - var/list/scores_by_choice = list() for(var/choice in choices) - scores_by_choice += "[choice]" - scores_by_choice["[choice]"] = list() + scores += "[choice]" + scores["[choice]"] = 0 for(var/ckey in voted) var/list/this_vote = voted[ckey] - for(var/choice in choices) - if("[choice]" in this_vote && "[choice]" in scores_by_choice) - sorted_insert(scores_by_choice["[choice]"],this_vote["[choice]"],/proc/cmp_numeric_asc) + for(var/choice in this_vote) + scores["[choice]"] += this_vote["[choice]"] var/min_score = 100 var/max_score = -100 - for(var/score_name in scores_by_choice) - var/list/score = scores_by_choice[score_name] - for(var/S in score) - scores[score_name] += S + for(var/score_name in scores) // normalize the scores from 0-1 max_score=max(max_score,scores[score_name]) min_score=min(min_score,scores[score_name]) - for(var/score_name in scores) // normalize the scores from 0-1 + for(var/score_name in scores) scores[score_name] = (scores[score_name]-min_score)/(max_score-min_score) SSblackbox.record_feedback("nested tally","voting",scores[score_name],list(blackbox_text,"Total scores",score_name)) @@ -235,12 +230,6 @@ SUBSYSTEM_DEF(vote) text += "\nIt should be noted that this is not a raw tally of votes (impossible in ranked choice) but the score determined by the schulze method of voting, so the numbers will look weird!" if(vote_system == MAJORITY_JUDGEMENT_VOTING) text += "\nIt should be noted that this is not a raw tally of votes but the number of runoffs done by majority judgement!" - if(vote_system == SCORE_VOTING) - for(var/score_name in scores) - var/score = scores[score_name] - if(!score) - score = 0 - text = "\n[score_name]: [obfuscated ? "???" : score]" else for(var/i=1,i<=choices.len,i++) var/votes = choices[choices[i]] @@ -258,6 +247,15 @@ SUBSYSTEM_DEF(vote) text += "\nVote Result: [obfuscated ? "???" : .]" //CIT CHANGE - adds obfuscated votes else text += "\nDid not vote: [GLOB.clients.len-voted.len]" + else if(vote_system == SCORE_VOTING) + for(var/score_name in scores) + var/score = scores[score_name] + if(!score) + score = 0 + if(was_roundtype_vote) + stored_gamemode_votes[score_name] = score + text = "\n[score_name]: [obfuscated ? "???" : score]" + . = 1 else text += "Vote Result: Inconclusive - No Votes!" log_vote(text) @@ -330,19 +328,13 @@ SUBSYSTEM_DEF(vote) if("dynamic") if(SSticker.current_state > GAME_STATE_PREGAME)//Don't change the mode if the round already started. return message_admins("A vote has tried to change the gamemode, but the game has already started. Aborting.") - if(. == "Secret") - GLOB.master_mode = "secret" - SSticker.save_mode(.) - message_admins("The gamemode has been voted for, and has been changed to: [GLOB.master_mode]") - log_admin("Gamemode has been voted for and switched to: [GLOB.master_mode].") - else - GLOB.master_mode = "dynamic" - var/list/runnable_storytellers = config.get_runnable_storytellers() - for(var/T in runnable_storytellers) - var/datum/dynamic_storyteller/S = T - runnable_storytellers[S] *= scores[initial(S.name)] - var/datum/dynamic_storyteller/S = pickweightAllowZero(runnable_storytellers) - GLOB.dynamic_storyteller_type = S + GLOB.master_mode = "dynamic" + var/list/runnable_storytellers = config.get_runnable_storytellers() + for(var/T in runnable_storytellers) + var/datum/dynamic_storyteller/S = T + runnable_storytellers[S] *= scores[initial(S.name)] + var/datum/dynamic_storyteller/S = pickweightAllowZero(runnable_storytellers) + GLOB.dynamic_storyteller_type = S if("map") var/datum/map_config/VM = config.maplist[.] message_admins("The map has been voted for and will change to: [VM.map_name]") @@ -466,8 +458,6 @@ SUBSYSTEM_DEF(vote) if(probabilities[initial(S.config_tag)] > 0) choices.Add(initial(S.name)) choice_descs.Add(initial(S.desc)) - choices.Add("Secret") - choice_descs.Add("Standard secret. Switches mode if it wins.") if("custom") question = stripped_input(usr,"What is the vote for?") if(!question) From 88ce25a09b17c1d0f9bf1d6275815e34b4204656 Mon Sep 17 00:00:00 2001 From: Putnam Date: Mon, 3 Feb 2020 08:10:45 -0800 Subject: [PATCH 055/172] hopefully fixing the once-assassin --- code/game/gamemodes/objective.dm | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index c713c71b49..459ff2f3d6 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -181,14 +181,10 @@ GLOBAL_LIST_EMPTY(objectives) ..() if(target && target.current) explanation_text = "Kill [target.name], the [!target_role_type ? target.assigned_role : target.special_role]. You only need to kill them once; if they come back, you've still succeeded." + START_PROCESSING(SSprocessing,src) else explanation_text = "Free Objective" -/datum/objective/assassinate/once/find_target_by_role(role, role_type=0, invert=0) - . = ..() - if(.) - START_PROCESSING(SSprocessing,src) - /datum/objective/assassinate/once/check_completion() return won || ..() From e4e5b651e69e2321ac97b5d89809bed02d405be8 Mon Sep 17 00:00:00 2001 From: Putnam Date: Mon, 3 Feb 2020 08:11:03 -0800 Subject: [PATCH 056/172] making permassassin scale with dynamic --- code/modules/antagonists/traitor/datum_traitor.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 3180c1b305..1c7ee48f71 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -191,7 +191,7 @@ maroon_objective.owner = owner maroon_objective.find_target() add_objective(maroon_objective) - else if(prob(30)) + else if(prob(max(0,assassin_prob-20))) var/datum/objective/assassinate/kill_objective = new kill_objective.owner = owner kill_objective.find_target() From aabd0b9e7936b20ceee3454f6bd782c0298ab671 Mon Sep 17 00:00:00 2001 From: Putnam Date: Mon, 3 Feb 2020 08:18:49 -0800 Subject: [PATCH 057/172] fixing quirk removal (whoops) --- code/modules/antagonists/_common/antag_datum.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index f019858319..0c05afb155 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -128,6 +128,7 @@ GLOBAL_LIST_EMPTY(antagonists) var/datum/quirk/Q = q if(Q.antag_removal_text) to_chat(L, "[Q.antag_removal_text]") + L.remove_quirk(Q.type) //Returns the team antagonist belongs to if any. /datum/antagonist/proc/get_team() From 63c8612ccd2497cdf196372cf8c87a46b10fb94f Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Tue, 4 Feb 2020 01:42:59 +0100 Subject: [PATCH 058/172] Refactoring mob holders into an element. --- code/__DEFINES/components.dm | 4 +- code/_onclick/click.dm | 6 +- code/controllers/subsystem/pai.dm | 1 + code/datums/elements/mob_holder.dm | 185 ++++++++++++++++++ code/datums/elements/wuv.dm | 4 + code/modules/mob/living/carbon/examine.dm | 5 +- .../mob/living/carbon/human/examine.dm | 1 + .../carbon/human/species_types/dullahan.dm | 8 +- .../mob/living/carbon/monkey/monkey.dm | 10 +- code/modules/mob/living/inhand_holder.dm | 130 ------------ code/modules/mob/living/living.dm | 7 - code/modules/mob/living/living_defines.dm | 2 - code/modules/mob/living/silicon/pai/pai.dm | 5 +- .../mob/living/silicon/pai/pai_shell.dm | 21 +- .../mob/living/simple_animal/friendly/cat.dm | 9 +- .../mob/living/simple_animal/friendly/dog.dm | 23 +-- .../simple_animal/friendly/drone/_drone.dm | 11 +- .../friendly/drone/interaction.dm | 6 - .../mob/living/simple_animal/friendly/fox.dm | 5 +- .../living/simple_animal/friendly/lizard.dm | 9 +- .../living/simple_animal/friendly/mouse.dm | 12 +- .../living/simple_animal/friendly/sloth.dm | 4 +- code/modules/mob/mob.dm | 10 +- tgstation.dme | 2 +- 24 files changed, 256 insertions(+), 224 deletions(-) create mode 100644 code/datums/elements/mob_holder.dm delete mode 100644 code/modules/mob/living/inhand_holder.dm diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 0d2e88042d..0efd5a1f79 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -106,6 +106,9 @@ #define COMSIG_CLICK "atom_click" //from base of atom/Click(): (location, control, params, mob/user) #define COMSIG_CLICK_SHIFT "shift_click" //from base of atom/ShiftClick(): (/mob) + #define COMPONENT_ALLOW_EXAMINATE 1 + #define COMPONENT_DENY_EXAMINATE 2 //Higher priority compared to the above one + #define COMSIG_CLICK_CTRL "ctrl_click" //from base of atom/CtrlClickOn(): (/mob) #define COMSIG_CLICK_ALT "alt_click" //from base of atom/AltClick(): (/mob) #define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click" //from base of atom/CtrlShiftClick(/mob) @@ -159,7 +162,6 @@ // /mob signals #define COMSIG_MOB_EXAMINATE "mob_examinate" //from base of /mob/verb/examinate(): (atom/A) - #define COMPONENT_ALLOW_EXAMINE 1 #define COMSIG_MOB_DEATH "mob_death" //from base of mob/death(): (gibbed) #define COMPONENT_BLOCK_DEATH_BROADCAST 1 //stops the death from being broadcasted in deadchat. #define COMSIG_MOB_GHOSTIZE "mob_ghostize" //from base of mob/Ghostize(): (can_reenter_corpse, special, penalize) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 9bf59d5e76..e8a57bb257 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -319,9 +319,11 @@ /mob/proc/ShiftClickOn(atom/A) A.ShiftClick(src) return + /atom/proc/ShiftClick(mob/user) - SEND_SIGNAL(src, COMSIG_CLICK_SHIFT, user) - user.examinate(src) + var/flags = SEND_SIGNAL(src, COMSIG_CLICK_SHIFT, user) + if(!(flags & COMPONENT_DENY_EXAMINATE) && user.client && (user.client.eye == user || user.client.eye == user.loc || flags & COMPONENT_ALLOW_EXAMINATE)) + user.examinate(src) return /* diff --git a/code/controllers/subsystem/pai.dm b/code/controllers/subsystem/pai.dm index dd9848e465..7fc6f3b7c7 100644 --- a/code/controllers/subsystem/pai.dm +++ b/code/controllers/subsystem/pai.dm @@ -7,6 +7,7 @@ SUBSYSTEM_DEF(pai) var/ghost_spam = FALSE var/spam_delay = 100 var/list/pai_card_list = list() + var/list/mob_holders_by_chassis = list() /datum/controller/subsystem/pai/Topic(href, href_list) if(href_list["download"]) diff --git a/code/datums/elements/mob_holder.dm b/code/datums/elements/mob_holder.dm new file mode 100644 index 0000000000..5e1e47013a --- /dev/null +++ b/code/datums/elements/mob_holder.dm @@ -0,0 +1,185 @@ +/datum/element/mob_holder + element_flags = ELEMENT_BESPOKE + id_arg_index = 2 + var/worn_state + var/alt_worn + var/right_hand + var/left_hand + var/can_head + var/proctype //if present, will be invoked on headwear generation. + +/datum/element/mob_holder/Attach(datum/target, _worn_state, _alt_worn, _right_hand, _left_hand, _can_head = FALSE, _proctype) + . = ..() + + if(!isliving(target)) + return ELEMENT_INCOMPATIBLE + + worn_state = _worn_state + alt_worn = _alt_worn + right_hand = _right_hand + left_hand = _left_hand + can_head = _can_head + proctype = _proctype + + RegisterSignal(target, COMSIG_CLICK_ALT, .proc/mob_try_pickup) + RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/on_examine) + +/datum/element/mob_holder/Detach(datum/source, force) + . = ..() + UnregisterSignal(source, COMSIG_CLICK_ALT) + UnregisterSignal(source, COMSIG_PARENT_EXAMINE) + +/datum/element/mob_holder/proc/on_examine(mob/living/source, mob/user, .) + if(ishuman(user) && !istype(source.loc, /obj/item/clothing/head/mob_holder)) + . += "Looks like [source.p_they(TRUE)] can be picked up with Alt+Click!" + +/datum/element/mob_holder/proc/mob_try_pickup(mob/living/source, mob/user) + if(!ishuman(user) || !user.Adjacent(source) || user.incapacitated()) + return FALSE + if(user.get_active_held_item()) + to_chat(user, "Your hands are full!") + return FALSE + if(source.buckled) + to_chat(user, "[src] is buckled to something!") + return FALSE + if(source == user) + to_chat(user, "You can't pick yourself up.") + return FALSE + source.visible_message("[user] starts picking up [source].", \ + "[user] starts picking you up!") + if(!do_after(user, 20, target = src) || source.buckled) + return FALSE + + source.visible_message("[user] picks up [source]!", \ + "[user] picks you up!") + to_chat(user, "You pick [src] up.") + source.drop_all_held_items() + var/obj/item/clothing/head/mob_holder/holder = new(get_turf(source), source, worn_state, alt_worn, right_hand, left_hand, can_head) + if(proctype) + INVOKE_ASYNC(src, proctype, source, holder, user) + user.put_in_hands(holder) + return TRUE + +/datum/element/mob_holder/proc/drone_worn_icon(mob/living/simple_animal/drone/D, obj/item/clothing/head/mob_holder/holder, mob/user) + var/new_state = "[D.visualAppearence]_hat" + holder.item_state = new_state + holder.icon_state = new_state + + +//The item itself, +/obj/item/clothing/head/mob_holder + name = "bugged mob" + desc = "Yell at coderbrush." + icon = null + alternate_worn_icon = 'icons/mob/animals_held.dmi' + righthand_file = 'icons/mob/animals_held_rh.dmi' + lefthand_file = 'icons/mob/animals_held_lh.dmi' + icon_state = "" + w_class = WEIGHT_CLASS_BULKY + var/mob/living/held_mob + +/obj/item/clothing/head/mob_holder/Initialize(mapload, mob/living/target, worn_state, alt_worn, right_hand, left_hand, can_head = FALSE) + . = ..() + + if(target) + assimilate(target) + + if(alt_worn) + alternate_worn_icon = alt_worn + if(worn_state) + item_state = worn_state + icon_state = worn_state + if(left_hand) + lefthand_file = left_hand + if(right_hand) + righthand_file = right_hand + if(!can_head) + slot_flags &= ~SLOT_HEAD + +/obj/item/clothing/head/mob_holder/proc/assimilate(mob/living/target) + target.setDir(SOUTH) + held_mob = target + target.forceMove(src) + var/image/I = new //work around to retain the same appearance to the mob idependently from inhands/worn states. + I.appearance = target.appearance + I.override = TRUE + add_overlay(I) + name = target.name + desc = target.desc + switch(target.mob_size) + if(MOB_SIZE_TINY) + w_class = WEIGHT_CLASS_TINY + if(MOB_SIZE_SMALL) + w_class = WEIGHT_CLASS_NORMAL + if(MOB_SIZE_LARGE) + w_class = WEIGHT_CLASS_HUGE + RegisterSignal(src, COMSIG_CLICK_SHIFT, .proc/examine_held_mob) + +/obj/item/clothing/head/mob_holder/Destroy() + if(held_mob) + release() + return ..() + +/obj/item/clothing/head/mob_holder/proc/examine_held_mob(datum/source, mob/user) + held_mob.ShiftClick(user) + return COMPONENT_DENY_EXAMINATE + +/obj/item/clothing/head/mob_holder/Exited(atom/movable/AM, atom/newloc) + . = ..() + if(AM == held_mob) + held_mob.reset_perspective() + held_mob = null + qdel(src) + +/obj/item/clothing/head/mob_holder/Entered(atom/movable/AM, atom/newloc) + . = ..() + if(AM != held_mob) + var/destination = loc + if(isliving(loc)) //the mob is held or worn, drop things on the floor + destination = get_turf(loc) + AM.forceMove(destination) + +/obj/item/clothing/head/mob_holder/dropped() + . = ..() + if(held_mob && isturf(loc))//don't release on soft-drops + release() + +/obj/item/clothing/head/mob_holder/proc/release() + if(held_mob) + var/mob/living/L = held_mob + held_mob = null + L.forceMove(get_turf(L)) + L.reset_perspective() + L.setDir(SOUTH) + qdel(src) + +/obj/item/clothing/head/mob_holder/relaymove(mob/user) + return + +/obj/item/clothing/head/mob_holder/container_resist() + if(isliving(loc)) + var/mob/living/L = loc + L.visible_message("[src] escapes from [L]!", "[src] escapes your grip!") + release() + +/obj/item/clothing/head/mob_holder/assume_air(datum/gas_mixture/env) + var/atom/location = loc + if(!loc) + return //null + var/turf/T = get_turf(loc) + while(location != T) + location = location.loc + if(ismob(location)) + return location.loc.assume_air(env) + return loc.assume_air(env) + +/obj/item/clothing/head/mob_holder/remove_air(amount) + var/atom/location = loc + if(!loc) + return //null + var/turf/T = get_turf(loc) + while(location != T) + location = location.loc + if(ismob(location)) + return location.loc.remove_air(amount) + return loc.remove_air(amount) diff --git a/code/datums/elements/wuv.dm b/code/datums/elements/wuv.dm index 84f327500f..ac900c30fd 100644 --- a/code/datums/elements/wuv.dm +++ b/code/datums/elements/wuv.dm @@ -30,6 +30,10 @@ RegisterSignal(target, COMSIG_MOB_ATTACK_HAND, .proc/on_attack_hand) +/datum/element/wuv/Detach(datum/source, force) + . = ..() + UnregisterSignal(source, COMSIG_MOB_ATTACK_HAND) + /datum/element/wuv/proc/on_attack_hand(datum/source, mob/user) var/mob/living/L = source diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index 34c268578c..3f2a259df7 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -16,10 +16,6 @@ . += "[t_He] [t_is] wearing [wear_mask.get_examine_string(user)] on [t_his] face." if (wear_neck) . += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck.\n" - if(can_be_held) - . += "[t_He] looks small enough to be picked up with Alt+Click!\n" - - for(var/obj/item/I in held_items) if(!(I.item_flags & ABSTRACT)) @@ -116,4 +112,5 @@ . += "[t_He] look[p_s()] very happy." if(MOOD_LEVEL_HAPPY4 to INFINITY) . += "[t_He] look[p_s()] ecstatic." + SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) . += "*---------*" diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index ef8a745b89..b560699a58 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -396,6 +396,7 @@ var/temp_flavor = print_flavor_text_2() if(temp_flavor) . += temp_flavor + SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) . += "*---------*" /mob/living/proc/status_effect_examines(pronoun_replacement) //You can include this in any mob's examine() to show the examine texts of status effects! diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm index 96d52dcb27..220e639e34 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -132,14 +132,14 @@ return INITIALIZE_HINT_QDEL owner = new_owner START_PROCESSING(SSobj, src) - RegisterSignal(owner, COMSIG_MOB_EXAMINATE, .proc/examinate_check) + RegisterSignal(owner, COMSIG_CLICK_SHIFT, .proc/examinate_check) RegisterSignal(src, COMSIG_ATOM_HEARER_IN_VIEW, .proc/include_owner) RegisterSignal(owner, COMSIG_LIVING_REGENERATE_LIMBS, .proc/unlist_head) RegisterSignal(owner, COMSIG_LIVING_FULLY_HEAL, .proc/retrieve_head) -/obj/item/dullahan_relay/proc/examinate_check(mob/source, atom/A) - if(source.client.eye == src && ((A in view(source.client.view, src)) || (isturf(A) && source.sight & SEE_TURFS) || (ismob(A) && source.sight & SEE_MOBS) || (isobj(A) && source.sight & SEE_OBJS))) - return COMPONENT_ALLOW_EXAMINE +/obj/item/dullahan_relay/proc/examinate_check(atom/source, mob/user) + if(user.client.eye == src) + return COMPONENT_ALLOW_EXAMINATE /obj/item/dullahan_relay/proc/include_owner(datum/source, list/processing_list, list/hearers) if(!QDELETED(owner)) diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index ea5203778b..94a50b6806 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -15,7 +15,6 @@ bodyparts = list(/obj/item/bodypart/chest/monkey, /obj/item/bodypart/head/monkey, /obj/item/bodypart/l_arm/monkey, /obj/item/bodypart/r_arm/monkey, /obj/item/bodypart/r_leg/monkey, /obj/item/bodypart/l_leg/monkey) hud_type = /datum/hud/monkey - can_be_held = "monkey" /mob/living/carbon/monkey/Initialize(mapload, cubespawned=FALSE, mob/spawner) verbs += /mob/living/proc/mob_sleep @@ -42,14 +41,15 @@ create_dna(src) dna.initialize_dna(random_blood_type()) +/mob/living/carbon/monkey/ComponentInitialize() + . = ..() + AddElement(/datum/element/mob_holder, "monkey", null, null, null, TRUE) + + /mob/living/carbon/monkey/Destroy() SSmobs.cubemonkeys -= src return ..() -/mob/living/carbon/monkey/generate_mob_holder() - var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, "monkey", 'icons/mob/animals_held.dmi', 'icons/mob/animals_held_lh.dmi', 'icons/mob/animals_held_rh.dmi', TRUE) - return holder - /mob/living/carbon/monkey/create_internal_organs() internal_organs += new /obj/item/organ/appendix internal_organs += new /obj/item/organ/lungs diff --git a/code/modules/mob/living/inhand_holder.dm b/code/modules/mob/living/inhand_holder.dm deleted file mode 100644 index 695258f944..0000000000 --- a/code/modules/mob/living/inhand_holder.dm +++ /dev/null @@ -1,130 +0,0 @@ -//Generic system for picking up mobs. -//Currently works for head and hands. -/obj/item/clothing/head/mob_holder - name = "bugged mob" - desc = "Yell at coderbrush." - icon = null - icon_state = "" - var/mob/living/held_mob - var/can_head = FALSE - w_class = WEIGHT_CLASS_BULKY - -/obj/item/clothing/head/mob_holder/Initialize(mapload, mob/living/M, _worn_state, alt_worn, lh_icon, rh_icon, _can_head_override = FALSE) - . = ..() - - if(M) - M.setDir(SOUTH) - held_mob = M - M.forceMove(src) - appearance = M.appearance - name = M.name - desc = M.desc - - if(_can_head_override) - can_head = _can_head_override - if(alt_worn) - alternate_worn_icon = alt_worn - if(_worn_state) - item_state = _worn_state - icon_state = _worn_state - if(lh_icon) - lefthand_file = lh_icon - if(rh_icon) - righthand_file = rh_icon - if(!can_head) - slot_flags = NONE - -/obj/item/clothing/head/mob_holder/Destroy() - if(held_mob) - release() - return ..() - -/obj/item/clothing/head/mob_holder/dropped() - ..() - if(isturf(loc))//don't release on soft-drops - release() - -/obj/item/clothing/head/mob_holder/proc/release() - if(isliving(loc)) - var/mob/living/L = loc - L.dropItemToGround(src) - if(held_mob) - var/mob/living/m = held_mob - m.forceMove(get_turf(m)) - m.reset_perspective() - m.setDir(SOUTH) - held_mob = null - qdel(src) - -/obj/item/clothing/head/mob_holder/relaymove(mob/user) - return - -/obj/item/clothing/head/mob_holder/container_resist() - if(isliving(loc)) - var/mob/living/L = loc - visible_message("[src] escapes [L]!") - release() - -/mob/living/proc/mob_pickup(mob/living/L) - var/obj/item/clothing/head/mob_holder/holder = generate_mob_holder() - if(!holder) - return - drop_all_held_items() - L.put_in_hands(holder) - return - -/mob/living/proc/mob_try_pickup(mob/living/user) - if(!ishuman(user) || !src.Adjacent(user) || user.incapacitated() || !can_be_held) - return FALSE - if(user.get_active_held_item()) - to_chat(user, "Your hands are full!") - return FALSE - if(buckled) - to_chat(user, "[src] is buckled to something!") - return FALSE - if(src == user) - to_chat(user, "You can't pick yourself up.") - return FALSE - visible_message("[user] starts picking up [src].", \ - "[user] starts picking you up!") - if(!do_after(user, 20, target = src)) - return FALSE - - if(user.get_active_held_item()||buckled) - return FALSE - - visible_message("[user] picks up [src]!", \ - "[user] picks you up!") - to_chat(user, "You pick [src] up.") - mob_pickup(user) - return TRUE - -/mob/living/AltClick(mob/user) - . = ..() - if(mob_try_pickup(user)) - return TRUE - - -// I didn't define these for mobs, because you shouldn't be able to breathe out of mobs and using their loc isn't always the logical thing to do. - -/obj/item/clothing/head/mob_holder/assume_air(datum/gas_mixture/env) - var/atom/location = loc - if(!loc) - return //null - var/turf/T = get_turf(loc) - while(location != T) - location = location.loc - if(ismob(location)) - return location.loc.assume_air(env) - return loc.assume_air(env) - -/obj/item/clothing/head/mob_holder/remove_air(amount) - var/atom/location = loc - if(!loc) - return //null - var/turf/T = get_turf(loc) - while(location != T) - location = location.loc - if(ismob(location)) - return location.loc.remove_air(amount) - return loc.remove_air(amount) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 90ada3d718..b3dc82a40f 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -40,11 +40,6 @@ QDEL_LIST(diseases) return ..() - -/mob/living/proc/generate_mob_holder() - var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, (istext(can_be_held) ? can_be_held : ""), 'icons/mob/animals_held.dmi', 'icons/mob/animals_held_lh.dmi', 'icons/mob/animals_held_rh.dmi') - return holder - /mob/living/onZImpact(turf/T, levels) if(!isgroundlessturf(T)) ZImpactDamage(T, levels) @@ -1172,8 +1167,6 @@ return if(!over.Adjacent(src) || (user != src) || !canUseTopic(over)) return - if(can_be_held) - mob_try_pickup(over) /mob/living/proc/get_static_viruses() //used when creating blood and other infective objects if(!LAZYLEN(diseases)) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index e668828392..84f0004805 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -101,8 +101,6 @@ var/list/obj/effect/proc_holder/abilities = list() - var/can_be_held = FALSE //whether this can be picked up and held. - var/radiation = 0 //If the mob is irradiated. var/ventcrawl_layer = PIPING_LAYER_DEFAULT var/losebreath = 0 diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 9e2dea0442..409665f792 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -11,7 +11,7 @@ health = 500 maxHealth = 500 layer = BELOW_MOB_LAYER - can_be_held = TRUE + var/datum/element/mob_holder/current_mob_holder //because only a few of their chassis can be actually held. var/network = "ss13" var/obj/machinery/camera/current = null @@ -64,9 +64,6 @@ var/list/possible_chassis //initialized in initialize. var/list/dynamic_chassis_icons //ditto. var/list/chassis_pixel_offsets_x //stupid dogborgs - var/static/item_head_icon = 'icons/mob/pai_item_head.dmi' - var/static/item_lh_icon = 'icons/mob/pai_item_lh.dmi' - var/static/item_rh_icon = 'icons/mob/pai_item_rh.dmi' var/emitterhealth = 20 var/emittermaxhealth = 20 diff --git a/code/modules/mob/living/silicon/pai/pai_shell.dm b/code/modules/mob/living/silicon/pai/pai_shell.dm index bb02bf172d..8aa38169ff 100644 --- a/code/modules/mob/living/silicon/pai/pai_shell.dm +++ b/code/modules/mob/living/silicon/pai/pai_shell.dm @@ -43,6 +43,12 @@ set_light(0) icon_state = "[chassis]" visible_message("[src] folds out its holochassis emitter and forms a holoshell around itself!") + if(possible_chassis[chassis]) + var/datum/element/mob_holder/ele = SSpai.mob_holders_by_chassis[chassis] + if(ele) + current_mob_holder = ele.Attach(src) + else + current_mob_holder = SSpai.mob_holders_by_chassis[chassis] = AddElement(/datum/element/mob_holder, chassis, 'icons/mob/pai_item_head.dmi', 'icons/mob/pai_item_rh.dmi', 'icons/mob/pai_item_lh.dmi', TRUE) holoform = TRUE /mob/living/silicon/pai/proc/fold_in(force = FALSE) @@ -69,6 +75,8 @@ holoform = FALSE if(resting) lay_down() + current_mob_holder?.Detach(src) + current_mob_holder = null /mob/living/silicon/pai/proc/choose_chassis() if(!isturf(loc) && loc != card) @@ -117,19 +125,6 @@ set_light(0) to_chat(src, "You disable your integrated light.") -/mob/living/silicon/pai/mob_pickup(mob/living/L) - var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, chassis, item_head_icon, item_lh_icon, item_rh_icon) - if(!L.put_in_hands(holder)) - qdel(holder) - else - L.visible_message("[L] scoops up [src]!") - -/mob/living/silicon/pai/mob_try_pickup(mob/living/user) - if(!possible_chassis[chassis]) - to_chat(user, "[src]'s current form isn't able to be carried!") - return FALSE - return ..() - /mob/living/silicon/pai/verb/toggle_chassis_sit() set name = "Toggle Chassis Sit" set category = "IC" diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 016bee2d44..f12f3649cf 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -31,7 +31,7 @@ var/mob/living/simple_animal/mouse/movement_target gold_core_spawnable = FRIENDLY_SPAWN collar_type = "cat" - can_be_held = "cat2" + var/held_icon = "cat2" do_footstep = TRUE /mob/living/simple_animal/pet/cat/Initialize() @@ -41,6 +41,7 @@ /mob/living/simple_animal/pet/cat/ComponentInitialize() . = ..() AddElement(/datum/element/wuv, "purrs!", EMOTE_AUDIBLE, /datum/mood_event/pet_animal, "hisses!", EMOTE_AUDIBLE) + AddElement(/datum/element/mob_holder, held_icon) /mob/living/simple_animal/pet/cat/update_canmove() ..() @@ -60,6 +61,7 @@ icon_state = "spacecat" icon_living = "spacecat" icon_dead = "spacecat_dead" + held_icon = "spacecat" unsuitable_atmos_damage = 0 minbodytemp = TCMB maxbodytemp = T0C + 40 @@ -71,6 +73,7 @@ icon_state = "original" icon_living = "original" icon_dead = "original_dead" + held_icon = "original" collar_type = null unique_pet = TRUE @@ -84,7 +87,7 @@ pass_flags = PASSMOB mob_size = MOB_SIZE_SMALL collar_type = "kitten" - can_be_held = "cat" + held_icon = "cat" //RUNTIME IS ALIVE! SQUEEEEEEEE~ /mob/living/simple_animal/pet/cat/Runtime @@ -249,7 +252,7 @@ attacked_sound = 'sound/items/eatfood.ogg' deathmessage = "loses its false life and collapses!" death_sound = "bodyfall" - can_be_held = "cak" + held_icon = "cak" /mob/living/simple_animal/pet/cat/cak/CheckParts(list/parts) ..() diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index 554d03991a..f02d21c2af 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -13,13 +13,14 @@ see_in_dark = 5 speak_chance = 1 turns_per_move = 10 + var/held_icon = "corgi" do_footstep = TRUE - can_be_held = TRUE /mob/living/simple_animal/pet/dog/ComponentInitialize() . = ..() AddElement(/datum/element/wuv, "yaps_happily!", EMOTE_AUDIBLE, /datum/mood_event/pet_animal, "growls!", EMOTE_AUDIBLE) + AddElement(/datum/element/mob_holder, held_icon) //Corgis and pugs are now under one dog subtype @@ -34,13 +35,11 @@ childtype = list(/mob/living/simple_animal/pet/dog/corgi/puppy = 95, /mob/living/simple_animal/pet/dog/corgi/puppy/void = 5) animal_species = /mob/living/simple_animal/pet/dog gold_core_spawnable = FRIENDLY_SPAWN - can_be_held = TRUE collar_type = "corgi" var/obj/item/inventory_head var/obj/item/inventory_back var/shaved = FALSE var/nofur = FALSE //Corgis that have risen past the material plane of existence. - can_be_held = "corgi" /mob/living/simple_animal/pet/dog/corgi/Destroy() QDEL_NULL(inventory_head) @@ -69,7 +68,7 @@ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/pug = 3) gold_core_spawnable = FRIENDLY_SPAWN collar_type = "pug" - can_be_held = "pug" + held_icon = "pug" /mob/living/simple_animal/pet/dog/corgi/exoticcorgi name = "Exotic Corgi" @@ -156,13 +155,6 @@ ..() update_corgi_fluff() -/mob/living/simple_animal/pet/dog/corgi/mob_pickup(mob/living/L) - var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, "corgi", null, 'icons/mob/pets_held_lh.dmi', 'icons/mob/pets_held_rh.dmi', FALSE) - if(!L.put_in_hands(holder)) - qdel(holder) - else - L.visible_message("[L] scoops up [src]!") - /mob/living/simple_animal/pet/dog/corgi/Topic(href, href_list) if(!(iscarbon(usr) || iscyborg(usr)) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) usr << browse(null, "window=mob[REF(src)]") @@ -371,7 +363,10 @@ icon_dead = "old_corgi_dead" desc = "At a ripe old age of [record_age] Ian's not as spry as he used to be, but he'll always be the HoP's beloved corgi." //RIP turns_per_move = 20 - can_be_held = "old_corgi" + var/datum/element/mob_holder/ele = SSdcs.GetElement(/datum/element/mob_holder, held_icon) + if(ele) + ele.Detach(src) + AddElement(/datum/element/mob_holder, "old_corgi") /mob/living/simple_animal/pet/dog/corgi/Ian/Life() if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved) @@ -594,7 +589,7 @@ unsuitable_atmos_damage = 0 minbodytemp = TCMB maxbodytemp = T0C + 40 - can_be_held = "void_puppy" + held_icon = "void_puppy" /mob/living/simple_animal/pet/dog/corgi/puppy/void/Process_Spacemove(movement_dir = 0) return 1 //Void puppies can navigate space. @@ -616,7 +611,7 @@ response_harm = "kicks" var/turns_since_scan = 0 var/puppies = 0 - can_be_held = "lisa" + held_icon = "lisa" //Lisa already has a cute bow! /mob/living/simple_animal/pet/dog/corgi/Lisa/Topic(href, href_list) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index 28fb1f5a42..158719414a 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -51,7 +51,7 @@ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE see_in_dark = 7 blood_volume = 0 - can_be_held = TRUE + var/can_be_held = TRUE //mob holder element. held_items = list(null, null) var/staticChoice = "static" var/list/staticChoices = list("static", "blank", "letter", "animal") @@ -101,6 +101,11 @@ for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) diag_hud.add_to_hud(src) +/mob/living/simple_animal/drone/ComponentInitialize() + . = ..() + if(can_be_held) + //icon/item state is defined in mob_holder/drone_worn_icon() + AddElement(/datum/element/mob_holder, null, 'icons/mob/head.dmi', 'icons/mob/inhands/clothing_righthand.dmi', 'icons/mob/inhands/clothing_lefthand.dmi', TRUE, /datum/element/mob_holder.proc/drone_worn_icon) /mob/living/simple_animal/drone/med_hud_set_health() var/image/holder = hud_list[DIAG_HUD] @@ -283,7 +288,3 @@ var/obj/item/clothing/H = head if(H.clothing_flags & SCAN_REAGENTS) return TRUE - -/mob/living/simple_animal/drone/generate_mob_holder() - var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, "[visualAppearence]_hat", null, null, null, TRUE) - return holder diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm index c9207fcf89..0f97a4c496 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm @@ -29,12 +29,6 @@ if("Nothing") return -//picky up the drone c: -/mob/living/simple_animal/drone/attack_hand(mob/user) - if(user.a_intent != INTENT_HELP) - return ..() // TODO: convert picking up mobs into an element or component. - mob_try_pickup(user) - /mob/living/simple_animal/drone/proc/try_reactivate(mob/living/user) var/mob/dead/observer/G = get_ghost() if(!client && (!G || !G.client)) diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm index 3f58ca593e..95b082b733 100644 --- a/code/modules/mob/living/simple_animal/friendly/fox.dm +++ b/code/modules/mob/living/simple_animal/friendly/fox.dm @@ -18,9 +18,12 @@ response_disarm = "gently pushes aside" response_harm = "kicks" gold_core_spawnable = FRIENDLY_SPAWN - can_be_held = "fox" do_footstep = TRUE +/mob/living/simple_animal/pet/fox/ComponentInitialize() + . = ..() + AddElement(/datum/element/mob_holder, "fox") + //Captain fox /mob/living/simple_animal/pet/fox/Renault name = "Renault" diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index cafa0d9009..0918005061 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -23,7 +23,10 @@ obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE var/static/list/edibles = typecacheof(list(/mob/living/simple_animal/butterfly, /mob/living/simple_animal/cockroach)) //list of atoms, however turfs won't affect AI, but will affect consumption. - can_be_held = "lizard" //you can hold lizards now. + +/mob/living/simple_animal/hostile/lizard/ComponentInitialize() + . = ..() + AddElement(/datum/element/mob_holder, "lizard", null, null, null, TRUE) //you can hold lizards now. /mob/living/simple_animal/hostile/lizard/CanAttack(atom/the_target)//Can we actually attack a possible target? if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it @@ -40,7 +43,3 @@ return TRUE else return ..() - -/mob/living/simple_animal/hostile/lizard/generate_mob_holder() - var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, "lizard", 'icons/mob/animals_held.dmi', 'icons/mob/animals_held_lh.dmi', 'icons/mob/animals_held_rh.dmi', TRUE) - return holder diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 69d9a0eef3..d326573957 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -26,17 +26,16 @@ var/body_color //brown, gray and white, leave blank for random gold_core_spawnable = FRIENDLY_SPAWN var/chew_probability = 1 - can_be_held = TRUE /mob/living/simple_animal/mouse/Initialize() . = ..() AddComponent(/datum/component/squeak, list('sound/effects/mousesqueek.ogg'=1), 100) if(!body_color) - body_color = pick( list("brown","gray","white") ) + body_color = pick(list("brown","gray","white")) + AddElement(/datum/element/mob_holder, "mouse_[body_color]") icon_state = "mouse_[body_color]" icon_living = "mouse_[body_color]" icon_dead = "mouse_[body_color]_dead" - can_be_held = "mouse_[body_color]" /mob/living/simple_animal/mouse/proc/splat() src.health = 0 @@ -89,17 +88,14 @@ /mob/living/simple_animal/mouse/white body_color = "white" icon_state = "mouse_white" - can_be_held = "mouse_white" /mob/living/simple_animal/mouse/gray body_color = "gray" icon_state = "mouse_gray" - can_be_held = "mouse_gray" /mob/living/simple_animal/mouse/brown body_color = "brown" icon_state = "mouse_brown" - can_be_held = "mouse_brown" //TOM IS ALIVE! SQUEEEEEEEE~K :) /mob/living/simple_animal/mouse/brown/Tom @@ -124,7 +120,3 @@ /obj/item/reagent_containers/food/snacks/deadmouse/on_grind() reagents.clear_reagents() -/mob/living/simple_animal/mouse/generate_mob_holder() - var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, (istext(can_be_held) ? can_be_held : ""), 'icons/mob/animals_held.dmi', 'icons/mob/animals_held_lh.dmi', 'icons/mob/animals_held_rh.dmi') - holder.w_class = WEIGHT_CLASS_TINY - return holder diff --git a/code/modules/mob/living/simple_animal/friendly/sloth.dm b/code/modules/mob/living/simple_animal/friendly/sloth.dm index 175cb8e838..21df73fa61 100644 --- a/code/modules/mob/living/simple_animal/friendly/sloth.dm +++ b/code/modules/mob/living/simple_animal/friendly/sloth.dm @@ -22,9 +22,11 @@ maxHealth = 50 speed = 10 glide_size = 2 - can_be_held = "sloth" //finally oranges can be held do_footstep = TRUE +/mob/living/simple_animal/pet/fox/ComponentInitialize() + . = ..() + AddElement(/datum/element/mob_holder, "sloth") //finally oranges can be held //Cargo Sloth /mob/living/simple_animal/sloth/paperwork diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 52e2673dd6..35c7510ad9 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -321,20 +321,18 @@ mob/visible_message(message, self_message, blind_message, vision_distance = DEFA set name = "Examine" set category = "IC" - if(!client) - return - - if(!(SEND_SIGNAL(src, COMSIG_MOB_EXAMINATE, A) & COMPONENT_ALLOW_EXAMINE) && ((client.eye != src && client.eye != loc) || (isturf(A) && !(sight & SEE_TURFS) && !(A in view(client ? client.view : world.view, src))))) - //cameras & co don't allow users to examine far away things, also shift-click catcher may issue examinate() calls for out-of-sight turfs + if(isturf(A) && !(sight & SEE_TURFS) && !(A in view(client ? client.view : world.view, src))) + // shift-click catcher may issue examinate() calls for out-of-sight turfs return if(is_blind(src)) - to_chat(src, "Something is there but you can't see it.") + to_chat(src, "Something is there but you can't see it!") return face_atom(A) var/list/result = A.examine(src) to_chat(src, result.Join("\n")) + SEND_SIGNAL(src, COMSIG_MOB_EXAMINATE, A) //same as above //note: ghosts can point, this is intended diff --git a/tgstation.dme b/tgstation.dme index b5f5442d67..a23fe5edc4 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -487,6 +487,7 @@ #include "code\datums\elements\dusts_on_leaving_area.dm" #include "code\datums\elements\earhealing.dm" #include "code\datums\elements\ghost_role_eligibility.dm" +#include "code\datums\elements\mob_holder.dm" #include "code\datums\elements\wuv.dm" #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\getrev.dm" @@ -2123,7 +2124,6 @@ #include "code\modules\mob\living\damage_procs.dm" #include "code\modules\mob\living\death.dm" #include "code\modules\mob\living\emote.dm" -#include "code\modules\mob\living\inhand_holder.dm" #include "code\modules\mob\living\life.dm" #include "code\modules\mob\living\living.dm" #include "code\modules\mob\living\living_defense.dm" From d13d8dd95398f574297fa37e842a822eec2934ff Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Tue, 4 Feb 2020 02:13:11 +0100 Subject: [PATCH 059/172] Less hacky. --- code/controllers/subsystem/pai.dm | 1 - code/datums/elements/mob_holder.dm | 13 ++++++------- code/modules/mob/living/carbon/monkey/monkey.dm | 2 +- code/modules/mob/living/silicon/pai/pai_shell.dm | 11 +++++------ .../mob/living/simple_animal/friendly/lizard.dm | 2 +- 5 files changed, 13 insertions(+), 16 deletions(-) diff --git a/code/controllers/subsystem/pai.dm b/code/controllers/subsystem/pai.dm index 7fc6f3b7c7..dd9848e465 100644 --- a/code/controllers/subsystem/pai.dm +++ b/code/controllers/subsystem/pai.dm @@ -7,7 +7,6 @@ SUBSYSTEM_DEF(pai) var/ghost_spam = FALSE var/spam_delay = 100 var/list/pai_card_list = list() - var/list/mob_holders_by_chassis = list() /datum/controller/subsystem/pai/Topic(href, href_list) if(href_list["download"]) diff --git a/code/datums/elements/mob_holder.dm b/code/datums/elements/mob_holder.dm index 5e1e47013a..af184a6353 100644 --- a/code/datums/elements/mob_holder.dm +++ b/code/datums/elements/mob_holder.dm @@ -5,10 +5,10 @@ var/alt_worn var/right_hand var/left_hand - var/can_head + var/inv_slots var/proctype //if present, will be invoked on headwear generation. -/datum/element/mob_holder/Attach(datum/target, _worn_state, _alt_worn, _right_hand, _left_hand, _can_head = FALSE, _proctype) +/datum/element/mob_holder/Attach(datum/target, _worn_state, _alt_worn, _right_hand, _left_hand, _inv_slots = NONE, _proctype) . = ..() if(!isliving(target)) @@ -18,7 +18,7 @@ alt_worn = _alt_worn right_hand = _right_hand left_hand = _left_hand - can_head = _can_head + inv_slots = _inv_slots proctype = _proctype RegisterSignal(target, COMSIG_CLICK_ALT, .proc/mob_try_pickup) @@ -54,7 +54,7 @@ "[user] picks you up!") to_chat(user, "You pick [src] up.") source.drop_all_held_items() - var/obj/item/clothing/head/mob_holder/holder = new(get_turf(source), source, worn_state, alt_worn, right_hand, left_hand, can_head) + var/obj/item/clothing/head/mob_holder/holder = new(get_turf(source), source, worn_state, alt_worn, right_hand, left_hand, inv_slots) if(proctype) INVOKE_ASYNC(src, proctype, source, holder, user) user.put_in_hands(holder) @@ -78,7 +78,7 @@ w_class = WEIGHT_CLASS_BULKY var/mob/living/held_mob -/obj/item/clothing/head/mob_holder/Initialize(mapload, mob/living/target, worn_state, alt_worn, right_hand, left_hand, can_head = FALSE) +/obj/item/clothing/head/mob_holder/Initialize(mapload, mob/living/target, worn_state, alt_worn, right_hand, left_hand, inv_slots = NONE) . = ..() if(target) @@ -93,8 +93,7 @@ lefthand_file = left_hand if(right_hand) righthand_file = right_hand - if(!can_head) - slot_flags &= ~SLOT_HEAD + slot_flags = slots /obj/item/clothing/head/mob_holder/proc/assimilate(mob/living/target) target.setDir(SOUTH) diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 94a50b6806..cd51a4234b 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -43,7 +43,7 @@ /mob/living/carbon/monkey/ComponentInitialize() . = ..() - AddElement(/datum/element/mob_holder, "monkey", null, null, null, TRUE) + AddElement(/datum/element/mob_holder, "monkey", null, null, null, SLOT_HEAD) /mob/living/carbon/monkey/Destroy() diff --git a/code/modules/mob/living/silicon/pai/pai_shell.dm b/code/modules/mob/living/silicon/pai/pai_shell.dm index 8aa38169ff..37353e2ed7 100644 --- a/code/modules/mob/living/silicon/pai/pai_shell.dm +++ b/code/modules/mob/living/silicon/pai/pai_shell.dm @@ -43,12 +43,6 @@ set_light(0) icon_state = "[chassis]" visible_message("[src] folds out its holochassis emitter and forms a holoshell around itself!") - if(possible_chassis[chassis]) - var/datum/element/mob_holder/ele = SSpai.mob_holders_by_chassis[chassis] - if(ele) - current_mob_holder = ele.Attach(src) - else - current_mob_holder = SSpai.mob_holders_by_chassis[chassis] = AddElement(/datum/element/mob_holder, chassis, 'icons/mob/pai_item_head.dmi', 'icons/mob/pai_item_rh.dmi', 'icons/mob/pai_item_lh.dmi', TRUE) holoform = TRUE /mob/living/silicon/pai/proc/fold_in(force = FALSE) @@ -104,6 +98,11 @@ dynamic_chassis = choice resist_a_rest(FALSE, TRUE) update_icon() + if(possible_chassis[chassis]) + current_mob_holder = AddElement(/datum/element/mob_holder, chassis, 'icons/mob/pai_item_head.dmi', 'icons/mob/pai_item_rh.dmi', 'icons/mob/pai_item_lh.dmi', SLOT_HEAD) + else + current_mob_holder?.Detach(src) + return to_chat(src, "You switch your holochassis projection composite to [chassis]") /mob/living/silicon/pai/lay_down() diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index 0918005061..6275256f5a 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -26,7 +26,7 @@ /mob/living/simple_animal/hostile/lizard/ComponentInitialize() . = ..() - AddElement(/datum/element/mob_holder, "lizard", null, null, null, TRUE) //you can hold lizards now. + AddElement(/datum/element/mob_holder, "lizard", null, null, null, SLOT_HEAD) //you can hold lizards now. /mob/living/simple_animal/hostile/lizard/CanAttack(atom/the_target)//Can we actually attack a possible target? if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it From 7723450d1117b6065784ab46599c812b3c7ebebd Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Tue, 4 Feb 2020 02:21:23 +0100 Subject: [PATCH 060/172] welp. --- code/datums/elements/mob_holder.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/elements/mob_holder.dm b/code/datums/elements/mob_holder.dm index af184a6353..6ee9bddc90 100644 --- a/code/datums/elements/mob_holder.dm +++ b/code/datums/elements/mob_holder.dm @@ -78,7 +78,7 @@ w_class = WEIGHT_CLASS_BULKY var/mob/living/held_mob -/obj/item/clothing/head/mob_holder/Initialize(mapload, mob/living/target, worn_state, alt_worn, right_hand, left_hand, inv_slots = NONE) +/obj/item/clothing/head/mob_holder/Initialize(mapload, mob/living/target, worn_state, alt_worn, right_hand, left_hand, slots = NONE) . = ..() if(target) From 0f708cb85686110cd5e8e7f2f9e3f5102e197adb Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Tue, 4 Feb 2020 02:26:42 +0100 Subject: [PATCH 061/172] pAI shenanigeans --- code/modules/mob/living/silicon/pai/pai_shell.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/mob/living/silicon/pai/pai_shell.dm b/code/modules/mob/living/silicon/pai/pai_shell.dm index 37353e2ed7..8ae44c042f 100644 --- a/code/modules/mob/living/silicon/pai/pai_shell.dm +++ b/code/modules/mob/living/silicon/pai/pai_shell.dm @@ -69,8 +69,6 @@ holoform = FALSE if(resting) lay_down() - current_mob_holder?.Detach(src) - current_mob_holder = null /mob/living/silicon/pai/proc/choose_chassis() if(!isturf(loc) && loc != card) @@ -102,6 +100,7 @@ current_mob_holder = AddElement(/datum/element/mob_holder, chassis, 'icons/mob/pai_item_head.dmi', 'icons/mob/pai_item_rh.dmi', 'icons/mob/pai_item_lh.dmi', SLOT_HEAD) else current_mob_holder?.Detach(src) + current_mob_holder = null return to_chat(src, "You switch your holochassis projection composite to [chassis]") From 89466de29ee152e28c19557117c362cdb1fade2d Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Tue, 4 Feb 2020 02:30:14 +0100 Subject: [PATCH 062/172] Good catch linter. --- code/datums/elements/mob_holder.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/elements/mob_holder.dm b/code/datums/elements/mob_holder.dm index 6ee9bddc90..5b471a0dc7 100644 --- a/code/datums/elements/mob_holder.dm +++ b/code/datums/elements/mob_holder.dm @@ -29,9 +29,9 @@ UnregisterSignal(source, COMSIG_CLICK_ALT) UnregisterSignal(source, COMSIG_PARENT_EXAMINE) -/datum/element/mob_holder/proc/on_examine(mob/living/source, mob/user, .) +/datum/element/mob_holder/proc/on_examine(mob/living/source, mob/user, list/examine_list) if(ishuman(user) && !istype(source.loc, /obj/item/clothing/head/mob_holder)) - . += "Looks like [source.p_they(TRUE)] can be picked up with Alt+Click!" + examine_list += "Looks like [source.p_they(TRUE)] can be picked up with Alt+Click!" /datum/element/mob_holder/proc/mob_try_pickup(mob/living/source, mob/user) if(!ishuman(user) || !user.Adjacent(source) || user.incapacitated()) From 54d70cd9fe4a1de3dbbc74876361ee98b35db4df Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 3 Feb 2020 18:33:24 -0700 Subject: [PATCH 063/172] Update gun.dm --- code/modules/projectiles/gun.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 255fb5a5c1..bc11da05e1 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -229,7 +229,7 @@ return /obj/item/gun/proc/on_cooldown() - return busy_action || firing || (last_fire + fire_delay > world.time) + return busy_action || firing || ((last_fire + fire_delay) > world.time) /obj/item/gun/proc/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) add_fingerprint(user) From b6509d25e663b235bf4d10af32403553c920c0a5 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Tue, 4 Feb 2020 06:34:42 +0100 Subject: [PATCH 064/172] Ports "Cleans up plante gene mutability." --- code/modules/hydroponics/grown/flowers.dm | 5 +++-- code/modules/hydroponics/grown/misc.dm | 5 +++-- code/modules/hydroponics/grown/mushrooms.dm | 7 ++++--- code/modules/hydroponics/plant_genes.dm | 4 +++- code/modules/hydroponics/seeds.dm | 2 +- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm index 8cdf403b00..b9118f0bee 100644 --- a/code/modules/hydroponics/grown/flowers.dm +++ b/code/modules/hydroponics/grown/flowers.dm @@ -72,8 +72,9 @@ rarity = 30 /obj/item/seeds/poppy/lily/trumpet/Initialize() - ..() - unset_mutability(/datum/plant_gene/reagent/polypyr, PLANT_GENE_EXTRACTABLE) + . = ..() + if(!nogenes) + unset_mutability(/datum/plant_gene/reagent/polypyr, PLANT_GENE_EXTRACTABLE) /obj/item/reagent_containers/food/snacks/grown/trumpet seed = /obj/item/seeds/poppy/lily/trumpet diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index e0a2453353..18ca5cc812 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -83,8 +83,9 @@ reagents_add = list(/datum/reagent/consumable/nutriment = 0.05, /datum/reagent/medicine/silibinin = 0.1) /obj/item/seeds/galaxythistle/Initialize() - ..() - unset_mutability(/datum/plant_gene/trait/invasive, PLANT_GENE_REMOVABLE) + . = ..() + if(!nogenes) + unset_mutability(/datum/plant_gene/trait/invasive, PLANT_GENE_REMOVABLE) /obj/item/reagent_containers/food/snacks/grown/galaxythistle seed = /obj/item/seeds/galaxythistle diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm index 7e43911c5c..2610a2c044 100644 --- a/code/modules/hydroponics/grown/mushrooms.dm +++ b/code/modules/hydroponics/grown/mushrooms.dm @@ -218,9 +218,10 @@ reagents_add = list(/datum/reagent/consumable/nutriment = 0.1) /obj/item/seeds/chanterelle/jupitercup/Initialize() - ..() - unset_mutability(/datum/plant_gene/reagent/liquidelectricity, PLANT_GENE_EXTRACTABLE) - unset_mutability(/datum/plant_gene/trait/plant_type/carnivory, PLANT_GENE_REMOVABLE) + . = ..() + if(!nogenes) + unset_mutability(/datum/plant_gene/reagent/liquidelectricity, PLANT_GENE_EXTRACTABLE) + unset_mutability(/datum/plant_gene/trait/plant_type/carnivory, PLANT_GENE_REMOVABLE) /obj/item/reagent_containers/food/snacks/grown/mushroom/jupitercup seed = /obj/item/seeds/chanterelle/jupitercup diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index 99fd873995..756788898a 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -18,7 +18,9 @@ return !istype(S, /obj/item/seeds/sample) // Samples can't accept new genes /datum/plant_gene/proc/Copy() - return new type + var/datum/plant_gene/G = new type + G.mutability_flags = mutability_flags + return G /datum/plant_gene/proc/apply_vars(obj/item/seeds/S) // currently used for fire resist, can prob. be further refactored return diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index f459e97814..aa0e789721 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -37,7 +37,7 @@ var/weed_rate = 1 //If the chance below passes, then this many weeds sprout during growth var/weed_chance = 5 //Percentage chance per tray update to grow weeds -/obj/item/seeds/Initialize(loc, nogenes = 0) +/obj/item/seeds/Initialize(mapload, nogenes = 0) . = ..() pixel_x = rand(-8, 8) pixel_y = rand(-8, 8) From dcb3447c12e57899f8d70c44c8ab195be69f43be Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Tue, 4 Feb 2020 06:51:50 +0100 Subject: [PATCH 065/172] Update misc.dm --- code/modules/hydroponics/grown/misc.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index 18ca5cc812..b8496c865c 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -82,7 +82,7 @@ mutatelist = list() reagents_add = list(/datum/reagent/consumable/nutriment = 0.05, /datum/reagent/medicine/silibinin = 0.1) -/obj/item/seeds/galaxythistle/Initialize() +/obj/item/seeds/galaxythistle/Initialize(mapload, nogenes = FALSE) . = ..() if(!nogenes) unset_mutability(/datum/plant_gene/trait/invasive, PLANT_GENE_REMOVABLE) From 4e4b0d718ae4c38248cc01078979ac5512c9c8d4 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Tue, 4 Feb 2020 06:52:54 +0100 Subject: [PATCH 066/172] Update mushrooms.dm --- code/modules/hydroponics/grown/mushrooms.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm index 2610a2c044..554115eb5f 100644 --- a/code/modules/hydroponics/grown/mushrooms.dm +++ b/code/modules/hydroponics/grown/mushrooms.dm @@ -217,7 +217,7 @@ growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' reagents_add = list(/datum/reagent/consumable/nutriment = 0.1) -/obj/item/seeds/chanterelle/jupitercup/Initialize() +/obj/item/seeds/chanterelle/jupitercup/Initialize(mapload, nogenes = FALSE) . = ..() if(!nogenes) unset_mutability(/datum/plant_gene/reagent/liquidelectricity, PLANT_GENE_EXTRACTABLE) From dd4e1d8f5796c54e0d099906393700e3e0852fa5 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Tue, 4 Feb 2020 06:57:07 +0100 Subject: [PATCH 067/172] Update flowers.dm --- code/modules/hydroponics/grown/flowers.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm index b9118f0bee..4843d863c5 100644 --- a/code/modules/hydroponics/grown/flowers.dm +++ b/code/modules/hydroponics/grown/flowers.dm @@ -71,7 +71,7 @@ reagents_add = list(/datum/reagent/consumable/nutriment = 0.05) rarity = 30 -/obj/item/seeds/poppy/lily/trumpet/Initialize() +/obj/item/seeds/poppy/lily/trumpet/Initialize(mapload, nogenes = FALSE) . = ..() if(!nogenes) unset_mutability(/datum/plant_gene/reagent/polypyr, PLANT_GENE_EXTRACTABLE) From 8db3fbdf880d1320585adfd1688adf1d0646bba7 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Tue, 4 Feb 2020 03:49:09 -0700 Subject: [PATCH 068/172] modularize out taser rework --- code/__DEFINES/flags.dm | 11 +++-- code/__DEFINES/status_effects.dm | 4 +- code/datums/status_effects/debuffs.dm | 41 +++++-------------- code/modules/mob/living/living.dm | 4 -- .../projectiles/ammunition/energy/stun.dm | 7 +--- .../projectiles/guns/energy/energy_gun.dm | 19 ++++----- code/modules/projectiles/guns/energy/stun.dm | 17 +------- .../projectiles/projectile/energy/stun.dm | 22 ++-------- 8 files changed, 31 insertions(+), 94 deletions(-) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 317066f673..a7d2670747 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -56,12 +56,11 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 //Movement Types -#define GROUND (1<<0) -#define FLYING (1<<1) -#define VENTCRAWLING (1<<2) -#define FLOATING (1<<3) -#define UNSTOPPABLE (1<<4) //When moving, will Bump()/Cross()/Uncross() everything, but won't be stopped. -#define CRAWLING (1<<5) //Applied if you're crawling around on the ground/resting. +#define GROUND (1<<0) +#define FLYING (1<<1) +#define VENTCRAWLING (1<<2) +#define FLOATING (1<<3) +#define UNSTOPPABLE (1<<4) //When moving, will Bump()/Cross()/Uncross() everything, but won't be stopped. //Fire and Acid stuff, for resistance_flags #define LAVA_PROOF (1<<0) diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index f42948f4ae..6d52f4640c 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -46,9 +46,7 @@ #define STATUS_EFFECT_SLEEPING /datum/status_effect/incapacitating/sleeping //the affected is asleep -#define STATUS_EFFECT_TASED_WEAK /datum/status_effect/electrode //not as crippling, just slows down - -#define STATUS_EFFECT_TASED /datum/status_effect/electrode/no_combat_mode //the affected has been tased, preventing fine muscle control +#define STATUS_EFFECT_TASED /datum/status_effect/no_combat_mode/electrode/ //the affected has been tased, preventing fine muscle control #define STATUS_EFFECT_PACIFY /datum/status_effect/pacify //the affected is pacified, preventing direct hostile actions diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 7319945f49..2e46046a7e 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -33,6 +33,7 @@ if(owner.getStaminaLoss()) owner.adjustStaminaLoss(-0.3) //reduce stamina loss by 0.3 per tick, 6 per 2 seconds + //UNCONSCIOUS /datum/status_effect/incapacitating/unconscious id = "unconscious" @@ -112,53 +113,31 @@ icon = 'icons/mob/actions/bloodsucker.dmi' icon_state = "power_mez" -/datum/status_effect/electrode +/datum/status_effect/no_combat_mode/electrode id = "tased" - var/slowdown = 1.5 - var/slowdown_priority = 50 //to make sure the stronger effect overrides - var/affect_crawl = FALSE - var/nextmove_modifier = 1 - var/stamdmg_per_ds = 1 //a 20 duration would do 20 stamdmg, disablers do 24 or something - var/last_tick = 0 //fastprocess processing speed is a goddamn sham, don't trust it. -/datum/status_effect/electrode/on_creation(mob/living/new_owner, set_duration) +/datum/status_effect/no_combat_mode/electrode/on_creation(mob/living/new_owner, set_duration) if(isnum(set_duration)) //TODO, figure out how to grab from subtype duration = set_duration . = ..() - last_tick = world.time if(iscarbon(owner)) var/mob/living/carbon/C = owner if(C.combatmode) C.toggle_combat_mode(TRUE) - C.add_movespeed_modifier("[MOVESPEED_ID_TASED_STATUS]_[id]", TRUE, priority = slowdown_priority, override = TRUE, multiplicative_slowdown = slowdown, blacklisted_movetypes = affect_crawl? NONE : CRAWLING) + C.add_movespeed_modifier(MOVESPEED_ID_TASED_STATUS, TRUE, override = TRUE, multiplicative_slowdown = 8) -/datum/status_effect/electrode/on_remove() +/datum/status_effect/no_combat_mode/electrode/on_remove() if(iscarbon(owner)) var/mob/living/carbon/C = owner - C.remove_movespeed_modifier("[MOVESPEED_ID_TASED_STATUS]_[id]") + C.remove_movespeed_modifier(MOVESPEED_ID_TASED_STATUS) . = ..() -/datum/status_effect/electrode/tick() - var/diff = world.time - last_tick +/datum/status_effect/no_combat_mode/electrode/tick() if(owner) - owner.adjustStaminaLoss(max(0, stamdmg_per_ds * diff)) //if you really want to try to stamcrit someone with a taser alone, you can, but it'll take time and good timing. - last_tick = world.time + owner.adjustStaminaLoss(5) //if you really want to try to stamcrit someone with a taser alone, you can, but it'll take time and good timing. -/datum/status_effect/electrode/no_combat_mode - id = "tased_strong" - slowdown = 8 - slowdown_priority = 100 - nextmove_modifier = 2 - -/datum/status_effect/electrode/no_combat_mode/on_creation(mob/living/new_owner, set_duration) - . = ..() - if(iscarbon(owner)) - var/mob/living/carbon/C = owner - if(C.combatmode) - C.toggle_combat_mode(TRUE) - -/datum/status_effect/electrode/no_combat_mode/nextmove_modifier() //why is this a proc. its no big deal since this doesnt get called often at all but literally w h y - return nextmove_modifier +/datum/status_effect/no_combat_mode/electrode/nextmove_modifier() //why is this a proc. its no big deal since this doesnt get called often at all but literally w h y + return 2 //OTHER DEBUFFS /datum/status_effect/his_wrath //does minor damage over time unless holding His Grace diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 90eb17716e..90ada3d718 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1087,10 +1087,6 @@ fall(forced = 1) canmove = !(ko || recoveringstam || pinned || IsStun() || IsFrozen() || chokehold || buckled || (!has_legs && !ignore_legs && !has_arms)) //Cit change - makes it plausible to move while resting, adds pinning and stamina crit density = !lying - if(resting) - ENABLE_BITFIELD(movement_type, CRAWLING) - else - DISABLE_BITFIELD(movement_type, CRAWLING) if(lying) if(layer == initial(layer)) //to avoid special cases like hiding larvas. layer = LYING_MOB_LAYER //so mob lying always appear behind standing mobs diff --git a/code/modules/projectiles/ammunition/energy/stun.dm b/code/modules/projectiles/ammunition/energy/stun.dm index 2abc472138..7c2b62c02c 100644 --- a/code/modules/projectiles/ammunition/energy/stun.dm +++ b/code/modules/projectiles/ammunition/energy/stun.dm @@ -5,10 +5,6 @@ e_cost = 200 harmful = FALSE -/obj/item/ammo_casing/energy/electrode/security - projectile_type = /obj/item/projectile/energy/electrode/security - e_cost = 100 - /obj/item/ammo_casing/energy/electrode/spec e_cost = 100 @@ -17,7 +13,6 @@ e_cost = 100 /obj/item/ammo_casing/energy/electrode/hos - projectile_type = /obj/item/projectile/energy/electrode/security/hos e_cost = 200 /obj/item/ammo_casing/energy/electrode/old @@ -32,4 +27,4 @@ click_cooldown_override = 3.5 /obj/item/ammo_casing/energy/disabler/secborg - e_cost = 50 + e_cost = 50 \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index efe107a3f8..163deae0ed 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -97,7 +97,7 @@ pin = null can_charge = 0 ammo_x_offset = 1 - ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser) + ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser) selfcharge = EGUN_SELFCHARGE var/fail_tick = 0 var/fail_chance = 0 @@ -113,21 +113,18 @@ ..() /obj/item/gun/energy/e_gun/nuclear/proc/failcheck() - if(prob(fail_chance)) + if(prob(fail_chance) && isliving(loc)) + var/mob/living/M = loc switch(fail_tick) if(0 to 200) fail_tick += (2*(fail_chance)) - radiation_pulse(src, 50) - var/mob/M = (ismob(loc) && loc) || (ismob(loc.loc) && loc.loc) //thank you short circuiting. if you powergame and nest these guns deeply you get to suffer no-warning radiation death. - if(M) - to_chat(M, "Your [name] feels warmer.") + M.rad_act(400) + to_chat(M, "Your [name] feels warmer.") if(201 to INFINITY) SSobj.processing.Remove(src) - radiation_pulse(src, 200) - crit_fail = TRUE - var/mob/M = (ismob(loc) && loc) || (ismob(loc.loc) && loc.loc) - if(M) - to_chat(M, "Your [name]'s reactor overloads!") + M.rad_act(800) + crit_fail = 1 + to_chat(M, "Your [name]'s reactor overloads!") /obj/item/gun/energy/e_gun/nuclear/emp_act(severity) . = ..() diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index d700db817c..55d11c52d1 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -18,23 +18,10 @@ /obj/item/gun/energy/e_gun/advtaser name = "hybrid taser" - desc = "A dual-mode taser designed to fire both short-range high-power electrodes and long-range disabler beams. Right click in combat mode to fire a taser shot with a cooldown." + desc = "A dual-mode taser designed to fire both short-range high-power electrodes and long-range disabler beams." icon_state = "advtaser" - ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/electrode/security = FALSE) + ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/electrode) ammo_x_offset = 2 - // Not enough guns have altfire systems like this yet for this to be a universal framework. - var/last_altfire = 0 - var/altfire_delay = 15 - -/obj/item/gun/energy/e_gun/advtaser/altafterattack(atom/target, mob/user, proximity_flag, params) - . = TRUE - if(last_altfire + altfire_delay > world.time) - return - var/current_index = current_firemode_index - set_firemode_to_type(/obj/item/ammo_casing/energy/electrode) - process_afterattack(target, user, proximity_flag, params) - set_firemode_index(current_index) - last_altfire = world.time /obj/item/gun/energy/e_gun/advtaser/cyborg name = "cyborg taser" diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index 8852d754ce..88e70154d1 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -2,11 +2,11 @@ name = "electrode" icon_state = "spark" color = "#FFFF00" - nodamage = TRUE + nodamage = 1 knockdown = 60 knockdown_stamoverride = 36 knockdown_stam_max = 50 - stutter = 10 + stutter = 5 jitter = 20 hitsound = 'sound/weapons/taserhit.ogg' range = 7 @@ -14,7 +14,6 @@ muzzle_type = /obj/effect/projectile/muzzle/stun impact_type = /obj/effect/projectile/impact/stun var/tase_duration = 50 - var/strong_tase = TRUE /obj/item/projectile/energy/electrode/on_hit(atom/target, blocked = FALSE) . = ..() @@ -27,23 +26,10 @@ C.IgniteMob() if(C.dna && C.dna.check_mutation(HULK)) C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") - else if(tase_duration && (C.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(C, TRAIT_STUNIMMUNE)) - C.apply_status_effect(strong_tase? STATUS_EFFECT_TASED : STATUS_EFFECT_TASED_WEAK, tase_duration) + else if((C.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(C, TRAIT_STUNIMMUNE)) + C.apply_status_effect(STATUS_EFFECT_TASED, tase_duration) addtimer(CALLBACK(C, /mob/living/carbon.proc/do_jitter_animation, jitter), 5) /obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet do_sparks(1, TRUE, src) ..() - -/obj/item/projectile/energy/electrode/security - tase_duration = 20 - knockdown = 0 - stamina = 10 - knockdown_stamoverride = 0 - knockdown_stam_max = 0 - strong_tase = FALSE - -/obj/item/projectile/energy/electrode/security/hos - knockdown = 100 - knockdown_stamoverride = 30 - knockdown_stam_max = null From a67902ee32a885d84f20f36aeadfabcf9d7c78eb Mon Sep 17 00:00:00 2001 From: Putnam Date: Tue, 4 Feb 2020 12:43:59 -0800 Subject: [PATCH 069/172] Also added instant runoff and renamed schulze. yak shaving --- code/__DEFINES/vote.dm | 3 ++- code/controllers/subsystem/vote.dm | 40 +++++++++++++++++++++++------- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/code/__DEFINES/vote.dm b/code/__DEFINES/vote.dm index 6553447029..b83ea7b8f6 100644 --- a/code/__DEFINES/vote.dm +++ b/code/__DEFINES/vote.dm @@ -1,7 +1,8 @@ #define PLURALITY_VOTING 0 #define APPROVAL_VOTING 1 -#define RANKED_CHOICE_VOTING 2 +#define SCHULZE_VOTING 2 #define SCORE_VOTING 3 #define MAJORITY_JUDGEMENT_VOTING 4 +#define INSTANT_RUNOFF_VOTING 5 GLOBAL_LIST_INIT(vote_score_options,list("Bad","Poor","Acceptable","Good","Great")) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 49f1f3f851..2a7c4401f3 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -204,6 +204,28 @@ SUBSYSTEM_DEF(vote) scores[score_name] = (scores[score_name]-min_score)/(max_score-min_score) SSblackbox.record_feedback("nested tally","voting",scores[score_name],list(blackbox_text,"Total scores",score_name)) +/datum/controller/subsystem/vote/proc/get_runoff_results(var/blackbox_text) + var/already_lost_runoff = list() + var/list/cur_choices = choices.Copy() + for(var/ckey in voted) + choices[choices[voted[ckey][1]]]++ // jesus christ how horrifying + for(var/_this_var_unused_ignore_it in 1 to choices.len) // if it takes more than this something REALLY wrong happened + for(var/ckey in voted) + cur_choices[cur_choices[voted[ckey][1]]]++ // jesus christ how horrifying + var/least_vote = 100000 + var/least_voted + for(var/i in 1 to cur_choices.len) + var/option = cur_choices[i] + if(cur_choices[option] > voted.len/2) + return list(option) + else if(cur_choices[option] < least_vote && !(option in already_lost_runoff)) + least_vote = cur_choices[option] + least_voted = i + already_lost_runoff += cur_choices[least_voted] + for(var/ckey in voted) + voted[ckey] -= least_voted + for(var/option in cur_choices) + cur_choices[option] = 0 /datum/controller/subsystem/vote/proc/announce_result() var/vote_title_text @@ -214,19 +236,19 @@ SUBSYSTEM_DEF(vote) else text += "[capitalize(mode)] Vote" vote_title_text = "[capitalize(mode)] Vote" - if(vote_system == RANKED_CHOICE_VOTING) + if(vote_system == SCHULZE_VOTING) calculate_condorcet_votes(vote_title_text) if(vote_system == SCORE_VOTING) calculate_scores(vote_title_text) if(vote_system == MAJORITY_JUDGEMENT_VOTING) calculate_majority_judgement_vote(vote_title_text) // nothing uses this at the moment - var/list/winners = get_result() + var/list/winners = vote_system == INSTANT_RUNOFF_VOTING ? get_runoff_results() : get_result() var/was_roundtype_vote = mode == "roundtype" || mode == "dynamic" if(winners.len > 0) if(was_roundtype_vote) stored_gamemode_votes = list() if(!obfuscated) - if(vote_system == RANKED_CHOICE_VOTING) + if(vote_system == SCHULZE_VOTING) text += "\nIt should be noted that this is not a raw tally of votes (impossible in ranked choice) but the score determined by the schulze method of voting, so the numbers will look weird!" if(vote_system == MAJORITY_JUDGEMENT_VOTING) text += "\nIt should be noted that this is not a raw tally of votes but the number of runoffs done by majority judgement!" @@ -265,7 +287,7 @@ SUBSYSTEM_DEF(vote) if(APPROVAL_VOTING,PLURALITY_VOTING) for(var/i=1,i<=choices.len,i++) SSblackbox.record_feedback("nested tally","voting",choices[choices[i]],list(vote_title_text,choices[i])) - if(RANKED_CHOICE_VOTING) + if(SCHULZE_VOTING,INSTANT_RUNOFF_VOTING) for(var/i=1,i<=voted.len,i++) var/list/myvote = voted[voted[i]] if(islist(myvote)) @@ -274,7 +296,7 @@ SUBSYSTEM_DEF(vote) if(obfuscated) //CIT CHANGE - adds obfuscated votes. this messages admins with the vote's true results var/admintext = "Obfuscated results" if(vote_system != SCORE_VOTING) - if(vote_system == RANKED_CHOICE_VOTING) + if(vote_system == SCHULZE_VOTING) admintext += "\nIt should be noted that this is not a raw tally of votes (impossible in ranked choice) but the score determined by the schulze method of voting, so the numbers will look weird!" else if(vote_system == MAJORITY_JUDGEMENT_VOTING) admintext += "\nIt should be noted that this is not a raw tally of votes but the number of runoffs done by majority judgement!" @@ -385,7 +407,7 @@ SUBSYSTEM_DEF(vote) voted[usr.ckey] = list(vote) choices[choices[vote]]++ return vote - if(RANKED_CHOICE_VOTING) + if(SCHULZE_VOTING,INSTANT_RUNOFF_VOTING) if(usr.ckey in voted) if(vote in voted[usr.ckey]) voted[usr.ckey] -= vote @@ -394,7 +416,7 @@ SUBSYSTEM_DEF(vote) voted[usr.ckey] = list() voted[usr.ckey] += vote saved -= usr.ckey - if(SCORE_VOTING) + if(SCORE_VOTING,MAJORITY_JUDGEMENT_VOTING) if(!(usr.ckey in voted)) voted += usr.ckey voted[usr.ckey] = list() @@ -519,7 +541,7 @@ SUBSYSTEM_DEF(vote) . += "

        Vote one.

        " if(APPROVAL_VOTING) . += "

        Vote any number of choices.

        " - if(RANKED_CHOICE_VOTING) + if(SCHULZE_VOTING,INSTANT_RUNOFF_VOTING) . += "

        Vote by order of preference. Revoting will demote to the bottom. 1 is your favorite, and higher numbers are worse.

        " if(SCORE_VOTING,MAJORITY_JUDGEMENT_VOTING) . += "

        Grade the candidates by how much you like them.

        " @@ -541,7 +563,7 @@ SUBSYSTEM_DEF(vote) if(choice_descs.len >= i) . += "
      • [choice_descs[i]]
      • " . += "

      " - if(RANKED_CHOICE_VOTING) + if(SCHULZE_VOTING,INSTANT_RUNOFF_VOTING) var/list/myvote = voted[C.ckey] for(var/i=1,i<=choices.len,i++) var/vote = (islist(myvote) ? (myvote.Find(i)) : 0) From 205c38a7c5853c33b7fdc2a9a9e83d2cad3a2983 Mon Sep 17 00:00:00 2001 From: TrilbySpaceClone Date: Tue, 4 Feb 2020 17:40:25 -0500 Subject: [PATCH 070/172] edits 4-5 things, gets 40000 lines of code edits --- _maps/map_files/BoxStation/BoxStation.dmm | 10828 ++++++++++---------- 1 file changed, 5410 insertions(+), 5418 deletions(-) diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 4743d12d0e..a630c54b6e 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -173,19 +173,6 @@ "aay" = ( /turf/open/floor/plating, /area/security/prison) -"aaz" = ( -/obj/structure/lattice/catwalk, -/obj/item/stack/marker_beacon{ - anchored = 1; - icon_state = "markerburgundy-on"; - light_color = "#FA644B"; - light_power = 3; - light_range = 3; - name = "Docking Beacon"; - picked_color = "Burgundy" - }, -/turf/open/space/basic, -/area/space/nearstation) "aaA" = ( /obj/machinery/seed_extractor, /turf/open/floor/plasteel, @@ -247,46 +234,10 @@ /obj/structure/chair/stool, /turf/open/floor/plasteel, /area/security/prison) -"aaK" = ( -/obj/structure/lattice/catwalk, -/obj/item/stack/marker_beacon{ - anchored = 1; - icon_state = "markerburgundy-on"; - light_color = "#FA644B"; - light_power = 3; - light_range = 3; - name = "Docking Beacon"; - picked_color = "Burgundy" - }, -/turf/open/floor/plating, -/area/space/nearstation) -"aaL" = ( -/obj/machinery/photocopier, -/turf/open/floor/wood, -/area/library) -"aaM" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) "aaN" = ( /obj/structure/chair/sofa/right, /turf/open/floor/plasteel, /area/security/prison) -"aaO" = ( -/obj/effect/spawner/lootdrop/keg, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "aaP" = ( /obj/machinery/computer/cryopod{ dir = 8; @@ -297,12 +248,6 @@ }, /turf/open/floor/plasteel, /area/security/prison) -"aaQ" = ( -/obj/structure/sign/poster/contraband/random{ - pixel_y = 32 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "aaR" = ( /obj/structure/lattice, /obj/structure/sign/warning/securearea{ @@ -340,15 +285,6 @@ }, /turf/open/floor/plasteel, /area/security/prison) -"aaY" = ( -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 4; - name = "4maintenance loot spawner" - }, -/obj/item/poster/random_official, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "aaZ" = ( /turf/closed/wall/r_wall, /area/ai_monitored/security/armory) @@ -569,11 +505,6 @@ "abF" = ( /turf/open/floor/plasteel/freezer, /area/security/prison) -"abG" = ( -/obj/structure/door_assembly/door_assembly_mai, -/obj/item/electronics/airlock, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "abH" = ( /obj/structure/table, /obj/item/storage/box/chemimp{ @@ -1634,10 +1565,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/carpet, /area/crew_quarters/heads/hos) -"adO" = ( -/obj/effect/spawner/structure/window/shuttle, -/turf/open/floor/plating/airless, -/area/space/nearstation) "adP" = ( /obj/structure/cable{ icon_state = "2-8" @@ -2052,34 +1979,6 @@ }, /turf/open/floor/plating, /area/maintenance/fore/secondary) -"aeD" = ( -/obj/structure/grille/broken, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"aeE" = ( -/obj/structure/girder, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"aeF" = ( -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/obj/machinery/computer/station_alert{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "aeG" = ( /obj/structure/cable, /obj/machinery/power/solar{ @@ -2458,12 +2357,6 @@ }, /turf/open/floor/plasteel, /area/security/main) -"afn" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat_interior) "afo" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod Three" @@ -2484,39 +2377,6 @@ }, /turf/open/space/basic, /area/space) -"afq" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat_interior) -"afr" = ( -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat_interior) -"afs" = ( -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_x = -31 - }, -/obj/machinery/computer/monitor{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "aft" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 5 @@ -2827,15 +2687,6 @@ /obj/machinery/atmospherics/pipe/manifold4w/general/visible, /turf/open/floor/plasteel, /area/engine/atmos) -"age" = ( -/obj/structure/chair/office/dark{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat_interior) "agf" = ( /obj/structure/table, /obj/item/stack/sheet/metal, @@ -2985,10 +2836,6 @@ /obj/machinery/suit_storage_unit/security, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) -"agv" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat_interior) "agw" = ( /obj/structure/table, /obj/machinery/syndicatebomb/training, @@ -3118,14 +2965,6 @@ }, /turf/open/floor/plasteel, /area/security/main) -"agH" = ( -/obj/machinery/bluespace_beacon, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/landmark/start/cyborg, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "agI" = ( /obj/machinery/airalarm{ pixel_y = 23 @@ -3255,12 +3094,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/security/warden) -"agX" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat_interior) "agY" = ( /obj/structure/table, /obj/item/storage/fancy/donut_box, @@ -3501,16 +3334,6 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) -"ahw" = ( -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat_interior) "ahx" = ( /obj/structure/cable{ icon_state = "4-8" @@ -4651,16 +4474,6 @@ /obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, /turf/open/floor/plasteel, /area/security/brig) -"ajC" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat_interior) "ajD" = ( /obj/structure/cable{ icon_state = "4-8" @@ -4869,18 +4682,6 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/maintenance/solars/port/fore) -"ajX" = ( -/obj/machinery/computer/teleporter{ - dir = 8 - }, -/turf/open/floor/plating, -/area/ai_monitored/turret_protected/aisat_interior) -"ajY" = ( -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/landmark/start/cyborg, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/atmos) "ajZ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external{ @@ -5164,18 +4965,6 @@ }, /turf/open/floor/plasteel, /area/security/courtroom) -"akz" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/landmark/start/cyborg, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "akA" = ( /obj/structure/chair{ dir = 8; @@ -6276,14 +6065,6 @@ /turf/open/floor/plasteel, /area/security/processing) "anu" = ( -/obj/machinery/button/door{ - desc = "A remote control switch for the exit."; - id = "laborexit"; - name = "exit button"; - normaldoorcontrol = 1; - pixel_x = 26; - pixel_y = -6 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, @@ -6432,10 +6213,8 @@ /area/space) "anP" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security{ - id_tag = "laborexit"; - name = "Labor Shuttle"; - req_access_txt = "63" +/obj/machinery/door/airlock/security/glass{ + name = "Labor Camp Shuttle Airlock" }, /turf/open/floor/plasteel, /area/security/processing) @@ -16138,6 +15917,10 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) +"aNV" = ( +/obj/machinery/photocopier, +/turf/open/floor/wood, +/area/library) "aNW" = ( /obj/machinery/door/airlock/public/glass{ name = "Chapel Office"; @@ -22009,7 +21792,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, -/turf/open/floor/wood, +/turf/open/floor/carpet, /area/crew_quarters/heads/captain) "bcR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -22128,6 +21911,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/computer/arcade/minesweeper, /turf/open/floor/wood, /area/crew_quarters/heads/captain) "bdj" = ( @@ -23115,7 +22899,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, -/turf/open/floor/carpet, +/turf/open/floor/wood, /area/crew_quarters/heads/captain) "bfD" = ( /obj/structure/cable{ @@ -26705,6 +26489,7 @@ /area/crew_quarters/heads/captain) "boa" = ( /obj/structure/toilet{ + contents = newlist(/obj/item/toy/snappop/phoenix); dir = 4 }, /turf/open/floor/plasteel/freezer, @@ -30020,6 +29805,12 @@ }, /turf/open/floor/plasteel, /area/quartermaster/qm) +"bvG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/space/nearstation) "bvH" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -30190,6 +29981,21 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"bwc" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) "bwd" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -48366,6 +48172,16 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"coh" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"coi" = ( +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers, +/turf/open/floor/plasteel, +/area/security/brig) "cop" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/incinerator_input{ dir = 1 @@ -48524,6 +48340,10 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"coI" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/hydroponics) "coJ" = ( /obj/machinery/door/firedoor, /obj/structure/cable/yellow{ @@ -48754,6 +48574,15 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"cpF" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/sign/poster/official/space_cops{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) "cpG" = ( /obj/structure/table/optable, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, @@ -49488,9 +49317,46 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) +"ctu" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/ai_monitored/turret_protected/aisat_interior) "ctv" = ( /turf/closed/wall/r_wall, /area/space/nearstation) +"ctw" = ( +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, +/obj/machinery/computer/station_alert{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"ctx" = ( +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers, +/turf/open/floor/plasteel/grimy, +/area/ai_monitored/turret_protected/aisat_interior) +"cty" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/ai_monitored/turret_protected/aisat_interior) "ctz" = ( /obj/machinery/door/poddoor/shutters{ id = "teledoor"; @@ -49535,6 +49401,41 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) +"ctG" = ( +/obj/structure/chair/office/dark{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/grimy, +/area/ai_monitored/turret_protected/aisat_interior) +"ctH" = ( +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_x = -31 + }, +/obj/machinery/computer/monitor{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"ctI" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/grimy, +/area/ai_monitored/turret_protected/aisat_interior) "ctJ" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -49558,6 +49459,14 @@ }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) +"ctM" = ( +/obj/machinery/bluespace_beacon, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/landmark/start/cyborg, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "ctN" = ( /obj/machinery/atmospherics/pipe/simple/yellow/visible{ dir = 10 @@ -49565,6 +49474,12 @@ /obj/structure/lattice, /turf/open/space, /area/space/nearstation) +"ctP" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/ai_monitored/turret_protected/aisat_interior) "ctQ" = ( /obj/structure/table, /obj/machinery/microwave{ @@ -49590,6 +49505,26 @@ /obj/structure/sign/warning/radiation/rad_area, /turf/closed/wall, /area/engine/engineering) +"ctS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/grimy, +/area/ai_monitored/turret_protected/aisat_interior) +"ctT" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/grimy, +/area/ai_monitored/turret_protected/aisat_interior) "ctU" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -49612,6 +49547,12 @@ /obj/structure/chair, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) +"ctW" = ( +/obj/machinery/computer/teleporter{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat_interior) "ctX" = ( /obj/machinery/camera{ c_tag = "MiniSat Teleporter"; @@ -49892,6 +49833,12 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat/atmos) +"cuC" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/landmark/start/cyborg, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat/atmos) "cuD" = ( /obj/machinery/light/small{ dir = 8 @@ -49940,6 +49887,18 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) +"cuG" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/landmark/start/cyborg, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "cuH" = ( /obj/machinery/light/small{ dir = 8 @@ -50882,14 +50841,6 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) -"cwP" = ( -/obj/structure/fireplace, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 23 - }, -/turf/open/floor/plating, -/area/maintenance/port) "cwT" = ( /obj/machinery/camera{ c_tag = "Arrivals Escape Pod 2"; @@ -51199,14 +51150,6 @@ }, /turf/open/floor/plating, /area/engine/engineering) -"czi" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 8; - name = "8maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) "czk" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -52077,6 +52020,15 @@ /obj/machinery/deepfryer, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) +"cCt" = ( +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 4; + name = "4maintenance loot spawner" + }, +/obj/item/poster/random_official, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "cCB" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 10 @@ -52238,6 +52190,36 @@ /obj/structure/closet/radiation, /turf/open/floor/plasteel, /area/engine/engineering) +"cEo" = ( +/obj/structure/closet/boxinggloves, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"cGz" = ( +/obj/structure/table/wood, +/obj/item/instrument/violin, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"cHf" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3; + pixel_y = 20 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + dir = 1; + pixel_x = 3; + pixel_y = 20 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/item/reagent_containers/food/drinks/britcup, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "cHD" = ( /obj/structure/cable{ icon_state = "1-2" @@ -52548,27 +52530,10 @@ }, /turf/open/floor/plating, /area/hallway/secondary/entry) -"cJn" = ( -/obj/structure/reagent_dispensers/watertank/high, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/box, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cMk" = ( -/obj/machinery/vr_sleeper{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/prison) +"cIv" = ( +/obj/structure/sign/poster/official/cohiba_robusto_ad, +/turf/closed/wall, +/area/lawoffice) "cMC" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -52599,6 +52564,10 @@ }, /turf/open/floor/plasteel/airless/solarpanel, /area/solar/starboard/aft) +"cMS" = ( +/obj/item/chair/wood, +/turf/open/floor/plating, +/area/maintenance/port) "cNa" = ( /obj/structure/cable, /obj/machinery/power/solar{ @@ -52752,6 +52721,10 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"cPn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) "cPA" = ( /obj/machinery/atmospherics/components/binary/valve{ dir = 4 @@ -52794,47 +52767,25 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"cRz" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +"cQF" = ( +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 8; + name = "8maintenance loot spawner" }, -/obj/machinery/button/door{ - id = "holoprivacy"; - name = "Holodeck Privacy"; - pixel_y = 24 +/obj/item/radio/intercom{ + pixel_y = 25 }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"cRD" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/structure/dresser, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/power/apc{ - areastring = "/area/crew_quarters/theatre"; - dir = 8; - name = "Theatre APC"; - pixel_x = -25 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/theatre) -"cSn" = ( -/obj/machinery/light_switch{ - pixel_y = 28 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) +"cQT" = ( +/obj/structure/filingcabinet, /obj/machinery/light{ - dir = 1 + dir = 8; + light_color = "#e8eaff" }, -/turf/open/floor/circuit, -/area/ai_monitored/nuke_storage) +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) "cSA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -53196,6 +53147,12 @@ }, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) +"cTT" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/circuit, +/area/ai_monitored/nuke_storage) "cTX" = ( /obj/structure/cable{ icon_state = "0-2" @@ -53218,952 +53175,31 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) +"cUx" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/bridge/meeting_room) "cVb" = ( /turf/closed/wall, /area/hallway/secondary/service) -"cVp" = ( -/obj/structure/window/reinforced/tinted{ - dir = 8 - }, -/obj/structure/window/reinforced/tinted{ - dir = 4 - }, -/obj/structure/curtain, -/turf/open/floor/mineral/titanium/blue, -/area/crew_quarters/dorms) -"cVu" = ( -/obj/machinery/camera{ - c_tag = "Locker Room South"; - dir = 8 - }, -/obj/structure/closet/secure_closet/personal, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) +"cVs" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/wood, +/area/bridge/meeting_room) "cVK" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/science/circuit) -"cXx" = ( -/obj/machinery/door/airlock/security{ - name = "Labor Shuttle"; - req_access_txt = "2" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/security/processing) -"dbn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/engine/engine_smes) -"dbM" = ( -/turf/open/floor/plating, -/area/space/nearstation) -"dcG" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/closet/wardrobe/pjs, -/obj/item/clothing/under/maid, -/obj/item/clothing/under/maid, -/obj/item/clothing/under/janimaid, -/obj/item/clothing/under/janimaid, -/obj/item/clothing/accessory/maidapron, -/obj/item/clothing/accessory/maidapron, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"dfh" = ( -/obj/machinery/power/apc{ - areastring = "/area/science/circuit"; - name = "Circuitry Lab APC"; - pixel_x = 30 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plasteel, -/area/science/circuit) -"dfI" = ( -/obj/machinery/door/firedoor, -/obj/structure/sign/departments/evac{ - pixel_y = -32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) -"dfL" = ( -/obj/structure/reagent_dispensers/keg/gargle, -/turf/open/floor/wood, -/area/maintenance/bar) -"dgh" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/obj/machinery/camera{ - c_tag = "VR Sleepers"; - dir = 1 - }, -/obj/machinery/light/small, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/crew_quarters/fitness) -"dgz" = ( -/turf/closed/wall, -/area/crew_quarters/cryopod) -"dhx" = ( -/obj/structure/mirror{ - pixel_y = 32 - }, -/obj/structure/sink{ - dir = 1; - pixel_y = 25 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/mineral/titanium/blue, -/area/crew_quarters/dorms) -"dok" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-22" - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"doP" = ( -/obj/structure/chair/stool{ - pixel_y = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/carpet{ - icon_state = "carpetsymbol" - }, -/area/crew_quarters/theatre) -"dqu" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall/r_wall, -/area/maintenance/disposal/incinerator) -"dtE" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"dvc" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/crew_quarters/cryopod) -"dvO" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/turf/closed/wall, -/area/science/circuit) -"dwc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"dxB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating, -/area/security/prison) -"dzi" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/carpet, -/area/crew_quarters/cryopod) -"dzy" = ( -/obj/machinery/door/airlock{ - name = "Shower Room" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/toilet) -"dHb" = ( -/obj/structure/chair/comfy/black{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"dKP" = ( -/turf/closed/wall, -/area/maintenance/bar) -"dKV" = ( -/obj/structure/chair/stool/bar, -/turf/open/floor/wood, -/area/maintenance/bar) -"dMu" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"dMX" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/structure/chair/comfy/brown, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"dMZ" = ( -/obj/structure/sign/poster/official/random{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/white, -/area/science/circuit) -"dRC" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/hydroponics) -"dSv" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - areastring = "/area/crew_quarters/abandoned_gambling_den"; - name = "Abandoned Gambling Den APC"; - pixel_y = -24 - }, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) -"dTe" = ( -/obj/structure/chair/comfy/beige{ - dir = 8 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel/grimy, -/area/hallway/secondary/entry) -"dTJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/obj/structure/chair/comfy/brown{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/captain) -"eaI" = ( -/obj/structure/table/reinforced, -/obj/item/radio/intercom{ - pixel_x = -30 - }, -/obj/item/stock_parts/cell/high, -/obj/item/stock_parts/cell/high, -/turf/open/floor/plasteel/white, -/area/science/circuit) -"edH" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"ego" = ( -/obj/machinery/atmospherics/components/binary/valve, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"egQ" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchen"; - name = "kitchen shutters" - }, -/obj/item/reagent_containers/food/snacks/bluecherrycupcake{ - pixel_y = 5 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) -"egS" = ( -/obj/structure/table/wood/fancy, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4; - pixel_y = 5 - }, -/obj/item/reagent_containers/food/snacks/burger/plain, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"elw" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, +"cXU" = ( /obj/effect/turf_decal/tile/red, +/obj/machinery/light{ + light_color = "#c9d3e8" + }, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"epV" = ( -/obj/structure/bed, -/obj/machinery/button/door{ - id = "Dorm6"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - pixel_y = -25; - specialfunctions = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/spawner/lootdrop/bedsheet, -/turf/open/floor/wood, -/area/crew_quarters/dorms) -"eqm" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"est" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/computer/shuttle/mining/common{ - dir = 4 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/hallway/secondary/entry) -"evR" = ( -/turf/open/floor/plating, -/area/maintenance/bar) -"ewZ" = ( -/obj/structure/chair/sofa/right, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) -"eyM" = ( -/obj/machinery/mineral/ore_redemption{ - input_dir = 2; - output_dir = 1 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"eHI" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"eLH" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"eMQ" = ( -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/obj/machinery/vending/wardrobe/curator_wardrobe, -/turf/open/floor/carpet, -/area/library) -"eND" = ( -/obj/structure/filingcabinet, -/obj/machinery/light{ - dir = 8; - light_color = "#e8eaff" - }, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"eNK" = ( -/obj/structure/table/wood, -/obj/item/instrument/guitar, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"eNW" = ( -/turf/open/floor/plasteel/dark, -/area/crew_quarters/dorms) -"eOv" = ( -/obj/effect/landmark/event_spawn, -/turf/closed/wall, -/area/crew_quarters/fitness) -"eOy" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"ePO" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4; - pixel_y = 5 - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"eRk" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) -"eRn" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/closed/wall, -/area/quartermaster/warehouse) -"eRz" = ( -/obj/structure/lattice, -/obj/structure/grille, -/turf/open/space/basic, -/area/space/nearstation) -"eUd" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/chair/comfy/brown{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"eVC" = ( -/obj/effect/spawner/structure/window, -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/crew_quarters/cryopod) -"eVL" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/light_switch{ - pixel_y = 28 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"eXm" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"fbm" = ( -/obj/structure/chair/comfy/brown{ - dir = 4 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"fby" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"fcG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/science/mixing) -"fhP" = ( -/obj/machinery/light{ - dir = 8; - light_color = "#e8eaff" - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"fjy" = ( -/obj/structure/lattice, -/turf/closed/wall/r_wall, -/area/crew_quarters/heads/captain) -"flc" = ( -/obj/structure/table/reinforced, -/obj/item/storage/fancy/donut_box, -/turf/open/floor/plasteel/white, -/area/science/circuit) -"fnC" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/service) -"fnJ" = ( -/obj/structure/sign/mining{ - pixel_y = 7 - }, -/turf/closed/wall, -/area/quartermaster/miningdock) -"frE" = ( -/obj/machinery/vr_sleeper{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/crew_quarters/fitness) -"ftv" = ( -/obj/structure/table, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 4; - name = "4maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"fuo" = ( -/obj/item/reagent_containers/glass/bucket, -/turf/open/floor/grass, -/area/security/prison) -"fvk" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/fore/secondary) -"fvW" = ( -/obj/structure/chair/comfy/brown{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"fvY" = ( -/obj/machinery/computer/cryopod{ - pixel_y = 26 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/crew_quarters/cryopod) -"fxa" = ( -/obj/structure/chair/wood/normal, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, -/area/maintenance/bar) -"fyq" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1; - pixel_x = 5 - }, -/obj/machinery/light/small, -/turf/open/floor/mineral/titanium/blue, -/area/crew_quarters/toilet) -"fyM" = ( -/obj/structure/closet/wardrobe/cargotech, -/obj/item/radio/headset/headset_cargo, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"fzd" = ( -/turf/closed/wall, -/area/crew_quarters/abandoned_gambling_den) -"fGf" = ( -/obj/machinery/smartfridge/disks{ - pixel_y = 2 - }, -/obj/structure/table, -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"fGl" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/security/brig) -"fGC" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/airlock/vault, -/obj/effect/mapping_helpers/airlock/locked, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"fHK" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"fIn" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/machinery/meter, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"fJa" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4; - pixel_y = 5 - }, -/obj/structure/chair/sofa{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"fKl" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/science/circuit) -"fLd" = ( -/obj/structure/table/wood, -/obj/machinery/requests_console{ - department = "Theatre"; - name = "theatre RC"; - pixel_x = -32 - }, -/obj/item/reagent_containers/food/snacks/baguette, -/obj/item/toy/dummy, -/obj/item/lipstick/random{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/lipstick/random{ - pixel_x = -2; - pixel_y = -2 - }, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/crew_quarters/theatre) -"fOc" = ( -/obj/structure/bed, -/obj/item/bedsheet/random, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) -"fPs" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchen"; - name = "kitchen shutters" - }, -/obj/item/reagent_containers/food/snacks/cheesynachos{ - pixel_y = 5 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) -"fQF" = ( -/obj/structure/sign/warning/fire{ - desc = "A sign that states the labeled room's number."; - dir = 5; - icon_state = "roomnum"; - name = "Room Number 7"; - pixel_y = 24 - }, -/obj/structure/chair/sofa/right, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"fSr" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"fTg" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"fVU" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Holodeck Door" - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) -"fZD" = ( -/obj/structure/filingcabinet, -/obj/machinery/light{ - dir = 4; - light_color = "#e8eaff" - }, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"gbq" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/turf/open/floor/plating, -/area/construction) -"gbT" = ( -/obj/structure/table, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/glass/fifty, -/turf/open/floor/plating, -/area/maintenance/department/medical/morgue) -"gdu" = ( -/obj/structure/toilet{ - dir = 4 - }, -/obj/structure/mirror{ - pixel_y = 32 - }, -/obj/structure/sink{ - dir = 1; - pixel_y = 25 - }, -/obj/machinery/button/door{ - id = "LockerShitter2"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - pixel_x = 14; - pixel_y = 38; - specialfunctions = 4 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/mineral/titanium/blue, -/area/crew_quarters/toilet/locker) -"gfD" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/carpet, -/area/crew_quarters/cryopod) -"ggg" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/turf/open/space, -/area/solar/starboard/aft) -"ghs" = ( -/obj/structure/table/wood/fancy, -/obj/machinery/light, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = -3; - pixel_y = 20 - }, -/obj/item/reagent_containers/food/condiment/peppermill{ - dir = 1; - pixel_x = 3; - pixel_y = 20 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4; - pixel_y = 5 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"ghJ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/sign/warning/fire{ - desc = "A sign that states the labeled room's number."; - icon_state = "roomnum"; - name = "Room Number 1"; - pixel_x = -30; - pixel_y = -7 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"ghY" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"gjf" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/wood, -/area/bridge/meeting_room) -"gjl" = ( -/turf/closed/wall, -/area/quartermaster/warehouse) -"gjC" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"gtL" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/turf/closed/wall/r_wall, -/area/engine/gravity_generator) -"gwd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/circuit) -"gwi" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"gBo" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/wood, -/area/maintenance/bar) -"gCe" = ( -/obj/effect/spawner/lootdrop/keg, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"gFD" = ( -/obj/structure/table/wood/fancy/royalblue, -/obj/item/crowbar/red, -/turf/open/floor/plating, -/area/maintenance/port) -"gIO" = ( -/obj/structure/bed, -/obj/effect/spawner/lootdrop/bedsheet, -/turf/open/floor/plating, -/area/security/prison) -"gJg" = ( -/turf/closed/wall/mineral/titanium, -/area/space/nearstation) -"gKk" = ( -/obj/machinery/vr_sleeper{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/crew_quarters/fitness) -"gLH" = ( -/obj/machinery/door/airlock/external{ - name = "External Access"; - req_access_txt = "13" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"gMl" = ( -/obj/structure/chair/wood/normal{ - dir = 4 - }, -/turf/open/floor/wood, -/area/maintenance/bar) -"gOZ" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/turf/open/floor/plating, -/area/crew_quarters/fitness) -"gQn" = ( -/obj/machinery/light/small, -/turf/open/floor/mineral/titanium/blue, -/area/crew_quarters/dorms) -"gSH" = ( -/obj/structure/grille, -/turf/closed/wall/r_wall, -/area/space/nearstation) -"gVX" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/closed/wall/r_wall, -/area/engine/engine_smes) -"gVY" = ( +"daI" = ( /obj/structure/reagent_dispensers/foamtank, /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -54178,488 +53214,20 @@ /obj/effect/turf_decal/stripes/box, /turf/open/floor/plasteel, /area/engine/atmos) -"gWd" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/construction) -"gXs" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"gZG" = ( -/obj/structure/closet/crate/freezer/surplus_limbs, -/obj/item/reagent_containers/glass/beaker/synthflesh, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/medical/sleeper) -"haz" = ( -/obj/machinery/autolathe{ - name = "public autolathe" - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"haX" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "holoprivacy"; - name = "Holodeck Shutters" - }, -/turf/open/floor/plating, -/area/crew_quarters/fitness) -"hcd" = ( -/obj/machinery/smartfridge/organ/preloaded, -/turf/closed/wall, -/area/medical/sleeper) -"hdb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"hdp" = ( -/obj/structure/table, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, +"dbU" = ( /obj/structure/light_construct{ - dir = 8 + dir = 1 }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"hfe" = ( -/obj/structure/sign/poster/contraband/smoke{ - desc = "This poster reminds us all that the Detective is a parasite. Year after year, they must get replacement lungs because of their addiction. "; - pixel_y = -32 - }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"hgX" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ +"dce" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, -/obj/machinery/light/small, -/obj/structure/extinguisher_cabinet{ - pixel_x = 5; - pixel_y = -32 - }, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/crew_quarters/fitness) -"hik" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/space, -/area/solar/starboard/aft) -"hjw" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/engine/gravity_generator) -"hkg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/crew_quarters/dorms) -"hlY" = ( -/obj/machinery/door/airlock{ - name = "Recharging Station" - }, -/turf/open/floor/plating, -/area/maintenance/fore/secondary) -"hoo" = ( -/obj/effect/landmark/carpspawn, -/turf/open/space/basic, -/area/space) -"htr" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"hvS" = ( -/obj/effect/landmark/stationroom/box/engine, -/turf/open/space/basic, -/area/space) -"hwu" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"hzw" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/structure/window{ - dir = 1 - }, -/obj/structure/window{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) -"hzR" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"hKF" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/storage/tech) -"hMx" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"hRa" = ( -/obj/structure/table/reinforced, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/cell_charger{ - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white, -/area/science/circuit) -"hRz" = ( -/obj/structure/chair/comfy/brown{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"hRT" = ( -/obj/effect/landmark/blobstart, -/turf/open/floor/plating, -/area/maintenance/department/electrical) -"hRX" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"hSU" = ( -/obj/structure/chair/sofa/left, -/obj/structure/window{ - dir = 1 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"hVw" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"hWn" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/engine/gravity_generator) -"hYW" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/fore/secondary) -"hZH" = ( -/obj/machinery/hydroponics/constructable, -/obj/item/radio/intercom{ - name = "Station Intercom (General)"; - pixel_x = 29 - }, -/turf/open/floor/plasteel/dark, -/area/hydroponics) -"idX" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"iep" = ( -/obj/structure/mirror{ - pixel_y = 32 - }, -/obj/structure/sink{ - dir = 1; - pixel_y = 25 - }, -/obj/structure/toilet{ - dir = 4 - }, -/turf/open/floor/mineral/titanium/blue, -/area/crew_quarters/dorms) -"ier" = ( -/obj/machinery/button/door{ - id = "Room Two"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - pixel_x = 7; - pixel_y = -24; - specialfunctions = 4 - }, -/obj/structure/chair/comfy/brown{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) -"igT" = ( -/obj/structure/table/wood/poker, -/obj/item/toy/cards/deck{ - pixel_y = 5 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"ihm" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/junction/flip, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"ihC" = ( -/obj/item/chair/wood, -/turf/open/floor/plating, -/area/maintenance/port) -"iiW" = ( -/turf/open/floor/wood, -/area/maintenance/bar) -"ilJ" = ( -/obj/effect/turf_decal/tile/red, -/obj/machinery/light{ - light_color = "#c9d3e8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) -"imH" = ( -/obj/structure/falsewall, -/turf/open/floor/plating, -/area/maintenance/bar) -"ioB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/effect/landmark/start/mime, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/crew_quarters/theatre) -"ioG" = ( -/obj/machinery/vending/cola/red, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"ioX" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"ipc" = ( -/obj/machinery/door/airlock/engineering{ - name = "Gravity Generator"; - req_access_txt = "11" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/engine_smes) -"ipA" = ( -/turf/open/floor/plating, -/area/maintenance/department/medical/morgue) -"iqw" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel, -/area/security/brig) -"isy" = ( -/obj/structure/urinal{ - pixel_y = 32 - }, -/turf/open/floor/mineral/titanium/blue, -/area/crew_quarters/toilet) -"itG" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/plasteel/white, -/area/science/circuit) -"itT" = ( -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) -"ium" = ( -/mob/living/simple_animal/bot/cleanbot{ - name = "C.L.E.A.N." - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"ivF" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/light{ - dir = 8; - light_color = "#e8eaff" - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"iyC" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-06" - }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/hallway/secondary/entry) -"izv" = ( -/obj/machinery/vending/clothing, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/wood, -/area/maintenance/bar) -"iEx" = ( -/obj/structure/table/wood, -/obj/machinery/light{ - dir = 4 - }, -/obj/item/instrument/trombone, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"iEI" = ( -/obj/machinery/vending/autodrobe/all_access, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"iEJ" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod One" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/hallway/secondary/entry) -"iES" = ( -/obj/structure/fireplace, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) -"iFL" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/crew_quarters/theatre) -"iMG" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-14" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) -"iNn" = ( -/obj/machinery/camera{ - c_tag = "Kitchen Cold Room" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/reagent_dispensers/cooking_oil, -/turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/kitchen) -"iOt" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/sign/poster/contraband/free_drone{ - pixel_y = 32 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"iOV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/light_construct{ - dir = 4 - }, +/obj/machinery/meter, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"iRJ" = ( +"dev" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, @@ -54680,150 +53248,67 @@ }, /turf/open/floor/plating, /area/maintenance/port) -"iVU" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/spawner/structure/window, -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/crew_quarters/cryopod) -"iWa" = ( -/obj/structure/closet/crate, -/obj/item/book/manual/wiki/telescience, -/obj/item/book/manual/wiki/engineering_guide, -/obj/item/book/manual/wiki/engineering_construction, -/obj/item/book/manual/wiki/atmospherics, -/obj/item/book/manual/wiki/detective, -/obj/item/book/manual/wiki/tcomms, -/obj/item/book/manual/wiki/engineering_singulo_tesla, -/obj/item/book/manual/wiki/experimentor, -/obj/item/book/manual/wiki/research_and_development, -/obj/item/book/manual/wiki/robotics_cyborgs, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/book/manual/wiki/medicine, -/obj/item/book/manual/wiki/medical_cloning, -/obj/item/book/manual/wiki/infections, -/obj/item/book/manual/ripley_build_and_repair, -/obj/item/book/manual/hydroponics_pod_people, -/obj/item/book/manual/wiki/toxins, -/obj/item/book/manual/wiki/grenades, -/obj/item/book{ - desc = "An undeniably handy book."; - icon_state = "bookknock"; - name = "A Simpleton's Guide to Safe-cracking with Stethoscopes" - }, -/turf/open/floor/wood, -/area/library) -"iWk" = ( -/obj/structure/bookcase{ - name = "Forbidden Knowledge" - }, -/turf/open/floor/carpet, -/area/library) -"iYz" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/theatre) -"jaa" = ( -/obj/machinery/hydroponics/constructable, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/hydroponics) -"jbf" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, +"dfh" = ( /obj/machinery/power/apc{ - areastring = "/area/hallway/secondary/service"; - dir = 1; - name = "Service Hall APC"; - pixel_y = 25 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/service) -"jdT" = ( -/turf/open/floor/carpet, -/area/crew_quarters/dorms) -"jeR" = ( -/obj/structure/chair/sofa/left, -/turf/open/floor/plasteel, -/area/security/prison) -"jeT" = ( -/obj/machinery/vending/clothing, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"jgm" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 + areastring = "/area/science/circuit"; + name = "Circuitry Lab APC"; + pixel_x = 30 }, /obj/effect/turf_decal/stripes/line{ - dir = 6 + dir = 4 }, -/obj/machinery/camera{ - c_tag = "Circuitry Lab"; - dir = 8; - network = list("ss13","rd") +/obj/structure/cable{ + icon_state = "0-8" }, /turf/open/floor/plasteel, /area/science/circuit) -"jgv" = ( -/obj/structure/chair/comfy/brown{ - color = "#596479"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"jhF" = ( -/obj/effect/turf_decal/stripes/line{ +"dfL" = ( +/obj/structure/reagent_dispensers/keg/gargle, +/turf/open/floor/wood, +/area/maintenance/bar) +"dgz" = ( +/turf/closed/wall, +/area/crew_quarters/cryopod) +"dgO" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/light{ - dir = 4; - light_color = "#c1caff" - }, -/turf/open/floor/plasteel, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, /area/engine/gravity_generator) -"jiR" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ +"diq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"dly" = ( +/obj/machinery/door/window/southright{ + name = "Target Storage" + }, +/obj/item/target/alien, +/obj/item/target/alien, +/obj/item/target/syndicate, +/turf/open/floor/plating, +/area/security/prison) +"dml" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"dqb" = ( +/obj/structure/bed, +/obj/item/bedsheet/random, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/window, -/obj/structure/window{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) -"jlm" = ( -/obj/machinery/rnd/production/techfab/department/cargo, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"jly" = ( +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"dqu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/maintenance/disposal/incinerator) +"dsC" = ( /obj/structure/chair/stool{ pixel_y = 8 }, @@ -54834,65 +53319,273 @@ icon_state = "carpetsymbol" }, /area/crew_quarters/theatre) -"jmC" = ( -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) -"jnm" = ( -/obj/machinery/power/smes{ - charge = 5e+006 +"dtx" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/structure/mirror{ + pixel_x = 25 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet) +"dvc" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/cryopod) +"dvO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/closed/wall, +/area/science/circuit) +"dyS" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"dzi" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/carpet, +/area/crew_quarters/cryopod) +"dBm" = ( +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"dCV" = ( +/obj/structure/table, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/recharger, +/obj/item/gun/energy/laser/practice, +/obj/item/gun/energy/laser/practice, +/turf/open/floor/plasteel, +/area/security/prison) +"dKP" = ( +/turf/closed/wall, +/area/maintenance/bar) +"dKV" = ( +/obj/structure/chair/stool/bar, +/turf/open/floor/wood, +/area/maintenance/bar) +"dLG" = ( +/obj/machinery/door/airlock/security{ + name = "Firing Range"; + req_access_txt = "2" }, /obj/structure/cable{ - icon_state = "0-8" + icon_state = "1-2" }, /turf/open/floor/plasteel, -/area/engine/gravity_generator) -"jnX" = ( -/obj/machinery/door/airlock/external{ - name = "Common Mining Shuttle Bay" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/hallway/secondary/entry) -"job" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/door/window/westright{ - name = "Red Corner" - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) -"jqv" = ( -/obj/structure/chair/wood/normal{ - dir = 1 - }, -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, -/area/maintenance/bar) -"jrE" = ( +/area/security/prison) +"dMZ" = ( /obj/structure/sign/poster/official/random{ - pixel_x = 32 + pixel_y = 32 }, /turf/open/floor/plasteel/white, /area/science/circuit) -"jsy" = ( +"dPk" = ( +/obj/structure/closet{ + name = "Costume Closet" + }, +/obj/item/clothing/head/russobluecamohat, +/obj/item/clothing/head/russobluecamohat, +/obj/item/clothing/head/helmet/rus_ushanka, +/obj/item/clothing/head/helmet/rus_ushanka, +/obj/item/clothing/head/helmet/rus_ushanka, +/obj/item/clothing/head/helmet/rus_ushanka, +/obj/item/clothing/under/mw2_russian_para, +/obj/item/clothing/under/mw2_russian_para, +/obj/item/clothing/under/mw2_russian_para, +/obj/item/clothing/under/mw2_russian_para, +/obj/item/clothing/shoes/jackboots, +/obj/item/clothing/shoes/jackboots, +/obj/item/clothing/shoes/jackboots, +/obj/item/clothing/shoes/jackboots, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"dTI" = ( +/obj/structure/urinal{ + pixel_y = 32 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet) +"dVU" = ( +/turf/open/floor/plating, +/area/space/nearstation) +"dXq" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"eaI" = ( +/obj/structure/table/reinforced, +/obj/item/radio/intercom{ + pixel_x = -30 + }, +/obj/item/stock_parts/cell/high, +/obj/item/stock_parts/cell/high, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"eaR" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/space, +/area/solar/starboard/fore) +"edA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-04" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"efO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating, +/area/space/nearstation) +"egt" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/requests_console{ + department = "Bar"; + departmentType = 2; + pixel_x = -30; + pixel_y = 45; + receive_ore_updates = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"eih" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"elh" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"enB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/security/execution/transfer) +"epC" = ( +/obj/machinery/door/airlock{ + desc = "To keep the station within regulations, space IKEA requires one storage cupboard for their Nanotrasen partnership to continue."; + id_tag = "MaintDorm1"; + name = "Furniture Storage" + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/port) +"epD" = ( +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/structure/chair/sofa/right{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"eqd" = ( +/obj/item/electropack/shockcollar, +/obj/item/assembly/signaler, +/turf/open/floor/plating, +/area/security/prison) +"eqA" = ( +/obj/machinery/shower{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/security/prison) +"esZ" = ( +/obj/machinery/door/airlock{ + desc = "Private study room where nerds are probably playing Dungeons and Dragons 13e, or a place for blood cult rituals."; + id_tag = "PrivateStudy"; + name = "Private Study" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/library) +"evR" = ( +/turf/open/floor/plating, +/area/maintenance/bar) +"ewu" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness) +"exP" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-14" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"eyM" = ( +/obj/machinery/mineral/ore_redemption{ + input_dir = 2; + output_dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"eAJ" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"eBX" = ( +/obj/machinery/vending/cola/space_up, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"eCr" = ( /obj/structure/closet{ name = "Suit Closet" }, @@ -54916,61 +53609,1168 @@ /obj/item/clothing/under/lawyer/really_black, /obj/item/clothing/under/lawyer/red, /turf/open/floor/plasteel, -/area/crew_quarters/locker) -"jtk" = ( -/obj/structure/chair/comfy/black{ +/area/crew_quarters/fitness) +"eCR" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) +"eEe" = ( +/obj/machinery/door/airlock{ + name = "Theatre Backstage"; + req_access_txt = "46" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"eFW" = ( +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"eHI" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal/incinerator) +"eHU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/security/prison) +"eJa" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/cards/deck{ + pixel_y = 5 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"eQb" = ( +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"eRz" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space/basic, +/area/space/nearstation) +"eSe" = ( +/obj/structure/closet/secure_closet/personal/cabinet{ + desc = "Swipe your ID on the closet to claim it. First come first serve, this one is wooden and fancy. Store your stuff here."; + name = "Personal ID-Locked Closet"; + pixel_y = 15 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"eVC" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/crew_quarters/cryopod) +"eVL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/light_switch{ + pixel_y = 28 + }, +/obj/machinery/light{ dir = 1 }, /turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"jtU" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, -/area/security/execution/transfer) -"jvN" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/area/quartermaster/miningdock) +"fcn" = ( +/obj/structure/lattice, +/turf/closed/wall/r_wall, +/area/ai_monitored/nuke_storage) +"fcG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/science/mixing) +"fde" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"jwi" = ( +/area/security/brig) +"feE" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/starboard/fore) +"feG" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, /turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"jzi" = ( +/area/crew_quarters/bar) +"fgG" = ( +/obj/structure/table/wood, +/obj/machinery/requests_console{ + department = "Theatre"; + name = "theatre RC"; + pixel_x = -32 + }, +/obj/item/reagent_containers/food/snacks/baguette, +/obj/item/toy/dummy, +/obj/item/lipstick/random{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/lipstick/random{ + pixel_x = -2; + pixel_y = -2 + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/crew_quarters/theatre) +"fjS" = ( +/obj/structure/closet/radiation, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"flc" = ( +/obj/structure/table/reinforced, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"flE" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"fne" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/landmark/start/mime, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/crew_quarters/theatre) +"fnC" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"fpl" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness) +"fpI" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-06" + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/entry) +"fsj" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/power/apc{ + areastring = "/area/security/main"; + dir = 4; + name = "Firing Range APC"; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"ftE" = ( +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"fup" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"fvY" = ( +/obj/machinery/computer/cryopod{ + pixel_y = 26 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/cryopod) +"fxa" = ( +/obj/structure/chair/wood/normal, +/turf/open/floor/wood{ + icon_state = "wood-broken4" + }, +/area/maintenance/bar) +"fxe" = ( +/obj/structure/chair/sofa, +/obj/structure/window{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"fxV" = ( +/turf/closed/wall/r_wall, +/area/hallway/primary/central) +"fzd" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel, +/area/hydroponics) +"fAj" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/sign/poster/official/love_ian{ + pixel_x = 32; + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"fBy" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) +"fCx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "holoprivacy"; + name = "Holodeck Privacy"; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"fFA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"fGf" = ( +/obj/machinery/smartfridge/disks{ + pixel_y = 2 + }, +/obj/structure/table, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"fHG" = ( +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"fIs" = ( /obj/structure/grille, /obj/structure/lattice, /turf/open/floor/plating, /area/space/nearstation) -"jzD" = ( -/obj/structure/piano{ - icon_state = "piano" +"fKl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/science/circuit) +"fMZ" = ( +/obj/item/radio/intercom{ + dir = 4; + name = "Station Intercom (General)"; + pixel_x = 27 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"fOA" = ( +/obj/machinery/door/airlock{ + name = "Theatre Backstage"; + req_access_txt = "46" }, /turf/open/floor/wood, -/area/crew_quarters/bar) -"jAD" = ( -/obj/structure/grille, -/turf/open/floor/plating/airless, +/area/crew_quarters/theatre) +"fOI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-18" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"fTg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"fTC" = ( +/obj/structure/filingcabinet, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"fZm" = ( +/obj/structure/chair/sofa/left, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"gbd" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"gbh" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness) +"gbq" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plating, +/area/construction) +"gbu" = ( +/obj/structure/bed, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/plating, +/area/security/prison) +"gbT" = ( +/obj/structure/table, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/glass/fifty, +/turf/open/floor/plating, +/area/maintenance/department/medical/morgue) +"gcF" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/light_construct{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"gfr" = ( +/obj/structure/bed, +/turf/open/floor/plating, +/area/maintenance/port) +"gfC" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"gfD" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/carpet, +/area/crew_quarters/cryopod) +"ghq" = ( +/obj/structure/lattice/catwalk, +/obj/item/stack/marker_beacon{ + anchored = 1; + icon_state = "markerburgundy-on"; + light_color = "#FA644B"; + light_power = 3; + light_range = 3; + name = "Docking Beacon"; + picked_color = "Burgundy" + }, +/turf/open/floor/plating, /area/space/nearstation) -"jBZ" = ( +"ghD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"gjl" = ( +/turf/closed/wall, +/area/quartermaster/warehouse) +"gnf" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/departments/custodian{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"gpD" = ( +/obj/machinery/light_switch{ + pixel_y = 28 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/circuit, +/area/ai_monitored/nuke_storage) +"grA" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness) +"gwd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/circuit) +"gxc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"gzf" = ( +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted{ + dir = 4 + }, +/obj/structure/curtain, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/dorms) +"gBo" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"gCC" = ( +/obj/structure/sign/poster/contraband/tools, +/turf/closed/wall, +/area/storage/primary) +"gDl" = ( +/obj/effect/landmark/carpspawn, +/turf/open/space/basic, +/area/space) +"gIU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plating, +/area/space/nearstation) +"gJi" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"gLH" = ( +/obj/machinery/door/airlock/external{ + name = "External Access"; + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"gMl" = ( +/obj/structure/chair/wood/normal{ + dir = 4 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"gNC" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/wood, +/area/bridge/meeting_room) +"gOZ" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness) +"gQX" = ( +/obj/machinery/button/door{ + desc = "Alright, GAMER! Want to take your PWRGAME addiction to the MAX? Just smash this button with your chubby chetto encrusted hands an- oh, you broke the switch. Good job, idiot."; + id = "RIPFUN"; + name = "Powerful Gamer Toggle"; + normaldoorcontrol = 1; + pixel_x = -24; + pixel_y = 7; + specialfunctions = 4 + }, +/obj/structure/table_frame/wood, +/turf/open/floor/plating, +/area/maintenance/port) +"gRZ" = ( +/obj/structure/bookcase{ + name = "Forbidden Knowledge" + }, +/turf/open/floor/carpet, +/area/library) +"gTx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"gUu" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) +"gWd" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/construction) +"gXs" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"gZG" = ( +/obj/structure/closet/crate/freezer/surplus_limbs, +/obj/item/reagent_containers/glass/beaker/synthflesh, +/turf/open/floor/plasteel/white/side{ + dir = 8 + }, +/area/medical/sleeper) +"haL" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) +"haM" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = -29 + }, /obj/structure/cable{ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/structure/cable{ - icon_state = "1-8" +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"hcb" = ( +/turf/open/floor/carpet, +/area/crew_quarters/theatre) +"hcA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"hew" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, /obj/structure/cable{ - icon_state = "1-4" + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/port) +"hgO" = ( +/obj/structure/table, +/obj/item/storage/pill_bottle/dice{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/reagent_containers/food/snacks/cherrycupcake, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"hiV" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/maintenance/department/electrical) +"hlV" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/crew_quarters/dorms) +"hnl" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/closed/wall, +/area/maintenance/port) +"hnU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plating, +/area/security/prison) +"hrF" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space, +/area/solar/port/aft) +"hsb" = ( +/obj/structure/table/wood, +/obj/item/book/codex_gigas, +/obj/item/clothing/under/suit_jacket/red, +/obj/structure/destructible/cult/tome, +/turf/open/floor/carpet, +/area/library) +"hse" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating, +/area/space/nearstation) +"hBA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/table, +/obj/item/storage/firstaid/regular{ + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"hGH" = ( +/obj/machinery/door/airlock{ + desc = "Private study room where nerds are probably playing Dungeons and Dragons 13e, or a place for blood cult rituals."; + id_tag = "PrivateStudy"; + name = "Private Study" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/wood, +/area/library) +"hHQ" = ( +/obj/structure/cable{ + icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"hIL" = ( +/obj/structure/sign/poster/contraband/space_up{ + pixel_x = -32; + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"hIM" = ( +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"hOv" = ( +/obj/structure/table/wood/fancy, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4; + pixel_y = 5 + }, +/obj/item/reagent_containers/food/snacks/burger/plain, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"hPs" = ( +/obj/structure/fireplace, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 23 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"hPP" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/closed/wall, +/area/quartermaster/warehouse) +"hRa" = ( +/obj/structure/table/reinforced, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/cell_charger{ + pixel_y = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"hRI" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) +"hSZ" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"hWd" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"idK" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"iiW" = ( +/turf/open/floor/wood, +/area/maintenance/bar) +"ijG" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/window, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"ikk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"ikm" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"imH" = ( +/obj/structure/falsewall, +/turf/open/floor/plating, +/area/maintenance/bar) +"inR" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/theatre) +"iou" = ( +/obj/machinery/light/small, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/dorms) +"ipA" = ( +/turf/open/floor/plating, +/area/maintenance/department/medical/morgue) +"itG" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"itK" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 3; + name = "3maintenance loot spawner" + }, +/obj/structure/light_construct{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"itQ" = ( +/obj/machinery/door/window/southleft{ + name = "Target Storage" + }, +/obj/item/target/clown, +/obj/item/target/clown, +/obj/item/target, +/obj/item/target, +/turf/open/floor/plating, +/area/security/prison) +"ium" = ( +/mob/living/simple_animal/bot/cleanbot{ + name = "C.L.E.A.N." + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"iuR" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"iwB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall, +/area/maintenance/port) +"izv" = ( +/obj/machinery/vending/clothing, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"iDo" = ( +/obj/structure/grille, +/turf/open/space/basic, +/area/space/nearstation) +"iDS" = ( +/obj/docking_port/stationary{ + dir = 8; + dwidth = 3; + height = 5; + id = "commonmining_home"; + name = "SS13: Common Mining Dock"; + roundstart_template = /datum/map_template/shuttle/mining_common/meta; + width = 7 + }, +/turf/open/space/basic, +/area/space) +"iEJ" = ( +/obj/machinery/door/airlock/external{ + name = "Escape Pod One" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"iHk" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) +"iNn" = ( +/obj/machinery/camera{ + c_tag = "Kitchen Cold Room" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/reagent_dispensers/cooking_oil, +/turf/open/floor/plasteel/showroomfloor, +/area/crew_quarters/kitchen) +"iTq" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/theatre) +"iTU" = ( +/obj/structure/piano{ + icon_state = "piano" + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"iVU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/spawner/structure/window, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/crew_quarters/cryopod) +"iWx" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance, +/obj/item/coin/silver, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"jaF" = ( +/obj/machinery/light/small, +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"jaH" = ( +/obj/structure/door_assembly/door_assembly_mai, +/obj/item/electronics/airlock, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) +"jbf" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/hallway/secondary/service"; + dir = 1; + name = "Service Hall APC"; + pixel_y = 25 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"jex" = ( +/obj/machinery/smartfridge/organ/preloaded, +/turf/closed/wall, +/area/medical/sleeper) +"jez" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"jgm" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/camera{ + c_tag = "Circuitry Lab"; + dir = 8; + network = list("ss13","rd") + }, +/turf/open/floor/plasteel, +/area/science/circuit) +"jgA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"jjC" = ( +/obj/structure/table/wood, +/obj/item/toy/cards/deck, +/turf/open/floor/plasteel, +/area/security/prison) +"jkx" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/computer/slot_machine, +/obj/item/coin/iron, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"jkz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) +"jlm" = ( +/obj/machinery/rnd/production/techfab/department/cargo, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"jls" = ( +/obj/machinery/door/airlock/security{ + name = "Labor Shuttle"; + req_access_txt = "2" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/security/processing) +"jmV" = ( +/obj/structure/table/wood/fancy, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/item/reagent_containers/food/drinks/britcup{ + desc = "Kingston's personal cup."; + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"jqv" = ( +/obj/structure/chair/wood/normal{ + dir = 1 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken7" + }, +/area/maintenance/bar) +"jrE" = ( +/obj/structure/sign/poster/official/random{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"juG" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchen"; + name = "kitchen shutters" + }, +/obj/item/reagent_containers/food/snacks/bluecherrycupcake{ + pixel_y = 5 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"jvd" = ( +/obj/structure/closet/athletic_mixed, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"jxF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/maintenance/port) +"jAD" = ( +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"jAN" = ( +/obj/machinery/vr_sleeper{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white/side{ + dir = 8 + }, +/area/crew_quarters/fitness) +"jBi" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness) +"jBA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) "jCq" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -54983,22 +54783,46 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"jDY" = ( -/obj/structure/chair{ +"jEc" = ( +/obj/machinery/vr_sleeper{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"jFy" = ( -/obj/machinery/door/airlock{ - desc = "Private study room where nerds are probably playing Dungeons and Dragons 13e, or a place for blood cult rituals."; - id_tag = "PrivateStudy"; - name = "Private Study" +/turf/open/floor/plasteel/white/corner{ + dir = 1 }, -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/library) +/area/crew_quarters/fitness) +"jFH" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"jGW" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"jHh" = ( +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "jHt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment{ @@ -55012,10 +54836,23 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"jHM" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/security/prison) +"jIs" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space, +/area/solar/starboard/fore) +"jJg" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4; + pixel_y = 5 + }, +/obj/structure/chair/sofa{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "jJF" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable{ @@ -55023,53 +54860,42 @@ }, /turf/open/floor/wood, /area/maintenance/port/aft) -"jLM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, +"jKP" = ( +/obj/structure/disposalpipe/segment, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, /turf/open/floor/plating, -/area/maintenance/fore) -"jMK" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"jNo" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plating, -/area/space/nearstation) -"jRy" = ( -/obj/machinery/door/airlock{ - name = "Instrument Storage" - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/fore) -"jSa" = ( -/obj/item/electropack/shockcollar, -/obj/item/assembly/signaler, -/turf/open/floor/plating, -/area/security/prison) -"jSD" = ( -/obj/machinery/door/airlock/security{ - name = "Firing Range"; - req_access_txt = "2" +/area/maintenance/fore/secondary) +"jLn" = ( +/obj/machinery/door/airlock/engineering{ + name = "Gravity Generator"; + req_access_txt = "11" }, /obj/structure/cable{ icon_state = "1-2" }, /turf/open/floor/plasteel, +/area/engine/engine_smes) +"jLT" = ( +/obj/machinery/button/door{ + id = "Room Two"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 7; + pixel_y = -24; + specialfunctions = 4 + }, +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"jRw" = ( +/obj/machinery/computer/arcade/minesweeper{ + dir = 4 + }, +/turf/open/floor/plasteel, /area/security/prison) "jSO" = ( /obj/machinery/light{ @@ -55089,65 +54915,71 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"jXg" = ( -/obj/machinery/power/apc{ - areastring = "/area/ai_monitored/nuke_storage"; - dir = 1; - name = "Vault APC"; - pixel_y = 25 - }, +"jZT" = ( /obj/structure/cable{ - icon_state = "0-2" + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/light{ - dir = 1 +/obj/machinery/door/poddoor/preopen{ + id = "maint2" }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"kaq" = ( +/turf/closed/wall/mineral/titanium, +/area/space/nearstation) +"kdP" = ( /obj/structure/cable{ icon_state = "2-8" }, -/turf/open/floor/circuit, -/area/ai_monitored/nuke_storage) -"jYI" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/security/prison) +"ker" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"keM" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/washing_machine, +/turf/open/floor/plasteel/freezer, +/area/security/prison) +"kfv" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/storage/tech) +"kfX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) -"kay" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/snacks/bluecherrycupcake{ - pixel_y = 5 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"kcj" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ +/turf/closed/wall/r_wall, +/area/engine/engine_smes) +"kgr" = ( +/obj/machinery/light/small{ + brightness = 3; dir = 8 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"kdm" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/plating, /area/security/prison) -"kel" = ( -/obj/effect/landmark/blobstart, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"kfE" = ( -/obj/machinery/computer/libraryconsole/bookmanagement, -/obj/structure/table, -/turf/open/floor/plasteel, -/area/security/prison) "khb" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -55158,22 +54990,6 @@ /obj/item/reagent_containers/glass/bucket, /turf/open/floor/plasteel, /area/hallway/secondary/service) -"khA" = ( -/obj/structure/table, -/obj/item/instrument/guitar{ - pixel_x = -7 - }, -/obj/item/instrument/eguitar{ - pixel_x = 5 - }, -/obj/item/instrument/violin, -/obj/item/instrument/trombone, -/obj/item/instrument/saxophone, -/obj/item/instrument/piano_synth, -/obj/item/instrument/recorder, -/obj/item/instrument/accordion, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "khB" = ( /obj/machinery/door/airlock/external{ req_access_txt = "13" @@ -55183,10 +54999,37 @@ }, /turf/open/floor/plating, /area/maintenance/fore/secondary) -"klu" = ( +"khV" = ( +/obj/machinery/vending/cola/red, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"kls" = ( /obj/structure/lattice, -/turf/open/space/basic, -/area/space) +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"kmw" = ( +/obj/structure/chair/comfy/black{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"kmS" = ( +/obj/item/flashlight/lamp/green{ + pixel_x = -3; + pixel_y = 22 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4; + pixel_y = 5 + }, +/obj/structure/dresser{ + desc = "There's plenty of clothes here to change into! It has a surprising amount of variety, too."; + name = "Dresser"; + pixel_y = 7 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) "knx" = ( /obj/machinery/door/airlock/public/glass{ name = "Central Access" @@ -55215,75 +55058,57 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"ksn" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, +"kqI" = ( /obj/structure/window, -/obj/effect/turf_decal/tile/blue{ - dir = 1 +/turf/open/floor/wood, +/area/crew_quarters/bar) +"ktP" = ( +/obj/machinery/power/smes{ + charge = 5e+006 }, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"ktS" = ( +/turf/open/space/basic, +/area/space/nearstation) +"kvl" = ( +/obj/structure/grille, +/turf/closed/wall/r_wall, +/area/space/nearstation) +"kvL" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) -"kuY" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/poddoor/preopen{ - id = "maint2" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"kvb" = ( -/obj/structure/shuttle/engine/heater{ - dir = 1 - }, -/turf/closed/wall/mineral/titanium, -/area/space/nearstation) -"kvZ" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"kwy" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/requests_console{ - department = "Bar"; - departmentType = 2; - pixel_x = -30; - pixel_y = 45; - receive_ore_updates = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"kxc" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"kyi" = ( -/obj/structure/bed, -/obj/machinery/button/door{ - id = "Dorm5"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - pixel_y = -25; - specialfunctions = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/spawner/lootdrop/bedsheet, /turf/open/floor/wood, -/area/crew_quarters/dorms) +/area/bridge/meeting_room) +"kxf" = ( +/obj/machinery/vr_sleeper{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/crew_quarters/fitness) "kyF" = ( /obj/effect/landmark/xeno_spawn, /turf/open/floor/wood, @@ -55292,91 +55117,83 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, /area/science/mixing) -"kCk" = ( -/obj/structure/mirror{ - pixel_y = 32 +"kAH" = ( +/obj/machinery/camera{ + c_tag = "Bar West"; + dir = 4 }, -/obj/structure/sink{ - dir = 1; - pixel_y = 25 - }, -/turf/open/floor/mineral/titanium/blue, -/area/crew_quarters/toilet) -"kCW" = ( -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"kDD" = ( -/obj/structure/lattice, -/turf/closed/wall/r_wall, -/area/ai_monitored/nuke_storage) -"kHJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "holoprivacy"; - name = "Holodeck Shutters" - }, -/turf/open/floor/plating, -/area/crew_quarters/fitness) -"kHK" = ( -/obj/machinery/button/door{ - desc = "Bolts the doors to the Private Study."; - id = "PrivateStudy"; - name = "Private Study Lock"; - pixel_x = 25; - pixel_y = 25; - req_access_txt = ""; - req_one_access_txt = "28;63" +/obj/machinery/computer/arcade/orion_trail, +/obj/structure/sign/poster/official/foam_force_ad{ + pixel_x = -32 }, /turf/open/floor/wood, -/area/library) -"kJr" = ( -/obj/effect/turf_decal/stripes/line{ +/area/crew_quarters/bar) +"kAJ" = ( +/obj/machinery/portable_atmospherics/pump, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"kAO" = ( +/obj/structure/chair/sofa{ + dir = 1 + }, +/obj/structure/window, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"kCo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ dir = 8 }, -/turf/open/floor/plating, -/area/security/prison) -"kJY" = ( -/obj/item/flashlight/lamp/green{ - pixel_x = -3; - pixel_y = 22 - }, -/obj/structure/dresser{ - desc = "There's plenty of clothes here to change into! It has a surprising amount of variety, too."; - name = "Dresser"; - pixel_y = 7 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"kKw" = ( -/obj/structure/lattice/catwalk, +/turf/open/floor/plasteel, +/area/crew_quarters/theatre) +"kEY" = ( +/obj/effect/landmark/stationroom/box/engine, +/turf/open/space/basic, +/area/space) +"kGJ" = ( /obj/structure/cable{ icon_state = "4-8" }, -/turf/open/space, -/area/solar/port/aft) -"kLR" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - desc = "Privacy shutters for the Private Study. Stops people spying in on your game."; - id = "PrivateStudy1"; - name = "Private Study Privacy Shutters" +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/effect/spawner/structure/window, -/turf/open/floor/wood, -/area/library) -"kOf" = ( -/obj/structure/chair{ - dir = 8 +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/machinery/light/small{ - dir = 4; - light_color = "#d8b1b1" +/obj/structure/cable{ + icon_state = "1-4" }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"kMt" = ( +/obj/structure/lattice, +/turf/closed/wall, +/area/security/prison) +"kNv" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/free_drone{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "kPd" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/structure/cable{ @@ -55384,6 +55201,13 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/service) +"kPj" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/junction/flip, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "kQk" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance{ @@ -55393,254 +55217,32 @@ /obj/item/storage/toolbox/electrical, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) -"kQZ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "holoprivacy"; - name = "Holodeck Shutters" - }, +"kQO" = ( +/obj/structure/reagent_dispensers/keg/semen, /turf/open/floor/plating, -/area/crew_quarters/fitness) -"kRk" = ( -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, -/obj/machinery/light{ - dir = 4; - light_color = "#e8eaff" - }, -/obj/structure/chair/sofa/right{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"kRw" = ( -/obj/effect/landmark/start/roboticist, -/turf/open/floor/plasteel/white, -/area/science/robotics/lab) +/area/maintenance/bar) "kSb" = ( /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/quartermaster/miningdock) -"kSh" = ( -/obj/item/radio/intercom{ - name = "Station Intercom (General)"; - pixel_y = -29 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"kSB" = ( -/obj/machinery/atmospherics/components/unary/tank/air{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"kTz" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/bridge/meeting_room) -"kWI" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/window{ +"kWp" = ( +/obj/structure/shuttle/engine/heater{ dir = 1 }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/locker) -"lhg" = ( -/obj/machinery/vending/clothing, -/obj/structure/disposalpipe/segment{ - dir = 4 +/turf/closed/wall/mineral/titanium, +/area/space/nearstation) +"kYk" = ( +/obj/machinery/door/firedoor, +/obj/structure/sign/departments/evac{ + pixel_y = 32 }, /turf/open/floor/plasteel, -/area/crew_quarters/locker) -"lmi" = ( -/obj/structure/door_assembly/door_assembly_mai, -/obj/item/electronics/airlock, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) -"lnu" = ( -/obj/structure/chair/wood/normal{ - dir = 4 - }, -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, -/area/maintenance/bar) -"lwj" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/soda_cans/starkist{ - pixel_x = 5; - pixel_y = 7 - }, -/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb{ - pixel_x = -3; - pixel_y = 2 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"lwp" = ( -/obj/structure/chair/stool{ - pixel_y = 8 - }, -/turf/open/floor/carpet{ - icon_state = "carpetsymbol" - }, -/area/crew_quarters/theatre) -"lwY" = ( -/obj/machinery/door/window/westleft{ - base_state = "right"; - icon_state = "right"; - name = "Unisex Showers" - }, -/turf/open/floor/plasteel/freezer, +/area/hallway/primary/starboard) +"laq" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel, /area/security/prison) -"lxx" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/crew_quarters/bar) -"lAB" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall, -/area/science/circuit) -"lBE" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"lCi" = ( -/obj/docking_port/stationary/public_mining_dock{ - dir = 8 - }, -/turf/open/floor/plating, -/area/construction/mining/aux_base) -"lCB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating, -/area/space/nearstation) -"lCL" = ( -/turf/open/space/basic, -/area/space/nearstation) -"lFl" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "holoprivacy"; - name = "Holodeck Shutters" - }, -/turf/open/floor/plating, -/area/crew_quarters/fitness) -"lLt" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/space/nearstation) -"lLI" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"lMg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/science/circuit) -"lMx" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall, -/area/crew_quarters/dorms) -"lMY" = ( -/obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/ausbushes/sparsegrass, -/obj/structure/flora/ausbushes/ppflowers, -/obj/structure/flora/ausbushes/ywflowers, -/obj/structure/flora/ausbushes/brflowers, -/obj/effect/spawner/structure/window, -/turf/open/floor/grass, -/area/crew_quarters/bar) -"lNB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/space/nearstation) -"lQG" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/science/circuit) -"lTq" = ( -/obj/structure/table, -/obj/item/folder/blue, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"lYU" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/sign/departments/security{ - pixel_x = -32; - pixel_y = -32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) -"lYZ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/junction, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"maC" = ( -/obj/structure/table, -/obj/item/storage/pill_bottle/dice{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/reagent_containers/food/snacks/cherrycupcake, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"mbD" = ( +"lip" = ( /obj/structure/closet{ name = "Suit Closet" }, @@ -55664,108 +55266,142 @@ /obj/item/clothing/under/lawyer/really_black, /obj/item/clothing/under/lawyer/red, /turf/open/floor/plasteel, +/area/crew_quarters/locker) +"lnu" = ( +/obj/structure/chair/wood/normal{ + dir = 4 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken6" + }, +/area/maintenance/bar) +"lsk" = ( +/obj/machinery/vending/autodrobe/all_access, +/turf/open/floor/plasteel, /area/crew_quarters/fitness) -"mfb" = ( -/obj/structure/toilet{ +"ltK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"lva" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"lyR" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/security/prison) +"lAB" = ( +/obj/structure/sign/nanotrasen, +/turf/closed/wall, +/area/science/circuit) +"lCi" = ( +/obj/docking_port/stationary/public_mining_dock{ + dir = 8 + }, +/turf/open/floor/plating, +/area/construction/mining/aux_base) +"lGV" = ( +/obj/machinery/button/door{ + id = "maintdiy"; + name = "Shutters Control Button"; + pixel_x = -6; + pixel_y = 24 + }, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) +"lMg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/science/circuit) +"lOe" = ( +/obj/machinery/shower{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, /area/crew_quarters/dorms) +"lPr" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "applebush" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"lQG" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/science/circuit) +"lSa" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/crew_quarters/theatre) +"lUS" = ( +/obj/structure/table/wood/fancy/black, +/obj/machinery/light/small, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"lXE" = ( +/obj/structure/sign/warning/fire{ + desc = "A sign that states the labeled room's number."; + dir = 5; + icon_state = "roomnum"; + name = "Room Number 7"; + pixel_y = 24 + }, +/obj/structure/chair/sofa/right, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"lZl" = ( +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance, +/obj/item/coin/gold, +/obj/item/coin/gold, +/obj/item/coin/gold, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"mbU" = ( +/obj/machinery/vr_sleeper{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/crew_quarters/fitness) +"mcp" = ( +/obj/structure/target_stake, +/obj/item/target/syndicate, +/turf/open/floor/plating, +/area/security/prison) "mjr" = ( /obj/structure/reagent_dispensers/keg/milk, /turf/open/floor/wood, /area/crew_quarters/bar) -"mlr" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/light_construct{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"moq" = ( -/obj/structure/chair/comfy/brown{ - dir = 1 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"mpI" = ( -/obj/structure/table/wood, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, -/area/maintenance/bar) -"mqa" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"mqZ" = ( -/obj/structure/reagent_dispensers/keg/aphro/strong, -/obj/item/reagent_containers/glass/beaker, -/turf/open/floor/plating, -/area/maintenance/bar) -"mrR" = ( -/obj/effect/spawner/lootdrop/keg, -/turf/open/floor/wood, -/area/maintenance/bar) -"mte" = ( -/obj/structure/extinguisher_cabinet, -/turf/closed/wall/r_wall, -/area/hallway/primary/central) -"mwO" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"myt" = ( -/obj/structure/closet/secure_closet/personal/cabinet{ - desc = "Swipe your ID on the closet to claim it. First come first serve, this one is wooden and fancy. Store your stuff here."; - name = "Personal ID-Locked Closet"; - pixel_y = 15 - }, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) -"mCq" = ( -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) -"mEN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) -"mHC" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) -"mIS" = ( -/obj/structure/table, -/obj/item/clothing/gloves/boxing/yellow, -/obj/item/clothing/gloves/boxing/green, -/obj/item/clothing/gloves/boxing/blue, -/obj/item/clothing/gloves/boxing/blue, -/obj/item/clothing/gloves/boxing, -/obj/item/clothing/gloves/boxing, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) -"mNi" = ( -/obj/machinery/light_switch{ - pixel_x = -20 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white, -/area/science/circuit) -"mPE" = ( -/obj/machinery/chem_dispenser/drinks, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/maintenance/bar) -"mQR" = ( +"mkv" = ( /obj/machinery/camera{ c_tag = "Gravity Generator Room"; dir = 8 @@ -55776,6 +55412,211 @@ }, /turf/open/floor/plasteel, /area/engine/gravity_generator) +"mkO" = ( +/obj/machinery/door/airlock{ + name = "Shower Room" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/toilet) +"mnC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/security/prison) +"moD" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/snacks/bluecherrycupcake{ + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"mps" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"mpI" = ( +/obj/structure/table/wood, +/turf/open/floor/wood{ + icon_state = "wood-broken5" + }, +/area/maintenance/bar) +"mqZ" = ( +/obj/structure/reagent_dispensers/keg/aphro/strong, +/obj/item/reagent_containers/glass/beaker, +/turf/open/floor/plating, +/area/maintenance/bar) +"mrR" = ( +/obj/effect/spawner/lootdrop/keg, +/turf/open/floor/wood, +/area/maintenance/bar) +"mse" = ( +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/structure/chair/sofa/left, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"mvt" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"myh" = ( +/obj/structure/piano, +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"mzB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/window, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"mAH" = ( +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"mGw" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/security/prison) +"mHU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/light_construct{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"mIZ" = ( +/obj/structure/falsewall, +/turf/open/floor/plating, +/area/security/prison) +"mJo" = ( +/obj/structure/door_assembly/door_assembly_mai, +/obj/item/electronics/airlock, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"mJG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"mNi" = ( +/obj/machinery/light_switch{ + pixel_x = -20 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"mNW" = ( +/obj/structure/sign/poster/official/fruit_bowl{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/primary/starboard) +"mOB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/engineering/glass{ + name = "Gravity Generator"; + req_access_txt = "11" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"mOO" = ( +/obj/structure/chair/sofa/left{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"mPk" = ( +/obj/structure/bed, +/obj/machinery/button/door{ + id = "Dorm5"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"mPr" = ( +/obj/structure/rack, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/effect/decal/cleanable/cobweb, +/obj/item/clothing/under/color/grey, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"mPt" = ( +/obj/structure/table, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/item/clothing/glasses/sunglasses{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/clothing/glasses/sunglasses{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/clothing/ears/earmuffs{ + pixel_x = -3; + pixel_y = -2 + }, +/obj/item/clothing/ears/earmuffs{ + pixel_x = -3; + pixel_y = -2 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"mPE" = ( +/obj/machinery/chem_dispenser/drinks, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/maintenance/bar) +"mQS" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) "mRe" = ( /obj/machinery/light{ dir = 8 @@ -55783,134 +55624,109 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/science/circuit) -"mTp" = ( -/obj/structure/chair/sofa/left, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 +"mRQ" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"mXB" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"ncj" = ( -/obj/effect/turf_decal/tile/blue, -/obj/structure/sign/poster/contraband/fun_police{ - pixel_x = 32 +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"mTG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) -"ndC" = ( /obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, /turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"nea" = ( -/obj/machinery/recharge_station, -/turf/open/floor/plating, -/area/maintenance/fore/secondary) -"neb" = ( -/obj/item/radio/intercom{ - pixel_y = 25 +/area/crew_quarters/locker) +"nbT" = ( +/obj/structure/cable{ + icon_state = "0-8" }, -/turf/open/floor/plasteel, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/turf/open/floor/plating, /area/hallway/primary/central) -"nel" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "holoprivacy"; - name = "Holodeck Shutters" - }, +"ndq" = ( /turf/open/floor/plating, -/area/crew_quarters/fitness) -"new" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/security/prison) -"neC" = ( +/area/crew_quarters/abandoned_gambling_den) +"nez" = ( /obj/structure/table/wood, -/obj/item/toy/cards/deck, -/turf/open/floor/plasteel, -/area/security/prison) +/obj/item/instrument/piano_synth, +/turf/open/floor/wood, +/area/crew_quarters/theatre) "nfm" = ( /obj/machinery/vending/autodrobe, /turf/open/floor/wood, /area/maintenance/bar) -"nie" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Holodeck Door" +"ngs" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) -"nlt" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"nmx" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"nmS" = ( -/obj/structure/closet/athletic_mixed, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"nrR" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"nsJ" = ( -/obj/machinery/door/airlock{ - desc = "Private study room where nerds are probably playing Dungeons and Dragons 13e, or a place for blood cult rituals."; - id_tag = "PrivateStudy"; - name = "Private Study" - }, -/obj/machinery/door/firedoor, /turf/open/floor/wood, -/area/library) -"ntf" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/area/crew_quarters/theatre) +"ngV" = ( +/obj/structure/table/wood, +/obj/item/instrument/guitar, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"nhY" = ( +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 4; + name = "4maintenance loot spawner" }, -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"nuV" = ( -/obj/structure/chair/stool{ - pixel_y = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"nkP" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 8; + name = "8maintenance loot spawner" + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"noy" = ( +/obj/structure/sign/poster/contraband/smoke{ + desc = "This poster reminds us all that the Detective is a parasite. Year after year, they must get replacement lungs because of their addiction. "; + pixel_y = -32 + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"noF" = ( +/obj/machinery/door/airlock{ + name = "Instrument Storage" + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/fore) +"nsA" = ( +/turf/closed/wall, +/area/crew_quarters/abandoned_gambling_den) +"nuw" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 4; + name = "4maintenance loot spawner" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"nwX" = ( +/obj/structure/grille/broken, +/turf/open/floor/plating/airless, +/area/space/nearstation) "nxv" = ( /obj/machinery/power/apc{ areastring = "/area/construction"; @@ -55922,13 +55738,13 @@ }, /turf/open/floor/plating, /area/construction) -"nyH" = ( -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 +"nGf" = ( +/obj/machinery/hydroponics/constructable, +/obj/machinery/light{ + dir = 1 }, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) +/turf/open/floor/plasteel/dark, +/area/hydroponics) "nGt" = ( /obj/structure/cable{ icon_state = "1-2" @@ -55940,51 +55756,74 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"nGS" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +"nGI" = ( +/obj/machinery/door/airlock/external{ + name = "Common Mining Shuttle Bay" }, -/obj/effect/turf_decal/tile/blue{ - alpha = 255; - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"nIE" = ( -/obj/structure/sign/poster/contraband/tools, -/turf/closed/wall, -/area/storage/primary) -"nLf" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/turf/open/floor/wood, -/area/bridge/meeting_room) -"nMx" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/vault, -/obj/structure/cable{ - icon_state = "1-2" +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"nLu" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"nLw" = ( +/obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/window{ + dir = 1 + }, +/obj/structure/window{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"nQi" = ( +/obj/machinery/recharge_station, +/turf/open/floor/plating, +/area/maintenance/fore/secondary) +"nRG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"nSt" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 }, /obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"nUV" = ( +/obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel, +/area/hydroponics) +"nXE" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"nOS" = ( +/area/hallway/primary/central) +"nYe" = ( /obj/structure/safe, /obj/item/clothing/head/bearpelt, /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, @@ -56004,266 +55843,228 @@ /obj/item/gun/ballistic/revolver/nagant, /turf/open/floor/plasteel/dark, /area/ai_monitored/nuke_storage) -"nQr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall, -/area/maintenance/port) -"nRG" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"nTE" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/gravity_generator) -"nWq" = ( -/obj/machinery/door/airlock/engineering{ - name = "Gravity Generator"; - req_access_txt = "11" - }, +"nZE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, /turf/open/floor/plasteel, -/area/engine/gravity_generator) -"nXa" = ( -/obj/machinery/light{ - dir = 4; - light_color = "#e8eaff" +/area/crew_quarters/dorms) +"oax" = ( +/obj/structure/table/wood/fancy, +/obj/machinery/light, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3; + pixel_y = 20 }, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) +/obj/item/reagent_containers/food/condiment/peppermill{ + dir = 1; + pixel_x = 3; + pixel_y = 20 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4; + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"obc" = ( +/obj/structure/chair/sofa/right, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) "oce" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, /turf/open/floor/plasteel/white, /area/science/mixing) +"ocv" = ( +/obj/structure/table, +/obj/item/clothing/gloves/boxing/yellow, +/obj/item/clothing/gloves/boxing/green, +/obj/item/clothing/gloves/boxing/blue, +/obj/item/clothing/gloves/boxing/blue, +/obj/item/clothing/gloves/boxing, +/obj/item/clothing/gloves/boxing, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) "odx" = ( /obj/machinery/vending/kink, /turf/open/floor/plating, /area/maintenance/bar) -"oeJ" = ( -/obj/structure/table/wood, -/obj/item/instrument/violin, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"oeQ" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"ohX" = ( -/obj/structure/table/wood, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/turf/open/floor/wood, -/area/security/vacantoffice) -"olr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white, -/area/science/circuit) -"olv" = ( -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers, -/turf/open/floor/plasteel, -/area/security/brig) -"olw" = ( -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 4; - name = "4maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"oma" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +"ofU" = ( +/obj/structure/chair/comfy/black{ dir = 4 }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"orw" = ( -/obj/structure/table, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, +"old" = ( /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/recharger, -/obj/item/gun/energy/laser/practice, -/obj/item/gun/energy/laser/practice, -/turf/open/floor/plasteel, -/area/security/prison) -"ory" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) -"otF" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = 5; +/obj/structure/sign/departments/security{ + pixel_x = -32; pixel_y = -32 }, /turf/open/floor/plasteel, -/area/hallway/primary/central) -"ouD" = ( -/obj/structure/reagent_dispensers/keg/semen, -/turf/open/floor/plating, -/area/maintenance/bar) -"oBp" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/maintenance/port) -"oDy" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-04" - }, +/area/hallway/primary/fore) +"olr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"oFk" = ( -/obj/structure/closet/boxinggloves, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"oHU" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, /area/science/circuit) -"oKh" = ( -/obj/structure/chair/wood/normal{ - dir = 8 +"omY" = ( +/obj/item/flashlight/lamp/green{ + pixel_x = -3; + pixel_y = 22 }, -/turf/open/floor/wood, -/area/maintenance/bar) -"oMY" = ( -/obj/machinery/button/door{ - desc = "Alright, GAMER! Want to take your PWRGAME addiction to the MAX? Just smash this button with your chubby chetto encrusted hands an- oh, you broke the switch. Good job, idiot."; - id = "RIPFUN"; - name = "Powerful Gamer Toggle"; - normaldoorcontrol = 1; - pixel_x = -24; - pixel_y = 7; - specialfunctions = 4 +/obj/structure/dresser{ + desc = "There's plenty of clothes here to change into! It has a surprising amount of variety, too."; + name = "Dresser"; + pixel_y = 7 }, -/obj/structure/table_frame/wood, /turf/open/floor/plating, /area/maintenance/port) -"oNb" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +"oqj" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness) +"oqO" = ( /obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/item/reagent_containers/food/drinks/soda_cans/starkist{ - pixel_x = -3; - pixel_y = 5 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"oNQ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /obj/machinery/light{ dir = 4; light_color = "#c1caff" }, /turf/open/floor/plasteel, /area/engine/gravity_generator) -"oOb" = ( -/obj/structure/sign/poster/official/cohiba_robusto_ad, -/turf/closed/wall, -/area/lawoffice) -"oSO" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +"ouQ" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_y = 6 + }, +/obj/item/pen/fountain, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"oxm" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/sparsegrass, +/obj/structure/flora/ausbushes/ppflowers, +/obj/structure/flora/ausbushes/ywflowers, +/obj/structure/flora/ausbushes/brflowers, +/obj/effect/spawner/structure/window, +/turf/open/floor/grass, +/area/crew_quarters/bar) +"oyl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/structure/chair/sofa, -/obj/item/radio/intercom{ - pixel_y = 25 +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"oUh" = ( -/obj/structure/disposalpipe/trunk{ +/obj/effect/turf_decal/tile/blue, +/obj/machinery/door/window/eastleft{ + name = "Blue Corner" + }, +/obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/machinery/disposal/bin, -/turf/open/floor/plasteel/white, -/area/science/circuit) -"oXL" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/security/prison) -"oYc" = ( -/obj/machinery/light/small{ - dir = 4; - light_color = "#d8b1b1" +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, /turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"phu" = ( +/area/crew_quarters/locker) +"oyz" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4; pixel_y = 5 }, /turf/open/floor/wood, /area/crew_quarters/theatre) -"phH" = ( -/turf/open/floor/grass, -/area/security/prison) -"phY" = ( +"oyN" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/space/nearstation) +"oyX" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 4; + name = "Air In" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/fore/secondary) +"oAb" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/red{ - dir = 1 +/turf/closed/wall, +/area/crew_quarters/bar) +"oAB" = ( +/obj/structure/fireplace, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"oDN" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 +/turf/open/floor/plating, +/area/crew_quarters/fitness) +"oEZ" = ( +/obj/effect/spawner/lootdrop/keg, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"oHB" = ( +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"oHU" = ( +/obj/structure/cable{ + icon_state = "1-2" }, /turf/open/floor/plasteel, -/area/crew_quarters/locker) -"pjh" = ( +/area/science/circuit) +"oIJ" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"oIW" = ( +/obj/structure/toilet{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/dorms) +"oKh" = ( +/obj/structure/chair/wood/normal{ + dir = 8 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"oLl" = ( /obj/structure/cable{ icon_state = "4-8" }, @@ -56272,10 +56073,96 @@ }, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) -"poa" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ +"oLn" = ( +/obj/machinery/light/small{ dir = 4 }, +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, +/turf/open/floor/plating, +/area/maintenance/fore/secondary) +"oTW" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/theatre) +"oUh" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"oZl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/closet/wardrobe/pjs, +/obj/item/clothing/under/maid, +/obj/item/clothing/under/maid, +/obj/item/clothing/under/janimaid, +/obj/item/clothing/under/janimaid, +/obj/item/clothing/accessory/maidapron, +/obj/item/clothing/accessory/maidapron, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"pem" = ( +/obj/machinery/button/door{ + desc = "Bolts the doors to the Private Study."; + id = "PrivateStudy"; + name = "Private Study Lock"; + pixel_x = 25; + pixel_y = 25; + req_access_txt = ""; + req_one_access_txt = "28;63" + }, +/turf/open/floor/wood, +/area/library) +"pfm" = ( +/obj/structure/sign/poster/official/twelve_gauge, +/turf/closed/wall/r_wall, +/area/ai_monitored/security/armory) +"pgf" = ( +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/dorms) +"pgn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/security/prison) +"plm" = ( +/obj/structure/reagent_dispensers/watertank/high, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/box, +/turf/open/floor/plasteel, +/area/engine/atmos) +"plC" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, /turf/open/floor/wood, /area/crew_quarters/bar) "poc" = ( @@ -56287,85 +56174,71 @@ }, /turf/open/floor/plasteel, /area/science/mixing) -"ppY" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/sign/poster/official/love_ian{ - pixel_x = 32; - pixel_y = -32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"pqR" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"prP" = ( -/obj/structure/grille, -/turf/open/space/basic, -/area/space/nearstation) -"prU" = ( -/obj/item/radio/intercom{ +"pou" = ( +/obj/machinery/light{ dir = 4; - name = "Station Intercom (General)"; - pixel_x = 27 + light_color = "#e8eaff" }, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) -"ptV" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/heads/captain) -"puG" = ( -/obj/structure/rack, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/effect/decal/cleanable/cobweb, -/obj/item/clothing/under/color/grey, /turf/open/floor/plating, -/area/maintenance/port/aft) -"pxD" = ( +/area/crew_quarters/abandoned_gambling_den) +"pqe" = ( /obj/structure/chair/sofa, /obj/structure/window{ dir = 1 }, +/obj/effect/landmark/start/assistant, /turf/open/floor/wood, /area/crew_quarters/bar) -"pzk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 +"pqs" = ( +/obj/machinery/vending/clothing, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/structure/table, -/obj/item/coin/gold, /turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"pAl" = ( -/obj/machinery/light/small, -/obj/machinery/atmospherics/components/unary/tank/air{ +/area/crew_quarters/locker) +"psk" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/bridge/meeting_room) +"pst" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/vault, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"puh" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ dir = 8 }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"pFt" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "0-2" +/obj/machinery/light/small, +/obj/structure/extinguisher_cabinet{ + pixel_x = 5; + pixel_y = -32 }, -/turf/open/space, -/area/solar/starboard/aft) +/turf/open/floor/plasteel/white/side{ + dir = 1 + }, +/area/crew_quarters/fitness) +"pBp" = ( +/obj/effect/landmark/event_spawn, +/turf/closed/wall, +/area/crew_quarters/fitness) +"pFX" = ( +/obj/structure/table/wood/fancy, +/obj/item/reagent_containers/food/drinks/soda_cans/starkist{ + pixel_x = -3; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "pHl" = ( /obj/structure/table, /obj/item/storage/box/beakers{ @@ -56392,12 +56265,31 @@ }, /turf/open/floor/plasteel/white, /area/medical/sleeper) -"pHo" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +"pHO" = ( +/obj/effect/turf_decal/tile/blue, +/obj/structure/sign/poster/contraband/fun_police{ + pixel_x = 32 }, /turf/open/floor/plasteel, -/area/hydroponics) +/area/hallway/primary/fore) +"pIf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/crew_quarters/theatre) +"pJR" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/floor/wood, +/area/library) "pLn" = ( /obj/machinery/conveyor/inverted{ dir = 5; @@ -56405,88 +56297,7 @@ }, /turf/open/floor/plating, /area/maintenance/disposal) -"pLt" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/power/apc{ - areastring = "/area/security/main"; - dir = 4; - name = "Firing Range APC"; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"pNH" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/window, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"pNI" = ( -/obj/effect/turf_decal/bot, -/obj/structure/sign/poster/official/pda_ad{ - pixel_y = -32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"pPE" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/machinery/door/window/eastleft{ - name = "Blue Corner" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) -"pQr" = ( -/obj/structure/table, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/item/clothing/glasses/sunglasses{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/clothing/glasses/sunglasses{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/clothing/ears/earmuffs{ - pixel_x = -3; - pixel_y = -2 - }, -/obj/item/clothing/ears/earmuffs{ - pixel_x = -3; - pixel_y = -2 - }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"pQD" = ( -/obj/structure/sign/poster/official/ion_rifle, -/turf/closed/wall/r_wall, -/area/ai_monitored/security/armory) -"pSf" = ( +"pPi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, @@ -56498,361 +56309,13 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) -"pTn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/terminal, -/turf/closed/wall/r_wall, -/area/engine/gravity_generator) -"pTR" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"pUl" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/command{ - name = "Command Access To Vault"; - req_access = "19" - }, -/turf/open/floor/plasteel/dark, -/area/bridge/meeting_room) -"pZv" = ( -/obj/machinery/shower{ - dir = 8 - }, -/turf/open/floor/mineral/titanium/blue, -/area/crew_quarters/dorms) -"qbx" = ( -/obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/drinks/soda_cans/starkist{ - pixel_x = -3; - pixel_y = 5 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"qeQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/science/circuit) -"qje" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) -"qkC" = ( -/obj/machinery/power/apc{ - areastring = "/area/maintenance/starboard/fore"; - dir = 1; - name = "Starboard Bow Maintenance APC"; - pixel_y = 24 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"qlr" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/window{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) -"qlF" = ( -/obj/structure/lattice, -/turf/closed/wall, -/area/security/prison) -"qmM" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"qoP" = ( -/obj/machinery/airalarm{ - pixel_y = 23 - }, -/obj/structure/chair/sofa/left, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) -"qpA" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/sign/poster/official/cohiba_robusto_ad{ - pixel_y = -32 - }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"qux" = ( -/obj/structure/chair/sofa/left{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"quT" = ( -/obj/structure/lattice, -/obj/structure/grille/broken, -/turf/open/space/basic, -/area/space/nearstation) -"qvM" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/circuit, -/area/ai_monitored/nuke_storage) -"qwe" = ( -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/crew_quarters/theatre) -"qwB" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Gravity Generator"; - req_access_txt = "11" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel/dark, -/area/engine/gravity_generator) -"qxc" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/machinery/computer/slot_machine, -/obj/item/coin/iron, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"qAQ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/table, -/obj/item/storage/firstaid/regular{ - pixel_y = 5 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"qBc" = ( -/turf/open/floor/carpet, -/area/crew_quarters/theatre) -"qBe" = ( -/obj/structure/chair/comfy/black{ - dir = 8 - }, +"pPI" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/bridge/meeting_room) -"qEv" = ( -/obj/structure/table/wood/fancy, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/item/reagent_containers/food/drinks/britcup{ - desc = "Kingston's personal cup."; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"qHB" = ( -/obj/structure/chair/stool{ - pixel_y = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/carpet{ - icon_state = "carpetsymbol" - }, -/area/crew_quarters/theatre) -"qIf" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/bar) -"qIw" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/crew_quarters/cryopod) -"qJZ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/carpet, -/area/crew_quarters/theatre) -"qMu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating, -/area/security/prison) -"qNs" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - on = 0; - pixel_x = -7; - pixel_y = 12 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) -"qOf" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"qQJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/crew_quarters/theatre) -"qUm" = ( -/obj/structure/filingcabinet/employment, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"qXH" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"rcD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/closed/wall/r_wall, -/area/science/circuit) -"reZ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall/r_wall, -/area/engine/engine_smes) -"rfW" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"rgF" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance, -/obj/item/coin/silver, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"rhb" = ( -/obj/machinery/vending/cola/space_up, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"riA" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Firing Range"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"riB" = ( -/obj/machinery/door/firedoor, -/obj/structure/sign/departments/evac{ - pixel_y = 32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) -"rmX" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/beer, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"rsv" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/space, -/area/solar/starboard/fore) -"rsX" = ( -/obj/effect/turf_decal/tile/red, -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) -"rtT" = ( -/obj/structure/chair/comfy/brown{ - color = "#66b266"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"rvZ" = ( -/obj/structure/target_stake, -/obj/item/target/syndicate, -/turf/open/floor/plating, -/area/security/prison) -"rzg" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/heads/captain) -"rBq" = ( -/obj/item/clothing/head/kitty, -/obj/item/clothing/under/maid, -/obj/item/clothing/mask/muzzle, -/turf/open/floor/plating, -/area/maintenance/bar) -"rEV" = ( +/area/engine/gravity_generator) +"pQp" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -56861,56 +56324,410 @@ }, /turf/open/floor/plating, /area/crew_quarters/fitness) -"rFc" = ( -/obj/machinery/door/airlock{ - desc = "To keep the station within regulations, space IKEA requires one storage cupboard for their Nanotrasen partnership to continue."; - id_tag = "MaintDorm1"; - name = "Furniture Storage" +"pRs" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 }, -/turf/open/floor/plasteel/dark, -/area/maintenance/port) -"rHa" = ( -/obj/docking_port/stationary{ - dir = 8; - dwidth = 3; - height = 5; - id = "commonmining_home"; - name = "SS13: Common Mining Dock"; - roundstart_template = /datum/map_template/shuttle/mining_common/meta; - width = 7 +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" }, -/turf/open/space/basic, -/area/space) -"rKc" = ( +/turf/open/floor/plating, +/area/crew_quarters/fitness) +"pTB" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ icon_state = "0-2" }, /turf/open/space, -/area/solar/port/fore) +/area/solar/starboard/aft) +"qaY" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"qcm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/captain) +"qeb" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/abandoned_gambling_den"; + name = "Abandoned Gambling Den APC"; + pixel_y = -24 + }, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) +"qeQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/circuit) +"qfk" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/window, +/obj/structure/window{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"qfD" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + desc = "Privacy shutters for the Private Study. Stops people spying in on your game."; + id = "PrivateStudy1"; + name = "Private Study Privacy Shutters" + }, +/obj/effect/spawner/structure/window, +/turf/open/floor/wood, +/area/library) +"qje" = ( +/obj/structure/sign/mining{ + pixel_y = 7 + }, +/turf/closed/wall, +/area/quartermaster/miningdock) +"qmn" = ( +/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/structure/table, +/turf/open/floor/plasteel, +/area/security/prison) +"qqs" = ( +/obj/structure/mirror{ + pixel_y = 32 + }, +/obj/structure/sink{ + dir = 1; + pixel_y = 25 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet) +"qus" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchen"; + name = "kitchen shutters" + }, +/obj/item/reagent_containers/food/snacks/cheesynachos{ + pixel_y = 5 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"quT" = ( +/obj/structure/lattice, +/obj/structure/grille/broken, +/turf/open/space/basic, +/area/space/nearstation) +"qAm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/light/small, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"qBi" = ( +/obj/structure/lattice, +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/captain) +"qIw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/cryopod) +"qJr" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/space, +/area/solar/port/aft) +"qLR" = ( +/obj/structure/mirror{ + pixel_y = 32 + }, +/obj/structure/sink{ + dir = 1; + pixel_y = 25 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/dorms) +"qOc" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/camera{ + c_tag = "VR Sleepers"; + dir = 1 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel/white/side{ + dir = 1 + }, +/area/crew_quarters/fitness) +"qOB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/captain) +"qTG" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/crew_quarters/theatre) +"qTV" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-22" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"qVP" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) +"qXg" = ( +/obj/structure/chair/sofa/left, +/turf/open/floor/plasteel, +/area/security/prison) +"rcD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/science/circuit) +"rdG" = ( +/obj/machinery/hydroponics/constructable, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = 29 + }, +/turf/open/floor/plasteel/dark, +/area/hydroponics) +"reA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/vending/kink, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"rfW" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/maintenance/disposal/incinerator) +"rjQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"rmN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/structure/chair/comfy/brown, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"rmX" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/beer, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"rnt" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/bridge/meeting_room) +"rnK" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 1 + }, +/turf/open/space/basic, +/area/space/nearstation) +"rqf" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"rqk" = ( +/obj/structure/reagent_dispensers/water_cooler, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"rqE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"rqW" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/dresser, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/theatre"; + dir = 8; + name = "Theatre APC"; + pixel_x = -25 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/theatre) +"rrM" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/structure/closet/wardrobe/black, +/obj/item/clothing/under/skirt/black, +/obj/item/clothing/head/beret/black, +/obj/item/clothing/head/beret/black, +/obj/item/clothing/under/trendy_fit, +/obj/item/clothing/under/trendy_fit, +/obj/item/clothing/under/sundress, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"rtl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/camera{ + c_tag = "Bar Backroom" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"ruo" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"rvr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"rvS" = ( +/obj/structure/chair/comfy/brown{ + color = "#66b266"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"ryr" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"rBq" = ( +/obj/item/clothing/head/kitty, +/obj/item/clothing/under/maid, +/obj/item/clothing/mask/muzzle, +/turf/open/floor/plating, +/area/maintenance/bar) +"rGq" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"rIA" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) "rKP" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, /turf/open/floor/plating, /area/construction) -"rLr" = ( -/obj/structure/window, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"rLR" = ( -/obj/structure/sign/poster/contraband/space_up{ - pixel_x = -32; - pixel_y = 32 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"rMc" = ( -/obj/structure/table/wood/fancy/black, -/obj/machinery/light/small, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) "rMN" = ( /obj/structure/bed, /obj/item/tank/internals/anesthetic, @@ -56933,38 +56750,32 @@ }, /turf/open/floor/plasteel, /area/science/mixing) -"rOm" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 23 - }, -/turf/open/floor/mineral/titanium/blue, -/area/crew_quarters/toilet) -"rTQ" = ( -/obj/machinery/vr_sleeper{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ +"rPU" = ( +/turf/open/floor/plasteel/white/side{ dir = 4 }, +/area/crew_quarters/theatre) +"rTu" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/command{ + name = "Command Access To Vault"; + req_access = "19" + }, +/turf/open/floor/plasteel/dark, +/area/bridge/meeting_room) +"rXl" = ( +/obj/structure/chair/office/light, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, /obj/effect/turf_decal/stripes/line{ - dir = 1 + dir = 9 }, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/crew_quarters/fitness) -"rUQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plating, -/area/space/nearstation) +/turf/open/floor/plasteel, +/area/engine/gravity_generator) "saK" = ( /obj/structure/closet/crate, /obj/item/target/alien, @@ -56977,60 +56788,54 @@ /obj/item/gun/energy/laser/practice, /turf/open/floor/plasteel/white, /area/science/circuit) -"sdL" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 +"saU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/engine/engine_smes) +"saX" = ( +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/grass, +/area/security/prison) +"sci" = ( +/obj/machinery/vr_sleeper{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/crew_quarters/fitness) +"seP" = ( +/obj/structure/cable{ + icon_state = "0-4" }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "0-8" }, -/turf/open/floor/plasteel/dark, -/area/bridge/meeting_room) -"sfa" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/poddoor/preopen{ + id = "Secure Gate"; + name = "brig shutters" + }, +/obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"sgV" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "Air In" + icon_state = "1-8" }, +/turf/open/floor/plating, +/area/security/brig) +"shR" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/plating, -/area/maintenance/fore/secondary) -"sjm" = ( -/obj/structure/table/wood, -/obj/item/instrument/piano_synth, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"sjw" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/structure/closet/wardrobe/black, -/obj/item/clothing/under/skirt/black, -/obj/item/clothing/head/beret/black, -/obj/item/clothing/head/beret/black, -/obj/item/clothing/under/trendy_fit, -/obj/item/clothing/under/trendy_fit, -/obj/item/clothing/under/sundress, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"sjT" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/security/prison) +/area/space/nearstation) "slk" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" @@ -57043,86 +56848,45 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) -"slp" = ( -/obj/effect/turf_decal/tile/blue{ - alpha = 255 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - alpha = 255; +"spu" = ( +/obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/red{ dir = 8 }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"smn" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"sqp" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/light, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"snG" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/space, -/area/solar/port/aft) -"spX" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/door/airlock/command{ + name = "Captain's Vault Access"; + req_access_txt = "20" }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/captain) -"sqa" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "applebush" +"srG" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) -"srq" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/bridge/meeting_room) -"ssL" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/space, -/area/solar/starboard/fore) -"suI" = ( -/obj/machinery/door/window/southleft{ - name = "Target Storage" - }, -/obj/item/target/clown, -/obj/item/target/clown, -/obj/item/target, -/obj/item/target, /turf/open/floor/plating, -/area/security/prison) -"svw" = ( -/obj/structure/chair{ +/area/crew_quarters/abandoned_gambling_den) +"ssB" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ dir = 4 }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, /turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/area/hallway/primary/starboard) "sxs" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/table, @@ -57136,16 +56900,88 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/service) -"sxX" = ( +"syJ" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/theatre) +"szG" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating{ - icon_state = "panelscorched" +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"sAM" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken6" }, -/area/maintenance/starboard/fore) -"sAI" = ( +/area/maintenance/bar) +"sEi" = ( +/obj/machinery/vr_sleeper{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/crew_quarters/fitness) +"sEt" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken7" + }, +/area/maintenance/bar) +"sEM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness) +"sFW" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/sign/departments/restroom{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"sHx" = ( +/obj/structure/table, +/obj/item/book/manual/hydroponics_pod_people{ + pixel_x = -4; + pixel_y = 5 + }, +/obj/item/paper/guides/jobs/hydroponics{ + pixel_x = -5; + pixel_y = 3 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"sJx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"sJI" = ( /obj/structure/table/wood/fancy, /obj/item/reagent_containers/food/condiment/saltshaker{ pixel_x = -3; @@ -57158,30 +56994,31 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) -"sAM" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken6" +"sLa" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/area/maintenance/bar) -"sEt" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken7" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/area/maintenance/bar) -"sIe" = ( -/obj/structure/sign/poster/official/fruit_bowl{ - pixel_y = 32 +/obj/structure/window{ + dir = 4 }, -/turf/open/floor/plasteel/white/corner{ +/obj/effect/turf_decal/tile/blue{ dir = 1 }, -/area/hallway/primary/starboard) -"sLr" = ( -/obj/structure/table, -/obj/effect/spawner/lootdrop/maintenance, -/obj/item/coin/silver, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"sLj" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) "sLv" = ( /obj/structure/closet, /obj/effect/spawner/lootdrop/maintenance, @@ -57190,17 +57027,13 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"sMa" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +"sNK" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/vending/kink, -/obj/machinery/light{ - dir = 4; - light_color = "#e8eaff" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/turf/open/floor/wood, +/area/crew_quarters/theatre) "sOs" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -57208,9 +57041,38 @@ /obj/machinery/door/airlock/maintenance/abandoned, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"sOA" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"sPT" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"sPY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/engine/engine_smes) "sQX" = ( /turf/open/floor/plating, /area/space) +"sRH" = ( +/obj/machinery/autolathe{ + name = "public autolathe" + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) "sRT" = ( /obj/machinery/vending/cola/random, /turf/open/floor/wood, @@ -57242,52 +57104,56 @@ /obj/machinery/vending/boozeomat/all_access, /turf/closed/wall, /area/maintenance/bar) -"sYv" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 +"sYR" = ( +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" }, -/turf/closed/wall/r_wall, -/area/engine/gravity_generator) -"sZa" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/camera{ - c_tag = "Bar Backroom" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"sZR" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/closed/wall/r_wall, -/area/engine/gravity_generator) +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) "tal" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/hallway/secondary/service) -"tdF" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/light{ +"tgH" = ( +/obj/structure/filingcabinet/employment, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"tif" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plating, -/area/maintenance/port/aft) +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"tkq" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"tkB" = ( +/obj/structure/sign/poster/official/help_others{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) "tkU" = ( /turf/open/floor/wood{ icon_state = "wood-broken5" }, /area/maintenance/bar) +"tmO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/security/prison) "tqg" = ( /obj/machinery/cryopod{ dir = 4 @@ -57297,20 +57163,98 @@ }, /turf/open/floor/carpet, /area/crew_quarters/cryopod) -"tqt" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/chair/comfy/brown{ - dir = 1 +"tqB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/turf/open/floor/wood, -/area/library) +/turf/open/floor/plating, +/area/space/nearstation) "trb" = ( /obj/machinery/light{ dir = 4 }, /turf/open/floor/plasteel, /area/security/courtroom) -"tru" = ( +"ttL" = ( +/obj/structure/sign/poster/contraband/random{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"ttX" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Firing Range"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"tur" = ( +/obj/item/restraints/handcuffs/fake, +/turf/open/floor/plating, +/area/maintenance/bar) +"tvi" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"txm" = ( +/obj/structure/table/wood/fancy/royalblue, +/obj/item/crowbar/red, +/turf/open/floor/plating, +/area/maintenance/port) +"tyX" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"tzQ" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/item/soap, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/dorms) +"tCa" = ( +/obj/structure/table/wood, +/obj/item/instrument/guitar{ + pixel_x = -7 + }, +/obj/item/instrument/eguitar{ + pixel_x = 5 + }, +/obj/item/instrument/violin, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"tCd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + alpha = 255; + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"tJi" = ( /obj/machinery/airalarm{ dir = 4; pixel_x = -22 @@ -57332,248 +57276,106 @@ /obj/item/megaphone/clown, /turf/open/floor/plasteel, /area/crew_quarters/theatre) -"trY" = ( -/obj/structure/sign/poster/contraband/lizard{ - pixel_x = -32 - }, -/obj/structure/sign/poster/contraband/lizard{ - pixel_x = -32 - }, -/obj/structure/sign/poster/contraband/lizard{ - pixel_x = -32 +"tJK" = ( +/obj/machinery/door/airlock/engineering{ + name = "Gravity Generator"; + req_access_txt = "11" }, /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"tsr" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, /turf/open/floor/plasteel, -/area/hydroponics) -"tuj" = ( -/obj/structure/light_construct{ - dir = 1 - }, +/area/engine/gravity_generator) +"tJS" = ( +/obj/effect/spawner/lootdrop/keg, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"tur" = ( -/obj/item/restraints/handcuffs/fake, -/turf/open/floor/plating, -/area/maintenance/bar) -"tuN" = ( -/obj/structure/chair/sofa, -/obj/structure/window{ +"tKk" = ( +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"tAb" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/command{ - name = "Captain's Vault Access"; - req_access_txt = "20" - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/heads/captain) -"tAE" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/table/wood, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = -3; - pixel_y = 20 - }, -/obj/item/reagent_containers/food/condiment/peppermill{ - dir = 1; - pixel_x = 3; - pixel_y = 20 - }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/effect/turf_decal/tile/neutral, -/obj/item/reagent_containers/food/drinks/britcup, +/obj/structure/sign/warning/fire{ + desc = "A sign that states the labeled room's number."; + icon_state = "roomnum"; + name = "Room Number 1"; + pixel_x = -30; + pixel_y = -7 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"tAV" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/crew_quarters/theatre) -"tCi" = ( -/obj/machinery/vr_sleeper{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 4 - }, -/area/crew_quarters/fitness) -"tFt" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"tGG" = ( -/obj/structure/table/wood, -/obj/item/book/codex_gigas, -/obj/item/clothing/under/suit_jacket/red, -/obj/structure/destructible/cult/tome, -/turf/open/floor/carpet, -/area/library) -"tHx" = ( -/obj/machinery/computer/arcade/minesweeper{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"tIk" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "maintdiy"; - name = "Security Shutters" - }, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) -"tIC" = ( -/obj/structure/table/wood, -/obj/item/instrument/guitar{ - pixel_x = -7 - }, -/obj/item/instrument/eguitar{ - pixel_x = 5 - }, -/obj/item/instrument/violin, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"tLl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/security/prison) "tMl" = ( /obj/effect/turf_decal/loading_area, /turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/kitchen) -"tMS" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_y = 6 +"tNF" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 }, -/obj/item/pen/fountain, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"tNJ" = ( -/obj/effect/spawner/structure/window, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) -"tOd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/security/prison) +/turf/open/floor/plasteel, +/area/engine/gravity_generator) "tOq" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, /turf/open/floor/plasteel/white, /area/science/mixing) -"tOU" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/light/small, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) "tPT" = ( /obj/machinery/chem_dispenser/drinks/beer, /obj/structure/table/wood, /turf/open/floor/wood, /area/maintenance/bar) -"tQk" = ( -/turf/open/floor/mineral/titanium/blue, -/area/crew_quarters/dorms) "tRe" = ( /obj/machinery/chem_master, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"tRB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "tRF" = ( /obj/machinery/light/small{ dir = 8 }, /turf/open/floor/wood, /area/maintenance/bar) -"tTW" = ( -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"tUm" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +"tWj" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4; + pixel_y = 5 }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/port) -"tUw" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/carpet, +/turf/open/floor/wood, /area/crew_quarters/theatre) -"tWs" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) -"tWR" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) "tXL" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) +"tZe" = ( +/obj/effect/turf_decal/bot, +/obj/structure/sign/poster/official/pda_ad{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"uaj" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) "uaw" = ( /obj/machinery/power/apc{ areastring = "/area/storage/art"; @@ -57586,37 +57388,380 @@ }, /turf/open/floor/wood, /area/maintenance/bar) -"udi" = ( +"ubj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/door/window/westright{ + name = "Red Corner" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"ucq" = ( +/obj/structure/sign/poster/contraband/red_rum{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"ufD" = ( +/obj/machinery/vr_sleeper{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/crew_quarters/fitness) +"ugu" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"uhm" = ( +/obj/machinery/door/airlock{ + name = "Recharging Station" + }, +/turf/open/floor/plating, +/area/maintenance/fore/secondary) +"ujv" = ( +/obj/structure/sign/departments/restroom, +/turf/closed/wall, +/area/crew_quarters/toilet) +"ujF" = ( +/obj/machinery/cryopod{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/cryopod) +"ujS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"unA" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"unW" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"uoB" = ( +/obj/structure/table/reinforced, +/obj/item/multitool, +/obj/item/screwdriver, +/obj/machinery/camera{ + c_tag = "Circuitry Lab North"; + network = list("ss13","rd") + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"uoG" = ( +/obj/machinery/power/apc{ + areastring = "/area/security/detectives_office"; + dir = 4; + name = "Detective's Office APC"; + pixel_x = 24 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"usO" = ( +/obj/machinery/vending/snack/random, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"uua" = ( +/obj/machinery/atmospherics/components/binary/valve, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"uuG" = ( /obj/structure/cable{ icon_state = "4-8" }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"uve" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/maintenance, +/obj/item/coin/silver, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"uvZ" = ( +/obj/structure/mineral_door/wood, +/turf/open/floor/wood, +/area/maintenance/bar) +"uxY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/junction, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"uBa" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/soda_cans/starkist{ + pixel_x = 5; + pixel_y = 7 + }, +/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb{ + pixel_x = -3; + pixel_y = 2 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"uDO" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/space, +/area/solar/port/fore) +"uEI" = ( /obj/structure/chair/comfy/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"uFp" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/structure/sign/poster/official/cohiba_robusto_ad{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"uGI" = ( +/turf/open/floor/grass, +/area/security/prison) +"uIO" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, /obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"uJx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/theatre) +"uNu" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/science/circuit) +"uOJ" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/vault, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"uPT" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/maintenance/disposal/incinerator) +"uQS" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1; + pixel_x = 5 + }, +/obj/machinery/light/small, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet) +"uRd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/terminal, +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) +"uRS" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/theatre) +"uVS" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"vae" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/space/nearstation) +"vbi" = ( +/obj/structure/table, +/obj/item/instrument/guitar{ + pixel_x = -7 + }, +/obj/item/instrument/eguitar{ + pixel_x = 5 + }, +/obj/item/instrument/violin, +/obj/item/instrument/trombone, +/obj/item/instrument/saxophone, +/obj/item/instrument/piano_synth, +/obj/item/instrument/recorder, +/obj/item/instrument/accordion, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"vbD" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command/glass{ + name = "EVA Storage"; + req_access_txt = "18" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"vcN" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"vda" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/window/westleft{ + base_state = "right"; + dir = 4; + icon_state = "right"; + name = "Shooting Range" + }, +/turf/open/floor/plating, +/area/security/prison) +"vdu" = ( +/obj/structure/table/wood, /obj/machinery/airalarm{ dir = 1; pixel_y = -22 }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"ued" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/turf/open/floor/wood, +/area/security/vacantoffice) +"vhb" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 +/obj/structure/window{ + dir = 1 }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"uhm" = ( +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/locker) +"viF" = ( +/obj/structure/table/wood, +/obj/item/instrument/trumpet, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"vjm" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/rag, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"vmQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness) +"vnI" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -57633,305 +57778,50 @@ }, /turf/open/floor/plating, /area/maintenance/port) -"ujF" = ( -/obj/machinery/cryopod{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/crew_quarters/cryopod) -"uko" = ( +"vob" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "1-4" }, /turf/open/floor/plasteel, -/area/security/brig) -"ukP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"ukS" = ( -/obj/machinery/shower{ - dir = 4 - }, -/obj/item/soap, -/turf/open/floor/mineral/titanium/blue, -/area/crew_quarters/dorms) -"unl" = ( -/obj/item/flashlight/lamp/green{ - pixel_x = -3; - pixel_y = 22 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4; - pixel_y = 5 - }, -/obj/structure/dresser{ - desc = "There's plenty of clothes here to change into! It has a surprising amount of variety, too."; - name = "Dresser"; - pixel_y = 7 - }, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) -"unu" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/washing_machine, -/turf/open/floor/plasteel/freezer, -/area/security/prison) -"unE" = ( -/obj/structure/fans/tiny/invisible, -/turf/open/space/basic, -/area/space) -"unY" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/sign/departments/custodian{ - pixel_y = -32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"uoB" = ( -/obj/structure/table/reinforced, -/obj/item/multitool, -/obj/item/screwdriver, -/obj/machinery/camera{ - c_tag = "Circuitry Lab North"; - network = list("ss13","rd") - }, -/turf/open/floor/plasteel/white, -/area/science/circuit) -"upX" = ( -/obj/structure/chair/stool{ - pixel_y = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/carpet{ - icon_state = "carpetsymbol" - }, -/area/crew_quarters/theatre) -"usO" = ( -/obj/machinery/vending/snack/random, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/wood, -/area/maintenance/bar) -"uuG" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"uvZ" = ( -/obj/structure/mineral_door/wood, -/turf/open/floor/wood, -/area/maintenance/bar) -"uya" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/sign/departments/restroom{ - pixel_y = -32 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"uzk" = ( -/obj/structure/sign/departments/restroom, -/turf/closed/wall, -/area/crew_quarters/toilet) -"uDW" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"uNu" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/science/circuit) -"uPT" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/maintenance/disposal/incinerator) -"uTq" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"uVq" = ( -/obj/machinery/light{ - dir = 1; - light_color = "#d1dfff" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) -"uVt" = ( -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/turf/open/floor/plating, -/area/security/prison) -"uVS" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"uYE" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) -"uZM" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/sign/poster/official/space_cops{ - pixel_x = -32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) -"vbD" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command/glass{ - name = "EVA Storage"; - req_access_txt = "18" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/storage/eva) -"vbY" = ( -/obj/machinery/vr_sleeper{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 4 - }, -/area/crew_quarters/fitness) -"vdz" = ( -/obj/machinery/shower{ - dir = 8 - }, -/turf/open/floor/plasteel/freezer, -/area/security/prison) -"vdH" = ( -/obj/structure/bed, -/turf/open/floor/plating, -/area/maintenance/port) -"vgp" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/turf/closed/wall/r_wall, /area/engine/gravity_generator) -"vjm" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/rag, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/wood, -/area/maintenance/bar) -"vjq" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"vpm" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "holoprivacy"; - name = "Holodeck Shutters" - }, -/turf/open/floor/plating, -/area/crew_quarters/fitness) -"vpz" = ( -/obj/structure/sign/poster/official/twelve_gauge, -/turf/closed/wall/r_wall, -/area/ai_monitored/security/armory) "vpY" = ( /obj/structure/closet/lasertag/blue, /obj/item/clothing/under/pj/blue, /obj/item/clothing/under/pj/blue, /turf/open/floor/plasteel, /area/crew_quarters/fitness) -"vrM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-18" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "vsM" = ( /obj/machinery/power/apc/auto_name/south, /obj/structure/cable, /turf/open/floor/carpet, /area/crew_quarters/cryopod) +"vsT" = ( +/obj/structure/closet/crate, +/obj/item/book/manual/wiki/telescience, +/obj/item/book/manual/wiki/engineering_guide, +/obj/item/book/manual/wiki/engineering_construction, +/obj/item/book/manual/wiki/atmospherics, +/obj/item/book/manual/wiki/detective, +/obj/item/book/manual/wiki/tcomms, +/obj/item/book/manual/wiki/engineering_singulo_tesla, +/obj/item/book/manual/wiki/experimentor, +/obj/item/book/manual/wiki/research_and_development, +/obj/item/book/manual/wiki/robotics_cyborgs, +/obj/item/book/manual/wiki/security_space_law, +/obj/item/book/manual/wiki/medicine, +/obj/item/book/manual/wiki/medical_cloning, +/obj/item/book/manual/wiki/infections, +/obj/item/book/manual/ripley_build_and_repair, +/obj/item/book/manual/hydroponics_pod_people, +/obj/item/book/manual/wiki/toxins, +/obj/item/book/manual/wiki/grenades, +/obj/item/book{ + desc = "An undeniably handy book."; + icon_state = "bookknock"; + name = "A Simpleton's Guide to Safe-cracking with Stethoscopes" + }, +/turf/open/floor/wood, +/area/library) "vxh" = ( /obj/structure/table, /obj/effect/spawner/lootdrop/maintenance{ @@ -57940,23 +57830,10 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"vys" = ( -/obj/machinery/vr_sleeper{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/crew_quarters/fitness) +"vyp" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall, +/area/crew_quarters/dorms) "vzp" = ( /obj/structure/table/reinforced, /obj/machinery/firealarm{ @@ -57973,35 +57850,42 @@ }, /turf/open/floor/wood, /area/maintenance/bar) -"vzS" = ( -/obj/structure/table, -/obj/item/book/manual/hydroponics_pod_people{ - pixel_x = -4; - pixel_y = 5 +"vBa" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 }, -/obj/item/paper/guides/jobs/hydroponics{ - pixel_x = -5; - pixel_y = 3 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/plasteel, -/area/hydroponics) +/turf/open/floor/plasteel/dark, +/area/bridge/meeting_room) "vCb" = ( /obj/machinery/rnd/production/techfab/department/service, /turf/open/floor/plasteel, /area/hallway/secondary/service) +"vCn" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) "vCt" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/white, /area/science/circuit) -"vDq" = ( -/obj/effect/turf_decal/stripes/line, +"vCy" = ( +/obj/machinery/power/apc{ + areastring = "/area/maintenance/starboard/fore"; + dir = 1; + name = "Starboard Bow Maintenance APC"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, /turf/open/floor/plating, -/area/space/nearstation) -"vFt" = ( -/obj/machinery/portable_atmospherics/pump, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"vGX" = ( +/area/maintenance/starboard/fore) +"vDR" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/structure/closet/secure_closet/personal/cabinet{ desc = "Swipe your ID on the closet to claim it. First come first serve, this one is wooden and fancy. Store your stuff here."; @@ -58010,6 +57894,38 @@ }, /turf/open/floor/wood, /area/crew_quarters/dorms) +"vEi" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 5; + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"vEp" = ( +/obj/structure/sign/poster/contraband/lizard{ + pixel_x = -32 + }, +/obj/structure/sign/poster/contraband/lizard{ + pixel_x = -32 + }, +/obj/structure/sign/poster/contraband/lizard{ + pixel_x = -32 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"vFr" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) "vHj" = ( /obj/machinery/door/airlock/public/glass{ name = "Cryogenics " @@ -58020,108 +57936,311 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/cryopod) -"vHv" = ( -/obj/structure/closet{ - name = "Costume Closet" - }, -/obj/item/clothing/head/russobluecamohat, -/obj/item/clothing/head/russobluecamohat, -/obj/item/clothing/head/helmet/rus_ushanka, -/obj/item/clothing/head/helmet/rus_ushanka, -/obj/item/clothing/head/helmet/rus_ushanka, -/obj/item/clothing/head/helmet/rus_ushanka, -/obj/item/clothing/under/mw2_russian_para, -/obj/item/clothing/under/mw2_russian_para, -/obj/item/clothing/under/mw2_russian_para, -/obj/item/clothing/under/mw2_russian_para, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/shoes/jackboots, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"vHM" = ( -/obj/machinery/vr_sleeper{ +"vHz" = ( +/obj/structure/chair{ dir = 8 }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 +/obj/machinery/light/small{ + dir = 4; + light_color = "#d8b1b1" }, +/turf/open/floor/plasteel, /area/crew_quarters/fitness) +"vHT" = ( +/obj/machinery/door/firedoor, +/obj/structure/sign/departments/evac{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) "vHY" = ( /turf/open/floor/plating, /area/science/mixing) -"vLD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, +"vIi" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/obj/machinery/light, -/obj/machinery/camera/motion{ - c_tag = "Vault"; - dir = 1; - network = list("vault") +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"vNh" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/turf/open/floor/plasteel, +/area/security/prison) +"vJu" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ dir = 8 }, -/turf/open/floor/carpet, -/area/crew_quarters/theatre) -"vOq" = ( -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance, -/obj/item/coin/gold, -/obj/item/coin/gold, -/obj/item/coin/gold, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"vPs" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/space, +/area/solar/starboard/aft) "vPE" = ( /obj/machinery/light{ dir = 4 }, /turf/open/floor/plasteel/white, /area/science/circuit) -"vRr" = ( -/obj/effect/turf_decal/stripes/line{ +"vZA" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/turf/open/space, +/area/solar/starboard/aft) +"vZR" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/floor/wood, +/area/library) +"wbE" = ( +/obj/effect/turf_decal/tile/blue{ + alpha = 255 + }, +/obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/machinery/door/window/westleft{ - base_state = "right"; - dir = 4; - icon_state = "right"; - name = "Shooting Range" +/obj/effect/turf_decal/tile/blue{ + alpha = 255; + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"wcB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/captain) +"wdv" = ( +/obj/structure/fans/tiny/invisible, +/turf/open/space/basic, +/area/space) +"weM" = ( +/obj/structure/girder, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"wfR" = ( +/obj/item/electropack/shockcollar, +/obj/item/assembly/signaler, +/turf/open/floor/plating, +/area/maintenance/bar) +"wig" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + on = 0; + pixel_x = -7; + pixel_y = 12 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"wkN" = ( +/turf/closed/wall, +/area/science/circuit) +"woR" = ( +/obj/machinery/cryopod{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/crew_quarters/cryopod) +"wph" = ( +/obj/docking_port/stationary{ + area_type = /area/construction/mining/aux_base; + dheight = 4; + dir = 8; + dwidth = 4; + height = 9; + id = "aux_base_zone"; + name = "aux base zone"; + roundstart_template = /datum/map_template/shuttle/aux_base/default; + width = 9 }, /turf/open/floor/plating, -/area/security/prison) -"vRX" = ( -/obj/machinery/power/apc{ - areastring = "/area/security/detectives_office"; - dir = 4; - name = "Detective's Office APC"; - pixel_x = 24 +/area/construction/mining/aux_base) +"wql" = ( +/obj/structure/extinguisher_cabinet, +/turf/closed/wall/r_wall, +/area/hallway/primary/central) +"wqF" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"wrp" = ( +/obj/machinery/light{ + dir = 8 }, /obj/structure/cable{ - icon_state = "0-8" + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"wvX" = ( +/obj/structure/table/reinforced, +/obj/machinery/light, +/obj/item/stack/sheet/metal/ten, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"wxT" = ( +/obj/structure/chair/sofa/left, +/obj/structure/window{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"wBd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/closed/wall, +/area/hallway/secondary/service) +"wHz" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/maintenance/disposal/incinerator) +"wIG" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/security/brig) +"wKe" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "maintdiy"; + name = "Security Shutters" }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"vUR" = ( -/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) +"wTf" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"wUg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"wUr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/carpet, +/area/crew_quarters/theatre) +"wUY" = ( +/obj/structure/table, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap, +/obj/item/hand_labeler, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"wWT" = ( +/obj/effect/landmark/start/roboticist, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"wXl" = ( +/obj/structure/mirror{ + pixel_y = 32 + }, +/obj/structure/sink{ + dir = 1; + pixel_y = 25 + }, +/obj/structure/toilet{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/dorms) +"wYc" = ( +/obj/machinery/vr_sleeper{ + dir = 8 + }, +/turf/open/floor/plasteel, /area/security/prison) -"vVP" = ( +"wZI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/captain) +"xbn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/structure/table, +/obj/item/coin/gold, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"xfS" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/computer/shuttle/mining/common{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/entry) +"xgk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"xgC" = ( /obj/structure/cable{ icon_state = "0-4" }, @@ -58147,325 +58266,22 @@ }, /turf/open/floor/plasteel, /area/engine/gravity_generator) -"vWw" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/plasteel, -/area/security/prison) -"vYa" = ( -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"vZs" = ( -/obj/structure/lattice, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"wcy" = ( -/obj/structure/reagent_dispensers/water_cooler, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"wfR" = ( -/obj/item/electropack/shockcollar, -/obj/item/assembly/signaler, -/turf/open/floor/plating, -/area/maintenance/bar) -"wgb" = ( -/obj/structure/falsewall, -/turf/open/floor/plating, -/area/security/prison) -"wkN" = ( -/turf/closed/wall, -/area/science/circuit) -"woR" = ( -/obj/machinery/cryopod{ - dir = 1 - }, -/turf/open/floor/carpet, -/area/crew_quarters/cryopod) -"woX" = ( -/obj/machinery/door/window/southright{ - name = "Target Storage" - }, -/obj/item/target/alien, -/obj/item/target/alien, -/obj/item/target/syndicate, -/turf/open/floor/plating, -/area/security/prison) -"wph" = ( -/obj/docking_port/stationary{ - area_type = /area/construction/mining/aux_base; - dheight = 4; - dir = 8; - dwidth = 4; - height = 9; - id = "aux_base_zone"; - name = "aux base zone"; - roundstart_template = /datum/map_template/shuttle/aux_base/default; - width = 9 - }, -/turf/open/floor/plating, -/area/construction/mining/aux_base) -"wpo" = ( -/obj/machinery/camera{ - c_tag = "Bar West"; - dir = 4 - }, -/obj/machinery/computer/arcade/orion_trail, -/obj/structure/sign/poster/official/foam_force_ad{ - pixel_x = -32 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"wrp" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/service) -"wuB" = ( -/obj/structure/chair/comfy/brown{ - dir = 1 - }, -/turf/open/floor/wood, -/area/library) -"wvX" = ( -/obj/structure/table/reinforced, -/obj/machinery/light, -/obj/item/stack/sheet/metal/ten, -/turf/open/floor/plasteel/white, -/area/science/circuit) -"wwn" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"wwB" = ( -/turf/closed/wall/r_wall, -/area/hallway/primary/central) -"wwC" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/obj/structure/mirror{ - pixel_x = 25 - }, -/turf/open/floor/mineral/titanium/blue, -/area/crew_quarters/toilet) -"wyM" = ( -/obj/machinery/door/airlock{ - name = "Theatre Backstage"; - req_access_txt = "46" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"wAB" = ( -/obj/structure/chair/office/light, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"wBd" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/closed/wall, -/area/hallway/secondary/service) -"wCa" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "holoprivacy"; - name = "Holodeck Shutters" - }, -/turf/open/floor/plating, -/area/crew_quarters/fitness) -"wDR" = ( -/obj/structure/sign/poster/official/help_others{ - pixel_y = -32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) -"wEp" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "bridge blast"; - name = "bridge blast door" - }, -/turf/open/floor/plating, -/area/hallway/primary/central) -"wFk" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/security/prison) -"wFX" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Holodeck Door" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) -"wGP" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"wHz" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/maintenance/disposal/incinerator) -"wJz" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) -"wLT" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/closed/wall, -/area/maintenance/port) -"wNM" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"wOT" = ( -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/plasteel, -/area/hydroponics) -"wUY" = ( -/obj/structure/table, -/obj/item/stack/packageWrap, -/obj/item/stack/packageWrap, -/obj/item/hand_labeler, -/turf/open/floor/plasteel, -/area/hallway/secondary/service) -"wVs" = ( -/obj/structure/table/wood, -/obj/item/instrument/trumpet, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"wXP" = ( -/obj/machinery/button/door{ - id = "maintdiy"; - name = "Shutters Control Button"; - pixel_x = -6; - pixel_y = 24 - }, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) -"wZB" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"xbu" = ( -/obj/structure/chair/comfy/black{ - dir = 8 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"xcg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plating, -/area/space/nearstation) -"xdb" = ( -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 8; - name = "8maintenance loot spawner" - }, -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) -"xdV" = ( -/obj/machinery/door/airlock{ - name = "Theatre Backstage"; - req_access_txt = "46" - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) "xgF" = ( /obj/structure/chair/stool/bar, /turf/open/floor/wood{ icon_state = "wood-broken5" }, /area/maintenance/bar) -"xhx" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +"xhS" = ( /obj/structure/cable{ icon_state = "2-4" }, -/turf/open/floor/wood, -/area/bridge/meeting_room) +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) "xhV" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -58475,6 +58291,14 @@ }, /turf/open/floor/plating, /area/construction) +"xib" = ( +/obj/machinery/door/window/westleft{ + base_state = "right"; + icon_state = "right"; + name = "Unisex Showers" + }, +/turf/open/floor/plasteel/freezer, +/area/security/prison) "xiw" = ( /obj/machinery/door/airlock{ name = "Service Hall"; @@ -58486,142 +58310,310 @@ }, /turf/open/floor/plating, /area/hallway/secondary/service) -"xkk" = ( -/obj/structure/piano, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"xlN" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +"xkd" = ( +/obj/machinery/light/small{ + dir = 4; + light_color = "#d8b1b1" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"xls" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/security/prison) +"xmo" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, -/obj/structure/disposalpipe/segment{ +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"xmS" = ( +/obj/structure/chair/comfy/beige{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel/grimy, +/area/hallway/secondary/entry) +"xqG" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/item/reagent_containers/food/drinks/soda_cans/starkist{ + pixel_x = -3; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"xrN" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"xtP" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"xxi" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/structure/cable{ icon_state = "4-8" }, /turf/open/floor/plating, -/area/maintenance/port/aft) -"xpx" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ +/area/maintenance/fore) +"xzd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/structure/chair/sofa, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/obj/effect/landmark/start/assistant, /turf/open/floor/plasteel, /area/crew_quarters/fitness) -"xqW" = ( -/obj/structure/cable{ - icon_state = "0-4" +"xzj" = ( +/obj/machinery/light{ + dir = 1; + light_color = "#d1dfff" }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/door/poddoor/preopen{ - id = "Secure Gate"; - name = "brig shutters" - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "1-8" +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"xAk" = ( +/obj/structure/chair/stool{ + pixel_y = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, -/area/security/brig) -"xzh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/space/nearstation) -"xzy" = ( -/obj/effect/turf_decal/stripes/corner{ +/area/maintenance/starboard/fore) +"xAv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel, -/area/hydroponics) +/area/crew_quarters/dorms) +"xBk" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 23 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet) +"xBw" = ( +/obj/structure/closet/wardrobe/cargotech, +/obj/item/radio/headset/headset_cargo, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"xDM" = ( +/obj/machinery/camera{ + c_tag = "Locker Room South"; + dir = 8 + }, +/obj/structure/closet/secure_closet/personal, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) "xEu" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) +"xEB" = ( +/obj/machinery/power/apc{ + areastring = "/area/ai_monitored/nuke_storage"; + dir = 1; + name = "Vault APC"; + pixel_y = 25 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/circuit, +/area/ai_monitored/nuke_storage) +"xEE" = ( +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/obj/machinery/vending/wardrobe/curator_wardrobe, +/turf/open/floor/carpet, +/area/library) "xIa" = ( /obj/structure/table, /obj/effect/spawner/lootdrop/grille_or_trash, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"xIn" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) -"xLZ" = ( -/obj/structure/closet/radiation, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"xMl" = ( -/obj/structure/chair/sofa{ - dir = 1 - }, -/obj/structure/window, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"xNY" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 1 +"xLX" = ( +/obj/structure/lattice/catwalk, +/obj/item/stack/marker_beacon{ + anchored = 1; + icon_state = "markerburgundy-on"; + light_color = "#FA644B"; + light_power = 3; + light_range = 3; + name = "Docking Beacon"; + picked_color = "Burgundy" }, /turf/open/space/basic, /area/space/nearstation) -"xXY" = ( +"xOx" = ( +/obj/structure/chair/comfy/brown{ + color = "#596479"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"xPk" = ( +/obj/structure/bed, +/obj/machinery/button/door{ + id = "Dorm6"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"xPY" = ( +/obj/structure/table/wood, +/obj/machinery/light{ + dir = 4 + }, +/obj/item/instrument/trombone, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"xQG" = ( +/obj/machinery/door/airlock/external{ + name = "Common Mining Shuttle Bay" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"xTy" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"xUe" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/security/prison) +"xUL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light, +/obj/machinery/camera/motion{ + c_tag = "Vault"; + dir = 1; + network = list("vault") + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"xXi" = ( +/obj/machinery/vending/clothing, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"xZD" = ( /obj/structure/closet/lasertag/red, /obj/item/clothing/under/pj/red, /obj/item/clothing/under/pj/red, /turf/open/floor/plasteel, /area/crew_quarters/fitness) -"xYO" = ( -/obj/structure/sign/poster/contraband/red_rum{ +"ybj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plating, +/area/security/prison) +"ycd" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/structure/mirror{ pixel_y = 32 }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) +/obj/structure/sink{ + dir = 1; + pixel_y = 25 + }, +/obj/machinery/button/door{ + id = "LockerShitter2"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 14; + pixel_y = 38; + specialfunctions = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet/locker) "ycu" = ( /obj/structure/cable{ icon_state = "2-4" }, /turf/open/floor/plasteel, /area/science/circuit) -"ycF" = ( -/obj/machinery/door/airlock/external{ - name = "Common Mining Shuttle Bay" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/hallway/secondary/entry) "ydD" = ( /obj/effect/turf_decal/bot, /obj/machinery/suit_storage_unit/rd, /turf/open/floor/plasteel, /area/science/mixing) -"yiN" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) +"yhz" = ( +/obj/structure/table, +/obj/item/folder/blue, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"yiY" = ( +/obj/structure/sign/poster/official/ion_rifle, +/turf/closed/wall/r_wall, +/area/ai_monitored/security/armory) (1,1,1) = {" aaa @@ -64643,11 +64635,11 @@ aaa aaa aaa aaa -aaK +ghq aaa aaa aaa -aaK +ghq aaa aaa aaa @@ -64660,7 +64652,7 @@ aaa aaa aaa aaa -hoo +gDl aaa aaa aaa @@ -64894,9 +64886,9 @@ aaa aaa aaa aaa -aaK +ghq aaa -aaK +ghq aaa aaa aaa @@ -64908,9 +64900,9 @@ gXs aaa aaa aaa -aaK +ghq aaa -aaK +ghq aaa aaa aaa @@ -65157,11 +65149,11 @@ gXs aaa aaa gXs -jmC +gJi gXs gXs gXs -jmC +gJi gXs aaa aaa @@ -65407,11 +65399,11 @@ aaa aaa aaa aaa -jmC -jmC +gJi +gJi gXs aag -jmC +gJi gXs gXs aaa @@ -65421,11 +65413,11 @@ aaa aaa gXs gXs -jmC -jmC -klu +gJi +gJi +haL aag -jmC +gJi aaa aaa aaa @@ -65664,11 +65656,11 @@ aaa aaa aaa aaa -xcg -lLt +gIU +shR aaa -lLt -jNo +shR +hse gXs aoV aaa @@ -65678,11 +65670,11 @@ aaa aaa aaa gXs -xcg -lLt +gIU +shR aaa -lLt -jNo +shR +hse aaa aaa aaa @@ -65921,11 +65913,11 @@ aaa aaa aaa aaa -xzh +bvG aaa cpe aaa -vDq +oyN aaa aaa aaa @@ -65935,11 +65927,11 @@ aaa aaa aaa aaa -xzh +bvG aaa cwV aaa -vDq +oyN aaa aaa aaa @@ -66177,7 +66169,7 @@ aaa aaa aaa aae -lCL +ktS gXs aaa aaa @@ -66434,7 +66426,7 @@ aaa aaa aaa aaa -lCL +ktS gXs aaa aaa @@ -66691,7 +66683,7 @@ aaa aaa aaa aaa -lCL +ktS gXs aaa aaa @@ -66948,7 +66940,7 @@ aaa aaa aaa aaa -lCL +ktS gXs aaa cqq @@ -66975,7 +66967,7 @@ aaa aaa aoV aaa -rHa +iDS aaa aaa aoV @@ -67205,7 +67197,7 @@ aaf aaf aaf aaa -lCL +ktS arB asE cyb @@ -67232,7 +67224,7 @@ aaa aaa asE asE -ycF +nGI asE asE aoV @@ -67492,7 +67484,7 @@ awW auP awW aaf -vZs +kls aaa aaa aaa @@ -67746,7 +67738,7 @@ aaa aaa arB arB -jnX +xQG asE aAC aaf @@ -67978,7 +67970,7 @@ apN apN apN apJ -iyC +fpI ayk awW aAD @@ -68002,7 +67994,7 @@ aaa aaa aaa arB -est +xfS ayk awW aAD @@ -69278,7 +69270,7 @@ aaa awW aOh ayl -tTW +jHh aRY awW aaa @@ -70574,7 +70566,7 @@ awW arB awZ aym -vrM +fOI awW aaf aaa @@ -71855,7 +71847,7 @@ aUO aUy aWm aWf -ohX +vdu czK bhN bcl @@ -72873,7 +72865,7 @@ aHy ayl aKk aLA -dTe +xmS aNf aLA aQD @@ -74899,7 +74891,7 @@ ady ady ady ady -rKc +uDO ajq ajW akB @@ -74943,7 +74935,7 @@ aXQ aXQ aPz aPz -rFc +epC aPz bhQ bjj @@ -75197,11 +75189,11 @@ aPA aXQ aZt aXQ -gdu +ycd aPz -kJY -ihC -oMY +omY +cMS +gQX bhQ bjj bkF @@ -75457,10 +75449,10 @@ aXQ bbL aPz bdJ -gFD +txm bgr -nQr -tUm +iwB +hew bkF aaa aaa @@ -75715,7 +75707,7 @@ aZw aPz bct bfa -vdH +gfr bhQ bjk bkE @@ -75970,10 +75962,10 @@ baO aZo baw aPz -cwP +hPs cBn bgs -wLT +hnl bjk bkF aaa @@ -76274,7 +76266,7 @@ ccb ccb ccb aaa -snG +qJr aaa ccb ccb @@ -76469,7 +76461,7 @@ bxk aDo aDo aIX -nIE +gCC aLE aLE aOp @@ -76483,7 +76475,7 @@ aQN aQN aQN aQN -kWI +vhb bbO aPA bgt @@ -76531,7 +76523,7 @@ aaa aaf aaa aaa -kKw +hrF aaa aaa aaf @@ -76546,7 +76538,7 @@ aaa aaa aaa aaa -hoo +gDl aaa aaa aaa @@ -76735,7 +76727,7 @@ aQN aQN aTz aUp -job +ubj aXr aZx aQN @@ -76788,7 +76780,7 @@ aaf aaf aaf aaf -kKw +hrF aaf aaf aaf @@ -76997,7 +76989,7 @@ aXv aYS aQN aQN -kWI +vhb bbO aPA aSg @@ -77240,18 +77232,18 @@ aDo aDo aDo aIY -nIE +gCC aLE aLE aOl aPA -lhg +pqs aQN aTC aUs -phY +mTG aXt -ksn +ijG aQN aQN aPA @@ -77506,9 +77498,9 @@ aQV aQN aTC aUu -eRk +gxc aXt -ksn +ijG aQN aQN aZB @@ -77761,11 +77753,11 @@ aOl aPA aQU aQN -hzw -qlr -pPE +nLw +sLa +oyl aXw -jiR +qfk aQN aQN aZA @@ -78273,10 +78265,10 @@ aLm aLE aOl aPA -xIn +vJu aQN aTD -mIS +ocv aUZ aYU aYU @@ -78517,14 +78509,14 @@ aaf avY axo arP -fLd -cRD +fgG +rqW aGD -tru +tJi aCr -qBc -iFL -qBc +hcb +qTG +hcb aKu aLM aLF @@ -78534,14 +78526,14 @@ aPG aPG aPG aPG -jsy +lip aQW aQW aQW aQW -cVu +xDM aPA -oBp +jxF aYb aZE bjp @@ -78774,14 +78766,14 @@ aaa avY axo arP -qwe -ioB +rPU +fne aGr aHI -xdV -ePO -phu -qBc +fOA +tWj +oyz +hcb aKu aLL bDe @@ -79032,13 +79024,13 @@ avY axo arP aCh -qQJ -iYz +pIf +kCo aHK aCr -tUw -mqa -qBc +uJx +ikk +hcb aKu aLN aLE @@ -79052,13 +79044,13 @@ aWu aYc aZD aZD -uhm +vnI aZD aZD bff -iRJ +dev aZE -fyM +xBw bjr ama bmh @@ -79117,18 +79109,18 @@ bLv bLv bLv aaa -prP -prP -prP -prP -prP -prP -prP -prP -prP +iDo +iDo +iDo +iDo +iDo +iDo +iDo +iDo +iDo aaa aaa -hoo +gDl aaa aaa aaa @@ -79289,13 +79281,13 @@ avZ axp ayC azH -wyM +eEe aGv aCr aCr -tUw -mqa -qBc +uJx +ikk +hcb aKu aLN aLE @@ -79306,7 +79298,7 @@ aRa aTF aPG aSX -eRn +hPP aZF aZF aZF @@ -79374,7 +79366,7 @@ cqK crl bLv aaa -prP +iDo ctv ctv ctv @@ -79382,7 +79374,7 @@ ctv ctv ctv ctv -prP +iDo aaa aaa aaa @@ -79543,14 +79535,14 @@ aGh aqR aqR awb -eLH +xtP ayA -fHK -hRX +sNK +xmo aBV -pNH -sfa -ioX +mzB +mJG +szG aHG aJe aKw @@ -79631,15 +79623,15 @@ cAQ crm bLv aaa -prP -prP -prP -prP -prP -prP -prP -prP -prP +iDo +iDo +iDo +iDo +iDo +iDo +iDo +iDo +iDo aaa aaa aaa @@ -79803,13 +79795,13 @@ awa axq ayD azI -gwi +rjQ aBU -xkk -upX -qJZ -doP -qBc +myh +inR +wUr +iTq +hcb aKu aLN aMQ @@ -79856,7 +79848,7 @@ aoV bCq bHE bHE -puG +mPr cdb bCq bVE @@ -79898,9 +79890,9 @@ gXs aaa aaa aaa -prP -prP -prP +iDo +iDo +iDo aaa aaa aaa @@ -80057,16 +80049,16 @@ aaa aaa aag avY -jLM +xxi ayD -oeJ +cGz aMr -qOf +ngs aDv -lwp -tUw -jly -qBc +uRS +uJx +dsC +hcb aKu aLN aMS @@ -80155,9 +80147,9 @@ gXs aaa aaa aaa -prP +iDo ctv -prP +iDo aaa aaa aaa @@ -80314,21 +80306,21 @@ aaa aaa aag avY -jLM +xxi ayD -wVs +viF aMr aMr aOH -lwp -vNh -qHB -qBc +uRS +lSa +oTW +hcb aKu aLN aMS aOi -sqa +lPr aPK aSl aTH @@ -80383,7 +80375,7 @@ mrR dKP odx rBq -ouD +kQO bCq bUs bLv @@ -80402,19 +80394,19 @@ aaf aaa aaf gXs -sYv +gUu crn bij bij bij bij bij -hWn +jkz btG aaa -prP +iDo ctv -prP +iDo aaa aaa aaa @@ -80573,14 +80565,14 @@ aag avY axs ayD -sjm -eNK -iEx +nez +ngV +xPY aOH -qBc -qBc -tAV -qBc +hcb +hcb +syJ +hcb aKu aLN aMS @@ -80610,7 +80602,7 @@ bbR btu bbR bOL -fnJ +qje byF bwW bGm @@ -80652,26 +80644,26 @@ cjJ cjJ cjJ cjJ -gVX -reZ -reZ +kfX +saU +saU bij crn bij bij -sZR -ued +eCR +wUg bnT bph bsc -fhP +mQS bsc -eXm +tNF btG gXs -prP +iDo ctv -prP +iDo aaa aaa aaa @@ -80912,12 +80904,12 @@ cov cpj cpS cjJ -xLZ -ivF +fjS +sPT btG -wAB -vVP -mwO +rXl +xgC +ugu bnV bph bih @@ -80926,9 +80918,9 @@ bii bsc btG aaa -prP +iDo ctv -prP +iDo aaa aaa aaa @@ -81104,8 +81096,8 @@ aPK aSn aTK aPK -vRX -hwu +uoG +sOA asW baW bLE @@ -81123,7 +81115,7 @@ bpB bpB brR bsV -aaM +bwc bxA bvI bwX @@ -81168,14 +81160,14 @@ cnN cox cpl cpU -ipc -edH -edH -nWq -edH -wZB -fby -qwB +jLn +xTy +xTy +tJK +xTy +vob +xhS +mOB bph big bgN @@ -81183,9 +81175,9 @@ bkZ bsc btG aaa -prP +iDo ctv -prP +iDo aaa aaa aaa @@ -81322,7 +81314,7 @@ aaa acd acd acd -jHM +xUe acd acd aaa @@ -81366,7 +81358,7 @@ aYi aqW aqW bbQ -qpA +uFp apd aZH aZK @@ -81426,12 +81418,12 @@ cow cpk cpT cjJ -xLZ -oNQ +fjS +dXq btG -sZa -jhF -qmM +rtl +oqO +vFr bnV bph bii @@ -81440,9 +81432,9 @@ bih bsc btG aaa -prP +iDo ctv -prP +iDo aaa aaa aaa @@ -81577,10 +81569,10 @@ abc abc afu abc -suI -qMu -kJr -dxB +itQ +pgn +tmO +eHU acd aaa aaa @@ -81681,25 +81673,25 @@ clG cnP coz cpn -dbn -dbn +sPY +sPY bgO -hjw +dgO bgO -nTE -pTn -jnm +pPI +uRd +ktP bnW bph bsc -mQR +mkv bsc -wNM +jFH btG gXs -prP +iDo ctv -prP +iDo aaa aaa aaa @@ -81834,11 +81826,11 @@ aea aeH aft abc -woX -kdm -rvZ -vUR -jHM +dly +mnC +mcp +xls +xUe aaa aaa aiU @@ -81944,19 +81936,19 @@ aaf aaa aaa gXs -gtL +iHk bgO bgO bgO bgO bgO bgO -vgp +jBA btG aaa -gSH +kvl ctv -prP +iDo aaa aaa aaa @@ -82080,7 +82072,7 @@ aaa aaa gXs gXs -dbM +dVU abc abu abu @@ -82092,10 +82084,10 @@ aeJ afw abc abc -kdm +mnC aay -vUR -qlF +xls +kMt aaf aaf aiU @@ -82163,7 +82155,7 @@ bCq bHD bJe bCq -czi +nkP bHE bHE bHE @@ -82211,7 +82203,7 @@ aaa aaa aaa aaa -prP +iDo ctv aaT aaa @@ -82349,9 +82341,9 @@ aeI afv agf abc -kdm +mnC aay -vUR +xls aiT aiT aiV @@ -82384,7 +82376,7 @@ aKA aLN aMS aOz -iMG +exP aPQ aSa aSr @@ -82394,7 +82386,7 @@ aYZ bLE aqW aqW -hfe +noy apd beA bqp @@ -82402,7 +82394,7 @@ cNG cNJ bLF aZK -haz +sRH bbR bqt cBq @@ -82468,8 +82460,8 @@ aaa aaa aaa aaa -prP -prP +iDo +iDo aaT aaa aaa @@ -82593,8 +82585,8 @@ aaa aaa aaa aai -jSa -uVt +eqd +kgr abe abw acc @@ -82606,9 +82598,9 @@ aeL afy agh abc -tOd -vRr -tLl +hnU +vda +ybj aiT ajs akb @@ -82850,7 +82842,7 @@ aaa aaa gXs aai -gIO +gbu aay abd abv @@ -82863,9 +82855,9 @@ aeK afx agg abc -orw -jMK -riA +dCV +idK +ttX aiU ajr aka @@ -83108,9 +83100,9 @@ aaf aaf aai acd -wgb +mIZ abg -jtU +enB aby aby aby @@ -83120,10 +83112,10 @@ aeN afA afA abc -vWw -wFk -oXL -cXx +laq +kdP +mGw +jls aju akd akK @@ -83190,14 +83182,14 @@ bCn bGq bGq bGq -tdF +rGq bLw bGq bGq bGq bLw bGq -tdF +rGq bTD bUx bVI @@ -83212,7 +83204,7 @@ bVI bVI bVI bTA -xlN +xgk bHE bHE bHE @@ -83245,7 +83237,7 @@ aaa aaa aaa aaa -hvS +kEY aaa aaa aaa @@ -83366,7 +83358,7 @@ aai aai abf aat -tHx +jRw abx acd acC @@ -83375,12 +83367,12 @@ adF aef aeM afz -jSD +dLG aav -sjT -pLt -pQr -new +vIi +fsj +mPt +lyR ajt akc akJ @@ -83693,7 +83685,7 @@ bqw aJq aJq aYl -ppY +fAj aLX aJq aJq @@ -83877,7 +83869,7 @@ aai aan aaw aaB -kfE +qmn aaJ aat abh @@ -84132,7 +84124,7 @@ aag aaa aak aap -fuo +saX aaD aau aat @@ -84207,7 +84199,7 @@ bqy cBr bqy buK -pNI +tZe aJw aJq aJq @@ -84239,7 +84231,7 @@ bWB bWB cec bVI -iOt +kNv ccw chY ciX @@ -84646,7 +84638,7 @@ aag aaa aal aar -phH +uGI aaF aat aat @@ -84725,7 +84717,7 @@ bwi bmr aMm aJq -otF +vEi bCs bCs bEY @@ -84903,12 +84895,12 @@ aag aaf aaj aaq -eOy +dyS aaE aat aaN aaV -rtT +rvS aat acd abL @@ -84987,7 +84979,7 @@ bCs bDv bEX bFb -hKF +kfv bFa bKt bLx @@ -85163,9 +85155,9 @@ aat aat aat aat -jeR -neC -jgv +qXg +jjC +xOx abD acd acd @@ -85183,9 +85175,9 @@ agj auj akl akO -uko -uko -xqW +fde +fde +seP anw anz aox @@ -85421,7 +85413,7 @@ aat aat aat aat -hRz +uEI aat abC acd @@ -85465,7 +85457,7 @@ aGq aHO aJl ayW -neb +ftE aJq aOE aJn @@ -85478,7 +85470,7 @@ aYq aZO aZC baK -qBe +rnt bbC bdI bgK @@ -85735,10 +85727,10 @@ aYs aZQ bbi bde -nLf +kvL bcd bcd -xhx +gNC bcd bcd bcd @@ -85930,14 +85922,14 @@ aaa aag aaf aai -cMk -cMk +wYc +wYc aaG -cMk +wYc aaP aaX -unu -lwY +keM +xib acd acD acY @@ -85993,7 +85985,7 @@ aZP bbh bcc bdd -gjf +cVs bfr bgM bif @@ -86211,9 +86203,9 @@ aiz ajg akl akR -uko -uko -xqW +fde +fde +seP anz anz aov @@ -86252,19 +86244,19 @@ bbk bfu bbk bfs -pUl +rTu aZM aZM aaf aaf -lCL +ktS aaf -lCL +ktS aaf -lCL +ktS aaf -lCL -wwB +ktS +fxV aXf aJq bBi @@ -86451,7 +86443,7 @@ aaa aaf aai abi -vdz +eqA ach acK adf @@ -86509,19 +86501,19 @@ bce bdf beb aYv -kTz -kDD +cUx +fcn aaf aaf -lCL -lCL +ktS +ktS aaf -wwB -wwB -wwB -wwB -wwB -wwB +fxV +fxV +fxV +fxV +fxV +fxV aXf aJq byU @@ -86766,19 +86758,19 @@ aZR bbm bec bfu -sdL +vBa aBa aBa aBa aBa aBa aBa -wwB +fxV bsb -lTq -tMS -eND -wEp +yhz +ouQ +cQT +nbT aXf aJq bBi @@ -86972,7 +86964,7 @@ cpg acv adi adi -pQD +yiY aeW agQ ahv @@ -86989,7 +86981,7 @@ anz anz aov aph -oOb +cIv ard ard ard @@ -87023,7 +87015,7 @@ aZR aZR aZR bft -srq +psk aBa aBT aDs @@ -87032,13 +87024,13 @@ aGb aBa bqD bsa -oeQ +vCn bsa bsa -wEp +nbT byS aJq -idX +wTf bCs bCs bCs @@ -87229,7 +87221,7 @@ acl cxA acL adi -vpz +pfm agp agT ahx @@ -87239,12 +87231,12 @@ ajc ajI akl akT -fGl -uko -xqW +unW +fde +seP anw anz -lYU +old apk anw anw @@ -87255,7 +87247,7 @@ avj awl axC ayY -uZM +cpF azZ azZ azZ @@ -87280,16 +87272,16 @@ bbm bdh bee bfv -vLD +xUL aBb -cSn +gpD aDr aEM aGa aHF bqF bsa -nmx +nXE buQ buQ bxI @@ -87359,7 +87351,7 @@ cgI cgI cgI aaa -hoo +gDl aaa aaa aaa @@ -87537,13 +87529,13 @@ bcf bdg bed bfv -kvZ -fGC -qvM +tyX +pst +cTT alu aEM aGd -nMx +uOJ bqE bqE bqE @@ -87769,7 +87761,7 @@ avk awk axE ayZ -ncj +pHO aBu aAa aAa @@ -87794,18 +87786,18 @@ bbm bdh bef bfv -smn +gTx aBc -jXg +xEB aDt aEO aGc aHF aKG bsf -kxc -kxc -kxc +dml +dml +dml bxK bwh bAh @@ -88015,7 +88007,7 @@ aml amT anw anz -ilJ +cXU apl aqc aqc @@ -88051,19 +88043,19 @@ aZR aZR aZR bfw -rzg +wZI aBa aBW bjy aEP -nOS +nYe aBa bqG bsa -jDY +eih bsa bsa -wEp +nbT bwb aJq bBr @@ -88272,7 +88264,7 @@ amn amV anw anz -rsX +gfC aod aqf ahT @@ -88308,19 +88300,19 @@ aZR bbm beh bfx -spX +qcm aBa aBa aBa aBa aBa aBa -mte +wql bsg -lTq -tMS -fZD -wEp +yhz +ouQ +fTC +nbT aJq aJq bBu @@ -88565,19 +88557,19 @@ bcg aZU beg aYB -ptV -fjy +qOB +qBi aaf aaf -lCL -lCL +ktS +ktS aaf -wwB -wwB -wwB -wwB -wwB -wwB +fxV +fxV +fxV +fxV +fxV +fxV aJq aJq bBt @@ -88782,9 +88774,9 @@ ajJ akr akX alC -iqw +wIG amX -elw +spu anz aoB aod @@ -88822,19 +88814,19 @@ bbp bfx bbp bfz -tAb +sqp aZV aZV aaf aaf -lCL +ktS aaf -lCL +ktS aaf -lCL +ktS aaf -lCL -wwB +ktS +fxV aJq aJq aXf @@ -89041,9 +89033,9 @@ akW aiG amo amW -uYE +uaj anz -rsX +gfC aod aqe arf @@ -89094,7 +89086,7 @@ bsh bqH aJq aJq -unY +gnf bCv bDJ bCt @@ -89333,7 +89325,7 @@ aYD aZX baf bdk -jwi +mRQ bek bfB bgU @@ -89576,7 +89568,7 @@ vHj eVC dgz aJv -ioG +khV aMg bHt aOE @@ -89806,13 +89798,13 @@ ahC aia aiP aiR -olv +coi akv ala aww afM aiX -uVq +xzj anz aoF apo @@ -89823,8 +89815,8 @@ atj aul auR atj -kcj -ghJ +mps +tKk atj aAX azc @@ -89847,7 +89839,7 @@ aPR aZV baq baQ -dTJ +wcB bcQ bfC bgV @@ -90083,8 +90075,8 @@ avt axL bbl azT -nlt -dwc +nZE +ker aDG aFd auk @@ -90137,7 +90129,7 @@ bOV bQj bRw bSF -gVY +daI bTP bRA bWQ @@ -90336,11 +90328,11 @@ arf arf arf arf -ukP -oma +ltK +xAv awr awr -wwn +ruo aAh aAh aAh @@ -90377,7 +90369,7 @@ btL buY buY bqH -neb +ftE aJq aXf bCv @@ -90394,7 +90386,7 @@ bOV bQo bRz bSH -cJn +plm bTP bRA bWQ @@ -90597,7 +90589,7 @@ avv awu awr aAd -uDW +tkq aAh aDL aAh @@ -90651,7 +90643,7 @@ bOV bQj bRy bSG -gVY +daI bUK bVT bWR @@ -90854,7 +90846,7 @@ awp axN awr awr -kSh +haM aAh aDQ aAh @@ -90862,7 +90854,7 @@ aGl aAh aBy aAh -pTR +rqf aJq aOE aJn @@ -90875,7 +90867,7 @@ aYF aZV bbw bcn -qUm +tgH ben bfE bgX @@ -91105,13 +91097,13 @@ aqe arf ari asu -kyi +mPk aun avR -oma -dHb +xAv +ofU awr -uya +sFW aAh aDM aGx @@ -91364,18 +91356,18 @@ arf arf arf arf -ukP +ltK axP azb aAi -wGP +uIO aCn -rOm -wwC +xBk +dtx aGm aHV aDM -nrR +hIM aJq aJq aJq @@ -91406,9 +91398,9 @@ bva bwu bwu bwu -ihm +kPj bBB -rhb +eBX bzs bFp bGJ @@ -91624,8 +91616,8 @@ arf awq axO aza -jtk -pqR +kmw +xrN aAh aAh aAh @@ -91874,7 +91866,7 @@ ajo aps aqk arf -vGX +vDR blU aHw avn @@ -91882,14 +91874,14 @@ awv axX aze awr -hMx +flE aAh aDU aBz aBz aAh -isy -uzk +dTI +ujv aJq aJq aJq @@ -92133,7 +92125,7 @@ aqj arf ark asu -epV +xPk aun awt awr @@ -92142,10 +92134,10 @@ azX aAZ aCe aDT -mEN -mEN -dzy -fyq +cPn +cPn +mkO +uQS aAh aJC aJC @@ -92402,18 +92394,18 @@ aDP aBx aBx aAh -kCk -qIf +qqs +sYR aMq adq aQb aPZ aRu -wpo +kAH aKR -tIC +tCa aXi -maC +hgO baa aJC bcq @@ -92653,7 +92645,7 @@ awy awr awr avG -udi +wqF aAh aAh aAh @@ -92663,13 +92655,13 @@ aAh aAh aKR aKR -pxD +fxe aPY -xMl +kAO aRx aKR -jzD -tuN +iTU +pqe aPY aZZ aQg @@ -92910,24 +92902,24 @@ awA axT axW aAl -tAE +cHf aJC aDR aFl -rLr +kqI aHZ aJC aKJ -rLR +hIL aKR -hSU -kay +wxT +moD aQd aQa aKR -xbu -hSU -lwj +elh +wxT +uBa bac aJC aYV @@ -93151,7 +93143,7 @@ aif aif aif bkV -fvk +jKP alK aif aif @@ -93159,19 +93151,19 @@ anc anD aoI arf -myt +eSe asN aur avy -tWR +nSt axS azk aAk -eUd +tvi aJC aDY aDY -rLr +kqI aKR aJk aKR @@ -93187,7 +93179,7 @@ aKR aKR bab aJC -xYO +ucq aYV ber bfF @@ -93399,13 +93391,13 @@ abp afo abp abp -hlY +uhm ahn aiA aiA aiA ahn -hYW +oLn anF aod ahn @@ -93416,15 +93408,15 @@ ahn ahn ahn arf -iES -jdT +oAB +eQb aut arf aXF awr awr aAn -wcy +rqk aJC aEc aFk @@ -93434,19 +93426,19 @@ aJC aKr aKR aKR -fbm -fbm -hzR +sLj +sLj +vcN aKR aKR aKR -fbm +sLj aKR aKR bbx aYV aYV -wDR +tkB bfF bhd bis @@ -93652,11 +93644,11 @@ aaf aaf aaf abp -unE +wdv afp -unE +wdv abp -nea +nQi ahn aaa aaf @@ -93666,39 +93658,39 @@ ahn anE aod aoK -sgV +oyX aqp ahn -ukS -tQk -cVp -jdT -jdT -jdT -rMc +tzQ +pgf +gzf +eQb +eQb +eQb +lUS aun avz awr awr aAn -fSr +jGW aJC aJC -gjC -lxx +plC +oAb aJC aJC aKq aKR aNF -egS -ghs -lMY +hOv +oax +oxm aSH aKR -dMX -igT -moq +rmN +eJa +hSZ aKR aQg aYV @@ -93724,7 +93716,7 @@ bvj bvj bvd bFu -hcd +jex bvj bvd bKH @@ -93926,19 +93918,19 @@ aoL apy aqq ahn -dhx -mfb +qLR +oIW arf -unl +kmS ast -jdT +eQb auv arf avA axW azo aAp -lYZ +uxY aBC aCt aEA @@ -93949,13 +93941,13 @@ aKN aKR aKR aOJ -fvW -dtE +oIJ +unA aKR aKR aUg bFC -moq +hSZ aKR bbx aYV @@ -93963,9 +93955,9 @@ aYV bet bfH bhf -slp +wbE bhh -slp +wbE bmJ bof bpu @@ -94191,11 +94183,11 @@ arf arf arf arf -hkg -eNW +hlV +oHB azf aAo -lMx +vyp aBB aBB aBB @@ -94205,12 +94197,12 @@ cNE aKM aMu aMu -poa -hdb +feG +tif aMu aMu aMu -uTq +jgA aSq aKR bad @@ -94222,7 +94214,7 @@ bfG bhe bit bjS -nGS +tCd bli boe bli @@ -94437,24 +94429,24 @@ aag aag aag arf -iep -gQn +wXl +iou arf -myt -qNs -lMx -sjw +eSe +wig +vyp +rrM clO asZ aua -dcG +oZl awB att azh -vYa -vYa -gKk -vbY +fHG +fHG +kxf +ufD alP aGI aId @@ -94468,7 +94460,7 @@ aMx aMx aMx aMx -eqm +rqE aKR aZb aJC @@ -94679,11 +94671,11 @@ aaa aaa aaa aaa -xzh +bvG aaa aqG aaa -vDq +oyN aaa aaa aaa @@ -94694,24 +94686,24 @@ aaa aaa aaa arf -pZv -tQk -cVp -jdT -ier +lOe +pgf +gzf +eQb +jLT arf arm -vYa +fHG aya -vYa -vYa +fHG +fHG auB atZ azg azp -vYa +fHG aCu -dgh +qOc alP aGH aIc @@ -94936,11 +94928,11 @@ aaa aaa aaa aaa -lCB -lNB +tqB +vae aaa -lNB -rUQ +vae +efO aaa aaa aaa @@ -94954,21 +94946,21 @@ arf arf arf arf -iES -jYI +oAB +ujS aqs -hVw -vYa -vYa -vYa -vYa -pSf -vYa +coh +fHG +fHG +fHG +fHG +pPi +fHG ayb -ndC -vYa +hWd +fHG aCv -frE +mbU alP aGJ aIe @@ -94982,7 +94974,7 @@ aXj aVy aSY aVy -oNb +xqG acN bah aJC @@ -95193,11 +95185,11 @@ aaa aaa aaa aaa -jmC -jmC +gJi +gJi gXs -jmC -jmC +gJi +gJi aaa aaa aaa @@ -95210,22 +95202,22 @@ aaa aaa aaa arf -ewZ -jdT -tOU +obc +eQb +qAm arf -fQF -qbx -qux -vYa -vYa -pSf -vYa +lXE +pFX +mOO +fHG +fHG +pPi +fHG ayb -ndC -vYa -vys -tCi +hWd +fHG +sci +sEi alP aGJ aIe @@ -95235,11 +95227,11 @@ aKQ aNu aJC aPw -kwy +egt aQc aSZ aQc -vjq +qaY acN bag aJC @@ -95467,22 +95459,22 @@ aaa aaa aaa arf -qoP -prU -fOc +mse +fMZ +dqb arf -oSO -sAI -fJa -vYa -svw -ntf -jvN -lBE -xpx -vYa +xzd +sJI +jJg +fHG +eAJ +rvr +nLu +hcA +ryr +fHG aCu -hgX +puh alP aGA aHS @@ -95504,7 +95496,7 @@ aYV aYV bet bfH -dok +qTV bhh bhg bln @@ -95708,9 +95700,9 @@ aaa aaa aaa aaa -aaz +xLX aaa -aaz +xLX aaa aaa aaa @@ -95728,18 +95720,18 @@ arf arf arf arf -mTp -qEv -kRk -mXB -qAQ -pzk -vYa -sMa -iEI -jeT -rTQ -vHM +fZm +jmV +epD +ghD +hBA +xbn +fHG +reA +lsk +xXi +jAN +jEc alP aGL aHM @@ -95984,18 +95976,18 @@ aaa aaa aaa gXs -kHJ -rEV -rEV -kQZ -fVU -vpm -vpm -fVU -nel -wCa -wCa -lFl +ewu +pQp +pQp +oqj +jBi +fpl +fpl +jBi +oDN +sEM +sEM +pRs arj alP aGL @@ -96092,7 +96084,7 @@ aaf ctZ cui cuq -ajY +cuC cuO cuz cvm @@ -96270,7 +96262,7 @@ aVz aVz aYJ aJI -sIe +mNW aYV aYV aYV @@ -96600,8 +96592,8 @@ czk cti cua cua -aeF -afs +ctw +ctH ctQ cuc cuj @@ -96787,7 +96779,7 @@ baj bbz aYV bdp -itT +mvt bfK bfK bfK @@ -96857,9 +96849,9 @@ ctb cth cua ctr -afn -age -agX +ctu +ctG +ctP cub cuj cur @@ -97040,7 +97032,7 @@ aVD aVE aXm aVz -egQ +juG bbz aYV bdp @@ -97114,13 +97106,13 @@ ctc ctc cto ctt -afq +cty ctJ -ahw +ctT cue cul cuu -akz +cuG cuS cve cvo @@ -97371,9 +97363,9 @@ ctb ctj ctk cts -afr -agv -ajC +ctx +ctI +ctS cud cuk cus @@ -97526,17 +97518,17 @@ aaa aaa aaa aaa -haX -rEV -rEV -rEV -nie -vpm -vpm -wFX -wCa -wCa -wCa +vmQ +pQp +pQp +pQp +grA +fpl +fpl +gbh +sEM +sEM +sEM aCy arj alP @@ -97554,7 +97546,7 @@ aTO cCq aVz aVz -fPs +qus bbz aYV bdp @@ -97787,14 +97779,14 @@ aaa aaa aaa arj -cRz +fCx avD awC ayb -mbD -nmS -oFk -xXY +eCr +jvd +cEo +xZD vpY alP aGJ @@ -97840,7 +97832,7 @@ bCR bqQ bGX bCR -oDy +edA bRN bIK bPq @@ -98046,13 +98038,13 @@ aaf arj auz avC -kOf +vHz aya -vYa -vYa -oYc -vYa -vYa +fHG +fHG +xkd +fHG +fHG gOZ aGJ avI @@ -98143,7 +98135,7 @@ aaa aaf cua ctF -agH +ctM ctX cuf cum @@ -98303,7 +98295,7 @@ alO arj arj arj -eOv +pBp gOZ cVb cVb @@ -98401,7 +98393,7 @@ aaf cua ctE ctL -ajX +ctW cuf cum cuw @@ -98815,10 +98807,10 @@ cxW anf aqv ayf -fIn -ego +dce +uua awE -dMu +tRB cVb vCb wUY @@ -99071,8 +99063,8 @@ aag alO anf alO -kSB -pAl +mAH +jaF alP anf aCG @@ -99088,11 +99080,11 @@ aIq aKK aMy aIp -jaa +nGf aQm -wOT -htr -htr +fzd +fFA +fFA aVK aRJ aRJ @@ -99334,10 +99326,10 @@ alP awF aCG alP -olw +nhY aBE aCz -trY +vEp aCJ aGT aIn @@ -99347,10 +99339,10 @@ aMt aIp aOW aQm -dRC +coI aSS aUj -pHo +sJx aRJ aYQ cBg @@ -99584,7 +99576,7 @@ aoN apA aof arq -hdp +itK atv auD alP @@ -99604,14 +99596,14 @@ aMA aIp aOX aQm -dRC +coI aST aUk -pHo +sJx aRJ aYQ bam -yiN +ssB aYV aYV aYV @@ -99828,10 +99820,10 @@ adU adU adU adU -ssL -rsv -rsv -rsv +eaR +jIs +jIs +jIs acx amv ane @@ -99861,14 +99853,14 @@ aMz aNQ aOX aQm -tFt -tsr -tsr -xzy +lva +nUV +nUV +gbd aRJ aYR ban -qje +ikm aYV aYV bez @@ -100112,7 +100104,7 @@ aaa aFq aGX aIp -vzS +sHx aKU aME aNN @@ -100125,7 +100117,7 @@ aXo aXo aYO bap -qje +ikm aYV bci beB @@ -100354,7 +100346,7 @@ aof aof aof aof -qkC +vCy aoP atw auF @@ -100362,7 +100354,7 @@ alP aoP auF azr -kel +jez atw alP alP @@ -100376,13 +100368,13 @@ aNQ aOZ aOX aOX -hZH +rdG aUz aVM aOX aYT bam -ory +iuR baR bcb bdl @@ -100439,7 +100431,7 @@ bAw bAw clp aag -jmC +gJi aaa aaa aaa @@ -100617,7 +100609,7 @@ aty auF alP aAt -kuY +jZT alP alP alP @@ -100868,7 +100860,7 @@ aaa aaa apC anf -kel +jez alP atx auF @@ -100877,7 +100869,7 @@ auD auF apE aAs -khA +vbi alP aCG aFr @@ -101130,12 +101122,12 @@ alP apE auG alP -rgF +iWx auF apE anf anf -jRy +noF aCG aDZ aFu @@ -101399,8 +101391,8 @@ bbE aIr bav aLf -aaL -kLR +aNV +qfD aRO aQp aRN @@ -101464,11 +101456,11 @@ cQB czY cOT aaa -jmC -jmC -jmC -jmC -jmC +gJi +gJi +gJi +gJi +gJi aaa aaa aaa @@ -101641,12 +101633,12 @@ apC alP alP alP -tuj +dbU auH avF awI ayc -mlr +gcF asw asw aCD @@ -101657,7 +101649,7 @@ aIu aJQ aIt aIt -kLR +qfD aRO aIt aRN @@ -101912,9 +101904,9 @@ anf aFu aIs aJP -wuB +vZR aIt -nsJ +hGH aYW aYW aYW @@ -101982,9 +101974,9 @@ aaa aaa aaa aaH -adO -aeD -aeE +eFW +nwX +weM aaa aaa aaa @@ -102169,9 +102161,9 @@ aFu aFu aIw aJS -tqt +pJR aNP -jFy +esZ aOS aOS aOS @@ -102235,14 +102227,14 @@ cQB cAa cOT gXs -xNY -kvb +rnK +kWp aaa aaa aaH aaH aaH -aeE +weM aaa aaa aaa @@ -102419,7 +102411,7 @@ awJ anf alP aAv -gCe +tJS aCE aDZ aFu @@ -102428,7 +102420,7 @@ aIv aJR aIt aIt -kLR +qfD aRO aIt aPd @@ -102492,14 +102484,14 @@ czU czZ cOT aaa -jmC +gJi aaH aaH aaH aaH aaH aaH -adO +eFW aaa aaa aaa @@ -102685,7 +102677,7 @@ aIx aJF aQq aNS -kLR +qfD aRO aIt aPd @@ -102749,14 +102741,14 @@ cgm czY cOT gXs -xNY -kvb -gJg +rnK +kWp +kaq aaH aaH aaa aaa -gJg +kaq aaa aaa aaa @@ -102946,12 +102938,12 @@ aFu aPf aQq aRP -kHK +pem aIt aIt aWd aXV -iWa +vsT bbD aYV aXq @@ -102959,7 +102951,7 @@ aYV bfV bhw cHM -kRw +wWT blB blF cHS @@ -103008,9 +103000,9 @@ cNW aaa aaa aaa -gJg -gJg -adO +kaq +kaq +eFW aaH gXs aaa @@ -103182,8 +103174,8 @@ alO anf anf arw -ftv -sLr +nuw +uve anf alP awL @@ -103456,7 +103448,7 @@ aIy aJG cAz aFw -iWk +gRZ aPg aQr aFu @@ -103523,10 +103515,10 @@ aaa aaa aaa aaa -jmC -jmC -jmC -jmC +gJi +gJi +gJi +gJi aaa aaa aaa @@ -103693,10 +103685,10 @@ aaa aaa gXs alP -qxc +jkx ayf -nuV -iOV +xAk +mHU aFn aFn aBB @@ -103713,7 +103705,7 @@ aFw aLo aLb aFw -eMQ +xEE aYW aYW aRQ @@ -103947,13 +103939,13 @@ aaa aaa aaa aaa -fzd -fzd -fzd -fzd -tNJ -fzd -fzd +nsA +nsA +nsA +nsA +qVP +nsA +nsA atB alP alP @@ -103970,7 +103962,7 @@ aIz aJM aLa aFw -tGG +hsb aYW aQs aFu @@ -104204,21 +104196,21 @@ aaa aaa aaa aaa -fzd -xdb -mCq -wJz -mHC -tWs -lmi -ghY -sxX -ghY -jBZ +nsA +cQF +ndq +rIA +fBy +hRI +jaH +hHQ +feE +hHQ +kGJ avI asA apE -vHv +dPk aCG aEf aFw @@ -104461,12 +104453,12 @@ aaa aaa aaa aaa -tIk -mCq -mCq -mCq -mCq -pjh +wKe +ndq +ndq +ndq +ndq +oLl asB asB asB @@ -104557,7 +104549,7 @@ cOe cBT aag gXs -jmC +gJi aaa aaa aaa @@ -104718,12 +104710,12 @@ aaa aaa aaa aaa -tIk -mCq -mCq -mCq -mCq -dSv +wKe +ndq +ndq +ndq +ndq +qeb asB atD auJ @@ -104975,12 +104967,12 @@ aaa aaa aaa aaa -fzd -mCq -mCq -mCq -mCq -mCq +nsA +ndq +ndq +ndq +ndq +ndq asB atC auI @@ -105064,7 +105056,7 @@ cNW cNW cNW cOe -qXH +fup csy cko cAf @@ -105232,12 +105224,12 @@ aaa aaa aaa aaa -tIk -mCq -mCq -mCq -mCq -mCq +wKe +ndq +ndq +ndq +ndq +ndq asB atE auI @@ -105489,18 +105481,18 @@ aaa aaa aaa aaa -tIk -mCq -mCq -mCq -mCq -mCq +wKe +ndq +ndq +ndq +ndq +ndq asB asB asB avL awR -hRT +hiV azu aAz asB @@ -105574,7 +105566,7 @@ cgp chv ciJ cbf -lLI +diq clr bnt cOe @@ -105746,12 +105738,12 @@ aaa aaa aaa aaa -fzd -wXP -mCq -nXa -mCq -nyH +nsA +lGV +ndq +pou +ndq +srG asB atG auL @@ -106003,12 +105995,12 @@ aaa aaa aaa aaa -fzd -fzd -fzd -fzd -fzd -fzd +nsA +nsA +nsA +nsA +nsA +nsA asB atF auK @@ -106092,7 +106084,7 @@ cNW clt cQw cNW -abG +mJo cNW cNW aaf @@ -106294,9 +106286,9 @@ aXB aZh baB aCR -riB +kYk bdx -dfI +vHT bgc bgc biX @@ -106348,7 +106340,7 @@ aaa cOT clt cQw -aaO +oEZ cOe cOe cNW @@ -106605,18 +106597,18 @@ aaa cOT clt cQw -aaQ +ttL cOe cOe cNW aaa -jzi -jzi -jzi -jzi -jzi -jzi -jzi +fIs +fIs +fIs +fIs +fIs +fIs +fIs aaS aaS aba @@ -106866,7 +106858,7 @@ bNB cOe cOe cNW -lCL +ktS aaS aaa aaf @@ -107119,7 +107111,7 @@ cNW cNW clt cQw -aaY +cCt cOe cOe cNW @@ -107368,7 +107360,7 @@ cbZ bSl cmo cNW -vOq +lZl cNW chC ciL @@ -108668,17 +108660,17 @@ cpi cpi cpi cqJ -ggg +vZA crk crk crk crk crk -pFt +pTB cqJ -ggg +vZA crk -pFt +pTB cpi cpi ctB @@ -108934,7 +108926,7 @@ crF aaa aaa aaa -hik +vPs aaa aaa aaa @@ -109673,7 +109665,7 @@ cNW cNW cNW cNW -vFt +kAJ clt cac cbh @@ -109939,7 +109931,7 @@ cbf cbf ceT cNW -kCW +dBm chH cNW aaf From bad4b5cb56b0fb8b55b44c06731e3b236083b435 Mon Sep 17 00:00:00 2001 From: Hatterhat Date: Tue, 4 Feb 2020 22:13:03 -0600 Subject: [PATCH 071/172] huskies --- code/__DEFINES/reagents.dm | 2 ++ code/modules/mob/living/carbon/carbon.dm | 4 ++-- .../reagents/chemistry/reagents/medicine_reagents.dm | 12 ++++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index 54f4648006..d08344cc96 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -40,6 +40,8 @@ #define ADD_REAGENT 2 // reagent added #define REM_REAGENT 3 // reagent removed (may still exist) +#define THRESHOLD_UNHUSK 50 // health threshold for synthflesh/rezadone to unhusk someone + //reagent bitflags, used for altering how they works #define REAGENT_DEAD_PROCESS (1<<0) //calls on_mob_dead() if present in a dead body #define REAGENT_DONOTSPLIT (1<<1) //Do not split the chem at all during processing diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 113588facf..ef33afec25 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -559,7 +559,7 @@ health = round(maxHealth - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute, DAMAGE_PRECISION) staminaloss = round(total_stamina, DAMAGE_PRECISION) update_stat() - if(((maxHealth - total_burn) < HEALTH_THRESHOLD_DEAD) && stat == DEAD ) + if(((maxHealth - total_burn) < HEALTH_THRESHOLD_DEAD*2) && stat == DEAD ) become_husk("burn") med_hud_set_health() if(stat == SOFT_CRIT) @@ -986,4 +986,4 @@ if(H.clothing_flags & SCAN_REAGENTS) return TRUE if(isclothing(wear_mask) && (wear_mask.clothing_flags & SCAN_REAGENTS)) - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index d8fc47d1b8..e8913f9ce4 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -216,6 +216,14 @@ ..() . = 1 +/datum/reagent/medicine/rezadone/reaction_mob(mob/living/M, method=TOUCH, reac_volume) + . = ..() + if(iscarbon(M)) + var/mob/living/carbon/patient = M + if(reac_volume >= 5 && HAS_TRAIT_FROM(patient, TRAIT_HUSK, "burn") && patient.getFireLoss() < THRESHOLD_UNHUSK) //One carp yields 12u rezadone. + patient.cure_husk("burn") + patient.visible_message("[patient]'s body rapidly absorbs moisture from the enviroment, taking on a more healthy appearance.") + /datum/reagent/medicine/spaceacillin name = "Spaceacillin" description = "Spaceacillin will prevent a patient from conventionally spreading any diseases they are currently infected with." @@ -436,6 +444,10 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) if(show_message) to_chat(M, "You feel your burns and bruises healing! It stings like hell!") SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) + //Has to be at less than THRESHOLD_UNHUSK burn damage and have 100 synthflesh before unhusking. Corpses dont metabolize. + if(HAS_TRAIT_FROM(M, TRAIT_HUSK, "burn") && M.getFireLoss() < THRESHOLD_UNHUSK && M.reagents.has_reagent(/datum/reagent/medicine/synthflesh, 100)) + M.cure_husk("burn") + M.visible_message("Most of [M]'s burnt off or charred flesh has been restored.") ..() /datum/reagent/medicine/synthflesh/overdose_start(mob/living/M) From 8c737b6ce756e6fcbf21af5264d8b9fdb085df74 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 5 Feb 2020 00:43:42 -0700 Subject: [PATCH 072/172] Update debuffs.dm --- code/datums/status_effects/debuffs.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 7319945f49..c560a123b5 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -79,11 +79,11 @@ desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are." icon_state = "asleep" -/datum/status_effect/no_combat_mode/ +/datum/status_effect/no_combat_mode id = "no_combat_mode" - blocks_combatmode = TRUE alert_type = null status_type = STATUS_EFFECT_REPLACE + blocks_combatmode = TRUE /datum/status_effect/no_combat_mode/on_creation(mob/living/new_owner, set_duration) if(isnum(set_duration)) @@ -149,6 +149,7 @@ slowdown = 8 slowdown_priority = 100 nextmove_modifier = 2 + blocks_combatmode = TRUE /datum/status_effect/electrode/no_combat_mode/on_creation(mob/living/new_owner, set_duration) . = ..() From 8b5e3e6004708e908da17bd713d3f13f295e0480 Mon Sep 17 00:00:00 2001 From: Artur Date: Wed, 5 Feb 2020 14:55:47 +0100 Subject: [PATCH 073/172] Removes the shitty verb --- .../reagents/reagent_containers/hypospray.dm | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index f4bb5e0d08..da99cd184b 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -423,18 +423,19 @@ else unload_hypo(vial,user) -/obj/item/hypospray/mkii/verb/modes() - set name = "Toggle Application Mode" - set category = "Object" - set src in usr - var/mob/M = usr - switch(mode) - if(HYPO_SPRAY) - mode = HYPO_INJECT - to_chat(M, "[src] is now set to inject contents on application.") - if(HYPO_INJECT) - mode = HYPO_SPRAY - to_chat(M, "[src] is now set to spray contents on application.") +/obj/item/hypospray/mkii/AltClick(mob/living/user) + if(user.canUseTopic(src, BE_CLOSE, FALSE,)) + switch(mode) + if(HYPO_SPRAY) + mode = HYPO_INJECT + to_chat(user, "[src] is now set to inject contents on application.") + if(HYPO_INJECT) + mode = HYPO_SPRAY + to_chat(user, "[src] is now set to spray contents on application.") + +/obj/item/hypospray/mkii/examine(mob/user) + . = ..() + . += "You can click on it while holding Alt to toggle its mode from spraying to injecting." #undef HYPO_SPRAY #undef HYPO_INJECT From 949587d671bb03b738c3a91a04f7f16d3f987c3e Mon Sep 17 00:00:00 2001 From: r4d6 Date: Wed, 5 Feb 2020 11:48:19 -0500 Subject: [PATCH 074/172] dorf config --- config/game_options.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/config/game_options.txt b/config/game_options.txt index 0fa4db519d..b2b0ac0abd 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -426,6 +426,7 @@ ROUNDSTART_RACES lizard ROUNDSTART_RACES plasmaman #ROUNDSTART_RACES shadow ROUNDSTART_RACES felinid +ROUNDSTART_RACES dwarf ## Races that are better than humans in some ways, but worse in others #ROUNDSTART_RACES jelly From 7e2ad2b71fbc94b8231fe5b32cd347c6df4eed1c Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Wed, 5 Feb 2020 18:45:15 +0100 Subject: [PATCH 075/172] Fixing accidental nerfs to the magpistol. --- code/datums/components/storage/concrete/pockets.dm | 2 +- code/modules/projectiles/boxes_magazines/external/magweapon.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/components/storage/concrete/pockets.dm b/code/datums/components/storage/concrete/pockets.dm index 9c8622d16e..4d3ecc8d17 100644 --- a/code/datums/components/storage/concrete/pockets.dm +++ b/code/datums/components/storage/concrete/pockets.dm @@ -56,7 +56,7 @@ /obj/item/scalpel, /obj/item/reagent_containers/syringe, /obj/item/dnainjector, /obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/dropper, /obj/item/implanter, /obj/item/screwdriver, /obj/item/weldingtool/mini, - /obj/item/firing_pin, /obj/item/gun/ballistic/automatic/pistol + /obj/item/firing_pin, /obj/item/gun/ballistic/automatic/pistol, /obj/item/gun/ballistic/automatic/magrifle/pistol )) /datum/component/storage/concrete/pockets/shoes/clown/Initialize() diff --git a/code/modules/projectiles/boxes_magazines/external/magweapon.dm b/code/modules/projectiles/boxes_magazines/external/magweapon.dm index fa90170ace..a1b7f58698 100644 --- a/code/modules/projectiles/boxes_magazines/external/magweapon.dm +++ b/code/modules/projectiles/boxes_magazines/external/magweapon.dm @@ -13,7 +13,7 @@ name = "magpistol magazine (non-lethal disabler)" icon_state = "smallmagmag" ammo_type = /obj/item/ammo_casing/caseless/magnetic/weak/disabler - max_ammo = 15 + max_ammo = 16 /obj/item/ammo_box/magazine/mmag/small/lethal name = "magpistol magazine (lethal)" From 9951f291fd0f9a0359886a851d00abc079036693 Mon Sep 17 00:00:00 2001 From: Artur Date: Wed, 5 Feb 2020 20:14:35 +0100 Subject: [PATCH 076/172] Reviewer suggestions --- code/modules/reagents/reagent_containers/hypospray.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index da99cd184b..d459206c99 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -424,7 +424,7 @@ unload_hypo(vial,user) /obj/item/hypospray/mkii/AltClick(mob/living/user) - if(user.canUseTopic(src, BE_CLOSE, FALSE,)) + if(user.canUseTopic(src, FALSE)) switch(mode) if(HYPO_SPRAY) mode = HYPO_INJECT @@ -432,10 +432,11 @@ if(HYPO_INJECT) mode = HYPO_SPRAY to_chat(user, "[src] is now set to spray contents on application.") + return TRUE /obj/item/hypospray/mkii/examine(mob/user) . = ..() - . += "You can click on it while holding Alt to toggle its mode from spraying to injecting." + . += "Alt-Click it to toggle its mode from spraying to injecting and vice versa." #undef HYPO_SPRAY #undef HYPO_INJECT From 560228901380f2a238df380a11f15428385305f9 Mon Sep 17 00:00:00 2001 From: Artur Date: Wed, 5 Feb 2020 20:25:04 +0100 Subject: [PATCH 077/172] Parent call Failed to get in the previous commit for some reason. --- code/modules/reagents/reagent_containers/hypospray.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index d459206c99..034f52bd2c 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -424,6 +424,7 @@ unload_hypo(vial,user) /obj/item/hypospray/mkii/AltClick(mob/living/user) + ..() if(user.canUseTopic(src, FALSE)) switch(mode) if(HYPO_SPRAY) From c2b68d0ba339156805f58dc5514a2cbb5b25c9d0 Mon Sep 17 00:00:00 2001 From: Artur Date: Wed, 5 Feb 2020 20:35:24 +0100 Subject: [PATCH 078/172] Adds debbuging --- code/__DEFINES/spaceman_dmm.dm | 5 +++++ code/game/world.dm | 1 + 2 files changed, 6 insertions(+) diff --git a/code/__DEFINES/spaceman_dmm.dm b/code/__DEFINES/spaceman_dmm.dm index e590a30ff9..8f7f9c5bf7 100644 --- a/code/__DEFINES/spaceman_dmm.dm +++ b/code/__DEFINES/spaceman_dmm.dm @@ -11,3 +11,8 @@ #define SHOULD_CALL_PARENT(X) #define UNLINT(X) X #endif + +/world/proc/enable_debugger() + var/dll = world.GetConfig("env", "EXTOOLS_DLL") + if(dll) + call(dll, "debug_initialize")() diff --git a/code/game/world.dm b/code/game/world.dm index 8e18f2ea51..6b380e0f94 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -8,6 +8,7 @@ GLOBAL_LIST(topic_status_cache) //This happens after the Master subsystem new(s) (it's a global datum) //So subsystems globals exist, but are not initialised /world/New() + enable_debugger() log_world("World loaded at [TIME_STAMP("hh:mm:ss", FALSE)]!") From 01d8086ebd5bae0ce853460d4160c42cba9f9b50 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Wed, 5 Feb 2020 21:12:15 +0100 Subject: [PATCH 079/172] Lavaland's Herald speech fix. --- .../simple_animal/hostile/mining_mobs/elites/herald.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm index f1e7494beb..0d62eb260d 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm @@ -62,8 +62,9 @@ /mob/living/simple_animal/hostile/asteroid/elite/herald/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) . = ..() - playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) - + if(.) + playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) + /datum/action/innate/elite_attack/herald_trishot name = "Triple Shot" button_icon_state = "herald_trishot" From 98c721fffc868910e173bcb0e0794e908a61ce89 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 5 Feb 2020 13:29:31 -0700 Subject: [PATCH 080/172] Update cart.dm --- code/game/objects/items/devices/PDA/cart.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index b186c29539..4f4a6fc4e8 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -100,7 +100,8 @@ bot_access_flags = CLEAN_BOT /obj/item/cartridge/lawyer - name = "\improper P.R.O.V.E. cartridge" + name = "\improper S.P.A.M. cartridge" + desc = "Introducing the Station Public Announcement Messenger cartridge, featuring the unique ability to broadcast-mark messages, designed for lawyers across Nanotrasen to advertise their useful and important services." icon_state = "cart-law" access = CART_SECURITY spam_enabled = 1 From 78339881de6e3faf4acafb3cbcdce6d8c858d04d Mon Sep 17 00:00:00 2001 From: Artur Date: Wed, 5 Feb 2020 21:37:36 +0100 Subject: [PATCH 081/172] Wierd ass formatting causing tabs to betray me --- code/__DEFINES/spaceman_dmm.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/__DEFINES/spaceman_dmm.dm b/code/__DEFINES/spaceman_dmm.dm index 8f7f9c5bf7..b9c0544bc1 100644 --- a/code/__DEFINES/spaceman_dmm.dm +++ b/code/__DEFINES/spaceman_dmm.dm @@ -14,5 +14,5 @@ /world/proc/enable_debugger() var/dll = world.GetConfig("env", "EXTOOLS_DLL") - if(dll) - call(dll, "debug_initialize")() + if (dll) + call(dll, "debug_initialize")() From 23834ce3f5811f15fc5325593440f996e956dea5 Mon Sep 17 00:00:00 2001 From: Arturlang Date: Wed, 5 Feb 2020 22:54:01 +0200 Subject: [PATCH 082/172] Parent call Co-Authored-By: Ghom <42542238+Ghommie@users.noreply.github.com> --- code/modules/reagents/reagent_containers/hypospray.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 034f52bd2c..02c8798329 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -424,7 +424,7 @@ unload_hypo(vial,user) /obj/item/hypospray/mkii/AltClick(mob/living/user) - ..() + . = ..() if(user.canUseTopic(src, FALSE)) switch(mode) if(HYPO_SPRAY) From 3a1a40ebd249ec316d378f519e9639b8fcece195 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Wed, 5 Feb 2020 23:41:52 +0100 Subject: [PATCH 083/172] Update read_from_file.dm --- .../code/modules/custom_loadout/read_from_file.dm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/modular_citadel/code/modules/custom_loadout/read_from_file.dm b/modular_citadel/code/modules/custom_loadout/read_from_file.dm index 78124b0324..004757add4 100644 --- a/modular_citadel/code/modules/custom_loadout/read_from_file.dm +++ b/modular_citadel/code/modules/custom_loadout/read_from_file.dm @@ -18,13 +18,13 @@ GLOBAL_LIST(custom_item_list) if(copytext(line,1,3) == "//") //Commented line, ignore. 3 == length("//") + 1 continue var/ckey_str_sep = findtext(line, "|") //Process our stuff.. - var/char_str_sep = findtext(line, "|", ckey_str_sep + length(ckey_str_sep)) - var/job_str_sep = findtext(line, "|", char_str_sep + length(char_str_sep)) - var/item_str_sep = findtext(line, "|", job_str_sep + length(job_str_sep)) + var/char_str_sep = findtext(line, "|", ckey_str_sep + length(line[ckey_str_sep])) + var/job_str_sep = findtext(line, "|", char_str_sep + length(line[char_str_sep])) + var/item_str_sep = findtext(line, "|", job_str_sep + length(line[job_str_sep])) var/ckey_str = ckey(copytext(line, 1, ckey_str_sep)) - var/char_str = copytext(line, ckey_str_sep + length(ckey_str_sep), char_str_sep) - var/job_str = copytext(line, char_str_sep + length(char_str_sep), job_str_sep) - var/item_str = copytext(line, job_str_sep + length(job_str_sep), item_str_sep) + var/char_str = copytext(line, ckey_str_sep + length(line[ckey_str_sep]), char_str_sep) + var/job_str = copytext(line, char_str_sep + length(line[char_str_sep]), job_str_sep) + var/item_str = copytext(line, job_str_sep + length(line[job_str_sep]), item_str_sep) if(!ckey_str || !char_str || !job_str || !item_str || !length(ckey_str) || !length(char_str) || !length(job_str) || !length(item_str)) log_admin("Errored custom_items_whitelist line: [line] - Component/separator missing!") if(!islist(GLOB.custom_item_list[ckey_str])) @@ -42,7 +42,7 @@ GLOBAL_LIST(custom_item_list) for(var/item_string in item_strings) var/path_str_sep = findtext(item_string, "=") var/path = copytext(item_string, 1, path_str_sep) //Path to spawn - var/amount = copytext(item_string, path_str_sep + length(path_str_sep)) //Amount to spawn + var/amount = copytext(item_string, path_str_sep + length(item_string[path_str_sep])) //Amount to spawn //world << "DEBUG: Item string [item_string] processed" amount = text2num(amount) path = text2path(path) From ab06c23a2b52c9a9c10798907a75a0872d0c0135 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Wed, 5 Feb 2020 23:48:17 +0100 Subject: [PATCH 084/172] runtime is forever, errors are eternal. --- code/game/machinery/dance_machine.dm | 2 +- code/game/objects/effects/contraband.dm | 3 +- code/game/objects/effects/wanted_poster.dm | 1 + .../mob/living/carbon/carbon_defense.dm | 51 +++++++++---------- code/modules/mob/living/say.dm | 3 +- code/modules/surgery/organs/eyes.dm | 2 +- 6 files changed, 32 insertions(+), 30 deletions(-) diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index c6b4f2fcf5..6bedfb0a10 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -430,6 +430,6 @@ /obj/machinery/jukebox/disco/process() . = ..() if(active) - for(var/mob/M in rangers) + for(var/mob/living/M in rangers) if(prob(5+(allowed(M)*4)) && M.canmove) dance(M) diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index 6e8387c07b..eea3bace98 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -57,6 +57,7 @@ var/poster_item_name = "hypothetical poster" var/poster_item_desc = "This hypothetical poster item should not exist, let's be honest here." var/poster_item_icon_state = "rolled_poster" + var/poster_item_type = /obj/item/poster /obj/structure/sign/poster/Initialize() . = ..() @@ -114,7 +115,7 @@ /obj/structure/sign/poster/proc/roll_and_drop(loc) pixel_x = 0 pixel_y = 0 - var/obj/item/poster/P = new(loc, src) + var/obj/item/poster/P = new poster_item_type(loc, src) forceMove(P) return P diff --git a/code/game/objects/effects/wanted_poster.dm b/code/game/objects/effects/wanted_poster.dm index 35d16070ff..2e3244b4b8 100644 --- a/code/game/objects/effects/wanted_poster.dm +++ b/code/game/objects/effects/wanted_poster.dm @@ -8,6 +8,7 @@ /obj/structure/sign/poster/wanted var/wanted_name + poster_item_type = /obj/item/poster/wanted /obj/structure/sign/poster/wanted/Initialize(mapload, icon/person_icon, person_name, description) . = ..() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index bb4442559e..637178ffe6 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -274,7 +274,7 @@ return if(health >= 0 && !(HAS_TRAIT(src, TRAIT_FAKEDEATH))) - + var/friendly_check = FALSE if(lying) if(buckled) to_chat(M, "You need to unbuckle [src] first to do that!") @@ -289,39 +289,35 @@ playsound(src, 'sound/items/Nose_boop.ogg', 50, 0) else if(check_zone(M.zone_selected) == "head") - var/mob/living/carbon/human/H = src - var/datum/species/pref_species = H.dna.species + var/datum/species/S + if(ishuman(src)) + S = dna.species - M.visible_message("[M] gives [H] a pat on the head to make [p_them()] feel better!", \ - "You give [H] a pat on the head to make [p_them()] feel better!") + M.visible_message("[M] gives [src] a pat on the head to make [p_them()] feel better!", \ + "You give [src] a pat on the head to make [p_them()] feel better!") SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "headpat", /datum/mood_event/headpat) - if(HAS_TRAIT(M, TRAIT_FRIENDLY)) - var/datum/component/mood/mood = M.GetComponent(/datum/component/mood) - if (mood.sanity >= SANITY_GREAT) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "friendly_hug", /datum/mood_event/besthug, M) - else if (mood.sanity >= SANITY_DISTURBED) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "friendly_hug", /datum/mood_event/betterhug, M) - if(H.dna.species.can_wag_tail(H)) - if("tail_human" in pref_species.default_features) - if(H.dna.features["tail_human"] == "None") + friendly_check = TRUE + if(S?.can_wag_tail(src)) + if("tail_human" in S.default_features) + if(dna.features["tail_human"] == "None") return else - if(!H.dna.species.is_wagging_tail()) - H.emote("wag") + if(!dna.species.is_wagging_tail()) + emote("wag") - if("tail_lizard" in pref_species.default_features) - if(H.dna.features["tail_lizard"] == "None") + if("tail_lizard" in S.default_features) + if(dna.features["tail_lizard"] == "None") return else - if(!H.dna.species.is_wagging_tail()) - H.emote("wag") + if(!dna.species.is_wagging_tail()) + emote("wag") - if("mam_tail" in pref_species.default_features) - if(H.dna.features["mam_tail"] == "None") + if("mam_tail" in S.default_features) + if(dna.features["mam_tail"] == "None") return else - if(!H.dna.species.is_wagging_tail()) - H.emote("wag") + if(!dna.species.is_wagging_tail()) + emote("wag") else return @@ -335,8 +331,11 @@ M.visible_message("[M] hugs [src] to make [p_them()] feel better!", \ "You hug [src] to make [p_them()] feel better!") SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/hug) - if(HAS_TRAIT(M, TRAIT_FRIENDLY)) - var/datum/component/mood/mood = M.GetComponent(/datum/component/mood) + friendly_check = TRUE + + if(friendly_check && HAS_TRAIT(M, TRAIT_FRIENDLY)) + var/datum/component/mood/mood = M.GetComponent(/datum/component/mood) + if(mood) if (mood.sanity >= SANITY_GREAT) SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "friendly_hug", /datum/mood_event/besthug, M) else if (mood.sanity >= SANITY_DISTURBED) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index a12d468e24..0fb48f65b1 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -103,7 +103,8 @@ GLOBAL_LIST_INIT(department_radio_keys, list( else if(message_mode || saymode) message = copytext_char(message, 3) message = trim_left(message) - + if(!message) + return if(message_mode == MODE_ADMIN) if(client) client.cmd_admin_say(message) diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index dfbf4ee21e..44e92e464b 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -51,7 +51,7 @@ clear_eye_trauma() . = ..() var/mob/living/carbon/C = . - if(C) + if(!QDELETED(C)) if(ishuman(C) && eye_color) var/mob/living/carbon/human/H = C H.eye_color = old_eye_color From 5d1d652ea4a078f205db529714b300939ef904af Mon Sep 17 00:00:00 2001 From: keronshb Date: Wed, 5 Feb 2020 18:28:00 -0500 Subject: [PATCH 085/172] Buffs the Pirate Ship to be bomb proof Title, also makes a few computers/machines indestructible and buffs turret health. It also allows turrets to be repairable now. --- _maps/shuttles/pirate_default.dmm | 28 +++++---- .../machinery/porta_turret/portable_turret.dm | 22 ++++++- .../objects/effects/spawners/structure.dm | 7 +++ code/game/objects/structures/window.dm | 24 ++++++++ .../turfs/simulated/wall/mineral_walls.dm | 61 +++++++++++++++++++ code/modules/events/pirates.dm | 5 ++ 6 files changed, 134 insertions(+), 13 deletions(-) diff --git a/_maps/shuttles/pirate_default.dmm b/_maps/shuttles/pirate_default.dmm index 1c8670d5b6..959e067a9d 100644 --- a/_maps/shuttles/pirate_default.dmm +++ b/_maps/shuttles/pirate_default.dmm @@ -89,7 +89,7 @@ /turf/open/floor/pod/dark, /area/shuttle/pirate) "aj" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, +/turf/closed/wall/mineral/plastitaniumpirate/nodiagonal, /area/shuttle/pirate) "ak" = ( /obj/machinery/airalarm/all_access{ @@ -469,7 +469,7 @@ icon_state = "standard_lethal"; mode = 1 }, -/turf/closed/wall/mineral/plastitanium/nodiagonal, +/turf/closed/wall/mineral/plastitaniumpirate/nodiagonal, /area/shuttle/pirate) "aR" = ( /obj/machinery/porta_turret/syndicate/energy{ @@ -477,7 +477,7 @@ icon_state = "standard_lethal"; mode = 1 }, -/turf/closed/wall/mineral/plastitanium, +/turf/closed/wall/mineral/plastitaniumpirate, /area/shuttle/pirate) "aS" = ( /obj/effect/turf_decal/stripes/line, @@ -486,7 +486,7 @@ /area/shuttle/pirate) "aU" = ( /obj/structure/sign/departments/engineering, -/turf/closed/wall/mineral/plastitanium/nodiagonal, +/turf/closed/wall/mineral/plastitaniumpirate/nodiagonal, /area/shuttle/pirate) "aV" = ( /obj/effect/mob_spawn/human/pirate{ @@ -897,7 +897,7 @@ icon_state = "standard_lethal"; mode = 1 }, -/turf/closed/wall/mineral/plastitanium, +/turf/closed/wall/mineral/plastitaniumpirate, /area/shuttle/pirate) "dy" = ( /obj/structure/chair/wood/normal, @@ -948,7 +948,8 @@ /turf/open/floor/pod/light, /area/shuttle/pirate) "ep" = ( -/obj/structure/window/reinforced{ +/obj/structure/window/plastitaniumpirate{ +//obj/structure/window/reinforced{ dir = 1; pixel_y = 1 }, @@ -978,7 +979,8 @@ /turf/open/floor/plating/airless, /area/shuttle/pirate) "ex" = ( -/obj/structure/window/reinforced, +/obj/structure/window/plastitaniumpirate +//obj/structure/window/reinforced, /obj/structure/frame/machine, /obj/item/wrench, /turf/open/floor/plating/airless, @@ -988,17 +990,19 @@ id = "piratebridge" }, /obj/structure/grille, -/obj/structure/window/plastitanium, +/obj/structure/window/plastitaniumpirate, /turf/open/floor/plating, /area/shuttle/pirate) "ez" = ( -/obj/structure/window/reinforced, +/obj/structure/window/plastitaniumpirate +//obj/structure/window/reinforced, /obj/structure/frame/machine, /obj/item/stack/cable_coil/cut/red, /turf/open/floor/plating/airless, /area/shuttle/pirate) "eA" = ( -/obj/structure/window/reinforced{ +/obj/structure/window/plastitaniumpirate +//obj/structure/window/reinforced{ dir = 1; pixel_y = 1 }, @@ -1016,7 +1020,7 @@ /turf/open/floor/plasteel, /area/shuttle/pirate) "fW" = ( -/turf/closed/wall/mineral/plastitanium, +/turf/closed/wall/mineral/plastitaniumpirate, /area/shuttle/pirate) "fY" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ @@ -1090,7 +1094,7 @@ icon_state = "standard_lethal"; mode = 1 }, -/turf/closed/wall/mineral/plastitanium, +/turf/closed/wall/mineral/plastitaniumpirate, /area/shuttle/pirate) "yi" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index a27cb9b78c..1d0c3b4ead 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -348,6 +348,22 @@ spark_system.start() //creates some sparks because they look cool qdel(cover) //deletes the cover - no need on keeping it there! +//turret healing +/obj/machinery/porta_turret/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/weldingtool) && user.a_intent == INTENT_HELP) + if(obj_integrity < max_integrity) + if(!I.tool_start_check(user, amount=0)) + return + user.visible_message("[user] is welding the turret.", \ + "You begin repairing the turret...", \ + "You hear welding.") + if(I.use_tool(src, user, 40, volume=50)) + obj_integrity = max_integrity + user.visible_message("[user.name] has repaired [src].", \ + "You finish repairing the turret.") + else + to_chat(user, "The turret doesn't need repairing.") + return /obj/machinery/porta_turret/process() @@ -670,7 +686,11 @@ nonlethal_projectile_sound = 'sound/weapons/taser2.ogg' lethal_projectile = /obj/item/projectile/beam/laser lethal_projectile_sound = 'sound/weapons/laser.ogg' - desc = "An energy blaster auto-turret." + desc = "An energy blaster auto-turret. Use a welder to fix." + explosion_block = 50 + max_integrity = 350 + integrity_failure = 20 + /obj/machinery/porta_turret/syndicate/energy/heavy icon_state = "standard_stun" diff --git a/code/game/objects/effects/spawners/structure.dm b/code/game/objects/effects/spawners/structure.dm index a5a4dfb44b..34af40cb07 100644 --- a/code/game/objects/effects/spawners/structure.dm +++ b/code/game/objects/effects/spawners/structure.dm @@ -163,6 +163,13 @@ again. icon_state = "plastitaniumwindow_spawner" spawn_list = list(/obj/structure/grille, /obj/structure/window/plastitanium) +//plastitaniumpirate window + +/obj/effect/spawner/structure/window/plastitaniumpirate + name = "plastitanium window spawner" + icon_state = "plastitaniumwindow_spawner" + explosion_block = 50 + spawn_list = list(/obj/structure/grille, /obj/structure/window/plastitaniumpirate) //ice window diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 14a7e445c1..99a8b94c5a 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -595,6 +595,30 @@ /obj/structure/window/plastitanium/unanchored anchored = FALSE +//pirate ship windows +/obj/structure/window/plastitaniumpirate + name = "plastitanium window" + desc = "Yarr this window be explosion proof!" + icon = 'icons/obj/smooth_structures/plastitanium_window.dmi' + icon_state = "plastitanium_window" + dir = FULLTILE_WINDOW_DIR + max_integrity = 100 + wtype = "shuttle" + fulltile = TRUE + flags_1 = PREVENT_CLICK_UNDER_1 + reinf = TRUE + heat_resistance = 1600 + armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100) + smooth = SMOOTH_TRUE + canSmoothWith = null + explosion_block = 50 + level = 3 + glass_type = /obj/item/stack/sheet/plastitaniumglass + glass_amount = 2 + +/obj/structure/window/plastitaniumpirate/unanchored + anchored = FALSE + /obj/structure/window/reinforced/clockwork name = "brass window" desc = "A paper-thin pane of translucent yet reinforced brass." diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/simulated/wall/mineral_walls.dm index d55cb0b475..7d82a20b91 100644 --- a/code/game/turfs/simulated/wall/mineral_walls.dm +++ b/code/game/turfs/simulated/wall/mineral_walls.dm @@ -303,3 +303,64 @@ /turf/closed/wall/mineral/plastitanium/copyTurf(turf/T) . = ..() T.transform = transform + +/////////////////////Pirate Plastitanium walls///////////////////// + +/turf/closed/wall/mineral/plastitaniumpirate + name = "wall" + desc = "Yarr just try to blow this to smithereens!" + icon = 'icons/turf/walls/plastitanium_wall.dmi' + icon_state = "map-shuttle" + explosion_block = 50 + sheet_type = /obj/item/stack/sheet/mineral/plastitanium + smooth = SMOOTH_MORE|SMOOTH_DIAGONAL + canSmoothWith = list(/turf/closed/wall/mineral/plastitaniumpirate, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/plastitaniumpirate, /obj/structure/shuttle/engine, /obj/structure/falsewall/plastitanium) + +/turf/closed/wall/mineral/plastitaniumpirate/nodiagonal + smooth = SMOOTH_MORE + icon_state = "map-shuttle_nd" + explosion_block = 50 + +/turf/closed/wall/mineral/plastitaniumpirate/nosmooth + icon = 'icons/turf/shuttle.dmi' + icon_state = "wall" + smooth = SMOOTH_FALSE + explosion_block = 50 + +/turf/closed/wall/mineral/plastitaniumpirate/overspace + icon_state = "map-overspace" + fixed_underlay = list("space"=1) + explosion_block = 50 + +/turf/closed/wall/mineral/plastitaniumpirate/explosive/ex_act(severity) + var/datum/explosion/acted_explosion = null + for(var/datum/explosion/E in GLOB.explosions) + if(E.explosion_id == explosion_id) + acted_explosion = E + break + if(acted_explosion && istype(acted_explosion.explosion_source, /obj/item/bombcore)) + var/obj/item/bombcore/large/bombcore = new(get_turf(src)) + bombcore.detonate() + ..() + +//have to copypaste this code +/turf/closed/wall/mineral/plastitaniumpirate/interior/copyTurf(turf/T) + if(T.type != type) + T.ChangeTurf(type) + if(underlays.len) + T.underlays = underlays + if(T.icon_state != icon_state) + T.icon_state = icon_state + if(T.icon != icon) + T.icon = icon + if(color) + T.atom_colours = atom_colours.Copy() + T.update_atom_colour() + if(T.dir != dir) + T.setDir(dir) + T.transform = transform + return T + +/turf/closed/wall/mineral/plastitaniumpirate/copyTurf(turf/T) + . = ..() + T.transform = transform \ No newline at end of file diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index 8bc5491970..ab9ab96678 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -177,6 +177,7 @@ shuttleId = "pirateship" icon_screen = "syndishuttle" icon_keyboard = "syndie_key" + resistance_flags = INDESTRUCTIBLE light_color = LIGHT_COLOR_RED possible_destinations = "pirateship_away;pirateship_home;pirateship_custom" @@ -184,6 +185,7 @@ name = "pirate shuttle navigation computer" desc = "Used to designate a precise transit location for the pirate shuttle." shuttleId = "pirateship" + resistance_flags = INDESTRUCTIBLE lock_override = CAMERA_LOCK_STATION shuttlePortId = "pirateship_custom" x_offset = 9 @@ -226,6 +228,7 @@ desc = "This sophisticated machine scans the nearby space for items of value." icon = 'icons/obj/machines/research.dmi' icon_state = "tdoppler" + resistance_flags = INDESTRUCTIBLE density = TRUE var/cooldown = 300 var/next_use = 0 @@ -259,6 +262,7 @@ name = "cargo hold pad" icon = 'icons/obj/telescience.dmi' icon_state = "lpad-idle-o" + resistance_flags = INDESTRUCTIBLE var/idle_state = "lpad-idle-o" var/warmup_state = "lpad-idle" var/sending_state = "lpad-beam" @@ -272,6 +276,7 @@ /obj/machinery/computer/piratepad_control name = "cargo hold control terminal" + resistance_flags = INDESTRUCTIBLE var/status_report = "Idle" var/obj/machinery/piratepad/pad var/warmup_time = 100 From 233ed5873f22c411c90dbaa23fd9bda984101ce5 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Thu, 6 Feb 2020 01:13:28 +0100 Subject: [PATCH 086/172] race conditions and turfs beings special. --- code/game/objects/items/implants/implant_explosive.dm | 5 +++-- code/game/turfs/simulated/walls.dm | 2 +- code/modules/projectiles/guns/energy.dm | 7 ++++--- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/implants/implant_explosive.dm b/code/game/objects/items/implants/implant_explosive.dm index b93c9419a3..bf8d215a11 100644 --- a/code/game/objects/items/implants/implant_explosive.dm +++ b/code/game/objects/items/implants/implant_explosive.dm @@ -82,8 +82,9 @@ /obj/item/implant/explosive/proc/boom_goes_the_weasel() explosion(get_turf(imp_in ? imp_in : src), heavy, medium, weak, weak, flame_range = weak) - imp_in?.gib(TRUE) - qdel(src) + if(!QDELETED(imp_in)) + imp_in.gib(TRUE) + qdel(src) /obj/item/implant/explosive/macro name = "macrobomb implant" diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 460c6a52c9..bd0b85a498 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -171,7 +171,7 @@ var/turf/T = user.loc //get user's location for delay checks //the istype cascade has been spread among various procs for easy overriding - if(try_clean(W, user, T) || try_wallmount(W, user, T) || try_decon(W, user, T) || try_destroy(W, user, T)) + if(try_clean(W, user, T) || try_wallmount(W, user, T) || try_decon(W, user, T) || (iswall(src) && try_destroy(W, user, T))) return return ..() diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 3ca732eb0b..eeea961037 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -57,9 +57,10 @@ fire_delay = shot.delay /obj/item/gun/energy/Destroy() - QDEL_NULL(cell) - QDEL_LIST(ammo_type) - STOP_PROCESSING(SSobj, src) + if(flags_1 & INITIALIZED_1) + QDEL_NULL(cell) + QDEL_LIST(ammo_type) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/gun/energy/process() From a3e2ec372f5b95f893465d3ee2a72b8d98d259da Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Thu, 6 Feb 2020 01:40:14 +0100 Subject: [PATCH 087/172] Makes it compile also custom emote fix. --- code/game/say.dm | 2 +- code/game/turfs/simulated/walls.dm | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/say.dm b/code/game/say.dm index b275d8b69c..85ae9f0681 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -129,7 +129,7 @@ GLOBAL_LIST_INIT(freqtospan, list( /atom/movable/proc/attach_spans(input, list/spans) var/customsayverb = findtext(input, "*") if(customsayverb) - input = capitalize(copytext(input, length(input[customsayverb]) + 1)) + input = capitalize(copytext(input, customsayverb + length(input[customsayverb]))) if(input) return "[message_spans_start(spans)][input]" else diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index bd0b85a498..d26a6efb02 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -171,7 +171,8 @@ var/turf/T = user.loc //get user's location for delay checks //the istype cascade has been spread among various procs for easy overriding - if(try_clean(W, user, T) || try_wallmount(W, user, T) || try_decon(W, user, T) || (iswall(src) && try_destroy(W, user, T))) + var/srctype = type + if(try_clean(W, user, T) || try_wallmount(W, user, T) || try_decon(W, user, T) || (type == srctype && try_destroy(W, user, T))) return return ..() From 523e080f8745f79b7f38c190e6dee440c58e91de Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Thu, 6 Feb 2020 02:09:27 +0100 Subject: [PATCH 088/172] Double-esword and hypereuplastic blade toys are sharp now blunt. --- code/game/objects/items/toys.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 8f5a6e8e0b..461d718131 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -453,6 +453,7 @@ force_wielded = 0 attack_verb = list("attacked", "struck", "hit") total_mass_on = TOTAL_MASS_TOY_SWORD + sharpness = IS_BLUNT /obj/item/twohanded/dualsaber/toy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) return FALSE From 8131a60f3a9269463cdd1baada2e232d4a0eabc1 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Thu, 6 Feb 2020 02:10:03 +0100 Subject: [PATCH 089/172] Oh. --- code/game/objects/items/toys.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 461d718131..6782ba0098 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -473,6 +473,7 @@ attack_verb = list("attacked", "struck", "hit") total_mass_on = TOTAL_MASS_TOY_SWORD slowdown_wielded = 0 + sharpness = IS_BLUNT /obj/item/twohanded/dualsaber/hypereutactic/toy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) return FALSE From 60b6d96f45d7eed2c69cda148e5b5df47e3b8947 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Thu, 6 Feb 2020 02:17:51 +0100 Subject: [PATCH 090/172] typecheck. --- .../mob/living/simple_animal/hostile/mining_mobs/basilisk.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm index 2fbcf376dd..ccd80573c0 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm @@ -144,7 +144,7 @@ /obj/item/projectile/temp/basilisk/icewing/on_hit(atom/target, blocked = FALSE) . = ..() - if(.) + if(. && isliving(target)) var/mob/living/L = target L.apply_status_effect(/datum/status_effect/freon/watcher) From 639ec8066dfe7e487d9f6b8df32396479f97e9a1 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Thu, 6 Feb 2020 02:19:14 +0100 Subject: [PATCH 091/172] Another typecheck --- .../mob/living/simple_animal/hostile/mining_mobs/basilisk.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm index ccd80573c0..91b76974b5 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm @@ -131,7 +131,7 @@ /obj/item/projectile/temp/basilisk/magmawing/on_hit(atom/target, blocked = FALSE) . = ..() - if(.) + if(. && isliving(target)) var/mob/living/L = target if (istype(L)) L.adjust_fire_stacks(0.1) From 8430ee3684a92c4aa2615c22ff1da0b102b07fed Mon Sep 17 00:00:00 2001 From: r4d6 Date: Wed, 5 Feb 2020 20:58:26 -0500 Subject: [PATCH 092/172] Timer 2-5 minutes --- code/modules/events/meteor_wave.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm index 6ecc1d9d42..854fcac932 100644 --- a/code/modules/events/meteor_wave.dm +++ b/code/modules/events/meteor_wave.dm @@ -22,7 +22,7 @@ /datum/round_event/meteor_wave/setup() announceWhen = 1 - startWhen = rand(60, 90) //Yeah for SOME REASON this is measured in seconds and not deciseconds??? + startWhen = rand(120, 360) //Yeah for SOME REASON this is measured in seconds and not deciseconds??? if(GLOB.singularity_counter) startWhen *= 1 - min(GLOB.singularity_counter * SINGULO_BEACON_DISTURBANCE, SINGULO_BEACON_MAX_DISTURBANCE) endWhen = startWhen + 60 From 10490e1c151806e6d826e0d61fe41d46e694f070 Mon Sep 17 00:00:00 2001 From: r4d6 Date: Wed, 5 Feb 2020 21:03:34 -0500 Subject: [PATCH 093/172] 3 minutes it is --- code/modules/events/meteor_wave.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm index 854fcac932..b1ba05fdc6 100644 --- a/code/modules/events/meteor_wave.dm +++ b/code/modules/events/meteor_wave.dm @@ -22,7 +22,7 @@ /datum/round_event/meteor_wave/setup() announceWhen = 1 - startWhen = rand(120, 360) //Yeah for SOME REASON this is measured in seconds and not deciseconds??? + startWhen = rand(180, 360) //Yeah for SOME REASON this is measured in seconds and not deciseconds??? if(GLOB.singularity_counter) startWhen *= 1 - min(GLOB.singularity_counter * SINGULO_BEACON_DISTURBANCE, SINGULO_BEACON_MAX_DISTURBANCE) endWhen = startWhen + 60 From 1dd6514bd7aa5a30f339ec8039657efc4c7a3242 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 6 Feb 2020 01:37:03 -0600 Subject: [PATCH 094/172] Automatic changelog generation for PR #10919 [ci skip] --- html/changelogs/AutoChangeLog-pr-10919.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10919.yml diff --git a/html/changelogs/AutoChangeLog-pr-10919.yml b/html/changelogs/AutoChangeLog-pr-10919.yml new file mode 100644 index 0000000000..0fa6420e39 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10919.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Fixing accidental nerfs to the magpistol magazine." From b3fb11559ef0ef485581ac8227d1fe138c71e696 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 6 Feb 2020 01:38:34 -0600 Subject: [PATCH 095/172] Automatic changelog generation for PR #10700 [ci skip] --- html/changelogs/AutoChangeLog-pr-10700.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10700.yml diff --git a/html/changelogs/AutoChangeLog-pr-10700.yml b/html/changelogs/AutoChangeLog-pr-10700.yml new file mode 100644 index 0000000000..296ebe4d99 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10700.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - tweak: "The anomalous honking crystal should now properly clown your mind." From 1c82779846a3dd77dfd3eb51690f23cc3768daa2 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 6 Feb 2020 01:41:32 -0600 Subject: [PATCH 096/172] Automatic changelog generation for PR #10881 [ci skip] --- html/changelogs/AutoChangeLog-pr-10881.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10881.yml diff --git a/html/changelogs/AutoChangeLog-pr-10881.yml b/html/changelogs/AutoChangeLog-pr-10881.yml new file mode 100644 index 0000000000..7c00713eae --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10881.yml @@ -0,0 +1,6 @@ +author: "Ghommie" +delete-after: True +changes: + - refactor: "Refactored mob holders into an element." + - bugfix: "Fixed a few minor issues with that feature. such as mismatching sprites for certain held mobs and a slight lack of safety checks." + - rscdel: "holdable mobs can't force themselves into people's hands anymore." From c54786e3bb7079d14b7a32b17fc3861ffcda179f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 6 Feb 2020 01:42:08 -0600 Subject: [PATCH 097/172] Automatic changelog generation for PR #10906 [ci skip] --- html/changelogs/AutoChangeLog-pr-10906.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10906.yml diff --git a/html/changelogs/AutoChangeLog-pr-10906.yml b/html/changelogs/AutoChangeLog-pr-10906.yml new file mode 100644 index 0000000000..ef725e921e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10906.yml @@ -0,0 +1,5 @@ +author: "Hatterhat" +delete-after: True +changes: + - rscadd: "Husking (from being burned to shit) can now be reverted! 5u rezadone or 100u synthflesh, at below 50 burn." + - balance: "Turning a body into a burnt husk now takes more effort. 300 burn's worth of effort." From e77c8bef98f5e4cfa3e967df53e3a11d0252e083 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 6 Feb 2020 01:42:42 -0600 Subject: [PATCH 098/172] Automatic changelog generation for PR #10868 [ci skip] --- html/changelogs/AutoChangeLog-pr-10868.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10868.yml diff --git a/html/changelogs/AutoChangeLog-pr-10868.yml b/html/changelogs/AutoChangeLog-pr-10868.yml new file mode 100644 index 0000000000..629f93585a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10868.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - tweak: "Holographic fans won't display above mobs and other objects anymore." From 365b41022ee3fe11ff0ca730135d80c342f3831f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 6 Feb 2020 01:43:49 -0600 Subject: [PATCH 099/172] Automatic changelog generation for PR #10870 [ci skip] --- html/changelogs/AutoChangeLog-pr-10870.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10870.yml diff --git a/html/changelogs/AutoChangeLog-pr-10870.yml b/html/changelogs/AutoChangeLog-pr-10870.yml new file mode 100644 index 0000000000..672e6abdbc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10870.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Fixed paraplegics appearing as shoeless." From fd19eb7fa820b70b9ab2cd36393524a83e5b4edf Mon Sep 17 00:00:00 2001 From: KrabSpider <32101466+KrabSpider@users.noreply.github.com> Date: Thu, 6 Feb 2020 03:20:13 -0500 Subject: [PATCH 100/172] Update human_face.dmi --- icons/mob/human_face.dmi | Bin 145686 -> 145856 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 6e95eae9603367cee547662cb7b2df404fc828d8..d0bd3048083ed0af538921ffab75611034cfa3c8 100644 GIT binary patch delta 14741 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 delta 14562 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 From 90bdc0c3e8929956fb0b9d1107bf1c5a908aa1c8 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 6 Feb 2020 04:47:32 -0600 Subject: [PATCH 101/172] Automatic changelog generation for PR #10901 [ci skip] --- html/changelogs/AutoChangeLog-pr-10901.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10901.yml diff --git a/html/changelogs/AutoChangeLog-pr-10901.yml b/html/changelogs/AutoChangeLog-pr-10901.yml new file mode 100644 index 0000000000..57c1d821f7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10901.yml @@ -0,0 +1,5 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - bugfix: "Box station captain office issues +maping: Gulag on box can now be accessed" From 57f6ad5e87b4730609e11982a5ef103167bf7d52 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 6 Feb 2020 05:46:31 -0700 Subject: [PATCH 102/172] Update login.dm --- code/modules/mob/living/silicon/login.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm index 2f133259ca..7b1854b940 100644 --- a/code/modules/mob/living/silicon/login.dm +++ b/code/modules/mob/living/silicon/login.dm @@ -7,4 +7,7 @@ var/datum/antagonist/bloodsucker/V = mind.has_antag_datum(/datum/antagonist/bloodsucker) if(V) mind.remove_antag_datum(V) + var/datum/antagonist/gang/G = mind.has_antag_datum(/datum/antagonist/gang) + if(G) + mind.remove_antag_datum(G) ..() From c9dc35fd9ae3b163885f0263dc1632074d50cda9 Mon Sep 17 00:00:00 2001 From: Artur Date: Thu, 6 Feb 2020 18:42:23 +0100 Subject: [PATCH 103/172] Updates the debug outfit --- code/__HELPERS/unsorted.dm | 7 +- code/datums/components/uplink.dm | 5 +- code/game/objects/items/cards_ids.dm | 12 ++- code/game/objects/items/debug_items.dm | 102 +++++++++++++++++++ code/game/objects/items/storage/boxes.dm | 59 +++++++++++ code/modules/clothing/glasses/_glasses.dm | 45 +++++++- code/modules/clothing/masks/gasmask.dm | 6 ++ code/modules/clothing/outfits/standard.dm | 31 ++++-- code/modules/clothing/shoes/magboots.dm | 10 +- code/modules/clothing/spacesuits/hardsuit.dm | 11 +- code/modules/projectiles/guns/magic/wand.dm | 6 ++ code/modules/research/stock_parts.dm | 4 + code/modules/uplink/uplink_devices.dm | 19 ++++ icons/obj/device.dmi | Bin 52431 -> 52967 bytes tgstation.dme | 1 + 15 files changed, 301 insertions(+), 17 deletions(-) create mode 100644 code/game/objects/items/debug_items.dm diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 86dde3d6a6..9cced1fdc7 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1537,4 +1537,9 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) if(190) return "." if(189) - return "-" \ No newline at end of file + return "-" + +/proc/generate_items_inside(list/items_list, where_to) + for(var/each_item in items_list) + for(var/i in 1 to items_list[each_item]) + new each_item(where_to) diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index 5057253522..d467f66b6a 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -25,6 +25,7 @@ GLOBAL_LIST_EMPTY(uplinks) var/unlock_code var/failsafe_code var/datum/ui_state/checkstate + var/debug = FALSE /datum/component/uplink/Initialize(_owner, _lockable = TRUE, _enabled = FALSE, datum/game_mode/_gamemode, starting_tc = 20, datum/ui_state/_checkstate) if(!isitem(parent)) @@ -152,7 +153,7 @@ GLOBAL_LIST_EMPTY(uplinks) if(I.restricted_roles.len) var/is_inaccessible = 1 for(var/R in I.restricted_roles) - if(R == user.mind.assigned_role) + if(R == user.mind.assigned_role || debug) is_inaccessible = 0 if(is_inaccessible) continue @@ -294,4 +295,4 @@ GLOBAL_LIST_EMPTY(uplinks) if(!T) return explosion(T,1,2,3) - qdel(parent) //Alternatively could brick the uplink. \ No newline at end of file + qdel(parent) //Alternatively could brick the uplink. diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 5e5ced2269..c851a23505 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -538,4 +538,14 @@ update_label("John Doe", "Clowny") id_color = "#0000FF" /obj/item/card/id/knight/captain - id_color = "#FFD700" \ No newline at end of file + id_color = "#FFD700" + +/obj/item/card/id/debug + name = "\improper Debug ID" + desc = "A debug ID card. Has ALL the all access, you really shouldn't have this." + icon_state = "ert_janitor" + assignment = "Jannie" + +/obj/item/card/id/debug/Initialize() + access = get_all_accesses()+get_all_centcom_access()+get_all_syndicate_access() + . = ..() diff --git a/code/game/objects/items/debug_items.dm b/code/game/objects/items/debug_items.dm new file mode 100644 index 0000000000..c7aaab6a26 --- /dev/null +++ b/code/game/objects/items/debug_items.dm @@ -0,0 +1,102 @@ +/* This file contains standalone items for debug purposes. */ + +/obj/item/debug/human_spawner + name = "human spawner" + desc = "Spawn a human by aiming at a turf and clicking. Use in hand to change type." + icon = 'icons/obj/guns/magic.dmi' + icon_state = "nothingwand" + item_state = "wand" + lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items_righthand.dmi' + w_class = WEIGHT_CLASS_SMALL + var/datum/species/selected_species + var/valid_species = list() + +/obj/item/debug/human_spawner/afterattack(atom/target, mob/user, proximity) + ..() + if(isturf(target)) + var/mob/living/carbon/human/H = new /mob/living/carbon/human(target) + if(selected_species) + H.set_species(selected_species) + +/obj/item/debug/human_spawner/attack_self(mob/user) + ..() + var/choice = input("Select a species", "Human Spawner", null) in GLOB.species_list + selected_species = GLOB.species_list[choice] + +/* Revive this once we purge all the istype checks for tools for tool_behaviour +/obj/item/debug/omnitool + name = "omnitool" + desc = "The original hypertool, born before them all. Use it in hand to unleash it's true power." + icon = 'icons/obj/device.dmi' + icon_state = "hypertool" + item_state = "hypertool" + toolspeed = 0.1 + tool_behaviour = null + +/obj/item/debug/omnitool/examine() + . = ..() + . += " The mode is: [tool_behaviour]" + +/obj/item/debug/omnitool/proc/check_menu(mob/user) + if(!istype(user)) + return FALSE + if(user.incapacitated() || !user.Adjacent(src)) + return FALSE + return TRUE + +/obj/item/debug/omnitool/attack_self(mob/user) + if(!user) + return + var/list/tool_list = list( + "Crowbar" = image(icon = 'icons/obj/tools.dmi', icon_state = "crowbar"), + "Multitool" = image(icon = 'icons/obj/device.dmi', icon_state = "multitool"), + "Screwdriver" = image(icon = 'icons/obj/tools.dmi', icon_state = "screwdriver_map"), + "Wirecutters" = image(icon = 'icons/obj/tools.dmi', icon_state = "cutters_map"), + "Wrench" = image(icon = 'icons/obj/tools.dmi', icon_state = "wrench"), + "Welding Tool" = image(icon = 'icons/obj/tools.dmi', icon_state = "miniwelder"), + "Analyzer" = image(icon = 'icons/obj/device.dmi', icon_state = "analyzer"), + "Mining Tool" = image(icon = 'icons/obj/mining.dmi', icon_state = "minipick"), + "Shovel" = image(icon = 'icons/obj/mining.dmi', icon_state = "spade"), + "Retractor" = image(icon = 'icons/obj/surgery.dmi', icon_state = "retractor"), + "Hemostat" = image(icon = 'icons/obj/surgery.dmi', icon_state = "hemostat"), + "Cautery" = image(icon = 'icons/obj/surgery.dmi', icon_state = "cautery"), + "Drill" = image(icon = 'icons/obj/surgery.dmi', icon_state = "drill"), + "Scalpel" = image(icon = 'icons/obj/surgery.dmi', icon_state = "scalpel"), + "Saw" = image(icon = 'icons/obj/surgery.dmi', icon_state = "saw") + ) + var/tool_result = show_radial_menu(user, src, tool_list, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE) + if(!check_menu(user)) + return + switch(tool_result) + if("Crowbar") + tool_behaviour = TOOL_CROWBAR + if("Multitool") + tool_behaviour = TOOL_MULTITOOL + if("Screwdriver") + tool_behaviour = TOOL_SCREWDRIVER + if("Wirecutters") + tool_behaviour = TOOL_WIRECUTTER + if("Wrench") + tool_behaviour = TOOL_WRENCH + if("Welding Tool") + tool_behaviour = TOOL_WELDER + if("Analyzer") + tool_behaviour = TOOL_ANALYZER + if("Mining Tool") + tool_behaviour = TOOL_MINING + if("Shovel") + tool_behaviour = TOOL_SHOVEL + if("Retractor") + tool_behaviour = TOOL_RETRACTOR + if("Hemostat") + tool_behaviour = TOOL_HEMOSTAT + if("Cautery") + tool_behaviour = TOOL_CAUTERY + if("Drill") + tool_behaviour = TOOL_DRILL + if("Scalpel") + tool_behaviour = TOOL_SCALPEL + if("Saw") + tool_behaviour = TOOL_SAW +*/ diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index daddc403b2..c4e6c57318 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -1288,3 +1288,62 @@ /obj/item/storage/box/marshmallow/PopulateContents() for (var/i in 1 to 5) new /obj/item/reagent_containers/food/snacks/marshmallow(src) + +/obj/item/storage/box/material/PopulateContents() //less uranium because radioactive + var/static/items_inside = list( + /obj/item/stack/sheet/metal/fifty=1,\ + /obj/item/stack/sheet/glass/fifty=1,\ + /obj/item/stack/sheet/rglass=50,\ + /obj/item/stack/sheet/plasmaglass=50,\ + /obj/item/stack/sheet/titaniumglass=50,\ + /obj/item/stack/sheet/plastitaniumglass=50,\ + /obj/item/stack/sheet/plasteel=50,\ + /obj/item/stack/sheet/mineral/plastitanium=50,\ + /obj/item/stack/sheet/mineral/titanium=50,\ + /obj/item/stack/sheet/mineral/gold=50,\ + /obj/item/stack/sheet/mineral/silver=50,\ + /obj/item/stack/sheet/mineral/plasma=50,\ + /obj/item/stack/sheet/mineral/uranium=50,\ + /obj/item/stack/sheet/mineral/diamond=50,\ + /obj/item/stack/sheet/bluespace_crystal=50,\ + /obj/item/stack/sheet/mineral/bananium=50,\ + /obj/item/stack/sheet/mineral/wood=50,\ + /obj/item/stack/sheet/plastic/fifty=1,\ + /obj/item/stack/sheet/runed_metal/fifty=1 + ) + generate_items_inside(items_inside, src) + +/obj/item/storage/box/debugtools + name = "box of debug tools" + icon_state = "syndiebox" + +/obj/item/storage/box/debugtools/PopulateContents() + var/static/items_inside = list( + /obj/item/flashlight/emp/debug=1,\ + /obj/item/pda=1,\ + /obj/item/modular_computer/tablet/preset/advanced=1,\ + /obj/item/geiger_counter=1,\ + /obj/item/construction/rcd/combat/admin=1,\ + /obj/item/pipe_dispenser=1,\ + /obj/item/card/emag=1,\ + /obj/item/healthanalyzer/advanced=1,\ + /obj/item/disk/tech_disk/debug=1,\ + /obj/item/uplink/debug=1,\ + /obj/item/uplink/nuclear/debug=1,\ + /obj/item/storage/box/beakers/bluespace=1,\ + /obj/item/storage/box/beakers/variety=1,\ + /obj/item/storage/box/material=1,\ + /obj/item/storage/belt/medical/surgery_belt_adv + ) + generate_items_inside(items_inside, src) + +/obj/item/storage/box/beakers/variety + name = "beaker variety box" + +/obj/item/storage/box/beakers/variety/PopulateContents() + new /obj/item/reagent_containers/glass/beaker(src) + new /obj/item/reagent_containers/glass/beaker/large(src) + new /obj/item/reagent_containers/glass/beaker/plastic(src) + new /obj/item/reagent_containers/glass/beaker/meta(src) + new /obj/item/reagent_containers/glass/beaker/noreact(src) + new /obj/item/reagent_containers/glass/beaker/bluespace(src) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 7df10b56f7..b60856001e 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -488,4 +488,47 @@ if(client && client.prefs.uses_glasses_colour && glasses_equipped) add_client_colour(G.glass_colour_type) else - remove_client_colour(G.glass_colour_type) \ No newline at end of file + remove_client_colour(G.glass_colour_type) + +/obj/item/clothing/glasses/debug + name = "debug glasses" + desc = "Medical, security and diagnostic hud. Alt click to toggle xray." + icon_state = "nvgmeson" + item_state = "nvgmeson" + flags_cover = GLASSESCOVERSEYES + darkness_view = 8 + flash_protect = 2 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + glass_colour_type = FALSE + clothing_flags = SCAN_REAGENTS + vision_flags = SEE_TURFS + var/list/hudlist = list(DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC_ADVANCED, DATA_HUD_SECURITY_ADVANCED) + var/xray = FALSE + +/obj/item/clothing/glasses/debug/equipped(mob/user, slot) + . = ..() + if(slot != ITEM_SLOT_EYES) + return + if(ishuman(user)) + for(var/hud in hudlist) + var/datum/atom_hud/H = GLOB.huds[hud] + H.add_hud_to(user) + +/obj/item/clothing/glasses/debug/dropped(mob/user) + . = ..() + if(ishuman(user)) + for(var/hud in hudlist) + var/datum/atom_hud/H = GLOB.huds[hud] + H.remove_hud_from(user) + +/obj/item/clothing/glasses/debug/AltClick(mob/user) + . = ..() + if(ishuman(user)) + if(xray) + vision_flags -= SEE_MOBS|SEE_OBJS + else + vision_flags += SEE_MOBS|SEE_OBJS + xray = !xray + var/mob/living/carbon/human/H = user + H.update_sight() + diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 1e8f26e7fe..e6c68f2662 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -39,6 +39,12 @@ /obj/item/clothing/mask/gas/welding/attack_self(mob/user) weldingvisortoggle(user) +/obj/item/clothing/mask/gas/welding/up + +/obj/item/clothing/mask/gas/welding/up/Initialize() + ..() + visor_toggling() + // ******************************************************************** diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index 4c8f9bdab2..7c1121d137 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -427,14 +427,27 @@ /datum/outfit/debug //Debug objs plus hardsuit name = "Debug outfit" uniform = /obj/item/clothing/under/patriotsuit - suit = /obj/item/clothing/suit/space/hardsuit/syndi/elite - shoes = /obj/item/clothing/shoes/magboots/advance - suit_store = /obj/item/tank/internals/oxygen - mask = /obj/item/clothing/mask/gas/welding - belt = /obj/item/storage/belt/utility/chief/full - gloves = /obj/item/clothing/gloves/combat - id = /obj/item/card/id/ert - glasses = /obj/item/clothing/glasses/meson/night + suit = /obj/item/clothing/suit/space/hardsuit/syndi/elite/debug + glasses = /obj/item/clothing/glasses/debug ears = /obj/item/radio/headset/headset_cent/commander + mask = /obj/item/clothing/mask/gas/welding/up + gloves = /obj/item/clothing/gloves/combat + belt = /obj/item/storage/belt/utility/chief/full + l_pocket = /obj/item/gun/magic/wand/resurrection/debug + r_pocket = /obj/item/gun/magic/wand/death/debug + shoes = /obj/item/clothing/shoes/magboots/advance/debug + id = /obj/item/card/id/debug + suit_store = /obj/item/tank/internals/oxygen back = /obj/item/storage/backpack/holding - backpack_contents = list(/obj/item/card/emag=1, /obj/item/flashlight/emp/debug=1, /obj/item/construction/rcd/combat=1, /obj/item/gun/magic/wand/resurrection/debug=1, /obj/item/melee/transforming/energy/axe=1) + box = /obj/item/storage/box/debugtools + internals_slot = ITEM_SLOT_SUITSTORE + backpack_contents = list( + /obj/item/melee/transforming/energy/axe=1,\ + /obj/item/storage/part_replacer/bluespace/tier4=1,\ + /obj/item/debug/human_spawner=1,\ + ) + +/datum/outfit/debug/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + var/obj/item/card/id/W = H.wear_id + W.registered_name = H.real_name + W.update_label() diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 8864add0d8..1acb7628a3 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -30,8 +30,9 @@ magpulse = !magpulse icon_state = "[magboot_state][magpulse]" to_chat(user, "You [magpulse ? "enable" : "disable"] the mag-pulse traction system.") - user.update_inv_shoes() //so our mob-overlays update - user.update_gravity(user.has_gravity()) + if(user) + user.update_inv_shoes() //so our mob-overlays update + user.update_gravity(user.has_gravity()) for(var/X in actions) var/datum/action/A = X A.UpdateButtonIcon() @@ -52,6 +53,11 @@ slowdown_active = SHOES_SLOWDOWN resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF +/obj/item/clothing/shoes/magboots/advance/debug + +/obj/item/clothing/shoes/magboots/advance/debug/Initialize() + attack_self(src) + /obj/item/clothing/shoes/magboots/syndie desc = "Reverse-engineered magnetic boots that have a heavy magnetic pull. Property of Gorlex Marauders." name = "blood-red magboots" diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 703fe26287..fab41c9876 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -269,7 +269,7 @@ item_state = "syndie_helm" item_color = "syndi" armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 90) - on = TRUE + on = FALSE var/obj/item/clothing/suit/space/hardsuit/syndi/linkedsuit = null actions_types = list(/datum/action/item_action/toggle_helmet_mode) visor_flags_inv = HIDEMASK|HIDEEYES|HIDEFACE|HIDEFACIALHAIR @@ -367,6 +367,12 @@ on = FALSE resistance_flags = FIRE_PROOF | ACID_PROOF +/obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/debug + +/obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/debug/Initialize() + . = ..() + soundloop.volume = 0 + /obj/item/clothing/suit/space/hardsuit/syndi/elite name = "elite syndicate hardsuit" desc = "An elite version of the syndicate hardsuit, with improved armour and fireproofing. It is in travel mode." @@ -380,6 +386,9 @@ resistance_flags = FIRE_PROOF | ACID_PROOF mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC|STYLE_PAW_TAURIC +/obj/item/clothing/suit/space/hardsuit/syndi/elite/debug + helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/debug + slowdown = 0 //The Owl Hardsuit /obj/item/clothing/head/helmet/space/hardsuit/syndi/owl diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index 52236ab695..57bbd13cf7 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -73,6 +73,12 @@ user.adjustOxyLoss(500) charges-- +/obj/item/gun/magic/wand/death/debug + desc = "In some obscure circles, this is known as the 'cloning tester's friend'." + max_charges = 500 + variable_charges = FALSE + can_charge = TRUE + recharge_rate = 1 ///////////////////////////////////// //WAND OF HEALING diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index e29cf28f34..5037f23cd1 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -60,6 +60,7 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi new /obj/item/stock_parts/manipulator(src) new /obj/item/stock_parts/micro_laser(src) new /obj/item/stock_parts/matter_bin(src) + new /obj/item/stock_parts/cell/high(src) /obj/item/storage/part_replacer/bluespace/tier2 @@ -70,6 +71,7 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi new /obj/item/stock_parts/manipulator/nano(src) new /obj/item/stock_parts/micro_laser/high(src) new /obj/item/stock_parts/matter_bin/adv(src) + new /obj/item/stock_parts/cell/super(src) /obj/item/storage/part_replacer/bluespace/tier3 @@ -80,6 +82,7 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi new /obj/item/stock_parts/manipulator/pico(src) new /obj/item/stock_parts/micro_laser/ultra(src) new /obj/item/stock_parts/matter_bin/super(src) + new /obj/item/stock_parts/cell/hyper(src) /obj/item/storage/part_replacer/bluespace/tier4 @@ -90,6 +93,7 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi new /obj/item/stock_parts/manipulator/femto(src) new /obj/item/stock_parts/micro_laser/quadultra(src) new /obj/item/stock_parts/matter_bin/bluespace(src) + new /obj/item/stock_parts/cell/bluespace(src) /obj/item/storage/part_replacer/cargo //used in a cargo crate diff --git a/code/modules/uplink/uplink_devices.dm b/code/modules/uplink/uplink_devices.dm index 2bcfb40c45..9c09a7334a 100644 --- a/code/modules/uplink/uplink_devices.dm +++ b/code/modules/uplink/uplink_devices.dm @@ -57,3 +57,22 @@ /obj/item/pen/uplink/Initialize(mapload, owner, tc_amount = 20) . = ..() AddComponent(/datum/component/uplink, owner, TRUE, FALSE, null, tc_amount) + +/obj/item/uplink/debug + name = "debug uplink" + +/obj/item/uplink/debug/Initialize(mapload, owner, tc_amount = 9000) + . = ..() + var/datum/component/uplink/hidden_uplink = GetComponent(/datum/component/uplink) + hidden_uplink.name = "debug uplink" + hidden_uplink.debug = TRUE + +/obj/item/uplink/nuclear/debug + name = "debug nuclear uplink" + +/obj/item/uplink/nuclear/debug/Initialize(mapload, owner, tc_amount = 9000) + . = ..() + var/datum/component/uplink/hidden_uplink = GetComponent(/datum/component/uplink) + hidden_uplink.set_gamemode(/datum/game_mode/nuclear) + hidden_uplink.name = "debug nuclear uplink" + hidden_uplink.debug = TRUE diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 8c2abcd3b9ce91c9e3cb922bac3743b1aaf1ec94..28fc29cd714eaa59bac7cde307e201f8698b0639 100644 GIT binary patch delta 11293 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 delta 10753 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 diff --git a/tgstation.dme b/tgstation.dme index 8c578e70f0..1da937ac60 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -865,6 +865,7 @@ #include "code\game\objects\items\cosmetics.dm" #include "code\game\objects\items\courtroom.dm" #include "code\game\objects\items\crayons.dm" +#include "code\game\objects\items\debug_items.dm" #include "code\game\objects\items\defib.dm" #include "code\game\objects\items\dehy_carp.dm" #include "code\game\objects\items\dice.dm" From 0353f1602d7fa421b6bb034b66201a715189d54a Mon Sep 17 00:00:00 2001 From: Arturlang Date: Thu, 6 Feb 2020 20:10:02 +0100 Subject: [PATCH 104/172] Fixes ore boxes --- code/game/objects/structures.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 9246a00399..1d36b2b41b 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -37,7 +37,7 @@ structureclimber.visible_message("[structureclimber] has been knocked off [src].", "You're knocked off [src]!", "You see [structureclimber] get knocked off [src].") /obj/structure/ui_act(action, params) - ..() + . = ..() add_fingerprint(usr) /obj/structure/MouseDrop_T(atom/movable/O, mob/user) From 6373b263c02c2874483677b6f70e382874f65624 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 6 Feb 2020 13:31:49 -0600 Subject: [PATCH 105/172] Automatic changelog generation for PR #10917 [ci skip] --- html/changelogs/AutoChangeLog-pr-10917.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10917.yml diff --git a/html/changelogs/AutoChangeLog-pr-10917.yml b/html/changelogs/AutoChangeLog-pr-10917.yml new file mode 100644 index 0000000000..f6e5997348 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10917.yml @@ -0,0 +1,4 @@ +author: "Arturlang" +delete-after: True +changes: + - tweak: "The MK2 hypospray now" From 5123c6b45576ffd227cc539b0216dde0f9026e7b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 6 Feb 2020 17:25:25 -0600 Subject: [PATCH 106/172] Automatic changelog generation for PR #10623 [ci skip] --- html/changelogs/AutoChangeLog-pr-10623.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10623.yml diff --git a/html/changelogs/AutoChangeLog-pr-10623.yml b/html/changelogs/AutoChangeLog-pr-10623.yml new file mode 100644 index 0000000000..623560f7d2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10623.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - rscadd: "Lots of new traitor objectives" From d05c2426a813993a5df913a3527ff71cac1c415c Mon Sep 17 00:00:00 2001 From: Putnam Date: Thu, 6 Feb 2020 15:47:04 -0800 Subject: [PATCH 107/172] Added a config for map voting types. --- code/controllers/configuration/entries/general.dm | 3 +++ code/controllers/subsystem/ticker.dm | 10 +++++++++- config/config.txt | 9 +++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index c3ae90cc1b..2e5b8a1852 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -267,6 +267,9 @@ /datum/config_entry/flag/tgstyle_maprotation +/datum/config_entry/string/map_vote_type + config_entry_value = "SCORE" + /datum/config_entry/number/maprotatechancedelta config_entry_value = 0.75 min_val = 0 diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index ceb003210e..f0c9e3499c 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -477,7 +477,15 @@ SUBSYSTEM_DEF(ticker) if(CONFIG_GET(flag/tgstyle_maprotation)) INVOKE_ASYNC(SSmapping, /datum/controller/subsystem/mapping/.proc/maprotate) else - SSvote.initiate_vote("map","server",TRUE) + switch(CONFIG_GET(string/map_vote_type)) + if("PLURALITY") + SSvote.initiate_vote("map","server",TRUE) + else if("APPROVAL") + SSvote.initiate_vote("map","server",TRUE,votesystem = APPROVAL_VOTING) + else if("IRV") + SSvote.initiate_vote("map","server",TRUE,votesystem = INSTANT_RUNOFF_VOTING) + else if("SCORE") + SSvote.initiate_vote("map","server",TRUE,votesystem = MAJORITY_JUDGEMENT_VOTING) /datum/controller/subsystem/ticker/proc/HasRoundStarted() return current_state >= GAME_STATE_PLAYING diff --git a/config/config.txt b/config/config.txt index 6d302a5512..4d8dcfb00c 100644 --- a/config/config.txt +++ b/config/config.txt @@ -384,6 +384,15 @@ MAPROTATION ## When it's set to zero, the map will be randomly picked each round ALLOW_MAP_VOTING 1 +## Map voting type +## Determines what kind of vote the map vote is +## Options are: +## PLURALITY (default, only vote for one option) +## APPROVAL (can vote for as many as you want), I +## IRV (vote by ranked choice, winner determined by instant runoff algorithm) +## SCORE (give individual rankings of each choice, winner determined by majority judgement algorithm) +MAP_VOTE_TYPE SCORE + ## Map rotate chance delta ## This is the chance of map rotation factored to the round length. ## A value of 1 would mean the map rotation chance is the round length in minutes (hour long round == 60% rotation chance) From e6d353dd016ca3b0c7ddc3810dd1706948cc8788 Mon Sep 17 00:00:00 2001 From: Putnam Date: Thu, 6 Feb 2020 15:56:58 -0800 Subject: [PATCH 108/172] that's not how switch works... --- code/controllers/subsystem/ticker.dm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index f0c9e3499c..d73bde6763 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -480,12 +480,14 @@ SUBSYSTEM_DEF(ticker) switch(CONFIG_GET(string/map_vote_type)) if("PLURALITY") SSvote.initiate_vote("map","server",TRUE) - else if("APPROVAL") + if("APPROVAL") SSvote.initiate_vote("map","server",TRUE,votesystem = APPROVAL_VOTING) - else if("IRV") + if("IRV") SSvote.initiate_vote("map","server",TRUE,votesystem = INSTANT_RUNOFF_VOTING) - else if("SCORE") + if("SCORE") SSvote.initiate_vote("map","server",TRUE,votesystem = MAJORITY_JUDGEMENT_VOTING) + // fallback + SSvote.initiate_vote("map","server",TRUE) /datum/controller/subsystem/ticker/proc/HasRoundStarted() return current_state >= GAME_STATE_PLAYING From edcdb531cccf3fcd08e8dfd1399ab607627cdfe0 Mon Sep 17 00:00:00 2001 From: Putnam Date: Thu, 6 Feb 2020 15:57:42 -0800 Subject: [PATCH 109/172] kwargs --- code/controllers/subsystem/ticker.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index d73bde6763..716773b3b4 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -479,15 +479,15 @@ SUBSYSTEM_DEF(ticker) else switch(CONFIG_GET(string/map_vote_type)) if("PLURALITY") - SSvote.initiate_vote("map","server",TRUE) + SSvote.initiate_vote("map","server",hideresults=TRUE) if("APPROVAL") - SSvote.initiate_vote("map","server",TRUE,votesystem = APPROVAL_VOTING) + SSvote.initiate_vote("map","server",hideresults=TRUE,votesystem = APPROVAL_VOTING) if("IRV") - SSvote.initiate_vote("map","server",TRUE,votesystem = INSTANT_RUNOFF_VOTING) + SSvote.initiate_vote("map","server",hideresults=TRUE,votesystem = INSTANT_RUNOFF_VOTING) if("SCORE") - SSvote.initiate_vote("map","server",TRUE,votesystem = MAJORITY_JUDGEMENT_VOTING) + SSvote.initiate_vote("map","server",hideresults=TRUE,votesystem = MAJORITY_JUDGEMENT_VOTING) // fallback - SSvote.initiate_vote("map","server",TRUE) + SSvote.initiate_vote("map","server",hideresults=TRUE) /datum/controller/subsystem/ticker/proc/HasRoundStarted() return current_state >= GAME_STATE_PLAYING From 0ebd2a814fa26b67ee98c3a7b106c5d95716ba75 Mon Sep 17 00:00:00 2001 From: Putnam Date: Thu, 6 Feb 2020 16:11:14 -0800 Subject: [PATCH 110/172] fixed spurious divide-by-zero --- code/controllers/subsystem/vote.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 2a7c4401f3..0b80f6253a 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -201,7 +201,10 @@ SUBSYSTEM_DEF(vote) max_score=max(max_score,scores[score_name]) min_score=min(min_score,scores[score_name]) for(var/score_name in scores) - scores[score_name] = (scores[score_name]-min_score)/(max_score-min_score) + if(max_score == min_score) + scores[score_name] = 1 + else + scores[score_name] = (scores[score_name]-min_score)/(max_score-min_score) SSblackbox.record_feedback("nested tally","voting",scores[score_name],list(blackbox_text,"Total scores",score_name)) /datum/controller/subsystem/vote/proc/get_runoff_results(var/blackbox_text) From 76683f572f598eff0011216fbc767cf521bef69b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 6 Feb 2020 22:53:11 -0600 Subject: [PATCH 111/172] Automatic changelog generation for PR #10922 [ci skip] --- html/changelogs/AutoChangeLog-pr-10922.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10922.yml diff --git a/html/changelogs/AutoChangeLog-pr-10922.yml b/html/changelogs/AutoChangeLog-pr-10922.yml new file mode 100644 index 0000000000..c71630fd0d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10922.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - tweak: "The lawyer's PDA cartridge has been rebranded to something more accurate to its true nature." From 353c13631a39f8cd873a41a1fc20eae94243ebbf Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 6 Feb 2020 23:34:33 -0700 Subject: [PATCH 112/172] Update beam_rifle.dm --- .../projectiles/guns/misc/beam_rifle.dm | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index c53e28ea29..7cd5ecbc47 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -43,6 +43,7 @@ var/lastangle = 0 var/aiming_lastangle = 0 + var/last_aim_beam = 0 var/mob/current_user = null var/list/obj/effect/projectile/tracer/current_tracers @@ -187,6 +188,8 @@ /obj/item/gun/energy/beam_rifle/proc/aiming_beam(force_update = FALSE) var/diff = abs(aiming_lastangle - lastangle) check_user() + if((last_aim_beam + 1) > world.time) + return if(diff < AIMING_BEAM_ANGLE_CHANGE_THRESHOLD && !force_update) return aiming_lastangle = lastangle @@ -208,6 +211,7 @@ targloc = get_turf_in_angle(lastangle, curloc, 10) P.preparePixelProjectile(targloc, current_user, current_user.client.mouseParams, 0) P.fire(lastangle) + last_aim_beam = world.time /obj/item/gun/energy/beam_rifle/process() if(!aiming) @@ -296,27 +300,17 @@ if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher)) return process_aim() - if(aiming_time_left <= aiming_time_fire_threshold && check_user()) + if(aiming_time_left <= aiming_time_fire_threshold && check_user() && ((lastfire + delay) <= world.time)) sync_ammo() - afterattack(M.client.mouseObject, M, FALSE, M.client.mouseParams, passthrough = TRUE) + do_fire(M.client.mouseObject, M, FALSE, M.client.mouseParams, M.zone_selected) stop_aiming() QDEL_LIST(current_tracers) return ..() -/obj/item/gun/energy/beam_rifle/afterattack(atom/target, mob/living/user, flag, params, passthrough = FALSE) - if(flag) //It's adjacent, is the user, or is on the user's person - if(target in user.contents) //can't shoot stuff inside us. - return - if(!ismob(target) || user.a_intent == INTENT_HARM) //melee attack - return - if(target == user && user.zone_selected != BODY_ZONE_PRECISE_MOUTH) //so we can't shoot ourselves (unless mouth selected) - return - if(!passthrough && (aiming_time > aiming_time_fire_threshold)) - return - if(lastfire > world.time + delay) - return - lastfire = world.time +/obj/item/gun/energy/beam_rifle/do_fire(atom/target, mob/living/user, message = TRUE, params, zone_override = "", bonus_spread = 0) . = ..() + if(.) + lastfire = world.time stop_aiming() /obj/item/gun/energy/beam_rifle/proc/sync_ammo() From ae199cee283ba67294fcff32cf5233cde4812d20 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 6 Feb 2020 23:49:36 -0700 Subject: [PATCH 113/172] Update beam_rifle.dm --- code/modules/projectiles/guns/misc/beam_rifle.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index c53e28ea29..3de5d607a1 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -43,6 +43,7 @@ var/lastangle = 0 var/aiming_lastangle = 0 + var/last_aimbeam = 0 var/mob/current_user = null var/list/obj/effect/projectile/tracer/current_tracers @@ -186,8 +187,9 @@ /obj/item/gun/energy/beam_rifle/proc/aiming_beam(force_update = FALSE) var/diff = abs(aiming_lastangle - lastangle) - check_user() - if(diff < AIMING_BEAM_ANGLE_CHANGE_THRESHOLD && !force_update) + if(!check_user()) + return + if(((diff < AIMING_BEAM_ANGLE_CHANGE_THRESHOLD) || ((last_aimbeam + 1) > world.time)) && !force_update) return aiming_lastangle = lastangle var/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/P = new @@ -208,6 +210,7 @@ targloc = get_turf_in_angle(lastangle, curloc, 10) P.preparePixelProjectile(targloc, current_user, current_user.client.mouseParams, 0) P.fire(lastangle) + last_aimbeam = world.time /obj/item/gun/energy/beam_rifle/process() if(!aiming) From 3b3be0a56725632a6410fa1592161eecce25f61f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 7 Feb 2020 00:51:20 -0600 Subject: [PATCH 114/172] Automatic changelog generation for PR #10929 [ci skip] --- html/changelogs/AutoChangeLog-pr-10929.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10929.yml diff --git a/html/changelogs/AutoChangeLog-pr-10929.yml b/html/changelogs/AutoChangeLog-pr-10929.yml new file mode 100644 index 0000000000..fa9413f25a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10929.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Childproofs double-esword and hypereuplastic blade toys." From d70b290dceecfd62336ec914e8c4c95fa9a2b4b1 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 7 Feb 2020 00:52:52 -0600 Subject: [PATCH 115/172] Automatic changelog generation for PR #10798 [ci skip] --- html/changelogs/AutoChangeLog-pr-10798.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10798.yml diff --git a/html/changelogs/AutoChangeLog-pr-10798.yml b/html/changelogs/AutoChangeLog-pr-10798.yml new file mode 100644 index 0000000000..637343c7b6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10798.yml @@ -0,0 +1,5 @@ +author: "necromanceranne" +delete-after: True +changes: + - rscdel: "Removed the formal security officer jacket from the secdrobe" + - tweak: "formal security jackets are now armor vests" From d741fb0a1ff3bbff81a56664a1c1ab867b46a142 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 7 Feb 2020 00:53:57 -0600 Subject: [PATCH 116/172] Automatic changelog generation for PR #10787 [ci skip] --- html/changelogs/AutoChangeLog-pr-10787.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10787.yml diff --git a/html/changelogs/AutoChangeLog-pr-10787.yml b/html/changelogs/AutoChangeLog-pr-10787.yml new file mode 100644 index 0000000000..ee221b69f3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10787.yml @@ -0,0 +1,4 @@ +author: "Seris02" +delete-after: True +changes: + - rscadd: "thief's gloves" From e8236f504bee2daed4ac1b1c6ac039baa0f12d49 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 7 Feb 2020 00:56:16 -0600 Subject: [PATCH 117/172] Automatic changelog generation for PR #10921 [ci skip] --- html/changelogs/AutoChangeLog-pr-10921.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10921.yml diff --git a/html/changelogs/AutoChangeLog-pr-10921.yml b/html/changelogs/AutoChangeLog-pr-10921.yml new file mode 100644 index 0000000000..d6d551b40d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10921.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "The Lavaland's Herald speech sound should only play if they are actually speaking." From 34f43dccb4691012b16a9745f2aeecfc35a1f522 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 7 Feb 2020 00:56:35 -0600 Subject: [PATCH 118/172] Automatic changelog generation for PR #10924 [ci skip] --- html/changelogs/AutoChangeLog-pr-10924.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10924.yml diff --git a/html/changelogs/AutoChangeLog-pr-10924.yml b/html/changelogs/AutoChangeLog-pr-10924.yml new file mode 100644 index 0000000000..d419928dd2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10924.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Fixed whitelisted/donor loadouts" From ed2bfb66d86b6ba7c0d002ae4eaa252f7488da6a Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 7 Feb 2020 00:05:21 -0700 Subject: [PATCH 119/172] Update fail2topic.dm --- code/controllers/subsystem/fail2topic.dm | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/code/controllers/subsystem/fail2topic.dm b/code/controllers/subsystem/fail2topic.dm index b358cc2c5f..6c40a97479 100644 --- a/code/controllers/subsystem/fail2topic.dm +++ b/code/controllers/subsystem/fail2topic.dm @@ -31,15 +31,18 @@ SUBSYSTEM_DEF(fail2topic) return ..() /datum/controller/subsystem/fail2topic/fire() - for(var/i in 1 to length(rate_limiting)) - var/ip = rate_limiting[i] - var/last_attempt = rate_limiting[ip] - if (world.time - last_attempt > rate_limit) - rate_limiting -= ip - fail_counts -= ip - - if (MC_TICK_CHECK) - return + if(length(rate_limiting)) + var/i = 1 + while(i <= length(rate_limiting)) + var/ip = rate_limiting[i] + var/last_attempt = rate_limiting[ip] + if(world.time - last_attempt > rate_limit) + rate_limiting -= ip + fail_counts -= ip + else //if we remove that, and the next element is in its place. check that instead of incrementing. + i++ + if(MC_TICK_CHECK) + return /datum/controller/subsystem/fail2topic/Shutdown() DropFirewallRule() From e6f14a085de00399fc05a308ff4a8581cbfd6ee2 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 7 Feb 2020 00:06:32 -0700 Subject: [PATCH 120/172] Update fail2topic.dm --- code/controllers/subsystem/fail2topic.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem/fail2topic.dm b/code/controllers/subsystem/fail2topic.dm index 6c40a97479..02e7bc7aab 100644 --- a/code/controllers/subsystem/fail2topic.dm +++ b/code/controllers/subsystem/fail2topic.dm @@ -40,7 +40,7 @@ SUBSYSTEM_DEF(fail2topic) rate_limiting -= ip fail_counts -= ip else //if we remove that, and the next element is in its place. check that instead of incrementing. - i++ + ++i if(MC_TICK_CHECK) return From 4f2acb629882591194793759074deb1f6ba8377e Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 7 Feb 2020 00:08:19 -0700 Subject: [PATCH 121/172] Update gun.dm --- code/modules/projectiles/gun.dm | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 0c2b5e013e..e39d45a275 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -77,10 +77,14 @@ azoom = new (src) /obj/item/gun/Destroy() - QDEL_NULL(pin) - QDEL_NULL(gun_light) - QDEL_NULL(bayonet) - QDEL_NULL(chambered) + if(pin) + QDEL_NULL(pin) + if(gun_light) + QDEL_NULL(gun_light) + if(bayonet) + QDEL_NULL(bayonet) + if(chambered) + QDEL_NULL(chambered) return ..() /obj/item/gun/CheckParts(list/parts_list) From 4c645d40561ee924d8f8b166008c8b4f2c47e76b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 7 Feb 2020 03:17:17 -0600 Subject: [PATCH 122/172] Automatic changelog generation for PR #10950 [ci skip] --- html/changelogs/AutoChangeLog-pr-10950.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10950.yml diff --git a/html/changelogs/AutoChangeLog-pr-10950.yml b/html/changelogs/AutoChangeLog-pr-10950.yml new file mode 100644 index 0000000000..8258db1d69 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10950.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - bugfix: "beam rifle runtime fix during aiming_beam" From f87aac6060f06eb68826842d2d09d31122664a53 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 7 Feb 2020 03:34:58 -0600 Subject: [PATCH 123/172] Automatic changelog generation for PR #10951 [ci skip] --- html/changelogs/AutoChangeLog-pr-10951.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10951.yml diff --git a/html/changelogs/AutoChangeLog-pr-10951.yml b/html/changelogs/AutoChangeLog-pr-10951.yml new file mode 100644 index 0000000000..20bc444967 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10951.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - bugfix: "fail2topic runtime fix: taking out an ip while incrementing index resulted in accessing the next-next entry instead of the next and results in out of bound errors." From 0337a6402b761f5eac83c1b6f1c9cb352de1fdc5 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 7 Feb 2020 03:16:52 -0700 Subject: [PATCH 124/172] Update wizard.dm --- code/modules/spells/spell_types/wizard.dm | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm index e098fe389d..44fdd1eb55 100644 --- a/code/modules/spells/spell_types/wizard.dm +++ b/code/modules/spells/spell_types/wizard.dm @@ -248,6 +248,7 @@ mutations = list(BLINDMUT) duration = 300 sound = 'sound/magic/blind.ogg' + /obj/effect/proc_holder/spell/aoe_turf/repulse name = "Repulse" desc = "This spell throws everything around the user away." @@ -266,15 +267,22 @@ action_icon_state = "repulse" /obj/effect/proc_holder/spell/aoe_turf/repulse/cast(list/targets,mob/user = usr, stun_amt = 50) + var/list/mobs = list() + var/list/objs = list() var/list/thrownatoms = list() var/atom/throwtarget var/distfromcaster playMagSound() for(var/turf/T in targets) //Done this way so things don't get thrown all around hilariously. - for(var/atom/movable/AM in T) - thrownatoms += AM - + for(var/mob/M in T) + mobs += M + for(var/obj/O in T) + objs += O + thrownatoms = mobs + objs //mobs first + var/safety = 50 for(var/am in thrownatoms) + if(!safety) + break var/atom/movable/AM = am if(AM == user || AM.anchored) continue @@ -299,6 +307,7 @@ M.Knockdown(stun_amt, override_hardstun = stun_amt * 0.2) to_chat(M, "You're thrown back by [user]!") AM.throw_at(throwtarget, ((CLAMP((maxthrow - (CLAMP(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1,user)//So stuff gets tossed around at the same time. + safety-- /obj/effect/proc_holder/spell/aoe_turf/repulse/xeno //i fixed conflicts only to find out that this is in the WIZARD file instead of the xeno file?! name = "Tail Sweep" From 41eebc6e2ba1fe78ed23f5fbab1003b8b19424f2 Mon Sep 17 00:00:00 2001 From: Artur Date: Fri, 7 Feb 2020 13:42:56 +0200 Subject: [PATCH 125/172] Fixes cloak --- code/modules/antagonists/bloodsucker/powers/bs_cloak.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/antagonists/bloodsucker/powers/bs_cloak.dm b/code/modules/antagonists/bloodsucker/powers/bs_cloak.dm index 9126638fea..9d83c95f05 100644 --- a/code/modules/antagonists/bloodsucker/powers/bs_cloak.dm +++ b/code/modules/antagonists/bloodsucker/powers/bs_cloak.dm @@ -31,12 +31,11 @@ if(was_running) user.toggle_move_intent() ADD_TRAIT(user, TRAIT_NORUNNING, "cloak of darkness") - while(bloodsuckerdatum && ContinueActive(user) || user.m_intent == MOVE_INTENT_RUN) + while(bloodsuckerdatum && ContinueActive(user)) // Pay Blood Toll (if awake) owner.alpha = max(20, owner.alpha - min(75, 10 + 5 * level_current)) bloodsuckerdatum.AddBloodVolume(-0.2) sleep(5) // Check every few ticks that we haven't disabled this power - // Return to Running (if you were before) /datum/action/bloodsucker/cloak/ContinueActive(mob/living/user, mob/living/target) if (!..()) From 7f0a3698700e76db72c502f1d70e7020fa47dc16 Mon Sep 17 00:00:00 2001 From: Putnam Date: Fri, 7 Feb 2020 04:29:53 -0800 Subject: [PATCH 126/172] Also added options for custom votes --- code/__DEFINES/vote.dm | 9 +++++++++ code/controllers/subsystem/vote.dm | 2 ++ 2 files changed, 11 insertions(+) diff --git a/code/__DEFINES/vote.dm b/code/__DEFINES/vote.dm index b83ea7b8f6..12e802383e 100644 --- a/code/__DEFINES/vote.dm +++ b/code/__DEFINES/vote.dm @@ -6,3 +6,12 @@ #define INSTANT_RUNOFF_VOTING 5 GLOBAL_LIST_INIT(vote_score_options,list("Bad","Poor","Acceptable","Good","Great")) + +GLOBAL_LIST_INIT(vote_type_names,list(\ +"Plurality (default)" = PLURALITY_VOTING,\ +"Approval" = APPROVAL_VOTING,\ +"IRV (single winner ranked choice)" = INSTANT_RUNOFF_VOTING,\ +"Schulze (ranked choice, higher result=better)" = SCHULZE_VOTING,\ +"Raw Score (returns results from 0 to 1, winner is 1)" = SCORE_VOTING,\ +"Majority Judgement (single-winner score voting)" = MAJORITY_JUDGEMENT_VOTING,\ +)) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 0b80f6253a..730f688723 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -487,6 +487,8 @@ SUBSYSTEM_DEF(vote) question = stripped_input(usr,"What is the vote for?") if(!question) return 0 + var/system_string = input(usr,"Which voting type?",GLOB.vote_type_names[1]) in GLOB.vote_type_names + vote_system = GLOB.vote_type_names[system_string] for(var/i=1,i<=10,i++) var/option = capitalize(stripped_input(usr,"Please enter an option or hit cancel to finish")) if(!option || mode || !usr.client) From 27efd5427485851c8a15792d33edd338d52a007f Mon Sep 17 00:00:00 2001 From: Putnam Date: Fri, 7 Feb 2020 04:38:39 -0800 Subject: [PATCH 127/172] why was that else there. why --- code/controllers/subsystem/vote.dm | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 730f688723..086167fc48 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -255,14 +255,13 @@ SUBSYSTEM_DEF(vote) text += "\nIt should be noted that this is not a raw tally of votes (impossible in ranked choice) but the score determined by the schulze method of voting, so the numbers will look weird!" if(vote_system == MAJORITY_JUDGEMENT_VOTING) text += "\nIt should be noted that this is not a raw tally of votes but the number of runoffs done by majority judgement!" - else - for(var/i=1,i<=choices.len,i++) - var/votes = choices[choices[i]] - if(!votes) - votes = 0 - if(was_roundtype_vote) - stored_gamemode_votes[choices[i]] = votes - text += "\n[choices[i]]: [obfuscated ? "???" : votes]" //CIT CHANGE - adds obfuscated votes + for(var/i=1,i<=choices.len,i++) + var/votes = choices[choices[i]] + if(!votes) + votes = 0 + if(was_roundtype_vote) + stored_gamemode_votes[choices[i]] = votes + text += "\n[choices[i]]: [obfuscated ? "???" : votes]" //CIT CHANGE - adds obfuscated votes if(mode != "custom") if(winners.len > 1 && !obfuscated) //CIT CHANGE - adds obfuscated votes text = "\nVote Tied Between:" From b4faac50a992b4d00837c698c47a2a9d112a167d Mon Sep 17 00:00:00 2001 From: Putnam Date: Fri, 7 Feb 2020 04:41:16 -0800 Subject: [PATCH 128/172] yeah "null" is bad juju. why did i do that --- code/game/gamemodes/dynamic/dynamic.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index 821c819664..137220dfe9 100644 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -41,7 +41,7 @@ GLOBAL_LIST_EMPTY(dynamic_forced_roundstart_ruleset) // Forced threat level, setting this to zero or higher forces the roundstart threat to the value. GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) -GLOBAL_VAR_INIT(dynamic_storyteller_type, null) +GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) /datum/game_mode/dynamic name = "dynamic mode" From b615be1248d407773760bbc7f585056b10bf752e Mon Sep 17 00:00:00 2001 From: Artur Date: Fri, 7 Feb 2020 18:20:09 +0100 Subject: [PATCH 129/172] Should hopefully work.. --- .github/workflows/autobuild_tgui.yml | 36 +++++++++++++ tgui-next/README.md | 81 ++++++++++++++++++++++++++-- tools/hooks/install.sh | 7 ++- tools/travis/build_tgui.sh | 22 +++++++- tools/travis/install_build_tools.sh | 2 + 5 files changed, 142 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/autobuild_tgui.yml diff --git a/.github/workflows/autobuild_tgui.yml b/.github/workflows/autobuild_tgui.yml new file mode 100644 index 0000000000..565cc8fd57 --- /dev/null +++ b/.github/workflows/autobuild_tgui.yml @@ -0,0 +1,36 @@ +name: Autobuild TGUI + +on: + push: + branches: + - 'master' + paths: + - 'tgui-next/**.js' + - 'tgui-next/**.scss' + +jobs: + build: + name: Rebuild TGUI + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v1 + - name: Setup Node + uses: actions/setup-node@v1 + with: + node-version: '>=12.13' + - name: Get Dependencies + run: yarn install + working-directory: ./tgui-next + - name: Build TGUI + run: yarn run build + working-directory: ./tgui-next + - name: Commit Artifacts + run: | + git config --local user.email "action@github.com" + git config --local user.name "TGUI" + git commit -m "Automatic TGUI Rebuild [ci skip]" -a + - name: Push Artifacts + uses: ad-m/github-push-action@master + with: + github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/tgui-next/README.md b/tgui-next/README.md index df801684c6..beb7aaff80 100644 --- a/tgui-next/README.md +++ b/tgui-next/README.md @@ -65,6 +65,9 @@ Run one of the following: hot module replacement and logging facilities in all running instances of tgui. In short, this means that you will instantly see changes in the game as you code it. Very useful, highly recommended. + In order to use, you should start the game server first, connect to it so dreamseeker is + open, then start the dev server. You'll know if it's hooked correctly if data gets dumped + to the log when tgui windows are opened. - `bin/tgui --dev --reload` - reload byond cache once. - `bin/tgui --dev --debug` - run server with debug logging enabled. - `bin/tgui --dev --no-hot` - disable hot module replacement (helps when @@ -220,7 +223,6 @@ This way, `Button` can pull out the `className` generated by the `Box`. ``` `Box` units, like width, height and margins can be defined in two ways: - - By plain numbers (1 unit equals `0.5em`); - In absolute measures, by providing a full unit string (e.g. `100px`). @@ -239,6 +241,8 @@ Props: - `height: number` - Box height. - `minHeight: number` - Box minimum height. - `maxHeight: number` - Box maximum height. +- `fontSize: number` - Font size. +- `fontFamily: string` - Font family. - `lineHeight: number` - Directly affects the height of text lines. Useful for adjusting button height. - `inline: boolean` - Forces the `Box` to appear as an `inline-block`, @@ -254,6 +258,7 @@ all available horizontal space. - `opacity: number` - Opacity, from 0 to 1. - `bold: boolean` - Make text bold. - `italic: boolean` - Make text italic. +- `nowrap: boolean` - Stops text from wrapping. - `textAlign: string` - Align text inside the box. - `left` (default) - `center` @@ -293,11 +298,55 @@ over the button. - `bottom` (default) - Show tooltip below the button. - `left` - Show tooltip on the left of the button. - `right` - Show tooltip on the right of the button. +- `ellipsis: boolean` - If button width is constrained, button text will +be truncated with an ellipsis. Be careful however, because this prop breaks +the baseline alignment. - `title: string` - A native browser tooltip, which appears when hovering over the button. - `content/children: any` - Content to render inside the button. - `onClick: function` - Called when element is clicked. +### `Button.Checkbox` + +A ghetto checkbox, made entirely using existing Button API. + +Props: + +- See inherited props: [Button](#button) +- `checked: boolean` - Boolean value, which marks the checkbox as checked. + +### `Button.Confirm` + +A button with a an extra confirmation step, using native button component. + +Props: + +- See inherited props: [Button](#button) +- `confirmMessage: string` - Text to display after first click; defaults to "Confirm?" +- `confirmColor: string` - Color to display after first click; default to "bad" + +### `Button.Input` + +A button that turns into an input box after the first click. Turns back into a button after the user hits enter, defocuses, or hits escape. Enter and defocus commit, while escape cancels. + +Props: + - See inherited props: [Box](#box) + - `fluid`: fill availible horizontal space + - `onCommit: (e, value) => void`: function that is called after the user defocuses the input or presses enter + - `currentValue: string`: default string to display when the input is shown + - `defaultValue: string`: default value emitted if the user leaves the box blank when hitting enter or defocusing. If left undefined, will cancel the change on a blank defocus/enter + +### `Collapsible` + +Displays contents when open, acts as a fluid button when closed. Click to toggle, closed by default. + +Props: + - See inherited props: [Box](#box) + - `children: any` - What is collapsed when closed + - `title: string` - Text to display on the button for collapsing + - `color: string` - Color of the button; see [Button](#button) + - `buttons: any` - Buttons or other content to render inline with the button + ### `ColorBox` Displays a 1-character wide colored square. Can be used as a status indicator, @@ -319,6 +368,21 @@ Props: - See inherited props: [Box](#box) +### `Dropdown` + +A simple dropdown box component. Lets the user select from a list of options and displays selected entry. + +Props: + + - See inherited props: [Box](#box) + - `options: string[]` - An array of strings which will be displayed in the dropdown when open + - `selected: string` - Currently selected entry + - `width: number` - Width of dropdown button and resulting menu + - `over: boolean` - dropdown renders over instead of below + - `color: string` - color of dropdown button + - `onClick: (e) => void` - Called when dropdown button is clicked + - `onSelected: (value) => void` - Called when a value is picked from the list, `value` is the value that was picked + ### `Flex` Quickly manage the layout, alignment, and sizing of grid columns, navigation, components, and more with a full suite of responsive flexbox utilities. @@ -350,6 +414,10 @@ two flex items as far as possible from each other. Props: - See inherited props: [Box](#box) +- `spacing: number` - Spacing between flex items, in integer units +(1 unit - 0.5em). Does not directly relate to a flex css property +(adds a modifier class under the hood), and only integer numbers are +supported. - `direction: string` - This establishes the main-axis, thus defining the direction flex items are placed in the flex container. - `row` (default) - left to right. @@ -406,6 +474,7 @@ remaining space is distributed. It can be a length (e.g. `20%`, `5rem`, etc.), an `auto` or `content` keyword. - `align: string` - This allows the default alignment (or the one specified by align-items) to be overridden for individual flex items. See: [Flex](#flex). + ### `Grid` Helps you to divide horizontal space into two or more equal sections. @@ -432,7 +501,7 @@ Props: Props: -- See inherited props: [Table.Cell](#table-cell) +- See inherited props: [Table.Cell](#tablecell) - `size: number` (default: 1) - Size of the column relative to other columns. ### `Icon` @@ -445,7 +514,6 @@ Renders one of the FontAwesome icons of your choice. To smoothen the transition from v4 to v5, we have added a v4 semantic to transform names with `-o` suffixes to FA Regular icons. For example: - - `square` will get transformed to `fas square` - `square-o` will get transformed to `far square` @@ -470,7 +538,9 @@ Props: - See inherited props: [Box](#box) - `value: string` - Value of an input. +- `placeholder: string` - Text placed into Input box when value is otherwise nothing. Clears automatically when focused. - `fluid: boolean` - Fill all available horizontal space. +- `selfClear: boolean` - Clear after hitting enter, as well as remain focused when this happens. Useful for things like chat inputs - `onChange: (e, value) => void` - An event, which fires when you commit the text by either unfocusing the input box, or by pressing the Enter key. - `onInput: (e, value) => void` - An event, which fires on every keypress. @@ -562,6 +632,9 @@ dragging the input. - `stepPixelSize: number` (default: 1) - Screen distance mouse needs to travel to adjust value by one `step`. - `width: string|number` - Width of the element, in `Box` units or pixels. +- `height: string|numer` - Height of the element, in `Box` units or pixels. +- `lineHeight: string|number` - lineHeight of the element, in `Box` units or pixels. +- `fontSize: string|number` - fontSize of the element, in `Box` units or pixels. - `format: value => value` - Format value using this function before displaying it. - `suppressFlicker: number` - A number in milliseconds, for which the input @@ -738,6 +811,8 @@ Props: - `vertical: boolean` - Use a vertical configuration, where tabs will appear stacked on the left side of the container. +- `altSelection` - Whether the tab buttons select via standard select (color change) or by adding a white indicator to the selected tab. + Intended for usage on interfaces where tab color has relevance. - `children: Tab[]` - This component only accepts tabs as its children. ### `Tabs.Tab` diff --git a/tools/hooks/install.sh b/tools/hooks/install.sh index ccc4cf5227..6dfc15a2fa 100644 --- a/tools/hooks/install.sh +++ b/tools/hooks/install.sh @@ -10,6 +10,11 @@ for f in *.merge; do echo Installing merge driver: ${f%.merge} git config --replace-all merge.${f%.merge}.driver "tools/hooks/$f %P %O %A %B %L" done -echo Installing Python dependencies + +echo "Installing tgui hooks" +../../tgui-next/bin/tgui --install-git-hooks + +echo "Installing Python dependencies" ./python.sh -m pip install -r ../mapmerge2/requirements.txt + echo "Done" diff --git a/tools/travis/build_tgui.sh b/tools/travis/build_tgui.sh index 0141f3e117..333e7331b0 100755 --- a/tools/travis/build_tgui.sh +++ b/tools/travis/build_tgui.sh @@ -1,7 +1,25 @@ #!/bin/bash set -euo pipefail -cd tgui -source ~/.nvm/nvm.sh +## Change to project root relative to the script +cd "$(dirname "${0}")/../.." +base_dir="$(pwd)" + +## The final authority on what's required to fully build the project +source dependencies.sh + +## Setup NVM +if [[ -e ~/.nvm/nvm.sh ]]; then + source ~/.nvm/nvm.sh + nvm use "${NODE_VERSION}" +fi + +echo "Building 'tgui'" +cd "${base_dir}/tgui" npm ci node node_modules/gulp/bin/gulp.js --min + +echo "Building 'tgui-next'" +cd "${base_dir}/tgui-next" +bin/tgui --clean +bin/tgui diff --git a/tools/travis/install_build_tools.sh b/tools/travis/install_build_tools.sh index 224687f088..c36cd571ba 100755 --- a/tools/travis/install_build_tools.sh +++ b/tools/travis/install_build_tools.sh @@ -5,6 +5,8 @@ source dependencies.sh source ~/.nvm/nvm.sh nvm install $NODE_VERSION +nvm use $NODE_VERSION +npm install --global yarn pip3 install --user PyYaml pip3 install --user beautifulsoup4 From ea096a79eed0bb91c8405e8496af5450a2b9ff24 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 7 Feb 2020 15:41:51 -0600 Subject: [PATCH 130/172] Automatic changelog generation for PR #10957 [ci skip] --- html/changelogs/AutoChangeLog-pr-10957.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10957.yml diff --git a/html/changelogs/AutoChangeLog-pr-10957.yml b/html/changelogs/AutoChangeLog-pr-10957.yml new file mode 100644 index 0000000000..b655b85fb9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10957.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - bugfix: "Dynamic now defaults to \"classic\" storyteller instead of just failing if the vote didn't choose a storyteller." From 6f3bec3ba337c4ab3e2d2c405c74a489a8b1db2e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 7 Feb 2020 15:44:22 -0600 Subject: [PATCH 131/172] Automatic changelog generation for PR #10774 [ci skip] --- html/changelogs/AutoChangeLog-pr-10774.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10774.yml diff --git a/html/changelogs/AutoChangeLog-pr-10774.yml b/html/changelogs/AutoChangeLog-pr-10774.yml new file mode 100644 index 0000000000..f596bdcddb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10774.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - tweak: "nuke explosion is now full dev radius for anti lag purposes" From 1200628e3599a020c9ca4ad465b10ede0986a5c4 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 7 Feb 2020 16:13:24 -0600 Subject: [PATCH 132/172] Automatic changelog generation for PR #10892 [ci skip] --- html/changelogs/AutoChangeLog-pr-10892.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10892.yml diff --git a/html/changelogs/AutoChangeLog-pr-10892.yml b/html/changelogs/AutoChangeLog-pr-10892.yml new file mode 100644 index 0000000000..88f12ef378 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10892.yml @@ -0,0 +1,5 @@ +author: "kevinz000" +delete-after: True +changes: + - refactor: "Guncode and energy guns have been refactored a bit." + - rscadd: "You can now combat mode ight click on an energy gun to attempt to switch firing modes. This only works on guns without right click functions overridden." From 853c66426b9a6f84c2cdd921dffdc185f8b830bd Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 7 Feb 2020 16:23:59 -0600 Subject: [PATCH 133/172] Automatic changelog generation for PR #10935 [ci skip] --- html/changelogs/AutoChangeLog-pr-10935.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10935.yml diff --git a/html/changelogs/AutoChangeLog-pr-10935.yml b/html/changelogs/AutoChangeLog-pr-10935.yml new file mode 100644 index 0000000000..f35855854f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10935.yml @@ -0,0 +1,5 @@ +author: "KrabSpider" +delete-after: True +changes: + - imageadd: "The Van Dyke is no longer Fu Manchu." + - imagedel: "Gets rid of a Fu Manchu imitation." From 8c2019fcbf568d1c082e77d1ffafe36ea560e75d Mon Sep 17 00:00:00 2001 From: kappa-sama <44128284+kappa-sama@users.noreply.github.com> Date: Fri, 7 Feb 2020 17:58:36 -0500 Subject: [PATCH 134/172] probably fixes plant disk techdisk --- code/modules/research/designs/misc_designs.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 3867fa9f23..2bc56f2fbd 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -250,10 +250,10 @@ name = "Plant Data Disk" desc = "A disk for storing plant genetic data." id = "diskplantgene" - build_type = PROTOLATHE + build_type = PROTOLATHE | AUTOLATHE materials = list(MAT_METAL=200, MAT_GLASS=100) build_path = /obj/item/disk/plantgene - category = list("Electronics") + category = list("Electronics","Imported") departmental_flags = DEPARTMENTAL_FLAG_SERVICE /datum/design/roastingstick From 84a9f2f058ea5e6e45a0c68f00800b799f1f8e64 Mon Sep 17 00:00:00 2001 From: Putnam Date: Fri, 7 Feb 2020 19:54:15 -0800 Subject: [PATCH 135/172] make the fallback majority judgement --- code/controllers/subsystem/ticker.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 716773b3b4..998ae835a7 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -487,7 +487,7 @@ SUBSYSTEM_DEF(ticker) if("SCORE") SSvote.initiate_vote("map","server",hideresults=TRUE,votesystem = MAJORITY_JUDGEMENT_VOTING) // fallback - SSvote.initiate_vote("map","server",hideresults=TRUE) + SSvote.initiate_vote("map","server",hideresults=TRUE,votesystem = MAJORITY_JUDGEMENT_VOTING) /datum/controller/subsystem/ticker/proc/HasRoundStarted() return current_state >= GAME_STATE_PLAYING From f4c148d44f6ed8662f997c1bc776217e223b2ff7 Mon Sep 17 00:00:00 2001 From: r4d6 Date: Fri, 7 Feb 2020 22:58:47 -0500 Subject: [PATCH 136/172] Fix mining base having holes to space --- _maps/map_files/Mining/Lavaland.dmm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index d4b09ac046..72f68910f7 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -75,7 +75,7 @@ /turf/closed/mineral/random/labormineral/volcanic, /area/lavaland/surface/outdoors) "aA" = ( -/turf/template_noop, +/turf/open/lava/smooth/lava_land_surface, /area/template_noop) "cu" = ( /obj/item/pickaxe, @@ -1181,7 +1181,7 @@ /area/lavaland/surface/outdoors) "ol" = ( /obj/effect/landmark/stationroom/lavaland/station, -/turf/template_noop, +/turf/open/lava/smooth/lava_land_surface, /area/template_noop) "Uq" = ( /obj/docking_port/stationary{ From c9852db0221830f96facee6e95083d9832f3ad1b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 7 Feb 2020 22:06:25 -0600 Subject: [PATCH 137/172] Automatic changelog generation for PR #10966 [ci skip] --- html/changelogs/AutoChangeLog-pr-10966.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10966.yml diff --git a/html/changelogs/AutoChangeLog-pr-10966.yml b/html/changelogs/AutoChangeLog-pr-10966.yml new file mode 100644 index 0000000000..bdc78a2b01 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10966.yml @@ -0,0 +1,4 @@ +author: "r4d6" +delete-after: True +changes: + - bugfix: "Mining no longer lead to spess" From 72a285bb4ddeb22cb0606d80dc6f5435c009248f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 7 Feb 2020 22:12:22 -0600 Subject: [PATCH 138/172] Automatic changelog generation for PR #10960 [ci skip] --- html/changelogs/AutoChangeLog-pr-10960.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10960.yml diff --git a/html/changelogs/AutoChangeLog-pr-10960.yml b/html/changelogs/AutoChangeLog-pr-10960.yml new file mode 100644 index 0000000000..6033533590 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10960.yml @@ -0,0 +1,4 @@ +author: "kappa-sama" +delete-after: True +changes: + - bugfix: "the plant dudes can actually make plant disks now" From c45dab8ebd33e9c96ef6ee6db113802f1abdbc8f Mon Sep 17 00:00:00 2001 From: Putnam Date: Fri, 7 Feb 2020 20:37:22 -0800 Subject: [PATCH 139/172] uhh? --- code/controllers/subsystem/ticker.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 998ae835a7..748cdc1dbd 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -477,7 +477,8 @@ SUBSYSTEM_DEF(ticker) if(CONFIG_GET(flag/tgstyle_maprotation)) INVOKE_ASYNC(SSmapping, /datum/controller/subsystem/mapping/.proc/maprotate) else - switch(CONFIG_GET(string/map_vote_type)) + var/vote_type = CONFIG_GET(string/map_vote_type) + switch(vote_type) if("PLURALITY") SSvote.initiate_vote("map","server",hideresults=TRUE) if("APPROVAL") From 79a72fac24c47379503a85c30673affbe215642a Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 7 Feb 2020 23:32:36 -0700 Subject: [PATCH 140/172] fix --- code/datums/status_effects/debuffs.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index c560a123b5..c694f27d64 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -144,6 +144,9 @@ owner.adjustStaminaLoss(max(0, stamdmg_per_ds * diff)) //if you really want to try to stamcrit someone with a taser alone, you can, but it'll take time and good timing. last_tick = world.time +/datum/status_effect/electrode/nextmove_modifier() //why is this a proc. its no big deal since this doesnt get called often at all but literally w h y + return nextmove_modifier + /datum/status_effect/electrode/no_combat_mode id = "tased_strong" slowdown = 8 @@ -158,9 +161,6 @@ if(C.combatmode) C.toggle_combat_mode(TRUE) -/datum/status_effect/electrode/no_combat_mode/nextmove_modifier() //why is this a proc. its no big deal since this doesnt get called often at all but literally w h y - return nextmove_modifier - //OTHER DEBUFFS /datum/status_effect/his_wrath //does minor damage over time unless holding His Grace id = "his_wrath" From 826ed7d4f22a35907f0d07fa4e87935928bd070c Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 7 Feb 2020 23:39:09 -0700 Subject: [PATCH 141/172] o k. --- code/__DEFINES/flags.dm | 11 +++++----- code/__DEFINES/status_effects.dm | 4 +++- code/modules/mob/living/living.dm | 4 ++++ .../projectiles/ammunition/energy/stun.dm | 7 +++++- .../projectiles/guns/energy/energy_gun.dm | 19 +++++++++------- code/modules/projectiles/guns/energy/stun.dm | 17 ++++++++++++-- .../projectiles/projectile/energy/stun.dm | 22 +++++++++++++++---- 7 files changed, 63 insertions(+), 21 deletions(-) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index a7d2670747..317066f673 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -56,11 +56,12 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 //Movement Types -#define GROUND (1<<0) -#define FLYING (1<<1) -#define VENTCRAWLING (1<<2) -#define FLOATING (1<<3) -#define UNSTOPPABLE (1<<4) //When moving, will Bump()/Cross()/Uncross() everything, but won't be stopped. +#define GROUND (1<<0) +#define FLYING (1<<1) +#define VENTCRAWLING (1<<2) +#define FLOATING (1<<3) +#define UNSTOPPABLE (1<<4) //When moving, will Bump()/Cross()/Uncross() everything, but won't be stopped. +#define CRAWLING (1<<5) //Applied if you're crawling around on the ground/resting. //Fire and Acid stuff, for resistance_flags #define LAVA_PROOF (1<<0) diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 6d52f4640c..f42948f4ae 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -46,7 +46,9 @@ #define STATUS_EFFECT_SLEEPING /datum/status_effect/incapacitating/sleeping //the affected is asleep -#define STATUS_EFFECT_TASED /datum/status_effect/no_combat_mode/electrode/ //the affected has been tased, preventing fine muscle control +#define STATUS_EFFECT_TASED_WEAK /datum/status_effect/electrode //not as crippling, just slows down + +#define STATUS_EFFECT_TASED /datum/status_effect/electrode/no_combat_mode //the affected has been tased, preventing fine muscle control #define STATUS_EFFECT_PACIFY /datum/status_effect/pacify //the affected is pacified, preventing direct hostile actions diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 9c8b2808ce..8652a1ee9e 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1094,6 +1094,10 @@ fall(forced = 1) canmove = !(ko || recoveringstam || pinned || IsStun() || IsFrozen() || chokehold || buckled || (!has_legs && !ignore_legs && !has_arms)) //Cit change - makes it plausible to move while resting, adds pinning and stamina crit density = !lying + if(resting) + ENABLE_BITFIELD(movement_type, CRAWLING) + else + DISABLE_BITFIELD(movement_type, CRAWLING) if(lying) if(layer == initial(layer)) //to avoid special cases like hiding larvas. layer = LYING_MOB_LAYER //so mob lying always appear behind standing mobs diff --git a/code/modules/projectiles/ammunition/energy/stun.dm b/code/modules/projectiles/ammunition/energy/stun.dm index 7c2b62c02c..2abc472138 100644 --- a/code/modules/projectiles/ammunition/energy/stun.dm +++ b/code/modules/projectiles/ammunition/energy/stun.dm @@ -5,6 +5,10 @@ e_cost = 200 harmful = FALSE +/obj/item/ammo_casing/energy/electrode/security + projectile_type = /obj/item/projectile/energy/electrode/security + e_cost = 100 + /obj/item/ammo_casing/energy/electrode/spec e_cost = 100 @@ -13,6 +17,7 @@ e_cost = 100 /obj/item/ammo_casing/energy/electrode/hos + projectile_type = /obj/item/projectile/energy/electrode/security/hos e_cost = 200 /obj/item/ammo_casing/energy/electrode/old @@ -27,4 +32,4 @@ click_cooldown_override = 3.5 /obj/item/ammo_casing/energy/disabler/secborg - e_cost = 50 \ No newline at end of file + e_cost = 50 diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index 163deae0ed..efe107a3f8 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -97,7 +97,7 @@ pin = null can_charge = 0 ammo_x_offset = 1 - ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser) + ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser) selfcharge = EGUN_SELFCHARGE var/fail_tick = 0 var/fail_chance = 0 @@ -113,18 +113,21 @@ ..() /obj/item/gun/energy/e_gun/nuclear/proc/failcheck() - if(prob(fail_chance) && isliving(loc)) - var/mob/living/M = loc + if(prob(fail_chance)) switch(fail_tick) if(0 to 200) fail_tick += (2*(fail_chance)) - M.rad_act(400) - to_chat(M, "Your [name] feels warmer.") + radiation_pulse(src, 50) + var/mob/M = (ismob(loc) && loc) || (ismob(loc.loc) && loc.loc) //thank you short circuiting. if you powergame and nest these guns deeply you get to suffer no-warning radiation death. + if(M) + to_chat(M, "Your [name] feels warmer.") if(201 to INFINITY) SSobj.processing.Remove(src) - M.rad_act(800) - crit_fail = 1 - to_chat(M, "Your [name]'s reactor overloads!") + radiation_pulse(src, 200) + crit_fail = TRUE + var/mob/M = (ismob(loc) && loc) || (ismob(loc.loc) && loc.loc) + if(M) + to_chat(M, "Your [name]'s reactor overloads!") /obj/item/gun/energy/e_gun/nuclear/emp_act(severity) . = ..() diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 55d11c52d1..d700db817c 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -18,10 +18,23 @@ /obj/item/gun/energy/e_gun/advtaser name = "hybrid taser" - desc = "A dual-mode taser designed to fire both short-range high-power electrodes and long-range disabler beams." + desc = "A dual-mode taser designed to fire both short-range high-power electrodes and long-range disabler beams. Right click in combat mode to fire a taser shot with a cooldown." icon_state = "advtaser" - ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/electrode) + ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/electrode/security = FALSE) ammo_x_offset = 2 + // Not enough guns have altfire systems like this yet for this to be a universal framework. + var/last_altfire = 0 + var/altfire_delay = 15 + +/obj/item/gun/energy/e_gun/advtaser/altafterattack(atom/target, mob/user, proximity_flag, params) + . = TRUE + if(last_altfire + altfire_delay > world.time) + return + var/current_index = current_firemode_index + set_firemode_to_type(/obj/item/ammo_casing/energy/electrode) + process_afterattack(target, user, proximity_flag, params) + set_firemode_index(current_index) + last_altfire = world.time /obj/item/gun/energy/e_gun/advtaser/cyborg name = "cyborg taser" diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index 88e70154d1..8852d754ce 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -2,11 +2,11 @@ name = "electrode" icon_state = "spark" color = "#FFFF00" - nodamage = 1 + nodamage = TRUE knockdown = 60 knockdown_stamoverride = 36 knockdown_stam_max = 50 - stutter = 5 + stutter = 10 jitter = 20 hitsound = 'sound/weapons/taserhit.ogg' range = 7 @@ -14,6 +14,7 @@ muzzle_type = /obj/effect/projectile/muzzle/stun impact_type = /obj/effect/projectile/impact/stun var/tase_duration = 50 + var/strong_tase = TRUE /obj/item/projectile/energy/electrode/on_hit(atom/target, blocked = FALSE) . = ..() @@ -26,10 +27,23 @@ C.IgniteMob() if(C.dna && C.dna.check_mutation(HULK)) C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") - else if((C.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(C, TRAIT_STUNIMMUNE)) - C.apply_status_effect(STATUS_EFFECT_TASED, tase_duration) + else if(tase_duration && (C.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(C, TRAIT_STUNIMMUNE)) + C.apply_status_effect(strong_tase? STATUS_EFFECT_TASED : STATUS_EFFECT_TASED_WEAK, tase_duration) addtimer(CALLBACK(C, /mob/living/carbon.proc/do_jitter_animation, jitter), 5) /obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet do_sparks(1, TRUE, src) ..() + +/obj/item/projectile/energy/electrode/security + tase_duration = 20 + knockdown = 0 + stamina = 10 + knockdown_stamoverride = 0 + knockdown_stam_max = 0 + strong_tase = FALSE + +/obj/item/projectile/energy/electrode/security/hos + knockdown = 100 + knockdown_stamoverride = 30 + knockdown_stam_max = null From c6c1cc484cd39e685639400c599108c8185c6418 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 7 Feb 2020 23:40:02 -0700 Subject: [PATCH 142/172] slight buff --- code/modules/projectiles/projectile/energy/stun.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index 8852d754ce..3bb1b3794e 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -36,12 +36,13 @@ ..() /obj/item/projectile/energy/electrode/security - tase_duration = 20 + tase_duration = 30 knockdown = 0 stamina = 10 knockdown_stamoverride = 0 knockdown_stam_max = 0 strong_tase = FALSE + range = 12 /obj/item/projectile/energy/electrode/security/hos knockdown = 100 From 30c78c5be22e59a0c9db310579d0aa64f4df1c46 Mon Sep 17 00:00:00 2001 From: TrilbySpaceClone Date: Sat, 8 Feb 2020 02:37:37 -0500 Subject: [PATCH 143/172] Let their be lists --- .../crafting/recipes/recipes_primal.dm | 21 ------------------- .../items/stacks/sheets/sheet_types.dm | 14 +++++++++++++ 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/code/datums/components/crafting/recipes/recipes_primal.dm b/code/datums/components/crafting/recipes/recipes_primal.dm index 1be479e4e1..1fc684eddc 100644 --- a/code/datums/components/crafting/recipes/recipes_primal.dm +++ b/code/datums/components/crafting/recipes/recipes_primal.dm @@ -1,10 +1,3 @@ -/datum/crafting_recipe/bonearmor - name = "Bone Armor" - result = /obj/item/clothing/suit/armor/bone - time = 30 - reqs = list(/obj/item/stack/sheet/bone = 6) - category = CAT_PRIMAL - /datum/crafting_recipe/bonetalisman name = "Bone Talisman" result = /obj/item/clothing/accessory/talisman @@ -29,13 +22,6 @@ /obj/item/stack/sheet/sinew = 1) category = CAT_PRIMAL -/datum/crafting_recipe/skullhelm - name = "Skull Helmet" - result = /obj/item/clothing/head/helmet/skull - time = 30 - reqs = list(/obj/item/stack/sheet/bone = 4) - category = CAT_PRIMAL - /datum/crafting_recipe/goliathcloak name = "Goliath Cloak" result = /obj/item/clothing/suit/hooded/cloak/goliath @@ -62,13 +48,6 @@ /obj/item/stack/sheet/sinew = 2) category = CAT_PRIMAL -/datum/crafting_recipe/bonedagger - name = "Bone Dagger" - result = /obj/item/kitchen/knife/combat/bone - time = 20 - reqs = list(/obj/item/stack/sheet/bone = 2) - category = CAT_PRIMAL - /datum/crafting_recipe/bonespear name = "Bone Spear" result = /obj/item/twohanded/bonespear diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 2bd7dd0d38..e17f96495d 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -698,6 +698,16 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ /* * Bones */ + +GLOBAL_LIST_INIT(bone_recipes, list( + new /datum/stack_recipe("Bone Dagger", /obj/item/kitchen/knife/combat/bone, 2, time = 20), \ + new /datum/stack_recipe("Skull Helmet", /obj/item/clothing/head/helmet/skull, 4, time = 30), \ + new /datum/stack_recipe("Bone Armor", /obj/item/clothing/suit/armor/bone, 6, time = 30))) + +/obj/item/stack/sheet/bone/Initialize(mapload, new_amount, merge = TRUE) + recipes = GLOB.bone_recipes + . = ..() + /obj/item/stack/sheet/bone name = "bones" icon = 'icons/obj/mining.dmi' @@ -714,6 +724,10 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ grind_results = list(/datum/reagent/carbon = 10) merge_type = /obj/item/stack/sheet/bone + /* + * Plastic + */ + GLOBAL_LIST_INIT(plastic_recipes, list( new /datum/stack_recipe("see-through plastic flaps", /obj/structure/plasticflaps, 5, one_per_turf = TRUE, on_floor = TRUE, time = 40), \ new /datum/stack_recipe("opaque plastic flaps", /obj/structure/plasticflaps/opaque, 5, one_per_turf = TRUE, on_floor = TRUE, time = 40), \ From 611c8506394e97cb846bd9cb20495cbe8c88d12e Mon Sep 17 00:00:00 2001 From: Putnam Date: Sat, 8 Feb 2020 00:31:46 -0800 Subject: [PATCH 144/172] all you need to understand is everything you know is wrong --- code/modules/antagonists/_common/antag_datum.dm | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 0c05afb155..187ca66705 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -120,15 +120,16 @@ GLOBAL_LIST_EMPTY(antagonists) SEND_SIGNAL(owner.current, COMSIG_CLEAR_MOOD_EVENT, "antag_moodlet") /datum/antagonist/proc/remove_blacklisted_quirks() - var/mob/living/L = owner + var/mob/living/L = owner.current if(istype(L)) - var/list/cut = list() - cut = SSquirks.filter_quirks(L.roundstart_quirks,blacklisted_quirks) - for(var/q in cut) + var/list/my_quirks = L.client?.prefs.all_quirks.Copy() + SSquirks.filter_quirks(my_quirks,blacklisted_quirks) + for(var/q in L.roundstart_quirks) var/datum/quirk/Q = q - if(Q.antag_removal_text) - to_chat(L, "[Q.antag_removal_text]") - L.remove_quirk(Q.type) + if(!(SSquirks.quirk_name_by_path(Q.type) in my_quirks)) + if(initial(Q.antag_removal_text)) + to_chat(L, "[initial(Q.antag_removal_text)]") + L.remove_quirk(Q.type) //Returns the team antagonist belongs to if any. /datum/antagonist/proc/get_team() From 1f506e2f28eedc45392e4978d976135199ee839d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 8 Feb 2020 02:36:13 -0600 Subject: [PATCH 145/172] Automatic changelog generation for PR #10974 [ci skip] --- html/changelogs/AutoChangeLog-pr-10974.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10974.yml diff --git a/html/changelogs/AutoChangeLog-pr-10974.yml b/html/changelogs/AutoChangeLog-pr-10974.yml new file mode 100644 index 0000000000..7f668256b3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10974.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - bugfix: "antag quirk blacklisting works now" From 65d1552208b0cad927081c2ab49f0607c5cb688d Mon Sep 17 00:00:00 2001 From: Artur Date: Sat, 8 Feb 2020 13:46:58 +0100 Subject: [PATCH 146/172] Lets see if this works --- tools/travis/build_tgui.sh | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100755 tools/travis/build_tgui.sh diff --git a/tools/travis/build_tgui.sh b/tools/travis/build_tgui.sh deleted file mode 100755 index 333e7331b0..0000000000 --- a/tools/travis/build_tgui.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -set -euo pipefail - -## Change to project root relative to the script -cd "$(dirname "${0}")/../.." -base_dir="$(pwd)" - -## The final authority on what's required to fully build the project -source dependencies.sh - -## Setup NVM -if [[ -e ~/.nvm/nvm.sh ]]; then - source ~/.nvm/nvm.sh - nvm use "${NODE_VERSION}" -fi - -echo "Building 'tgui'" -cd "${base_dir}/tgui" -npm ci -node node_modules/gulp/bin/gulp.js --min - -echo "Building 'tgui-next'" -cd "${base_dir}/tgui-next" -bin/tgui --clean -bin/tgui From 3fe246ad451097a2e20696e6d032d2c2c7fa851f Mon Sep 17 00:00:00 2001 From: Artur Date: Sat, 8 Feb 2020 13:47:25 +0100 Subject: [PATCH 147/172] Redo --- tools/travis/build_tgui.sh | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 tools/travis/build_tgui.sh diff --git a/tools/travis/build_tgui.sh b/tools/travis/build_tgui.sh new file mode 100644 index 0000000000..333e7331b0 --- /dev/null +++ b/tools/travis/build_tgui.sh @@ -0,0 +1,25 @@ +#!/bin/bash +set -euo pipefail + +## Change to project root relative to the script +cd "$(dirname "${0}")/../.." +base_dir="$(pwd)" + +## The final authority on what's required to fully build the project +source dependencies.sh + +## Setup NVM +if [[ -e ~/.nvm/nvm.sh ]]; then + source ~/.nvm/nvm.sh + nvm use "${NODE_VERSION}" +fi + +echo "Building 'tgui'" +cd "${base_dir}/tgui" +npm ci +node node_modules/gulp/bin/gulp.js --min + +echo "Building 'tgui-next'" +cd "${base_dir}/tgui-next" +bin/tgui --clean +bin/tgui From 860c8136df77c0335f295a254c57d6a8ae1714a8 Mon Sep 17 00:00:00 2001 From: IHOPMommyLich Date: Sat, 8 Feb 2020 17:01:12 -0500 Subject: [PATCH 148/172] Lowers the movespeed provided by Stimulants, weakening Stimpacks and Adrenals. --- code/modules/reagents/chemistry/reagents/medicine_reagents.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index e8913f9ce4..6d37f30884 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -994,7 +994,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) /datum/reagent/medicine/stimulants/on_mob_metabolize(mob/living/L) ..() - L.add_movespeed_modifier(type, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING)) + L.add_movespeed_modifier(type, update=TRUE, priority=100, multiplicative_slowdown=-0.5, blacklisted_movetypes=(FLYING|FLOATING)) /datum/reagent/medicine/stimulants/on_mob_end_metabolize(mob/living/L) L.remove_movespeed_modifier(type) From 3a9ac36286fe1f6d57848c998065afdeca8490cb Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 8 Feb 2020 16:31:36 -0600 Subject: [PATCH 149/172] Automatic changelog generation for PR #10942 [ci skip] --- html/changelogs/AutoChangeLog-pr-10942.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10942.yml diff --git a/html/changelogs/AutoChangeLog-pr-10942.yml b/html/changelogs/AutoChangeLog-pr-10942.yml new file mode 100644 index 0000000000..2a30ace3aa --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10942.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - rscadd: "map voting doesn't suck anymore" From c665ed7e36b6a89888dffa2118c0219acfc73748 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Sun, 9 Feb 2020 00:05:17 +0100 Subject: [PATCH 150/172] Cecilia need helpies in maint, nya --- tools/travis/build_tgui.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 tools/travis/build_tgui.sh diff --git a/tools/travis/build_tgui.sh b/tools/travis/build_tgui.sh old mode 100644 new mode 100755 From 9a2107bf1aa09bc8bc956e689e58e65bf590374a Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Sun, 9 Feb 2020 00:48:14 +0100 Subject: [PATCH 151/172] This one too. --- tgui-next/bin/tgui | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 tgui-next/bin/tgui diff --git a/tgui-next/bin/tgui b/tgui-next/bin/tgui old mode 100644 new mode 100755 From 6152ac92350434f0ee0b0f4f0e2c4a984a6db918 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Sun, 9 Feb 2020 00:56:31 +0100 Subject: [PATCH 152/172] tgstation PR #48090 --- .github/workflows/autobuild_tgui.yml | 9 +++------ tools/travis/build_tgui.sh | 3 +-- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/.github/workflows/autobuild_tgui.yml b/.github/workflows/autobuild_tgui.yml index 565cc8fd57..6849941d10 100644 --- a/.github/workflows/autobuild_tgui.yml +++ b/.github/workflows/autobuild_tgui.yml @@ -18,18 +18,15 @@ jobs: - name: Setup Node uses: actions/setup-node@v1 with: - node-version: '>=12.13' - - name: Get Dependencies - run: yarn install - working-directory: ./tgui-next + node-version: '>=12.13' - name: Build TGUI - run: yarn run build + run: bin/tgui --ci working-directory: ./tgui-next - name: Commit Artifacts run: | git config --local user.email "action@github.com" git config --local user.name "TGUI" - git commit -m "Automatic TGUI Rebuild [ci skip]" -a + git commit -m "Automatic TGUI Rebuild [ci skip]" -a || true - name: Push Artifacts uses: ad-m/github-push-action@master with: diff --git a/tools/travis/build_tgui.sh b/tools/travis/build_tgui.sh index 333e7331b0..b3973468e1 100755 --- a/tools/travis/build_tgui.sh +++ b/tools/travis/build_tgui.sh @@ -21,5 +21,4 @@ node node_modules/gulp/bin/gulp.js --min echo "Building 'tgui-next'" cd "${base_dir}/tgui-next" -bin/tgui --clean -bin/tgui +bin/tgui --ci From 187d9fdb431a713674172042de3b079a94beef53 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Sun, 9 Feb 2020 01:57:12 +0100 Subject: [PATCH 153/172] updating dependencies and #48122, #48241, #48673 --- .github/workflows/autobuild_tgui.yml | 5 ++++- dependencies.sh | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/autobuild_tgui.yml b/.github/workflows/autobuild_tgui.yml index 6849941d10..b680139f74 100644 --- a/.github/workflows/autobuild_tgui.yml +++ b/.github/workflows/autobuild_tgui.yml @@ -15,6 +15,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v1 + with: + fetch-depth: 25 - name: Setup Node uses: actions/setup-node@v1 with: @@ -26,8 +28,9 @@ jobs: run: | git config --local user.email "action@github.com" git config --local user.name "TGUI" + git pull origin master git commit -m "Automatic TGUI Rebuild [ci skip]" -a || true - name: Push Artifacts uses: ad-m/github-push-action@master with: - github_token: ${{ secrets.GITHUB_TOKEN }} + github_token: ${{ secrets.GITHUB_MASTER_KEY }} diff --git a/dependencies.sh b/dependencies.sh index 0f66dcab1a..488504b288 100644 --- a/dependencies.sh +++ b/dependencies.sh @@ -17,10 +17,10 @@ export RUST_G_VERSION=0.4.2 export BSQL_VERSION=v1.4.0.0 #node version -export NODE_VERSION=8 +export NODE_VERSION=12 # PHP version export PHP_VERSION=5.6 # SpacemanDMM git tag -export SPACEMAN_DMM_VERSION=suite-1.0 +export SPACEMAN_DMM_VERSION=suite-1.2 From 865a17e8e49b0a5a8c1659bcc0095bcf156809c8 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Sun, 9 Feb 2020 02:39:21 +0100 Subject: [PATCH 154/172] Fallback for linter. --- dependencies.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.sh b/dependencies.sh index 488504b288..a2f6873a32 100644 --- a/dependencies.sh +++ b/dependencies.sh @@ -23,4 +23,4 @@ export NODE_VERSION=12 export PHP_VERSION=5.6 # SpacemanDMM git tag -export SPACEMAN_DMM_VERSION=suite-1.2 +export SPACEMAN_DMM_VERSION=suite-1.0 From 90a1b249f1520f0c3699ef32335533517a5e60ba Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Sat, 8 Feb 2020 20:39:45 -0500 Subject: [PATCH 155/172] Update gangs.dm --- code/game/gamemodes/gangs/gangs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/gangs/gangs.dm b/code/game/gamemodes/gangs/gangs.dm index 9151107d6f..28c7f0bf4f 100644 --- a/code/game/gamemodes/gangs/gangs.dm +++ b/code/game/gamemodes/gangs/gangs.dm @@ -6,7 +6,7 @@ GLOBAL_LIST_EMPTY(gangs) name = "gang war" config_tag = "gang" antag_flag = ROLE_GANG - restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security") + restricted_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster", "AI", "Cyborg") required_players = 15 required_enemies = 0 recommended_enemies = 2 From ea9bdcd087346ffd09b60cd65b3433e1a97d8087 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Sun, 9 Feb 2020 02:49:20 +0100 Subject: [PATCH 156/172] Update gangs.dm --- code/game/gamemodes/gangs/gangs.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/gangs/gangs.dm b/code/game/gamemodes/gangs/gangs.dm index 28c7f0bf4f..566540e0b9 100644 --- a/code/game/gamemodes/gangs/gangs.dm +++ b/code/game/gamemodes/gangs/gangs.dm @@ -6,7 +6,8 @@ GLOBAL_LIST_EMPTY(gangs) name = "gang war" config_tag = "gang" antag_flag = ROLE_GANG - restricted_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster", "AI", "Cyborg") + restricted_roles = list("AI", "Cyborg") + protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") required_players = 15 required_enemies = 0 recommended_enemies = 2 From 506f1199ad480f3f0d24fe902a23dd429ef7e4a1 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Sun, 9 Feb 2020 02:56:17 +0100 Subject: [PATCH 157/172] I have a bad habit to edit people's (especially trilby) PRs out of the wild. Sorry --- code/game/gamemodes/gangs/gangs.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/gangs/gangs.dm b/code/game/gamemodes/gangs/gangs.dm index 566540e0b9..0dc4a520ef 100644 --- a/code/game/gamemodes/gangs/gangs.dm +++ b/code/game/gamemodes/gangs/gangs.dm @@ -6,8 +6,8 @@ GLOBAL_LIST_EMPTY(gangs) name = "gang war" config_tag = "gang" antag_flag = ROLE_GANG - restricted_roles = list("AI", "Cyborg") - protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") + restricted_jobs = list("AI", "Cyborg") + protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") required_players = 15 required_enemies = 0 recommended_enemies = 2 From a3f1ef19c700ecd758e8512cd22ec632d2968e04 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 8 Feb 2020 22:01:28 -0600 Subject: [PATCH 158/172] Automatic changelog generation for PR #10918 [ci skip] --- html/changelogs/AutoChangeLog-pr-10918.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10918.yml diff --git a/html/changelogs/AutoChangeLog-pr-10918.yml b/html/changelogs/AutoChangeLog-pr-10918.yml new file mode 100644 index 0000000000..bf47d0accf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10918.yml @@ -0,0 +1,4 @@ +author: "r4d6" +delete-after: True +changes: + - config: "Made dwarves into a roundstart races" From 49f2993c59b8986f7da6929173de1a652de1850d Mon Sep 17 00:00:00 2001 From: r4d6 <50276533+r4d6@users.noreply.github.com> Date: Sat, 8 Feb 2020 23:09:51 -0500 Subject: [PATCH 159/172] Correct timer --- code/modules/events/meteor_wave.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm index b1ba05fdc6..e24ce13034 100644 --- a/code/modules/events/meteor_wave.dm +++ b/code/modules/events/meteor_wave.dm @@ -22,7 +22,7 @@ /datum/round_event/meteor_wave/setup() announceWhen = 1 - startWhen = rand(180, 360) //Yeah for SOME REASON this is measured in seconds and not deciseconds??? + startWhen = rand(90, 180) // Apparently it is by 2 seconds, so 90 is actually 180 seconds, and 180 is 360 seconds. So this is 3-6 minutes if(GLOB.singularity_counter) startWhen *= 1 - min(GLOB.singularity_counter * SINGULO_BEACON_DISTURBANCE, SINGULO_BEACON_MAX_DISTURBANCE) endWhen = startWhen + 60 From a840b16c8773e1a49bbfff7e1e73b1ef085efef0 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 8 Feb 2020 22:12:40 -0600 Subject: [PATCH 160/172] Automatic changelog generation for PR #10930 [ci skip] --- html/changelogs/AutoChangeLog-pr-10930.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10930.yml diff --git a/html/changelogs/AutoChangeLog-pr-10930.yml b/html/changelogs/AutoChangeLog-pr-10930.yml new file mode 100644 index 0000000000..4121a00b9b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10930.yml @@ -0,0 +1,4 @@ +author: "r4d6" +delete-after: True +changes: + - tweak: "Meteor Timer back to 3-5 minutes" From 09501340ecad519ff78e338d3a30663aabcb9e4a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 9 Feb 2020 14:08:18 -0600 Subject: [PATCH 161/172] Automatic changelog generation for PR #10972 [ci skip] --- html/changelogs/AutoChangeLog-pr-10972.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10972.yml diff --git a/html/changelogs/AutoChangeLog-pr-10972.yml b/html/changelogs/AutoChangeLog-pr-10972.yml new file mode 100644 index 0000000000..9cc2e64687 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10972.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - tweak: "Bone armor/Dagger are now crafting from bones rather then crafting menu" From 9609eb64e015e44a3dc0cacd4e32026b3f04494f Mon Sep 17 00:00:00 2001 From: keronshb Date: Sun, 9 Feb 2020 15:18:15 -0500 Subject: [PATCH 162/172] Fixes some files and pathings for this Adds proper subtypes, put the health down a lil bit for the turret, fixed the welder type, added some tiny fans to the ship and also added some plastitanium windows where r-windows were --- _maps/shuttles/pirate_default.dmm | 59 ++++++++----------- .../machinery/porta_turret/portable_turret.dm | 32 +++++----- .../objects/effects/spawners/structure.dm | 8 +-- code/game/objects/structures/window.dm | 20 +------ .../turfs/simulated/wall/mineral_walls.dm | 57 ++---------------- 5 files changed, 53 insertions(+), 123 deletions(-) diff --git a/_maps/shuttles/pirate_default.dmm b/_maps/shuttles/pirate_default.dmm index 959e067a9d..73571bc684 100644 --- a/_maps/shuttles/pirate_default.dmm +++ b/_maps/shuttles/pirate_default.dmm @@ -89,7 +89,7 @@ /turf/open/floor/pod/dark, /area/shuttle/pirate) "aj" = ( -/turf/closed/wall/mineral/plastitaniumpirate/nodiagonal, +/turf/closed/wall/mineral/plastitanium/nodiagonal/pirate, /area/shuttle/pirate) "ak" = ( /obj/machinery/airalarm/all_access{ @@ -419,6 +419,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/pirate) "aK" = ( @@ -466,18 +467,16 @@ /obj/machinery/porta_turret/syndicate/energy{ dir = 1; faction = list("pirate"); - icon_state = "standard_lethal"; - mode = 1 + icon_state = "standard_lethal" }, -/turf/closed/wall/mineral/plastitaniumpirate/nodiagonal, +/turf/closed/wall/mineral/plastitanium/nodiagonal/pirate, /area/shuttle/pirate) "aR" = ( /obj/machinery/porta_turret/syndicate/energy{ faction = list("pirate"); - icon_state = "standard_lethal"; - mode = 1 + icon_state = "standard_lethal" }, -/turf/closed/wall/mineral/plastitaniumpirate, +/turf/closed/wall/mineral/plastitanium/pirate, /area/shuttle/pirate) "aS" = ( /obj/effect/turf_decal/stripes/line, @@ -486,7 +485,7 @@ /area/shuttle/pirate) "aU" = ( /obj/structure/sign/departments/engineering, -/turf/closed/wall/mineral/plastitaniumpirate/nodiagonal, +/turf/closed/wall/mineral/plastitanium/nodiagonal/pirate, /area/shuttle/pirate) "aV" = ( /obj/effect/mob_spawn/human/pirate{ @@ -867,37 +866,36 @@ dir = 1 }, /obj/docking_port/mobile/pirate{ - callTime = 100; - dheight = 0; - dir = 1; dwidth = 11; height = 16; - id = "pirateship"; launch_status = 0; movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); name = "Pirate Ship"; port_direction = 2; - preferred_direction = 1; width = 17 }, /obj/docking_port/stationary{ - dir = 1; dwidth = 11; height = 16; id = "pirateship_home"; name = "Deep Space"; width = 17 }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/pirate) +"db" = ( +/obj/structure/shuttle/engine/heater, +/obj/effect/spawner/structure/window/plastitanium/pirate, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) "df" = ( /obj/machinery/porta_turret/syndicate/energy{ dir = 4; faction = list("pirate"); - icon_state = "standard_lethal"; - mode = 1 + icon_state = "standard_lethal" }, -/turf/closed/wall/mineral/plastitaniumpirate, +/turf/closed/wall/mineral/plastitanium/pirate, /area/shuttle/pirate) "dy" = ( /obj/structure/chair/wood/normal, @@ -948,8 +946,7 @@ /turf/open/floor/pod/light, /area/shuttle/pirate) "ep" = ( -/obj/structure/window/plastitaniumpirate{ -//obj/structure/window/reinforced{ +/obj/structure/window/reinforced{ dir = 1; pixel_y = 1 }, @@ -979,8 +976,7 @@ /turf/open/floor/plating/airless, /area/shuttle/pirate) "ex" = ( -/obj/structure/window/plastitaniumpirate -//obj/structure/window/reinforced, +/obj/structure/window/reinforced, /obj/structure/frame/machine, /obj/item/wrench, /turf/open/floor/plating/airless, @@ -990,19 +986,17 @@ id = "piratebridge" }, /obj/structure/grille, -/obj/structure/window/plastitaniumpirate, +/obj/structure/window/plastitanium/pirate, /turf/open/floor/plating, /area/shuttle/pirate) "ez" = ( -/obj/structure/window/plastitaniumpirate -//obj/structure/window/reinforced, +/obj/structure/window/reinforced, /obj/structure/frame/machine, /obj/item/stack/cable_coil/cut/red, /turf/open/floor/plating/airless, /area/shuttle/pirate) "eA" = ( -/obj/structure/window/plastitaniumpirate -//obj/structure/window/reinforced{ +/obj/structure/window/reinforced{ dir = 1; pixel_y = 1 }, @@ -1020,7 +1014,7 @@ /turf/open/floor/plasteel, /area/shuttle/pirate) "fW" = ( -/turf/closed/wall/mineral/plastitaniumpirate, +/turf/closed/wall/mineral/plastitanium/pirate, /area/shuttle/pirate) "fY" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ @@ -1091,10 +1085,9 @@ /obj/machinery/porta_turret/syndicate/energy{ dir = 8; faction = list("pirate"); - icon_state = "standard_lethal"; - mode = 1 + icon_state = "standard_lethal" }, -/turf/closed/wall/mineral/plastitaniumpirate, +/turf/closed/wall/mineral/plastitanium/pirate, /area/shuttle/pirate) "yi" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -1330,7 +1323,7 @@ aU be aD aG -ep +db aH "} (9,1,1) = {" @@ -1348,7 +1341,7 @@ mU aL bP bX -ep +db aK "} (10,1,1) = {" @@ -1366,7 +1359,7 @@ aj bO bQ bk -ep +db er "} (11,1,1) = {" diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 1d0c3b4ead..b68d6ceead 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -349,21 +349,21 @@ qdel(cover) //deletes the cover - no need on keeping it there! //turret healing -/obj/machinery/porta_turret/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/weldingtool) && user.a_intent == INTENT_HELP) - if(obj_integrity < max_integrity) - if(!I.tool_start_check(user, amount=0)) - return - user.visible_message("[user] is welding the turret.", \ - "You begin repairing the turret...", \ - "You hear welding.") - if(I.use_tool(src, user, 40, volume=50)) - obj_integrity = max_integrity - user.visible_message("[user.name] has repaired [src].", \ - "You finish repairing the turret.") - else - to_chat(user, "The turret doesn't need repairing.") - return +/obj/machinery/porta_turret/welder_act(mob/living/user, obj/item/I) + if(obj_integrity < max_integrity) + if(!I.tool_start_check(user, amount=0)) + return + user.visible_message("[user] is welding the turret.", \ + "You begin repairing the turret...", \ + "You hear welding.") + if(I.use_tool(src, user, 40, volume=50)) + obj_integrity = max_integrity + user.visible_message("[user.name] has repaired [src].", \ + "You finish repairing the turret.") + return TRUE + else + to_chat(user, "The turret doesn't need repairing.") + return /obj/machinery/porta_turret/process() @@ -688,7 +688,7 @@ lethal_projectile_sound = 'sound/weapons/laser.ogg' desc = "An energy blaster auto-turret. Use a welder to fix." explosion_block = 50 - max_integrity = 350 + max_integrity = 260 integrity_failure = 20 diff --git a/code/game/objects/effects/spawners/structure.dm b/code/game/objects/effects/spawners/structure.dm index 34af40cb07..71615083b6 100644 --- a/code/game/objects/effects/spawners/structure.dm +++ b/code/game/objects/effects/spawners/structure.dm @@ -163,13 +163,11 @@ again. icon_state = "plastitaniumwindow_spawner" spawn_list = list(/obj/structure/grille, /obj/structure/window/plastitanium) -//plastitaniumpirate window +//plastitanium pirate window -/obj/effect/spawner/structure/window/plastitaniumpirate - name = "plastitanium window spawner" - icon_state = "plastitaniumwindow_spawner" +/obj/effect/spawner/structure/window/plastitanium/pirate explosion_block = 50 - spawn_list = list(/obj/structure/grille, /obj/structure/window/plastitaniumpirate) + spawn_list = list(/obj/structure/grille, /obj/structure/window/plastitanium/pirate) //ice window diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 99a8b94c5a..08d013d4da 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -596,27 +596,11 @@ anchored = FALSE //pirate ship windows -/obj/structure/window/plastitaniumpirate - name = "plastitanium window" +/obj/structure/window/plastitanium/pirate desc = "Yarr this window be explosion proof!" - icon = 'icons/obj/smooth_structures/plastitanium_window.dmi' - icon_state = "plastitanium_window" - dir = FULLTILE_WINDOW_DIR - max_integrity = 100 - wtype = "shuttle" - fulltile = TRUE - flags_1 = PREVENT_CLICK_UNDER_1 - reinf = TRUE - heat_resistance = 1600 - armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100) - smooth = SMOOTH_TRUE - canSmoothWith = null explosion_block = 50 - level = 3 - glass_type = /obj/item/stack/sheet/plastitaniumglass - glass_amount = 2 -/obj/structure/window/plastitaniumpirate/unanchored +/obj/structure/window/plastitanium/pirate/unanchored anchored = FALSE /obj/structure/window/reinforced/clockwork diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/simulated/wall/mineral_walls.dm index 7d82a20b91..ae25ec2d33 100644 --- a/code/game/turfs/simulated/wall/mineral_walls.dm +++ b/code/game/turfs/simulated/wall/mineral_walls.dm @@ -306,61 +306,16 @@ /////////////////////Pirate Plastitanium walls///////////////////// -/turf/closed/wall/mineral/plastitaniumpirate - name = "wall" +/turf/closed/wall/mineral/plastitanium/pirate desc = "Yarr just try to blow this to smithereens!" - icon = 'icons/turf/walls/plastitanium_wall.dmi' - icon_state = "map-shuttle" explosion_block = 50 - sheet_type = /obj/item/stack/sheet/mineral/plastitanium - smooth = SMOOTH_MORE|SMOOTH_DIAGONAL - canSmoothWith = list(/turf/closed/wall/mineral/plastitaniumpirate, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/plastitaniumpirate, /obj/structure/shuttle/engine, /obj/structure/falsewall/plastitanium) + canSmoothWith = list(/turf/closed/wall/mineral/plastitanium/pirate, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/plastitanium/pirate, /obj/structure/shuttle/engine, /obj/structure/falsewall/plastitanium) -/turf/closed/wall/mineral/plastitaniumpirate/nodiagonal - smooth = SMOOTH_MORE - icon_state = "map-shuttle_nd" +/turf/closed/wall/mineral/plastitanium/nodiagonal/pirate/ explosion_block = 50 -/turf/closed/wall/mineral/plastitaniumpirate/nosmooth - icon = 'icons/turf/shuttle.dmi' - icon_state = "wall" - smooth = SMOOTH_FALSE +/turf/closed/wall/mineral/plastitanium/nosmooth/pirate/ explosion_block = 50 -/turf/closed/wall/mineral/plastitaniumpirate/overspace - icon_state = "map-overspace" - fixed_underlay = list("space"=1) - explosion_block = 50 - -/turf/closed/wall/mineral/plastitaniumpirate/explosive/ex_act(severity) - var/datum/explosion/acted_explosion = null - for(var/datum/explosion/E in GLOB.explosions) - if(E.explosion_id == explosion_id) - acted_explosion = E - break - if(acted_explosion && istype(acted_explosion.explosion_source, /obj/item/bombcore)) - var/obj/item/bombcore/large/bombcore = new(get_turf(src)) - bombcore.detonate() - ..() - -//have to copypaste this code -/turf/closed/wall/mineral/plastitaniumpirate/interior/copyTurf(turf/T) - if(T.type != type) - T.ChangeTurf(type) - if(underlays.len) - T.underlays = underlays - if(T.icon_state != icon_state) - T.icon_state = icon_state - if(T.icon != icon) - T.icon = icon - if(color) - T.atom_colours = atom_colours.Copy() - T.update_atom_colour() - if(T.dir != dir) - T.setDir(dir) - T.transform = transform - return T - -/turf/closed/wall/mineral/plastitaniumpirate/copyTurf(turf/T) - . = ..() - T.transform = transform \ No newline at end of file +/turf/closed/wall/mineral/plastitanium/overspace/pirate/ + explosion_block = 50 \ No newline at end of file From 9ee5a84ad6d8c73565359b97fcb06d4e2b19670a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 9 Feb 2020 14:38:53 -0600 Subject: [PATCH 163/172] Automatic changelog generation for PR #10936 [ci skip] --- html/changelogs/AutoChangeLog-pr-10936.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10936.yml diff --git a/html/changelogs/AutoChangeLog-pr-10936.yml b/html/changelogs/AutoChangeLog-pr-10936.yml new file mode 100644 index 0000000000..2303f157ab --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10936.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - balance: "Cyborgization will now de-gang people, even gangheads." From 4e4346b8d47f1dd832f21d0466b8c5b359fe1c2f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 9 Feb 2020 14:47:34 -0600 Subject: [PATCH 164/172] Automatic changelog generation for PR #10277 [ci skip] --- html/changelogs/AutoChangeLog-pr-10277.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10277.yml diff --git a/html/changelogs/AutoChangeLog-pr-10277.yml b/html/changelogs/AutoChangeLog-pr-10277.yml new file mode 100644 index 0000000000..d2c873d010 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10277.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - refactor: "Custom snowflake plushies are now in config rather than code." From 4bc5ea60b51efcbb0d74ee53503041e41f417791 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 9 Feb 2020 15:49:24 -0600 Subject: [PATCH 165/172] Automatic changelog generation for PR #10937 [ci skip] --- html/changelogs/AutoChangeLog-pr-10937.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10937.yml diff --git a/html/changelogs/AutoChangeLog-pr-10937.yml b/html/changelogs/AutoChangeLog-pr-10937.yml new file mode 100644 index 0000000000..1c56882ccc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10937.yml @@ -0,0 +1,4 @@ +author: "Arturlang" +delete-after: True +changes: + - admin: "The debug outfit is now kitted out for whatever debbuging needs." From 60a3b134a3f45a17e1a2a5f99a16be9813ac891d Mon Sep 17 00:00:00 2001 From: keronshb Date: Sun, 9 Feb 2020 17:30:22 -0500 Subject: [PATCH 166/172] Should fix the rest of the requested changes Title --- _maps/shuttles/pirate_default.dmm | 22 +++++++++---------- .../machinery/porta_turret/portable_turret.dm | 9 ++++---- .../objects/effects/spawners/structure.dm | 2 -- code/game/objects/structures/window.dm | 2 +- .../turfs/simulated/wall/mineral_walls.dm | 18 +-------------- code/game/turfs/simulated/wall/reinf_walls.dm | 22 +++++++++++++++++++ 6 files changed, 40 insertions(+), 35 deletions(-) diff --git a/_maps/shuttles/pirate_default.dmm b/_maps/shuttles/pirate_default.dmm index 73571bc684..c002e66d53 100644 --- a/_maps/shuttles/pirate_default.dmm +++ b/_maps/shuttles/pirate_default.dmm @@ -89,7 +89,7 @@ /turf/open/floor/pod/dark, /area/shuttle/pirate) "aj" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal/pirate, +/turf/closed/wall/r_wall/syndicate/pirate/nodiagonal, /area/shuttle/pirate) "ak" = ( /obj/machinery/airalarm/all_access{ @@ -464,19 +464,19 @@ /turf/open/floor/plating, /area/shuttle/pirate) "aQ" = ( -/obj/machinery/porta_turret/syndicate/energy{ +/obj/machinery/porta_turret/syndicate/energy/pirate{ dir = 1; faction = list("pirate"); icon_state = "standard_lethal" }, -/turf/closed/wall/mineral/plastitanium/nodiagonal/pirate, +/turf/closed/wall/r_wall/syndicate/pirate/nodiagonal, /area/shuttle/pirate) "aR" = ( -/obj/machinery/porta_turret/syndicate/energy{ +/obj/machinery/porta_turret/syndicate/energy/pirate{ faction = list("pirate"); icon_state = "standard_lethal" }, -/turf/closed/wall/mineral/plastitanium/pirate, +/turf/closed/wall/r_wall/syndicate/pirate, /area/shuttle/pirate) "aS" = ( /obj/effect/turf_decal/stripes/line, @@ -485,7 +485,7 @@ /area/shuttle/pirate) "aU" = ( /obj/structure/sign/departments/engineering, -/turf/closed/wall/mineral/plastitanium/nodiagonal/pirate, +/turf/closed/wall/r_wall/syndicate/pirate/nodiagonal, /area/shuttle/pirate) "aV" = ( /obj/effect/mob_spawn/human/pirate{ @@ -890,12 +890,12 @@ /turf/open/floor/plating/airless, /area/shuttle/pirate) "df" = ( -/obj/machinery/porta_turret/syndicate/energy{ +/obj/machinery/porta_turret/syndicate/energy/pirate{ dir = 4; faction = list("pirate"); icon_state = "standard_lethal" }, -/turf/closed/wall/mineral/plastitanium/pirate, +/turf/closed/wall/r_wall/syndicate/pirate, /area/shuttle/pirate) "dy" = ( /obj/structure/chair/wood/normal, @@ -1014,7 +1014,7 @@ /turf/open/floor/plasteel, /area/shuttle/pirate) "fW" = ( -/turf/closed/wall/mineral/plastitanium/pirate, +/turf/closed/wall/r_wall/syndicate/pirate, /area/shuttle/pirate) "fY" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ @@ -1082,12 +1082,12 @@ /turf/open/floor/plasteel/showroomfloor, /area/shuttle/pirate) "wR" = ( -/obj/machinery/porta_turret/syndicate/energy{ +/obj/machinery/porta_turret/syndicate/energy/pirate{ dir = 8; faction = list("pirate"); icon_state = "standard_lethal" }, -/turf/closed/wall/mineral/plastitanium/pirate, +/turf/closed/wall/r_wall/syndicate/pirate, /area/shuttle/pirate) "yi" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index b68d6ceead..53f2afd227 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -27,7 +27,7 @@ max_integrity = 160 //the turret's health integrity_failure = 80 - armor = list("melee" = 50, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) + armor = list("melee" = 50, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) var/locked = TRUE //if the turret's behaviour control access is locked var/controllock = FALSE //if the turret responds to control panels @@ -687,9 +687,6 @@ lethal_projectile = /obj/item/projectile/beam/laser lethal_projectile_sound = 'sound/weapons/laser.ogg' desc = "An energy blaster auto-turret. Use a welder to fix." - explosion_block = 50 - max_integrity = 260 - integrity_failure = 20 /obj/machinery/porta_turret/syndicate/energy/heavy @@ -703,6 +700,10 @@ lethal_projectile_sound = 'sound/weapons/lasercannonfire.ogg' desc = "An energy blaster auto-turret." +/obj/machinery/porta_turret/syndicate/energy/pirate + max_integrity = 260 + integrity_failure = 20 + /obj/machinery/porta_turret/syndicate/setup() return diff --git a/code/game/objects/effects/spawners/structure.dm b/code/game/objects/effects/spawners/structure.dm index 71615083b6..8910e69a69 100644 --- a/code/game/objects/effects/spawners/structure.dm +++ b/code/game/objects/effects/spawners/structure.dm @@ -166,8 +166,6 @@ again. //plastitanium pirate window /obj/effect/spawner/structure/window/plastitanium/pirate - explosion_block = 50 - spawn_list = list(/obj/structure/grille, /obj/structure/window/plastitanium/pirate) //ice window diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 08d013d4da..d4925c8604 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -598,7 +598,7 @@ //pirate ship windows /obj/structure/window/plastitanium/pirate desc = "Yarr this window be explosion proof!" - explosion_block = 50 + explosion_block = 30 /obj/structure/window/plastitanium/pirate/unanchored anchored = FALSE diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/simulated/wall/mineral_walls.dm index ae25ec2d33..b04f4f0aa0 100644 --- a/code/game/turfs/simulated/wall/mineral_walls.dm +++ b/code/game/turfs/simulated/wall/mineral_walls.dm @@ -302,20 +302,4 @@ /turf/closed/wall/mineral/plastitanium/copyTurf(turf/T) . = ..() - T.transform = transform - -/////////////////////Pirate Plastitanium walls///////////////////// - -/turf/closed/wall/mineral/plastitanium/pirate - desc = "Yarr just try to blow this to smithereens!" - explosion_block = 50 - canSmoothWith = list(/turf/closed/wall/mineral/plastitanium/pirate, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/plastitanium/pirate, /obj/structure/shuttle/engine, /obj/structure/falsewall/plastitanium) - -/turf/closed/wall/mineral/plastitanium/nodiagonal/pirate/ - explosion_block = 50 - -/turf/closed/wall/mineral/plastitanium/nosmooth/pirate/ - explosion_block = 50 - -/turf/closed/wall/mineral/plastitanium/overspace/pirate/ - explosion_block = 50 \ No newline at end of file + T.transform = transform \ No newline at end of file diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm index 8eab4c34fe..e75c518ed3 100644 --- a/code/game/turfs/simulated/wall/reinf_walls.dm +++ b/code/game/turfs/simulated/wall/reinf_walls.dm @@ -258,3 +258,25 @@ /turf/closed/wall/r_wall/syndicate/overspace icon_state = "map-overspace" fixed_underlay = list("space"=1) + +/////////////////////Pirate Ship walls///////////////////// + +/turf/closed/wall/r_wall/syndicate/pirate + desc = "Yarr just try to blow this to smithereens!" + explosion_block = 30 + canSmoothWith = list(/turf/closed/wall/r_wall/syndicate/pirate, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/plastitanium/pirate, /obj/structure/shuttle/engine, /obj/structure/falsewall/plastitanium) + +/turf/closed/wall/r_wall/syndicate/pirate/nodiagonal/ + smooth = SMOOTH_MORE + icon_state = "map-shuttle_nd" + explosion_block = 30 + +/turf/closed/wall/r_wall/syndicate/pirate/nosmooth/ + icon = 'icons/turf/shuttle.dmi' + icon_state = "wall" + explosion_block = 30 + +/turf/closed/wall/r_wall/syndicate/pirate/overspace/ + icon_state = "map-overspace" + fixed_underlay = list("space"=1) + explosion_block = 30 From caf229b3548090b9b0ac21519c07b3c7f42c01f1 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 9 Feb 2020 16:56:55 -0600 Subject: [PATCH 167/172] Automatic changelog generation for PR #10981 [ci skip] --- html/changelogs/AutoChangeLog-pr-10981.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10981.yml diff --git a/html/changelogs/AutoChangeLog-pr-10981.yml b/html/changelogs/AutoChangeLog-pr-10981.yml new file mode 100644 index 0000000000..df0d7990cb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10981.yml @@ -0,0 +1,4 @@ +author: "IHOPMommyLich" +delete-after: True +changes: + - tweak: "Changed the multiplicative_slowdown of Stimulants from -1 to -0.5" From 1492586f76236274b0b48e9fec2d11f41920d071 Mon Sep 17 00:00:00 2001 From: keronshb Date: Sun, 9 Feb 2020 18:18:55 -0500 Subject: [PATCH 168/172] Fixes round 3? 4? Should fix the last round of requests? --- code/game/machinery/porta_turret/portable_turret.dm | 13 +++++++++---- code/game/objects/effects/spawners/structure.dm | 1 + code/game/turfs/simulated/wall/reinf_walls.dm | 6 +++--- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 53f2afd227..b9d52b82ce 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -27,7 +27,7 @@ max_integrity = 160 //the turret's health integrity_failure = 80 - armor = list("melee" = 50, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) + armor = list("melee" = 50, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) var/locked = TRUE //if the turret's behaviour control access is locked var/controllock = FALSE //if the turret responds to control panels @@ -349,7 +349,13 @@ qdel(cover) //deletes the cover - no need on keeping it there! //turret healing +/obj/machinery/porta_turret/examine(mob/user) + . = ..() + if(obj_integrity < max_integrity) + . += "Use a welder to fix it." + /obj/machinery/porta_turret/welder_act(mob/living/user, obj/item/I) + . = TRUE if(obj_integrity < max_integrity) if(!I.tool_start_check(user, amount=0)) return @@ -360,10 +366,8 @@ obj_integrity = max_integrity user.visible_message("[user.name] has repaired [src].", \ "You finish repairing the turret.") - return TRUE else to_chat(user, "The turret doesn't need repairing.") - return /obj/machinery/porta_turret/process() @@ -686,7 +690,7 @@ nonlethal_projectile_sound = 'sound/weapons/taser2.ogg' lethal_projectile = /obj/item/projectile/beam/laser lethal_projectile_sound = 'sound/weapons/laser.ogg' - desc = "An energy blaster auto-turret. Use a welder to fix." + desc = "An energy blaster auto-turret." /obj/machinery/porta_turret/syndicate/energy/heavy @@ -703,6 +707,7 @@ /obj/machinery/porta_turret/syndicate/energy/pirate max_integrity = 260 integrity_failure = 20 + armor = list("melee" = 50, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) /obj/machinery/porta_turret/syndicate/setup() diff --git a/code/game/objects/effects/spawners/structure.dm b/code/game/objects/effects/spawners/structure.dm index 8910e69a69..cdf3f3e6b4 100644 --- a/code/game/objects/effects/spawners/structure.dm +++ b/code/game/objects/effects/spawners/structure.dm @@ -166,6 +166,7 @@ again. //plastitanium pirate window /obj/effect/spawner/structure/window/plastitanium/pirate + spawn_list = list(/obj/structure/grille, /obj/structure/window/plastitanium/pirate) //ice window diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm index e75c518ed3..7a2fa5559b 100644 --- a/code/game/turfs/simulated/wall/reinf_walls.dm +++ b/code/game/turfs/simulated/wall/reinf_walls.dm @@ -266,17 +266,17 @@ explosion_block = 30 canSmoothWith = list(/turf/closed/wall/r_wall/syndicate/pirate, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/plastitanium/pirate, /obj/structure/shuttle/engine, /obj/structure/falsewall/plastitanium) -/turf/closed/wall/r_wall/syndicate/pirate/nodiagonal/ +/turf/closed/wall/r_wall/syndicate/pirate/nodiagonal smooth = SMOOTH_MORE icon_state = "map-shuttle_nd" explosion_block = 30 -/turf/closed/wall/r_wall/syndicate/pirate/nosmooth/ +/turf/closed/wall/r_wall/syndicate/pirate/nosmooth icon = 'icons/turf/shuttle.dmi' icon_state = "wall" explosion_block = 30 -/turf/closed/wall/r_wall/syndicate/pirate/overspace/ +/turf/closed/wall/r_wall/syndicate/pirate/overspace icon_state = "map-overspace" fixed_underlay = list("space"=1) explosion_block = 30 From feadfae8f69444b34f0329a294a7a4898ad06ace Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 9 Feb 2020 20:51:52 -0600 Subject: [PATCH 169/172] Automatic changelog generation for PR #10984 [ci skip] --- html/changelogs/AutoChangeLog-pr-10984.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10984.yml diff --git a/html/changelogs/AutoChangeLog-pr-10984.yml b/html/changelogs/AutoChangeLog-pr-10984.yml new file mode 100644 index 0000000000..137536b430 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10984.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - balance: "Heads of staff have been better screened by NT before being promoted" From 023d49a207d804ff504e4069201738f644126d4e Mon Sep 17 00:00:00 2001 From: keronshb Date: Sun, 9 Feb 2020 23:44:34 -0500 Subject: [PATCH 170/172] 30 removal Here it is --- code/game/turfs/simulated/wall/reinf_walls.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm index 7a2fa5559b..a9fc84124a 100644 --- a/code/game/turfs/simulated/wall/reinf_walls.dm +++ b/code/game/turfs/simulated/wall/reinf_walls.dm @@ -269,14 +269,10 @@ /turf/closed/wall/r_wall/syndicate/pirate/nodiagonal smooth = SMOOTH_MORE icon_state = "map-shuttle_nd" - explosion_block = 30 /turf/closed/wall/r_wall/syndicate/pirate/nosmooth icon = 'icons/turf/shuttle.dmi' icon_state = "wall" - explosion_block = 30 /turf/closed/wall/r_wall/syndicate/pirate/overspace icon_state = "map-overspace" - fixed_underlay = list("space"=1) - explosion_block = 30 From bd5f2bd64d0ae07834e915c25008c54891f01762 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Mon, 10 Feb 2020 07:41:36 +0100 Subject: [PATCH 171/172] Update reinf_walls.dm --- code/game/turfs/simulated/wall/reinf_walls.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm index a9fc84124a..a1d2c1757c 100644 --- a/code/game/turfs/simulated/wall/reinf_walls.dm +++ b/code/game/turfs/simulated/wall/reinf_walls.dm @@ -276,3 +276,4 @@ /turf/closed/wall/r_wall/syndicate/pirate/overspace icon_state = "map-overspace" + fixed_underlay = list("space"=1) From 4e45525a26e16134bac755c4dbf3915f5d3fb518 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 10 Feb 2020 01:40:13 -0600 Subject: [PATCH 172/172] Automatic changelog generation for PR #10926 [ci skip] --- html/changelogs/AutoChangeLog-pr-10926.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10926.yml diff --git a/html/changelogs/AutoChangeLog-pr-10926.yml b/html/changelogs/AutoChangeLog-pr-10926.yml new file mode 100644 index 0000000000..9662402d1b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10926.yml @@ -0,0 +1,9 @@ +author: "keronshb" +delete-after: True +changes: + - rscadd: "Added repairable turrets" + - rscadd: "Adds Tiny Fans to the pirate ship" + - tweak: "changes some reinforced windows to plastinanium pirate windows" + - tweak: "made the pirate shuttle + turrets bomb resistant" + - tweak: "made most pirate machines + consoles indestructible" + - tweak: "increased pirate turret health"