From daeba2eec7a060f79f9a8b00610ed7f5da80a54f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 28 Apr 2017 21:05:06 -0500 Subject: [PATCH 001/352] Zombie/limb refactors/fixes --- code/game/objects/items/weapons/weaponry.dm | 15 ++++++--- .../mob/living/carbon/human/inventory.dm | 4 ++- .../mob/living/carbon/human/species.dm | 17 +++++----- .../mob/living/carbon/human/species.dm.rej | 33 +++++++++++++++++++ .../carbon/human/species_types/zombies.dm | 25 ++++---------- .../chemistry/reagents/other_reagents.dm | 4 ++- .../surgery/bodyparts/dismemberment.dm | 5 +++ .../modules/surgery/prosthetic_replacement.dm | 4 +-- code/modules/zombie/items.dm | 3 +- code/modules/zombie/organs.dm | 4 +-- 10 files changed, 76 insertions(+), 38 deletions(-) create mode 100644 code/modules/mob/living/carbon/human/species.dm.rej diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index a0de9b5f76..e28c916ae4 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -390,7 +390,7 @@ desc = "A chainsaw that has replaced your arm." icon_state = "chainsaw_on" item_state = "mounted_chainsaw" - flags = NODROP | ABSTRACT + flags = NODROP | ABSTRACT | DROPDEL w_class = WEIGHT_CLASS_HUGE force = 21 throwforce = 0 @@ -400,10 +400,17 @@ attack_verb = list("sawed", "torn", "cut", "chopped", "diced") hitsound = 'sound/weapons/chainsawhit.ogg' -/obj/item/weapon/mounted_chainsaw/dropped() - ..() +/obj/item/weapon/mounted_chainsaw/Destroy() + var/obj/item/bodypart/part new /obj/item/weapon/twohanded/required/chainsaw(get_turf(src)) - qdel(src) + if(iscarbon(loc)) + var/mob/living/carbon/holder = loc + var/index = holder.get_held_index_of_item(src) + if(index) + part = holder.hand_bodyparts[index] + . = ..() + if(part) + part.drop_limb() /obj/item/weapon/statuebust name = "bust" diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 331fc5fc95..77ac31812a 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -142,10 +142,12 @@ return not_handled //For future deeper overrides /mob/living/carbon/human/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE) + var/index = get_held_index_of_item(I) . = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should. if(!. || !I) return - + if(index && dna.species.mutanthands) + put_in_hand(new dna.species.mutanthands(), index) if(I == wear_suit) if(s_store && invdrop) dropItemToGround(s_store, TRUE) //It makes no sense for your suit storage to stay on you if you drop your suit. diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index a48124e412..f6afab36f1 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -143,15 +143,16 @@ qdel(lungs) lungs = null - if(eyes) - qdel(eyes) - eyes = new mutanteyes - eyes.Insert(C) + if(C.get_bodypart("head")) + if(eyes) + qdel(eyes) + eyes = new mutanteyes + eyes.Insert(C) - if(ears) - qdel(ears) - ears = new mutantears - ears.Insert(C) + if(ears) + qdel(ears) + ears = new mutantears + ears.Insert(C) if((!(NOBREATH in species_traits)) && !lungs) if(mutantlungs) diff --git a/code/modules/mob/living/carbon/human/species.dm.rej b/code/modules/mob/living/carbon/human/species.dm.rej new file mode 100644 index 0000000000..25968a6a31 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species.dm.rej @@ -0,0 +1,33 @@ +diff a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm (rejected hunks) +@@ -173,14 +173,18 @@ + if(exotic_bloodtype && C.dna.blood_type != exotic_bloodtype) + C.dna.blood_type = exotic_bloodtype + ++ if(old_species.mutanthands) ++ for(var/obj/item/I in C.held_items) ++ if(istype(I, old_species.mutanthands)) ++ qdel(I) ++ + if(mutanthands) + // Drop items in hands + // If you're lucky enough to have a NODROP item, then it stays. + for(var/V in C.held_items) + var/obj/item/I = V + if(istype(I)) +- if(C.dropItemToGround(I)) +- C.put_in_hands(new mutanthands()) ++ C.dropItemToGround(I) + else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand + C.put_in_hands(new mutanthands()) + +@@ -189,10 +193,6 @@ + C.dna.blood_type = random_blood_type() + if(DIGITIGRADE in species_traits) + C.Digitigrade_Leg_Swap(TRUE) +- if(mutanthands) +- for(var/obj/item/I in C.held_items) +- if(istype(I, mutanthands)) +- qdel(I) + + /datum/species/proc/handle_hair(mob/living/carbon/human/H, forced_colour) + H.remove_overlay(HAIR_LAYER) diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm index 573b58159a..aef4aaaab5 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -13,6 +13,7 @@ name = "Infectious Zombie" id = "memezombies" limbs_id = "zombie" + mutanthands = /obj/item/zombie_hand no_equip = list(slot_wear_mask, slot_head) armor = 20 // 120 damage to KO a zombie, which kills it speedmod = 2 @@ -27,29 +28,15 @@ /datum/species/zombie/infectious/on_species_gain(mob/living/carbon/C, datum/species/old_species) . = ..() - // Drop items in hands - // If you're a zombie lucky enough to have a NODROP item, then it stays. - for(var/V in C.held_items) - var/obj/item/I = V - if(istype(I)) - if(C.dropItemToGround(I)) - var/obj/item/zombie_hand/zh = new /obj/item/zombie_hand() - C.put_in_hands(zh) - else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand - var/obj/item/zombie_hand/zh = new /obj/item/zombie_hand() - C.put_in_hands(zh) - // Next, deal with the source of this zombie corruption + // Deal with the source of this zombie corruption + // Infection organ needs to be handled separately from mutant_organs + // because it persists through species transitions var/obj/item/organ/zombie_infection/infection infection = C.getorganslot("zombie_infection") if(!infection) - infection = new(C) - -/datum/species/zombie/infectious/on_species_loss(mob/living/carbon/C) - . = ..() - for(var/obj/item/I in C.held_items) - if(istype(I, /obj/item/zombie_hand)) - qdel(I) + infection = new() + infection.Insert(C) // Your skin falls off diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index c25a1d050d..0b388ee7b4 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1533,7 +1533,9 @@ /datum/reagent/romerol/on_mob_life(mob/living/carbon/human/H) // Silently add the zombie infection organ to be activated upon death - new /obj/item/organ/zombie_infection(H) + if(!H.getorganslot("zombie_infection")) + var/obj/item/organ/zombie_infection/ZI = new() + ZI.Insert(H) ..() /datum/reagent/growthserum diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index de8c2b79ac..c8f0ade4b8 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -254,6 +254,8 @@ if(held_index > C.hand_bodyparts.len) C.hand_bodyparts.len = held_index C.hand_bodyparts[held_index] = src + if(C.dna.species.mutanthands && !is_pseudopart) + C.put_in_hand(new C.dna.species.mutanthands(), held_index) if(C.hud_used) var/obj/screen/inventory/hand/hand = C.hud_used.hand_slots["[held_index]"] if(hand) @@ -269,6 +271,9 @@ qdel(S) break + for(var/obj/item/organ/O in contents) + O.Insert(C) + update_bodypart_damage_state() C.updatehealth() diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm index b054626f4e..0f9a6489dd 100644 --- a/code/modules/surgery/prosthetic_replacement.dm +++ b/code/modules/surgery/prosthetic_replacement.dm @@ -58,9 +58,9 @@ user.visible_message("[user] successfully replaces [target]'s [parse_zone(target_zone)]!", "You succeed in replacing [target]'s [parse_zone(target_zone)].") return 1 else - target.regenerate_limb(target_zone) - var/obj/item/bodypart/L = target.get_bodypart(target_zone) + var/obj/item/bodypart/L = target.newBodyPart(target_zone, FALSE, FALSE) L.is_pseudopart = TRUE + L.attach_limb(target) user.visible_message("[user] finishes attaching [tool]!", "You attach [tool].") qdel(tool) if(istype(tool, /obj/item/weapon/twohanded/required/chainsaw)) diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index 1bdbd3fa45..1b93a4f685 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -46,7 +46,8 @@ var/obj/item/organ/zombie_infection/infection infection = target.getorganslot("zombie_infection") if(!infection) - infection = new(target) + infection = new() + infection.Insert(target) /obj/item/zombie_hand/proc/check_feast(mob/living/target, mob/living/user) if(target.stat == DEAD) diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm index 295d774595..28e6d9499f 100644 --- a/code/modules/zombie/organs.dm +++ b/code/modules/zombie/organs.dm @@ -5,7 +5,7 @@ slot = "zombie_infection" icon_state = "blacktumor" origin_tech = "biotech=5" - var/datum/species/old_species + var/datum/species/old_species = /datum/species/human var/living_transformation_time = 3 var/converts_living = FALSE @@ -63,6 +63,7 @@ if(!iszombie(owner)) old_species = owner.dna.species.type + owner.set_species(/datum/species/zombie/infectious) if(!converts_living && owner.stat != DEAD) return @@ -70,7 +71,6 @@ var/stand_up = (owner.stat == DEAD) || (owner.stat == UNCONSCIOUS) owner.grab_ghost() - owner.set_species(/datum/species/zombie/infectious) owner.revive(full_heal = TRUE) owner.visible_message("[owner] suddenly convulses, as [owner.p_they()][stand_up ? " stagger to [owner.p_their()] feet and" : ""] gain a ravenous hunger in [owner.p_their()] eyes!", "You HUNGER!") playsound(owner.loc, 'sound/hallucinations/far_noise.ogg', 50, 1) From 45adfd413cc3e8e954b39566306388f9b853cad7 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sat, 29 Apr 2017 08:23:46 -0500 Subject: [PATCH 002/352] fix RD PDA icon --- icons/obj/pda.dmi | Bin 28296 -> 28294 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi index d0e2f6845106e0c8be3167c555514e1f79642832..413503f7b3af1b421a5a28762f611b7d40ebabb5 100644 GIT binary patch delta 568 zcmV-80>}M`-2sN(0gxnr9ePw)bVOxyV{&P5bZKvH004NLm6yS8+b|4<&-POY?KK&e zY=>TaDN+nMw68EQ5@WNGMORYe`R#Woux`QH{Jhz~M^X|g@#n3(fB3O~a=XWUd*)n3 zlk42~FJIecmQV-Rxo_LH8Cd$EzWtO+m0jmdDf=Sa&<+XTsf#dU7eHpfgOzkR=> zsc^0^K9Rs|lzzZHUk@E)S5CpOV^6uq6W~=(pTW(bwM<%F=Qf+wcDuT;4_w(-IU7nkGGV*%lq&?S z8N)^l^8=$Kh7A~2z@Sm*grS6C&lvWCVO4*DAXCQ31BOL^0YP5SiV-lwiY5;X>_^4G z4BfhkBvrnC+VALEk4FoB$a>=IW%-wdk6IY)LBg+<6D7P&L^))_-(|?>pT`dGgoYN2 z>I_)C;O!KYPI&*ZXg!mV#G5`S#c2Pe8aQ#SWqe^RuPZ)~Vn<+~>l2@@r{W{v);&D!-0pGT{s!uz57JdaRvNQR G0z7OjEE<3S delta 570 zcmV-A0>%A?-2sT*0gxnrA9_?+bVOxyV{&P5bZKvH004NLt(U=W+b|4<&-POY?KK&i zY=>TaDN+nMw68EQ5@WNGMORXj`t5fpwr;`N`~-HhfsdplQsU2RcX$7N`{*_g+xE!0 zh$h#$Z(nZO<|LsGu5(}4Z8Na+Lw)-xl`6Z=T}k+%N6wMvtF{S$l8fuys%`d}Mt=K# zM^oWkVSFNi*(m*hd%hex&@wMIhJTamwh0_*cAdLj-2QF$q0yQ9k%M@OFn^S+QTrJ- zDC}RdRNTPRR7nyZU`|1B?*mQI;@(F+;WVdS67wfXJ2QBqBvo;~c;Vz3=ATEr6lBEx z4m#mSh`aTp!fXzIhSe6BjdYp~2^{8-4Qtk&R`F7*AuY+U9IB&XuRSNO;&B5%@F=Bb z{5qc~2gWbZj&kJ`3_JFedprSN_3#EypGv%jWJTyPnmS<4fPPo-Fy+lTwahs*i+2)K6lj~lmn*tS0bCE*d)+CBer Ivq}OyY;4LKy#N3J From f972199a156fc2838d032ff3a929009dab881ab0 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 29 Apr 2017 15:44:51 -0500 Subject: [PATCH 003/352] Fixed Dsay always causing a disk read --- code/modules/admin/verbs/deadsay.dm | 2 +- code/modules/admin/verbs/deadsay.dm.rej | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 code/modules/admin/verbs/deadsay.dm.rej diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index 8703784fc6..3dabd99da1 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -19,7 +19,7 @@ if (!msg) return - var/nicknames = world.file2list("config/admin_nicknames.txt") + var/static/nicknames = world.file2list("config/admin_nicknames.txt") var/rendered = "DEAD: ADMIN([src.holder.fakekey ? pick(nicknames) : src.key]) says, \"[msg]\"" diff --git a/code/modules/admin/verbs/deadsay.dm.rej b/code/modules/admin/verbs/deadsay.dm.rej new file mode 100644 index 0000000000..2e48326069 --- /dev/null +++ b/code/modules/admin/verbs/deadsay.dm.rej @@ -0,0 +1,8 @@ +diff a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm (rejected hunks) +@@ -29,4 +29,4 @@ + if (M.stat == DEAD || (M.client && M.client.holder && (M.client.prefs.chat_toggles & CHAT_DEAD))) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above + M.show_message(rendered, 2) + +- SSblackbox.add_details("admin_verb","Dsay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +\ No newline at end of file ++ SSblackbox.add_details("admin_verb","Dsay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! From 0bbe5a67fa6cebea94a453b780955dd1bad4aac1 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 29 Apr 2017 17:05:17 -0500 Subject: [PATCH 004/352] The least surprising nerf: Null Crates & Emagged Plasma Export Bonus --- code/modules/cargo/exports/materials.dm | 7 +------ code/modules/cargo/packs.dm.rej | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 6 deletions(-) create mode 100644 code/modules/cargo/packs.dm.rej diff --git a/code/modules/cargo/exports/materials.dm b/code/modules/cargo/exports/materials.dm index c2a0734958..8f3292df3a 100644 --- a/code/modules/cargo/exports/materials.dm +++ b/code/modules/cargo/exports/materials.dm @@ -50,11 +50,6 @@ material_id = MAT_PLASMA message = "cm3 of plasma" -/datum/export/material/plasma/get_cost(obj/O, contr = 0, emag = 0) - . = ..() - if(emag) // Syndicate pays you more for the plasma. - . = round(. * 1.5) - // Uranium. Still useful for both power generation and nuclear annihilation. /datum/export/material/uranium cost = 400 @@ -98,4 +93,4 @@ message = "cm3 of glass" material_id = MAT_GLASS export_types = list(/obj/item/stack/sheet/glass, /obj/item/weapon/ore, - /obj/item/weapon/shard) \ No newline at end of file + /obj/item/weapon/shard) diff --git a/code/modules/cargo/packs.dm.rej b/code/modules/cargo/packs.dm.rej new file mode 100644 index 0000000000..68a6ec8e60 --- /dev/null +++ b/code/modules/cargo/packs.dm.rej @@ -0,0 +1,18 @@ +diff a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm (rejected hunks) +@@ -169,14 +169,14 @@ + /datum/supply_pack/emergency/syndicate + name = "NULL_ENTRY" + hidden = TRUE +- cost = 14000 ++ cost = 20000 + contains = list() + crate_name = "emergency crate" + crate_type = /obj/structure/closet/crate/internals + dangerous = TRUE + + /datum/supply_pack/emergency/syndicate/fill(obj/structure/closet/crate/C) +- var/crate_value = 50 ++ var/crate_value = 30 + var/list/uplink_items = get_uplink_items(ticker.mode) + while(crate_value) + var/category = pick(uplink_items) From 23d44352c71f03638281489e64188e81dd3cf93b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 30 Apr 2017 02:13:43 -0500 Subject: [PATCH 005/352] Fixes spelling for Lavaland Syndicate --- code/modules/ruins/lavaland_ruin_code.dm | 1 - code/modules/ruins/lavaland_ruin_code.dm.rej | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 code/modules/ruins/lavaland_ruin_code.dm.rej diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index 376c8aa9f2..d14da81a8c 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -119,7 +119,6 @@ name = "incomplete artificial golem shell" has_owner = TRUE - ///Syndicate Listening Post /obj/effect/mob_spawn/human/lavaland_syndicate r_hand = /obj/item/weapon/gun/ballistic/automatic/sniper_rifle diff --git a/code/modules/ruins/lavaland_ruin_code.dm.rej b/code/modules/ruins/lavaland_ruin_code.dm.rej new file mode 100644 index 0000000000..2f25515493 --- /dev/null +++ b/code/modules/ruins/lavaland_ruin_code.dm.rej @@ -0,0 +1,18 @@ +diff a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm (rejected hunks) +@@ -136,16 +135,13 @@ + icon = 'icons/obj/Cryogenic2.dmi' + icon_state = "sleeper" + has_id = 1 +- + flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Continue your research as best you can, and try to keep a low profile. Do not abandon the base without good cause. The base is rigged with explosives should the worst happen, do not let the base fall into enemy hands!" + id_access_list = list(GLOB.access_syndicate) + +- + /obj/effect/mob_spawn/human/lavaland_syndicate/comms + name = "Syndicate Comms Agent" + r_hand = /obj/item/weapon/melee/energy/sword/saber + mask = /obj/item/clothing/mask/chameleon + suit = /obj/item/clothing/suit/armor/vest + flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Monitor enemy activity as best you can, and try to keep a low profile. Do not abandon the base without good cause. Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands!" +- + pocket2 = /obj/item/weapon/card/id/syndicate/anyone From fad23e97c3dd1f1cbe61e345b3c3c8010e20269c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 07:24:29 -0500 Subject: [PATCH 006/352] Proselytizers can now charge from Sigils of Transmission, and Sigils of Transmission can be charged with brass --- .../clock_cult/clock_effects/clock_sigils.dm | 50 +++++++++++-------- .../clock_helpers/proselytizer_helpers.dm | 22 ++++++++ .../clock_items/clockwork_proselytizer.dm | 32 ++++++++++-- .../items/stacks/sheets/sheet_types.dm | 2 +- .../objects/items/stacks/tiles/tile_types.dm | 4 +- 5 files changed, 81 insertions(+), 29 deletions(-) diff --git a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm index 6c56295c05..4f45b473ae 100644 --- a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm +++ b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm @@ -202,6 +202,21 @@ and [structure_number] Clockwork Structure[structure_number == 1 ? "":"s"] [structure_number == 1 ? "is":"are"] in range.") if(iscyborg(user)) to_chat(user, "You can recharge from the [sigil_name] by crossing it.") + else if(!GLOB.ratvar_awakens) + to_chat(user, "Hitting the [sigil_name] with brass sheets will convert them to power at a rate of 1 brass sheet to [POWER_FLOOR]W power.") + if(!GLOB.ratvar_awakens) + to_chat(user, "You can recharge Clockwork Proselytizers from the [sigil_name].") + +/obj/effect/clockwork/sigil/transmission/attackby(obj/item/I, mob/living/user, params) + if(is_servant_of_ratvar(user) && istype(I, /obj/item/stack/tile/brass) && !GLOB.ratvar_awakens) + var/obj/item/stack/tile/brass/B = I + user.visible_message("[user] places [B] on [src], causing it to disintegrate into glowing orange energy!", \ + "You charge the [sigil_name] with [B], providing it with [B.amount * POWER_FLOOR]W of power.") + modify_charge(-(B.amount * POWER_FLOOR)) + playsound(src, 'sound/effects/light_flicker.ogg', (B.amount * POWER_FLOOR) * 0.01, 1) + qdel(B) + return TRUE + return ..() /obj/effect/clockwork/sigil/transmission/sigil_effects(mob/living/L) if(is_servant_of_ratvar(L)) @@ -214,9 +229,7 @@ if(!cyborg_checks(cyborg)) return to_chat(cyborg, "You start to charge from the [sigil_name]...") - if(!do_after(cyborg, 50, target = src)) - return - if(!cyborg_checks(cyborg)) + if(!do_after(cyborg, 50, target = src, extra_checks = CALLBACK(src, .proc/cyborg_checks, cyborg, TRUE))) return var/giving_power = min(Floor(cyborg.cell.maxcharge - cyborg.cell.charge, MIN_CLOCKCULT_POWER), power_charge) //give the borg either all our power or their missing power floored to MIN_CLOCKCULT_POWER if(modify_charge(giving_power)) @@ -228,23 +241,27 @@ animate(cyborg, color = previous_color, time = 100) addtimer(CALLBACK(cyborg, /atom/proc/update_atom_colour), 100) -/obj/effect/clockwork/sigil/transmission/proc/cyborg_checks(mob/living/silicon/robot/cyborg) +/obj/effect/clockwork/sigil/transmission/proc/cyborg_checks(mob/living/silicon/robot/cyborg, silent) if(!cyborg.cell) - to_chat(cyborg, "You have no cell!") + if(!silent) + to_chat(cyborg, "You have no cell!") return FALSE if(!power_charge) - to_chat(cyborg, "The [sigil_name] has no stored power!") + if(!silent) + to_chat(cyborg, "The [sigil_name] has no stored power!") return FALSE if(cyborg.cell.charge > cyborg.cell.maxcharge - MIN_CLOCKCULT_POWER) - to_chat(cyborg, "You are already at maximum charge!") + if(!silent) + to_chat(cyborg, "You are already at maximum charge!") return FALSE if(cyborg.has_status_effect(STATUS_EFFECT_POWERREGEN)) - to_chat(cyborg, "You are already regenerating power!") + if(!silent) + to_chat(cyborg, "You are already regenerating power!") return FALSE return TRUE -/obj/effect/clockwork/sigil/transmission/New() - ..() +/obj/effect/clockwork/sigil/transmission/Initialize() + . = ..() update_glow() /obj/effect/clockwork/sigil/transmission/proc/modify_charge(amount) @@ -299,8 +316,7 @@ if((is_servant_of_ratvar(L) && L.suiciding) || sigil_active) return visible_message("[src] begins to glow bright blue!") - animate(src, alpha = 255, time = 10) - addtimer(CALLBACK(src, .proc/update_alpha), 10) + animate(src, alpha = 255, time = 10, flags = ANIMATION_END_NOW) //we may have a previous animation going. finish it first, then do this one without delay. sleep(10) //as long as they're still on the sigil and are either not a servant or they're a servant AND it has remaining vitality while(L && (!is_servant_of_ratvar(L) || (is_servant_of_ratvar(L) && (GLOB.ratvar_awakens || vitality))) && get_turf(L) == get_turf(src)) @@ -369,12 +385,4 @@ animation_number = initial(animation_number) sigil_active = FALSE visible_message("[src] slowly stops glowing!") - if(sigil_active || alpha == 255) - animate(src, alpha = initial(alpha), time = 10) - addtimer(CALLBACK(src, .proc/update_alpha), 10) - -/obj/effect/clockwork/sigil/vitality/proc/update_alpha() - if(sigil_active) - alpha = 255 - else - alpha = initial(alpha) + animate(src, alpha = initial(alpha), time = 10, flags = ANIMATION_END_NOW) diff --git a/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm b/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm index c6954bb67e..529f38d832 100644 --- a/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm +++ b/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm @@ -286,6 +286,28 @@ user.visible_message("[user]'s [proselytizer.name] stops covering [src] with glowing orange energy.", \ "You finish repairing [src]. It is now at [obj_integrity]/[max_integrity] integrity.") +//Hitting a sigil of transmission will try to charge from it. +/obj/effect/clockwork/sigil/transmission/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) + . = TRUE + var/list/charge_values = list() + if(!proselytizer.sigil_charge_checks(charge_values, src, user)) + return + user.visible_message("[user]'s [proselytizer.name] starts draining glowing orange energy from [src]...", \ + "You start recharging your [proselytizer.name]...") + proselytizer.recharging = src + while(proselytizer && user && src) + if(!do_after(user, 10, target = src, extra_checks = CALLBACK(proselytizer, /obj/item/clockwork/clockwork_proselytizer.proc/sigil_charge_checks, charge_values, src, user, TRUE))) + break + modify_charge(charge_values["power_gain"]) + proselytizer.modify_stored_power(charge_values["power_gain"]) + playsound(src, 'sound/effects/light_flicker.ogg', charge_values["power_gain"] * 0.1, 1) + + if(proselytizer) + proselytizer.recharging = null + if(user) + user.visible_message("[user]'s [proselytizer.name] stops draining glowing orange energy from [src].", \ + "You finish recharging your [proselytizer.name]. It now contains [proselytizer.get_power()]W/[proselytizer.get_max_power()]W power.") + //Proselytizer mob heal proc, to avoid as much copypaste as possible. /mob/living/proc/proselytizer_heal(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) var/list/repair_values = list() diff --git a/code/game/gamemodes/clock_cult/clock_items/clockwork_proselytizer.dm b/code/game/gamemodes/clock_cult/clock_items/clockwork_proselytizer.dm index 25e2138b81..60df56b6ef 100644 --- a/code/game/gamemodes/clock_cult/clock_items/clockwork_proselytizer.dm +++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_proselytizer.dm @@ -12,6 +12,7 @@ var/uses_power = TRUE var/metal_to_power = FALSE var/repairing = null //what we're currently repairing, if anything + var/obj/effect/clockwork/sigil/transmission/recharging = null //the sigil we're charging from, if any var/speed_multiplier = 1 //how fast this proselytizer works var/charge_rate = MIN_CLOCKCULT_POWER //how much power we gain every two seconds var/charge_delay = 2 //how many proccess ticks remain before we can start to charge @@ -140,10 +141,11 @@ /obj/item/clockwork/clockwork_proselytizer/attack_self(mob/living/user) if(is_servant_of_ratvar(user)) - if(!can_use_power(POWER_WALL_TOTAL)) - to_chat(user, "[src] requires [POWER_WALL_TOTAL]W of power to produce brass sheets!") - return - modify_stored_power(-POWER_WALL_TOTAL) + if(uses_power) + if(!can_use_power(POWER_WALL_TOTAL)) + to_chat(user, "[src] requires [POWER_WALL_TOTAL]W of power to produce brass sheets!") + return + modify_stored_power(-POWER_WALL_TOTAL) playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) new/obj/item/stack/tile/brass(user.loc, 5) to_chat(user, "You user [stored_power ? "some":"all"] of [src]'s power to produce some brass sheets. It now stores [get_power()]W/[get_max_power()]W of power.") @@ -182,6 +184,9 @@ if(repairing) to_chat(user, "You are currently repairing [repairing] with [src]!") return FALSE + if(recharging) + to_chat(user, "You are currently recharging [src] from the [recharging.sigil_name]!") + return FALSE var/list/proselytize_values = target.proselytize_vals(user, src) //relevant values for proselytizing stuff, given as an associated list if(!islist(proselytize_values)) if(proselytize_values != TRUE) //if we get true, fail, but don't send a message for whatever reason @@ -237,7 +242,7 @@ /obj/item/clockwork/clockwork_proselytizer/proc/proselytize_checks(list/proselytize_values, atom/target, expected_type, mob/user, silent) //checked constantly while proselytizing if(!islist(proselytize_values) || !target || QDELETED(target) || !user) return FALSE - if(repairing) + if(repairing || recharging) return FALSE if(target.type != expected_type) return FALSE @@ -296,3 +301,20 @@ [round(repair_values["amount_to_heal"]*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)]W to fully repair [target == user ? "yourself" : "[target.p_them()]"]!") return FALSE return TRUE + +//checked constantly while charging from a sigil +/obj/item/clockwork/clockwork_proselytizer/proc/sigil_charge_checks(list/charge_values, obj/effect/clockwork/sigil/transmission/sigil, mob/user, silent) + if(!islist(charge_values) || !sigil || QDELETED(sigil) || !user) + return FALSE + if(can_use_power(RATVAR_POWER_CHECK)) + return FALSE + charge_values["power_gain"] = Clamp(sigil.power_charge, 0, POWER_WALL_MINUS_FLOOR) + if(!charge_values["power_gain"]) + if(!silent) + to_chat(user, "The [sigil.sigil_name] contains no power!") + return FALSE + if(stored_power + charge_values["power_gain"] > max_power) + if(!silent) + to_chat(user, "Your [name] contains too much power to charge from the [sigil.sigil_name]!") + return FALSE + return TRUE diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index a007dd4545..4700f81d82 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -328,7 +328,7 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \ /obj/item/stack/tile/brass/Initialize(mapload, new_amount, merge = TRUE) recipes = GLOB.brass_recipes - ..() + . = ..() pixel_x = 0 pixel_y = 0 diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index f2432cee3d..aecee4e070 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -13,8 +13,8 @@ var/turf_type = null var/mineralType = null -/obj/item/stack/tile/New(loc, amount) - ..() +/obj/item/stack/tile/Initialize(mapload, amount) + . = ..() pixel_x = rand(-3, 3) pixel_y = rand(-3, 3) //randomize a little From ace93b6cfdd6d4aae413892fece1952ef8fcf0d1 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 08:34:51 -0500 Subject: [PATCH 007/352] Buffs mercury and lithium --- code/modules/reagents/chemistry/reagents/other_reagents.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index c25a1d050d..47cb1e5d3a 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -658,7 +658,7 @@ taste_mult = 0 // apparently tasteless. /datum/reagent/mercury/on_mob_life(mob/living/M) - if(M.canmove && isspaceturf(M.loc)) + if(M.canmove && !isspaceturf(M.loc)) step(M, pick(GLOB.cardinal)) if(prob(5)) M.emote(pick("twitch","drool","moan")) @@ -738,7 +738,7 @@ taste_description = "metal" /datum/reagent/lithium/on_mob_life(mob/living/M) - if(M.canmove && isspaceturf(M.loc)) + if(M.canmove && !isspaceturf(M.loc)) step(M, pick(GLOB.cardinal)) if(prob(5)) M.emote(pick("twitch","drool","moan")) From 55b9c06e63e1c389a569df334bf43189e86a92b6 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 08:36:04 -0500 Subject: [PATCH 008/352] A bunch of sparks to do_sparks --- code/modules/mining/machine_redemption.dm | 4 +--- code/modules/mining/machine_vending.dm | 4 +--- code/modules/mob/living/carbon/carbon_defense.dm | 4 +--- code/modules/mob/living/simple_animal/bot/bot.dm | 8 ++------ code/modules/mob/living/simple_animal/bot/cleanbot.dm | 4 +--- code/modules/mob/living/simple_animal/bot/ed209bot.dm | 4 +--- code/modules/mob/living/simple_animal/bot/floorbot.dm | 4 +--- code/modules/mob/living/simple_animal/bot/medbot.dm | 4 +--- code/modules/mob/living/simple_animal/bot/mulebot.dm | 4 +--- code/modules/mob/living/simple_animal/bot/secbot.dm | 4 +--- code/modules/mob/living/simple_animal/hostile/hivebot.dm | 4 +--- code/modules/power/apc.dm | 8 ++------ code/modules/power/cable.dm | 4 +--- 13 files changed, 15 insertions(+), 45 deletions(-) diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index db0b400fda..9b6e638df6 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -273,9 +273,7 @@ return /obj/machinery/mineral/ore_redemption/ex_act(severity, target) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() + do_sparks(5, TRUE, src) ..() //empty the redemption machine by stacks of at most max_amount (50 at this time) size diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index dc6bc87d18..f4f34a52dc 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -193,9 +193,7 @@ qdel(voucher) /obj/machinery/mineral/equipment_vendor/ex_act(severity, target) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() + do_sparks(5, TRUE, src) if(prob(50 / severity) && severity < 3) qdel(src) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 0d8cfeb98d..84cbc01a33 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -119,9 +119,7 @@ visible_message("The [M.name] has shocked [src]!", \ "The [M.name] has shocked [src]!") - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() + do_sparks(5, TRUE, src) var/power = M.powerlevel + rand(0,3) Weaken(power) if(stuttering < power) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 09e81582ac..dd98496dac 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -287,17 +287,13 @@ to_chat(user, "The welder must be on for this task!") else if(W.force) //if force is non-zero - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() + do_sparks(5, TRUE, src) ..() /mob/living/simple_animal/bot/bullet_act(obj/item/projectile/Proj) if(Proj && (Proj.damage_type == BRUTE || Proj.damage_type == BURN)) if(prob(75) && Proj.damage > 0) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() + do_sparks(5, TRUE, src) return ..() /mob/living/simple_animal/bot/emp_act(severity) diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index 4c5c2c14c5..190e6a7db4 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -259,9 +259,7 @@ if(prob(50)) new /obj/item/bodypart/l_arm/robot(Tsec) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(3, 1, src) - s.start() + do_sparks(3, TRUE, src) ..() /obj/machinery/bot_core/cleanbot diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index e11711f2bd..32db638542 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -390,9 +390,7 @@ Auto Patrol[]"}, if(lasercolor == "r") new /obj/item/clothing/suit/redtag(Tsec) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(3, 1, src) - s.start() + do_sparks(3, TRUE, src) new /obj/effect/decal/cleanable/oil(loc) ..() diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index c8208e7a3b..fe2b08e777 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -381,9 +381,7 @@ var/obj/item/stack/tile/plasteel/T = new (Tsec) T.amount = 1 - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(3, 1, src) - s.start() + do_sparks(3, TRUE, src) ..() /obj/machinery/bot_core/floorbot diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index bcf4b86191..5d3738108e 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -530,9 +530,7 @@ if(emagged && prob(25)) playsound(loc, 'sound/voice/minsult.ogg', 50, 0) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(3, 1, src) - s.start() + do_sparks(3, TRUE, src) ..() /mob/living/simple_animal/bot/medbot/proc/declare(crit_patient) diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 30c2c4e9a9..bdf4277438 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -719,9 +719,7 @@ cell.update_icon() cell = null - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(3, 1, src) - s.start() + do_sparks(3, TRUE, src) new /obj/effect/decal/cleanable/oil(loc) ..() diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index a57b9a9156..c30f52aa5c 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -397,9 +397,7 @@ Auto Patrol: []"}, if(prob(50)) new /obj/item/bodypart/l_arm/robot(Tsec) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(3, 1, src) - s.start() + do_sparks(3, TRUE, src) new /obj/effect/decal/cleanable/oil(loc) ..() diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index e0eb8aad29..5454f3c553 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -53,7 +53,5 @@ ranged = 1 /mob/living/simple_animal/hostile/hivebot/death(gibbed) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(3, 1, src) - s.start() + do_sparks(3, TRUE, src) ..(1) \ No newline at end of file diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 4633285488..6c6a088644 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -497,9 +497,7 @@ var/turf/T = get_turf(src) var/obj/structure/cable/N = T.get_cable_node() if (prob(50) && electrocute_mob(usr, N, N, 1, TRUE)) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() + do_sparks(5, TRUE, src) return C.use(10) to_chat(user, "You add cables to the APC frame.") @@ -1181,9 +1179,7 @@ /obj/machinery/power/apc/proc/shock(mob/user, prb) if(!prob(prb)) return 0 - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() + do_sparks(5, TRUE, src) if(isalien(user)) return 0 if(electrocute_mob(user, src, src, 1, TRUE)) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 653e3296f4..48fc254a8e 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -156,9 +156,7 @@ By design, d1 is the smallest direction and d2 is the highest if(!prob(prb)) return 0 if (electrocute_mob(user, powernet, src, siemens_coeff)) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() + do_sparks(5, TRUE, src) return 1 else return 0 From 529125d3dd19143be27aa22d4f463923b58dc55a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 11:51:27 -0500 Subject: [PATCH 009/352] Moves tips from config to strings tree --- code/controllers/subsystem/ticker.dm | 4 ++-- code/modules/admin/verbs/deadsay.dm.rej | 10 ++++++++++ {config => strings}/admin_nicknames.txt | 0 {config => strings}/sillytips.txt | 0 {config => strings}/tips.txt | 0 5 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 code/modules/admin/verbs/deadsay.dm.rej rename {config => strings}/admin_nicknames.txt (100%) rename {config => strings}/sillytips.txt (100%) rename {config => strings}/tips.txt (100%) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index f701c051da..67599e4f4c 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -625,8 +625,8 @@ SUBSYSTEM_DEF(ticker) if(selected_tip) m = selected_tip else - var/list/randomtips = world.file2list("config/tips.txt") - var/list/memetips = world.file2list("config/sillytips.txt") + var/list/randomtips = world.file2list("strings/tips.txt") + var/list/memetips = world.file2list("strings/sillytips.txt") if(randomtips.len && prob(95)) m = pick(randomtips) else if(memetips.len) diff --git a/code/modules/admin/verbs/deadsay.dm.rej b/code/modules/admin/verbs/deadsay.dm.rej new file mode 100644 index 0000000000..7d0347427b --- /dev/null +++ b/code/modules/admin/verbs/deadsay.dm.rej @@ -0,0 +1,10 @@ +diff a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm (rejected hunks) +@@ -19,7 +19,7 @@ + + if (!msg) + return +- var/static/nicknames = world.file2list("strings/admin_nicknames.txt") ++ var/static/nicknames = world.file2list("config/admin_nicknames.txt") + + var/rendered = "DEAD: ADMIN([src.holder.fakekey ? pick(nicknames) : src.key]) says, \"[msg]\"" + diff --git a/config/admin_nicknames.txt b/strings/admin_nicknames.txt similarity index 100% rename from config/admin_nicknames.txt rename to strings/admin_nicknames.txt diff --git a/config/sillytips.txt b/strings/sillytips.txt similarity index 100% rename from config/sillytips.txt rename to strings/sillytips.txt diff --git a/config/tips.txt b/strings/tips.txt similarity index 100% rename from config/tips.txt rename to strings/tips.txt From 7afd85e3fce1e471316696ff35cc2925c7dbbd31 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 12:47:22 -0500 Subject: [PATCH 010/352] PR announcement spam prevention --- code/world.dm.rej | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 code/world.dm.rej diff --git a/code/world.dm.rej b/code/world.dm.rej new file mode 100644 index 0000000000..70f208ed4d --- /dev/null +++ b/code/world.dm.rej @@ -0,0 +1,10 @@ +diff a/code/world.dm b/code/world.dm (rejected hunks) +@@ -184,7 +184,7 @@ + return + + #define CHAT_PULLR 64 //defined in preferences.dm, but not available here at compilation time +- for(var/client/C in clients) ++ for(var/client/C in GLOB.clients) + if(C.prefs && (C.prefs.chat_toggles & CHAT_PULLR)) + C << "PR: [announcement]" + #undef CHAT_PULLR From 301ad1b0fc138c70a75bafdf37ce7285a9651d17 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 12:49:28 -0500 Subject: [PATCH 011/352] Belligerent now prevents you from running even between chants --- code/__DEFINES/status_effects.dm | 1 + code/datums/status_effects/buffs.dm | 5 ++ code/datums/status_effects/debuffs.dm | 47 ++++++++++++++++++ code/datums/status_effects/gas.dm | 1 + code/datums/status_effects/status_effect.dm | 3 +- .../status_effects/status_effect.dm.rej | 11 ++++ .../clock_cult/clock_items/clockwork_slab.dm | 17 +++---- .../clock_items/clockwork_slab.dm.rej | 46 +++++++++++++++++ .../clock_items/wraith_spectacles.dm | 1 + .../clock_scriptures/scripture_drivers.dm | 15 +----- .../ratvar_the_clockwork_justicar.dm | 2 +- icons/mob/screen_alert.dmi | Bin 83184 -> 84140 bytes 12 files changed, 122 insertions(+), 27 deletions(-) create mode 100644 code/datums/status_effects/status_effect.dm.rej create mode 100644 code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm.rej diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index bc5816dbb9..0bfbe31fb1 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -31,5 +31,6 @@ ///////////// #define STATUS_EFFECT_SIGILMARK /datum/status_effect/sigil_mark +#define STATUS_EFFECT_BELLIGERENT /datum/status_effect/belligerent //forces the affected to walk, doing damage if they try to run #define STATUS_EFFECT_HISWRATH /datum/status_effect/his_wrath //His Wrath. diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index d07f66609b..918f67f7b7 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -13,6 +13,7 @@ /datum/status_effect/shadow_mend/on_apply() owner.visible_message("Violet light wraps around [owner]'s body!", "Violet light wraps around your body!") playsound(owner, 'sound/magic/Teleport_app.ogg', 50, 1) + return ..() /datum/status_effect/shadow_mend/tick() owner.adjustBruteLoss(-15) @@ -75,6 +76,7 @@ progbar = new(owner, duration, owner) progbar.bar.color = list("#FAE48C", "#FAE48C", "#FAE48C", rgb(0,0,0)) progbar.update(duration - world.time) + return ..() /datum/status_effect/vanguard_shield/tick() progbar.update(duration - world.time) @@ -127,6 +129,7 @@ animate(owner, color = oldcolor, time = 150, easing = EASE_IN) addtimer(CALLBACK(owner, /atom/proc/update_atom_colour), 150) playsound(owner, 'sound/magic/Ethereal_Enter.ogg', 50, 1) + return ..() /datum/status_effect/inathneqs_endowment/on_remove() add_logs(owner, null, "lost Inath-neq's invulnerability") @@ -178,6 +181,7 @@ /datum/status_effect/his_grace/on_apply() add_logs(owner, null, "gained His Grace's stun immunity") owner.add_stun_absorption("hisgrace", INFINITY, 3, null, "His Grace protects you from the stun!") + return ..() /datum/status_effect/his_grace/tick() bloodlust = 0 @@ -211,6 +215,7 @@ /datum/status_effect/wish_granters_gift/on_apply() to_chat(owner, "Death is not your end! The Wish Granter's energy suffuses you, and you begin to rise...") + return ..() /datum/status_effect/wish_granters_gift/on_remove() owner.revive(full_heal = 1, admin_revive = 1) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index f78a3ae522..8eec853047 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -29,3 +29,50 @@ owner.adjustBruteLoss(0.1) owner.adjustFireLoss(0.1) owner.adjustToxLoss(0.2, TRUE, TRUE) + +/datum/status_effect/belligerent + id = "belligerent" + duration = 70 + tick_interval = 0 //tick as fast as possible + status_type = STATUS_EFFECT_REPLACE + alert_type = /obj/screen/alert/status_effect/belligerent + var/leg_damage_on_toggle = 2 //damage on initial application and when the owner tries to toggle to run + var/cultist_damage_on_toggle = 10 //damage on initial application and when the owner tries to toggle to run, but to cultists + +/obj/screen/alert/status_effect/belligerent + name = "Belligerent" + desc = "Kneel, her-eti'c." + icon_state = "belligerent" + alerttooltipstyle = "clockcult" + +/datum/status_effect/belligerent/on_apply() + return do_movement_toggle(TRUE) + +/datum/status_effect/belligerent/tick() + if(!do_movement_toggle()) + qdel(src) + +/datum/status_effect/belligerent/proc/do_movement_toggle(force_damage) + var/number_legs = owner.get_num_legs() + if(iscarbon(owner) && !is_servant_of_ratvar(owner) && !owner.null_rod_check() && number_legs) + if(force_damage || owner.m_intent != MOVE_INTENT_WALK) + if(GLOB.ratvar_awakens) + owner.Weaken(1) + if(iscultist(owner)) + owner.apply_damage(cultist_damage_on_toggle * 0.5, BURN, "l_leg") + owner.apply_damage(cultist_damage_on_toggle * 0.5, BURN, "r_leg") + else + owner.apply_damage(leg_damage_on_toggle * 0.5, BURN, "l_leg") + owner.apply_damage(leg_damage_on_toggle * 0.5, BURN, "r_leg") + if(owner.m_intent != MOVE_INTENT_WALK) + if(!iscultist(owner)) + to_chat(owner, "Your leg[number_legs > 1 ? "s shiver":" shivers"] with pain!") + else //Cultists take extra burn damage + to_chat(owner, "Your leg[number_legs > 1 ? "s burn":" burns"] with pain!") + owner.toggle_move_intent() + return TRUE + return FALSE + +/datum/status_effect/belligerent/on_remove() + if(owner.m_intent == MOVE_INTENT_WALK) + owner.toggle_move_intent() diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm index c2c070dbec..ff92b67978 100644 --- a/code/datums/status_effects/gas.dm +++ b/code/datums/status_effects/gas.dm @@ -16,6 +16,7 @@ cube = icon('icons/effects/freeze.dmi', "ice_cube") owner.add_overlay(cube) owner.update_canmove() + return ..() /datum/status_effect/freon/tick() owner.update_canmove() diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index 51b4f8fc5f..b0f080a3a0 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -30,10 +30,9 @@ /datum/status_effect/proc/start_ticking() if(!src) return - if(!owner) + if(!owner || !on_apply()) qdel(src) return - on_apply() if(duration != -1) duration = world.time + initial(duration) tick_interval = world.time + initial(tick_interval) diff --git a/code/datums/status_effects/status_effect.dm.rej b/code/datums/status_effects/status_effect.dm.rej new file mode 100644 index 0000000000..a174c87f7b --- /dev/null +++ b/code/datums/status_effects/status_effect.dm.rej @@ -0,0 +1,11 @@ +diff a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm (rejected hunks) +@@ -54,7 +53,8 @@ var/global/list/all_status_effects = list() //a list of all status effects, if f + if(duration != -1 && duration < world.time) + qdel(src) + +-/datum/status_effect/proc/on_apply() //Called whenever the buff is applied. ++/datum/status_effect/proc/on_apply() //Called whenever the buff is applied; returning FALSE will cause it to autoremove itself. ++ return TRUE + /datum/status_effect/proc/tick() //Called every tick. + /datum/status_effect/proc/on_remove() //Called whenever the buff expires or is removed. + /datum/status_effect/proc/be_replaced() //Called instead of on_remove when a status effect is replaced by itself diff --git a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm index 35caabab5a..0ea612ea10 100644 --- a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm +++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm @@ -21,7 +21,6 @@ var/obj/effect/proc_holder/slab/slab_ability //the slab's current bound ability, for certain scripture var/list/quickbound = list(/datum/clockwork_scripture/ranged_ability/geis_prep, /datum/clockwork_scripture/create_object/replicant, \ /datum/clockwork_scripture/create_object/tinkerers_cache) //quickbound scripture, accessed by index - var/maximum_quickbound = 5 //how many quickbound scriptures we can have actions_types = list(/datum/action/item_action/clock/hierophant) /obj/item/clockwork/slab/starter @@ -52,7 +51,6 @@ nonhuman_usable = TRUE quickbound = list(/datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/ranged_ability/linked_vanguard, \ /datum/clockwork_scripture/create_object/tinkerers_cache) - maximum_quickbound = 6 //we usually have one or two unique scriptures, so if ratvar is up let us bind one more actions_types = list() /obj/item/clockwork/slab/cyborg/engineer //five scriptures, plus a proselytizer @@ -372,12 +370,11 @@ The remaining functions are several buttons in the top left while holding the slab.
From left to right, they are:
\ Hierophant Network, which allows communication to other Servants.
") if(LAZYLEN(quickbound)) - for(var/i in 1 to maximum_quickbound) - if(LAZYLEN(quickbound) < i || !quickbound[i]) - textlist += "A Quickbind slot, currently set to Nothing.
" - else - var/datum/clockwork_scripture/quickbind_slot = quickbound[i] - textlist += "A Quickbind slot, currently set to [initial(quickbind_slot.name)].
" + for(var/i in 1 to quickbound.len) + if(!quickbound[i]) + continue + var/datum/clockwork_scripture/quickbind_slot = quickbound[i] + textlist += "A Quickbind slot, currently set to [initial(quickbind_slot.name)].
" textlist += "
\ Examine the slab or swap to Recital to check the number of components it has available.

\ \ @@ -489,8 +486,8 @@ quickbound[found_index] = null //otherwise, leave it as a null so the scripture maintains position update_quickbind() else - var/target_index = input("Position of [initial(path.name)], 1 to [maximum_quickbound]?", "Input") as num|null - if(isnum(target_index) && target_index > 0 && target_index <= maximum_quickbound && !..()) + var/target_index = input("Position of [initial(path.name)], 1 to 5?", "Input") as num|null + if(isnum(target_index) && target_index > 0 && target_index < 6 && !..()) var/datum/clockwork_scripture/S if(LAZYLEN(quickbound) >= target_index) S = quickbound[target_index] diff --git a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm.rej b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm.rej new file mode 100644 index 0000000000..06e60a70e4 --- /dev/null +++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm.rej @@ -0,0 +1,46 @@ +diff a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm (rejected hunks) +@@ -21,6 +21,7 @@ + var/obj/effect/proc_holder/slab/slab_ability //the slab's current bound ability, for certain scripture + var/list/quickbound = list(/datum/clockwork_scripture/ranged_ability/geis_prep, /datum/clockwork_scripture/create_object/replicant, \ + /datum/clockwork_scripture/create_object/tinkerers_cache) //quickbound scripture, accessed by index ++ var/maximum_quickbound = 5 //how many quickbound scriptures we can have + actions_types = list(/datum/action/item_action/clock/hierophant) + + /obj/item/clockwork/slab/starter +@@ -51,6 +52,7 @@ + nonhuman_usable = TRUE + quickbound = list(/datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/ranged_ability/linked_vanguard, \ + /datum/clockwork_scripture/create_object/tinkerers_cache) ++ maximum_quickbound = 6 //we usually have one or two unique scriptures, so if ratvar is up let us bind one more + actions_types = list() + + /obj/item/clockwork/slab/cyborg/engineer //five scriptures, plus a proselytizer +@@ -362,11 +364,12 @@ + The remaining functions are several buttons in the top left while holding the slab.
From left to right, they are:
\ + Hierophant Network, which allows communication to other Servants.
") + if(LAZYLEN(quickbound)) +- for(var/i in 1 to quickbound.len) +- if(!quickbound[i]) +- continue +- var/datum/clockwork_scripture/quickbind_slot = quickbound[i] +- textlist += "A Quickbind slot, currently set to [initial(quickbind_slot.name)].
" ++ for(var/i in 1 to maximum_quickbound) ++ if(LAZYLEN(quickbound) < i || !quickbound[i]) ++ textlist += "A Quickbind slot, currently set to Nothing.
" ++ else ++ var/datum/clockwork_scripture/quickbind_slot = quickbound[i] ++ textlist += "A Quickbind slot, currently set to [initial(quickbind_slot.name)].
" + textlist += "
\ + Examine the slab or swap to Recital to check the number of components it has available.

\ + \ +@@ -478,8 +481,8 @@ + quickbound[found_index] = null //otherwise, leave it as a null so the scripture maintains position + update_quickbind() + else +- var/target_index = input("Position of [initial(path.name)], 1 to 5?", "Input") as num|null +- if(isnum(target_index) && target_index > 0 && target_index < 6 && !..()) ++ var/target_index = input("Position of [initial(path.name)], 1 to [maximum_quickbound]?", "Input") as num|null ++ if(isnum(target_index) && target_index > 0 && target_index <= maximum_quickbound && !..()) + var/datum/clockwork_scripture/S + if(LAZYLEN(quickbound) >= target_index) + S = quickbound[target_index] diff --git a/code/game/gamemodes/clock_cult/clock_items/wraith_spectacles.dm b/code/game/gamemodes/clock_cult/clock_items/wraith_spectacles.dm index 1b6c80af73..6d17fe4e74 100644 --- a/code/game/gamemodes/clock_cult/clock_items/wraith_spectacles.dm +++ b/code/game/gamemodes/clock_cult/clock_items/wraith_spectacles.dm @@ -129,6 +129,7 @@ if(ishuman(owner)) var/mob/living/carbon/human/H = owner apply_eye_damage(H) + return ..() /datum/status_effect/wraith_spectacles/tick() if(!ishuman(owner)) diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm index 023cd50dd1..2e822199d3 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm @@ -17,23 +17,10 @@ sort_priority = 1 quickbind = TRUE quickbind_desc = "Forces nearby non-Servants to walk, doing minor damage with each chant.
Maximum 15 chants." - var/noncultist_damage = 2 //damage per chant to noncultists - var/cultist_damage = 8 //damage per chant to non-walking cultists /datum/clockwork_scripture/channeled/belligerent/chant_effects(chant_number) for(var/mob/living/carbon/C in hearers(7, invoker)) - var/number_legs = C.get_num_legs() - if(!is_servant_of_ratvar(C) && !C.null_rod_check() && number_legs) //you have legs right - C.apply_damage(noncultist_damage * 0.5, BURN, "l_leg") - C.apply_damage(noncultist_damage * 0.5, BURN, "r_leg") - if(C.m_intent != MOVE_INTENT_WALK) - if(!iscultist(C)) - to_chat(C, "Your leg[number_legs > 1 ? "s shiver":" shivers"] with pain!") - else //Cultists take extra burn damage - to_chat(C, "Your leg[number_legs > 1 ? "s burn":" burns"] with pain!") - C.apply_damage(cultist_damage * 0.5, BURN, "l_leg") - C.apply_damage(cultist_damage * 0.5, BURN, "r_leg") - C.toggle_move_intent() + C.apply_status_effect(STATUS_EFFECT_BELLIGERENT) return TRUE diff --git a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm index 614a22a6f5..0529b67ffd 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm @@ -77,7 +77,7 @@ if(!prey && LAZYLEN(meals)) prey = pick(meals) to_chat(prey, "\"You will do, heretic.\"\n\ - ") + You feel something massive turn its crushing focus to you...") prey << 'sound/effects/ratvar_reveal.ogg' else if((!istype(prey, /obj/singularity/narsie) && prob(10) && LAZYLEN(meals) > 1) || prey.z != z || !(prey in meals)) diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi index 5858925d86cd131511a027fcfa768fe8b3c89a8b..46666cdd5fc8446bf51d51f4051e7d2151d18602 100644 GIT binary patch delta 31098 zcmb5WbyScXxN!A{SPqxVsd0cemnFpoJnWZpEQM0wH0} zpB(wve(PA#oG^-^l0XWe1(La$3YsZ>#Lp>LPKN_qr6{ol+pKjmHmX)kEx$X?q{rBo z%`=jlK!I@d7c1F$A#V?TN7|b4E^D$s>^w7Q_ItbLYkRqO$D};>X?GN)UjDadE*YQy z+gj$fb+-8-W7AuMnm^|^0%f3Y$b|4TZrEUiKE8+v}(i=`5DOR7y0J4PJ+sj zD?#tIZ_GQ79cpHm?LJ%5+@AzW6)$r}SRu#eTZffnp^BQg#;;usZ7-O`n~eQ--bpub zZTz)BXKb@$ef#_)THtOx9~CuW4b^*;aT$qz;2F_1!|41cgfCo@zsU-Yz4wZeRN=R`EZ_DA;u{WCX&F1wiY0DC$ z(%%o|I>ks!*B`}#Le_onjT)qdUVrmQVE$Sc&-LnNi>GUka3e!$b24l^C5~=#*_u<* zV{cGK(U9}thhVpVk5xPF-4Dvjo7#@$w=aa6XOYOh0XxjNHyc%Ff4sVE&hgTW-5R>{1^0n$pvQ;HzO0QaqGT%g-X*i zK9c_F6RSg376n^#m5rU!+=9Q4m)9e-!nn*PX;lBCWoO?(WqJ1>&AfJHwgcgfN{>EV z2zhFE36P87+jnvN5@Xa~QFn%-L@myR{%c#obF*&69JBL=!6h4S4|dQ>4sO08IBZ?d z>L6P31Wy$qyZTD4Sfi3xE}LT7m{bCh4Rw~j{Pu$7QQMRRlw31osF7EH?FIcb)$gTu zT(l&PwRg~C_Aq?$Cpy*E?lTqoFZ7|$xhxNHd_YCsH+Dk{Ee!vzqT3_-_3vMFFw@%r zum>Odn^pBUsl|mO>x_+}jD%92ik~VPr@d|5#V#UgUE3lNW_&W&&kNs_x`!2R!$f1_ z9Ul7b@SOzLAY#Sj>yiN$9EcPF4>Z2C9UiMn{KO-M>$h18x@qUOzih*-sK+01h8p+6 zEdZnOw{LJ{=fOfI2PT`4uXVty$+_pl-f06KO;IutdpCX@Lqn?k`4M=eAx;(=plW#= zyKWWOgN^$pG^fsTXEHl>-{W0M8Q690Vv^4|X25oApe99}5+sgmk2|}UF97roW|zT4IIv!)w=w!K)>MoV_*m5b`bUuinyTjm2JV@f(*SV%c}Y*2U_q*nQ~ z;Q5tsmsz}OAtc#Z>TJfqpKU&X(Kd(f`pp~__3M%KR>aIJ{ixA&dn;Fz6-u=g?n?7M zODM@KyqAw5SYhHikJp-b%xwha0922$UjmUyKHE4a&1t>|Uo}-3PkSKom8NZR91>n| zG1=&ONAg;3!zyNk8Utz=TG(KW*@r|LW=9o?n|Lr5Aa>#7L(6GGeeK9Sm!YBWW2lYc z>^?Lle%07bL;3T>@sbkMJtutzx*`Hw4Goz62>(VbqudkiGM??=?bxyhP==ZcBsq9l z(vVooa9bNtWUs)ksZx6nN__u`V3Z+#Vi97S@8Sw3zJ%`uuP4nf4o;?X>X5PH%ue5J zXX#-4?Kzhhqx#IMA)P!XpR~i0xbtf~%?t-sCWr!$EAYU}+yfa&xB%3eR#=s&TPMm{ zukx;jS(^2Tj`&9(1{?75ZC|G_u)eYlJd$p-F7vl~oVPL>N9l6P0^Ky&Ucvh)+=v&W;9wDiMoKu-g2mwFy2cxoR+M9|icMxg%zx z;K2dkkM3KR>K8F|-w)*(#n|Z$igF$)k`t%?Dadu3fWQu#<>)hZ>0+WrrjadPh^=ex zhB1t;O{_0Xbl7!f5*!sXr=xX>ctr7yB9noBYX*I!T52T4*c=15kpfKt1+(RGWxKu3 zIC5rdz?@?XD?x0M<0Wc*i41EkxJj8ZQ_ahq+vj>Mj(O4)N@H5XJkr;o9dWRY+9T$4 zl>h4ysJ`~tLQAys@pr5(F6_R$e)CL80d&=y z;dWO>=ZQ*^=3{Me|1cS48*0dGXSQi638$pQUA*m<61lhtbNoo6{j0@p zaB0r`dddm)>~~9en2~6ziO!rwhyYpyYlj`t0xC-qQ-0}FgK;CV#=mP6w@e=Ow) z`eyaia8fZ(y*hTG0uTx&;}_eVo?3dE;uJ3VTGWq_7h)F}{03zUp0t|b(}%ppZZc;A zGMB1PzN85C|{C9jtkVd4c?shvhwRYie*i}R?GE|F5d&TU0rRAkm0cG z8;^4n45xu*3O$nC4#51*wrk>jPz-E&;Ui zH|$Tr$?Okt2}vVQK2Z5b7||rZvI!UI0Iw749Sv^Hel;#-*{Z2oJN77J6cTT@R7qKv z`vVEKaRu&Bnx(^3ygEr#KnHd5)bfgLJ#;>Q!wz8F-`03 zfUUE?ZD*WQWSLyq_V=aIM94p$@6Zf?=Wiu)tah=t39uAsKTG@amAr`C8+*PX{fh+B zVdy=l(L_N1rlFO<&mSHOM4Po2Gh4%&LOK@d(q+_WpJ&?_q&_vh4r4?>i<$Lde9t9M zWXAm&dC28e9^gWDT-F%CW}SjC7$|d~Fz;+Xxs;fywW&G}X2agRu9wEAH3jCuDLZJD zwLJohp&Vi`&2!k_E}Oa=p1p!Uk0y-$14#1LeQ$5TQmL!79|P3-++Bq0&vMKIQ&Lik z_HW<5zUGucluJ>T6hblSzf%al&G`|)q(;w+csU5>00umv8&EJlbbDVYy|cC?jTdNc zgyvp1b9+*ApCV4Sn&FNdEUNptv8_)AY}Z7)|+NQgxrp?6r5*{(U}H!T6SoM7yG%lPJx^nkSTs ziiMe36)<8ZOxrl&wn##rrcdhI@|`~ij6Pv#;U&gWTb1I^w5AtbJui}=&Kf;!!u!ma zni=x|`Jt6r!OUaEg;7!QJ&ouN%CY-6w@Q6jI zWx=y{2ewOTBI`x72*}K)hwU;wjYk@yfECd|DCm)H1m8(l@x7`RhxhTHqN|-=I$mJe z=pFUS2MZ;RA~P8^uyy}S!Ik)#fN<%iXLP+i6_9zUSMmxR)JZ2LoplA5m8CL!)nW|R zi}J{gIjXyOjne*VV6RJN)_p?Sr2 z9}hwzDRZ@m^0)xRbJ#m@GlA;ToC+Y4xl7p(#FjdfZU7euKIt)8k#ixzk%_tIq3X|# z7npF5g3wN>*UdxYTp+aNmrXH-Nd2o`kP?*XD}_^8eS0U*zp?^d4yktvxgJ6OG`{PY zxUgl??>cK9wHdQxu<-{a%xWk6;s+U4dR*Sc!Ap~rK^Kvs+?L{@*2{C@E^q5c%)~$I^UD-{#N^`PEYXEjZgQ7}qH(rM zN9ibW;r}$z>|^|>s>u;Cig&xjXno|W2EM6lrQKDYW-|*&rfmLhq!~o}JA%qHr6PZ1 z6@So@)fv1v=^meOHnxuc1u*$*!9~;#k#$3{K0)o*?Seu4>s?O_iY`dkTL-`1Dy+JLOTHqchg1ajH4 zg>?C5I+*WZ|7sK}zd0ey^?Y@v2uxNEr;9nGV zN%^LLrO+&0yUXS7{7FdJ#^{Ijeb5!~DY~mZmDzk`a+`pdPq`U7yx#9e;sN#Fuc+~@ z4v2kF19@q!)>APC57oieXJkn=GfgYj!oRkVVQ?&^aiP4}giU z^qr;=je0`wfFZ(N{zs&>qSdzNuhL?&sW+z#tQ<~Fxhh323%XabW@kl-2X?dt+_$H} z{-H5b8(UKsVU03du;2Y1d*aCiKlu_3d7+Aq)p|KP{N2K$iKmRgZG zl$8e8-UE*kym|*7@4cJG1+X9*y)dl3xys-Z?P%a`RT`=(zi5qY^({nCAH`SgxOEby zr-!7D068FDC(hdZWBnrIMZ`xZPVRx^bXuR*9}SPq=lcZ);uA|QkAw*QB1d$(B7Ic0 z@^S={C&A)OQym$^?hAjjgPka= zZSK(ehl~IKclHlB?+ZIByne{S-el#{fNwQ-*4|5#G0AYXJu@DOz$16_RswDfC zyATIEs6M%${xL2ZRA+?L$`qVKwO1++V7q<&iLCL3@=|WjB(G&NW`+{O7P>k8tAXpK zqWsx%YJ%nW)CB%Yrh*Z7DxRWK$4f-#{zq?$hw8Nz+ej7%77VgPjBV6g#B7HmCpBUw zpN2{17uXDk{81t=VY4?0X@Pd94{iFu zBH48a>nU)l*mB-AdA`w0fB7@RGOs(=Kw;5cxkmy4fePV+w4|oydLW$-TVDS~%uK&| zTGohIG;Zd2_`DYt30B(NTo`ciJAo*|Lcky(*yI=N1K+AyoD#LG1geOp_Wp3FON_l4 zOH(p=%T_(Bl|QvOpP{nVy=5TI(obHF-!HqBXP5q|n~5QNGl)n~`w|HZhg>^8tuhjj zDe18o^vm^UlfqzjZH*oi`Q`;ys`%98$4w5taDf`zz#xCZBx|W~;PK(^Al_g4non}M z-DJ<_*4>*T&s6%z#?qAN_Rr1cVvp{I7Gi(L<)j~0|4+zrfud_3wTEA6xKj^)a|=@Q z_qa|$MGhok&1ljy_vW1+L$261F$MQC9393O+es2<&D0;N-Gl;Bo>7ceO*I%?=QVj( zry6Wj@4DDjGQ`iU0>x>A=ey?J1LRgn(Sg_g!$1Dx(fntsTYGVuXY8`Z3Tk{JgYUDa zDm%IbZsy*BJJ|&QVlmx(x0)3fwAEncisxH#_Sxr!wj+#~<4y0H3Fsf#PQTst=geIu zKEtP8?xZ3b=aChV-ATr}LZ!9;&F;HimJ>~KyTd*_RTA zAM!1b0`l}j;_Z+2*fC%^u40#w)7IMc>LlkEMc+RiDh%QL7$*d_wu6_)m93|9%BZE(5T&6E6FGw}h(jm7`47>@YSx6jcpmL*fe+zQ2t!PKA9#0PW*WLPok zZ({exOW(a?Vq>w`Z<;zY2mFTyl3EallNsMHp!N}H5(dM4td@3op34F0KU89LLEaI_ zU=U0^y6rw0_PeY79c1g^;nq+c`M%&#^cZ4be6D`0ER$%o^EXF2KUb043+xrJ2krK# zIoit)x<*8b)^r|DLQHjLSRBehyQJUR5&IV$3G{2qF~;b@0C-R!Y`LuKj9r)}yNJIW zznT4^Yn}7CoQ3E5eu^dc(mi7Ys~d@o?Aa4wc&ZK0Mfw^?i|ht4`lk^CU1Enkp3y7;TC|+<)_zJTO0xJj-S;y@a_f8wM|b0 zzMK;~!bk{*Pqp@w(ZOZhiW;6*96g^4$?VbBX1mWb)5n3wt$ngO(Pc0Gy^+a5|1}78 zbBeO-OYDq61RDV5gg9hT1^ikx@8~QuByij-GFKkyf-qUA;MqIsTSpT|ye>DYVfTts zuGY#$pDZe05^?B{Y8`d8<9_qog!ywpOH|Q&yszcu3xBZ4xpurV(n~&~S%8Y+u?$^{ zHqi;&QmK<({~OfqJJX$4)J#houlNQh{!2a+45rJuZUYc~z0p?7O_sUzourEYx={60 zeN&rE$A=>Lj?kg=vpKwC+wrPlYxS^6%lnb8{}Aa?HT}GZr;Ll&W@u7&hue-$2~JOq zq}&ICG^$n_#I|k1^u8!*s-il!L}TI#p*-VsAc%lp)CDbQ4Iew7-a5KlUqSdKv^|%Y zy)AkZ@c8Dexnlci3Y$62+JfEWUu@yVn_qyD6A0$zs52Hhqw>*S@iWI0MkWZ}uj*m= zuF3p7dDOAWt!ZbEN!a#ft+UZmb__$v9HN3qaE5}u)aH5NI^CY41pHbX?2tW$EB36= zlvN@vweTfW*PmC7#>$Zef#AWgkLxkz0N1o^aHhOX+4K{Dm4oCyr~}0JvEHs|mvOzw zz89wnn@O9qb{xHfRQrambE%_M0q-|Z-$)xUhr1J`W|Gpip_Q6P#aH6JePtcT^OX8d z2hiA@zsn(b`_TUUm1IhbP|Rcgs{p6p0M+cHuUo;h1Ps1a%xn0<1$(yz-~X9)%Wqby zX0MS^J5|?mZkM)gzrG;wB^}Lh+JfW8E_0(g#Udw5bq%?0-2a-l7uhl?wk*_KN zhrCi^Jh2F2_-D5IS>~Rn!6brSCx8StZ|3=v8Fg`d14Up_=dqw(K8IPK%%6#N(U>gU zAx~+k{{l{I4nz7M6nEn}fFu)oY%*;n^f=)y_Ku*wEsePjwxk->G-%683JVZZX=VEd&%=8or~LweV1n zb$`%~5Cn(`z zH_ULs>#k(&&OB@cltq-dKL{$jkAKKolwu4(U$B`Kr-*9&ZdE=;IjDcIndOSC`V>f; zpk~&>;>g=seZcg3AA`wY0;wws)WYk%gTPrXJ z!(7c*llAVlkgCn?i`oTwxbdIinBn?aL)fGYbHC)@L;w!(GOG*;f{Gn#yah-=~zb`V2IIlLBj5-x1c znGFb_usenye?c^m`kd-lpI}7CEQgoxL5Kd#uRis2d%*ewG~iGVwmg#tw^{ew>pURR zmDmCPMQbOj8{cO^X7^%Sl-T@&xI1UU$7_#d(Pf^*OI;F~2Y{ z)IRH29a#_}?f=EEm#B>m&Az#T_z^SLGz;5)9_+vR%shE~!mFLVa`kZwd&>Nx`h*_3 zQT|$Y$uxopN#%(nCPGD?f3u<$vHX0M5fw6mA0@*UB|fRp+J$TM4emq!(>f47l}-A zQz+9p_i+m-5QF9+LVaB@X1p>I<-8Yk7h`O7 z;f#)@>{C*Mj_uSlT=8+&17iwb(BOI-&x-_%=^zI8Ch{CGdbA~){6{}EaB(DSYPzvB z9H4m^iSKAA#7yc0Do>ZCp_}u68GmCQeOq*Oysf1>%_2uD%*1y3WxBJh0s;rnay5i9 zm*#j~Y70Pq(ItnMzTEBFhlwc!4n7Bt&B0v`i&nM`Ew?Vn4ud*mv3E*PDAP1+Z4~x6 zH;i(0kbO?7vamvFrYD7gL9*m0A2TT~l)32-bSG1oq{947ShQ`-9J4)UT&j|YDLyw? zXNC1`p$}H5CkEAlH`e$jmH5BU3lr>gn-~sq1OfbpPw%_G&VKEfd4kVzPFn6jrJWem z2F6mCfVsgAu35y;GzP5{QE*M2qw(sq&1oAbFADFkYGq(fI=j5T-=Fm|+`%;2zJ0oo znGY-a$i*Ac&@RiR5E(OB?^8?n#>dFhIT0(o!-K2sz5s( z@Cfh}-%m$>ETW9*?AYV~%)+VgK1xf8`t5tUNh6t^gfk*85*_o@_z+>~76|f$CWEZq z^Wul=`o*Iwm)^$shyEX5)!XC9=WyL%PB(^JPJc!^_x;m#J8l;+cPplYIU**g2-5m@ zWWSY)B?vQ4YE(vV-jyY5I+Gr z-I3Y5dwy;)A~Fh~@0w8M;6WEa6|A+wjDOi}3Qm%2QfJi=W2 z7n9-hByKp)n~pFtB`n_*<}Z^IMVD!R-H}qz3dKg$w2I!pH8n`L{5xVigD?I}Y@ob< zWx@wqmiPM$qv-GlK3GHf!0>SAJ^*{9>4n^XQX55bD`}ZNGr1*7159Zr{g;Hm_qg#* zEx$)6Qw=qtcLl;BgNzHp1P9R@aZL^nrfT3j(eGdTok&W?7@Cj%*xy3EJ1QXj3E_vw z3HZ_D*f^2kAN$1zsp7{h8-ci@NVXis7Z8rlpR`2Nocs#!lH%Ba7w$4Svp)FXB(xh2us%HQ69rIRUkOT`J*|BowUWw*nCt0V_V}CR+7(BA zRIU5f(3W|ZT?1_q*2ew_UVOjnJU&1F;@l~M_O#@-qiw9>7nuYfsB@~9v(1$jntWTB z4R>h=tZ`WM<^Twcmy!lqQCRgQ=&@4kcLIM#y z={4JA%u3b=nX9Eaa|<`9t`vDEQQwN=+a3C%v@&&gAK}}ls6LFUM8$3l1cmg(Icq9t-9KfPfn>Ok^Uf`0`o zUVIAa{>Nj1Wik2EPg-~b2BfS?#WVWYFdykYAr2ux(n=jwb`Q*0U2yO&bZAiIb$1k- zE4gO|(AISCE^%l45#i;g_y$-U_Z|2n9x@xZC7+Nb_#@k?B3NllZnm)sSh|`X(SXY@ zU`V_0^|*2a5_-&Irnx7^lHBsTx|MR>ZQNIoq?&zL+1OyU7L0S%`&o{jn!A`#@`Q_+ z#C32$!0HT-(vIC`?U&B1!PA-joDcN5PaZ8*23pXCO5fssyL7Q5>kHetRuLW!AQ0~( zyg~3?u^`GW?l7FM0RIJ8NPIC}xM9h-_t%dBaK2(@ZQh4+KYFPqQl^INg?usK#-Z?C z%~^h^o~;?{N!qd&(!Zm%aT12exE>?~xyvZkW0tW0hS-8gzKOFHw|}?zRA6kAB1WL4 zbjY`S2y!oYW{ZRqA{?R9c6HKnE?aw3`Zo?a2`GWo=;&$N*8LFE>=mrD8$GRh7WP7< zHh2!r5Ov2`yHhIm)eST`o7FhNst_>-yI@d@LW!BbJfK>#n)k-Xwo9W7k&vmNNaaL9Jm@SiFzeeO>u6e)Nx0PXxjVPFHM zFq17M(yw_w;XYgi6}M3c%PY#;KSt9JELYks7VCfPR2YKM!%J+K_qGqNgaB&o^DJky z;1`rMh-{~^AQEw(s(P$1lK$X!8LCxPR11rz&9Q5M8*iPRMDYKUPPl*_L@hdDizY!p zumpA5nkqAGs*yL*+LLhLIdQtQU^3rDX<-$DBFM_{pMCyXG+>Fa*HNIieYy;vH$aAX zsV~p)L^B6auExyR{8TjKn;;BrbkxUh4bpA|(I+0~RX1`@X$l)0g!kk>-~diN8axh^ z&pN=X4b{?X6O<7rux7T!>)S}PDGy-) z`ATHZ8s2|_QH$G9H=p_-3aoMSz~D_zIR7?!di4LBWXMvX-9>I0C}YDjN4)M^pF4kb zq!4L&lDOe)X13-fS?pzFOd>ztc5D~#d(dN!t7l^9BV#R>Avx}a4`H_d%X$FYgiM7A z-eIO-2wR#Px5dyL1JvVKADbeDk70Mew-*Kc_^{FWT<>>68&Q)!%L%GYG#}S-T*zf; z3sA}V`X8EfAP%c~<`HQg7a#N>~Q#`T^pDdlv{`1y*6$x)o1@~BHa z9`Zb+y0tvfE>}K6!W2F*)#NZ~s#pA~_Ez)YLK}p|1~W)Xx%_&rZ@Yk|YiD^voiM1lR*LYQzW6V4YrU z5v`@(tpA{s>-Da5!=M6)shCUfopH8_OKk%wLXlfmOR{w>(9N20Td2YLPgKkSP%XA4 zkmb8Jio5r{|#COu0Qp+eaGpGMbj3Iv)zPWJGaa!J03E9VLr9vI29vFl&@v2e5%~WG4vTHz>IMXRonV8K_mA(R3;Yn*EV(Z;#f_1h7bC#l&djMS9n8s5adDW20eD4hDDwT!T%Y;#>R@YR zFXicdyAC-|8#Fr`%|qDGWm+r%VCQC*Kh{OUB&F4^=sixQf18!LKczT$5)L-8R_A<; z^3+r}qfZ?VrI((!?dx<&0mZ7|X>9~ae*>wnA6T}!WEYvhvc&^u8Ka9jzjT?-g6u?` zcrj@SWq@1?7aMlHalzbJabH?_i?wx3;>`+|^|OKnb7v)KQ@`GU=NSTrqGpBuwxRAB zyyuPAmmV_iX#+F_vG-p!d zl~IQm#HYljWx2Qzrx!m})x)}(<(%{pwGq1!K!9!9KpTZ_=V0oNmEKC^hAly59(vWMy0D@aJiQQk1-*A+_+p8Q{ zXC&qRQR2{`D_N^IKHaY*1qaDJ6}q%QgX^BG1+wV&5n0RHjYo%>IFA0U~C3Ze0w_Z>SqHXSf%0rxS_8)R`T=-Us!>;$S5x(xuxlw zyO2Gxt?U^Z*B9~FOKA=5iqza+WpH3p zGNGr|Utagj(rLY2adMo>Y&rGP_*U(da3f?}h3nS*qV2iEnsb|E3MK#-5f%p4lknf| zkVoi{5q9LSJ|CFtYxj~Qa%}|hMbi8S>}~kFIE&^_>zW4|Xa9Nw9YGf#FR_||{&jmV z7V9J%#48YQbFj63KQSx$6leXu0Xmg*ZO7kAyv$d1(K7gka&`u3r_xy!5p(~LPEV8! zTE!?)ZnoF+1LiaN!|(Py!JTz&H7FjKF?L@blr{hz;G0;WK?q8!=0Yc3w%oiO?`4c> z_N=tA!`Bpw?LeG57sjnRRGtE7rmbv!o=Y(_H^Ggo#Q&Z0`Kh=zf(v_*SN7n*&SUME zL(NU=ue!-KyI~`9Hc(F9Y^bi5AS_p&ks|MvTs46vyVhn-vsUn1!xiVB)P0=-OsqEj zyvaDoxRm}l-#3`rP1|(vP1WNJ{PM+qi}mdO)r7$@CMx~39U?jIi0+@J#hnDxT8|4w z0VG@b0V;0|J#Vggi#*?K%VhW5-NY2`@<>$>p5>@hfCnM4jl#R!=eV3>KsW$x$q@shaHNbqmf$c@n3HP7Wo(yY*t(ZE<>qs#o3I9(JZQ3rLeVKZzqD0Ao+xEEyhMS^ArZA_4dW{B5m;d$x@ju{;vC$2N%&mv1un!L%>h(WcPiZP{Lws@T-sO zE4$@%N-JqA3vh&Z0(aJ5A9HmvnJ@X&Qo+0b#LbHD)Yvj1kI6${B0;19$gUR)$g~f$ z(q8>iG5v?W5XM<3iah@_NKxsUT_$w+a~6zPvB6(|!Sk$gc1sbozfa7tE$cl_-M!aY zKis)%kih~{AqIOH>ZV=+!s%0F&$E6e5xgpejE*wCsLmp1O8Vtqbr?{|H7mV7zEr;5 zj{jd`0;X4c_w9yd7ej6#;v*w6TPo?YS-hDbufKn%aIs+dZe4!4@hF;(K{85$R&Bfr zzrge1FHwu})WPi7IPsW>D4 zZz{q@RcN&#cWI*h1Th^`bN;9$!G}rAvYx3nLx-K?yC95jK`K9xj;JAFu~(hhAs;;n?JC z=sFFulHff@vTh!~*Rq0(2KjX1v{OyZ-kdvk8*rHvK4wAfpSDIuwv>@U5eu^D>n|aO zSZ9#L{D+HP{)-yB6^z?0gs1*B>#+9B_7Qn!#TXmD0OX>s3J?tnP6t3pYgZ!|i_fSJy-S6*89xX^|_ zdCKfUhH;So`z0!UF*PCK9;*}M-a=b)u9v5s0fqvp{M%9j!Xr^LMuE2VI(IvR53^0# z?9CBoz~%5v3t#rprA#MSmY;t^^(WY`a`9agu%Rq(jOyE{=Z}a>50F$lfss~OTK3>l zJ6@p@vu;M}5EX=lfSz!QfRQ){#vrd>f1^9p{>!CEeOT7>dxu1#0q>W`cn7_hcOaWBYI zAg2bHOG#F8?$$K1p@$>f^22E@iTl@6H6pjaW)1bZKvjPRMYJa|V+J0+6U>SK*3k?y z+WV?IDsLyb#c{0oeF}_f!3DzT%p2z-bwW*BJ8=c2K_Fk+C+B88lJE&{H%^ZZeEjc^ zgqeSuZDAIkS0oB+%WMAJ047Cp!64^I9(+-m_nX0#>o_*Mu^_b&3X{ZxyHCE$H&dWn zmA;Ageu^LI1pz58u-%*!QL>UTqUp5GF(S+Jt<9bX@qP~J1defO&CU7R;p>FZXHjS= zke$1P#_vu$9vgp(TIZ(;7YPmygI=V#(a9bWcSuQ3sU#|TnWrvs0$t(-@NE%``>V14 zBB_b$-AU>Cq~yIX{`_&mj%AkFn_~csnYXwk|7J#8RvGQsl=S>1exy;#R7q7MQgBz1 z`aPX{Og786VJ{Xt-1pk+nUf-u&c>U2{79>>BwIf3R$P zPzlX!SB$Ok)?f7&gSa!{G)D>E@0NB_Oz;>d>H#{HW;!n>CRtJb{xW%f37wkqy9d93 zK4P(eevA7wxMc%EbiKI)yNDIIZklO_YR`YB(~*ca64CXFv~ScZM+N-BG!F2?HJ}7G zCSy3x^%7C8cF&(>#v=W&!ndRQn#!-L358S3A<#JIo#HtYft!RIWvU=!|UQYCbBjfY;X=& z0iy*t_5fmd{Ydu`Jv2kwT`+{5g%FtEPVZOw%Y*+@g}O8Mvnfhiqvl}a0pwmsIa$s# zSvx)Dqq#4|UjC6p6L4*}eT*IoT+ zg3A=``*k{ocX3-crf*A~ZO(+}-`&pbiyC2~zJU`;I75Zlj$t6k-rld6s&$UjCzEeD za`}A`8;KcfO=3d$FXWoz(e&+qGF*%E{}vwlBQ`+*=(*Svhn3m0p}Yrv_K;@)Q(u3b zcQa-1wWuJx4u0IkndhHTGJS7|GKE1L^Nb>OkiF@p`Gbqym-~6+Djmag;Yg1`6D`3H z<34gbDg*@ybO`dveP+1wLiz!HYzTeNSXXcAak)+wBhXoPCbly+C=g84cU0KkffeWn ze4;AHseb`e#IbZOSLHk9U+e3ufo9xzWIr7T!aj+TLh3na0$QyEc227*qBKLT9M5ZG zy|0&bOUz}VKS>?(BpiR6&0uY*h@;6L*c9MwXfa!&Vh`+-JHVrrr-r1SkJ0H`rPTp6 zn&f)+^V7-34pxyMix!)u{U0Q(apyE!Z$b1?OYJgCK3z??^a6b`fJM&$c=s3U!VpvT zPs?5>!Cx$WeeIF|og;%G`o4`|1RayWw+K?O8%oDqYj%A_3RZfK^nJX*0hjW(?f^}U z=ZIEn7nOV$R&xt;hPRHv^R|Q^&DR@!slsUgR4w4KcEx7i{bXYx7XGL!-UVtB5yd^p zX3J+%kCtL&ggW1ceY$Es;7kcD3-I`kzv3@2-W0*z2Jz&`@u``|=bp5@j(_X;yD@@I z{MS?&Tw`_{PYF%LoQ7El_;nevJ1G*(j^o)SRh4C=2XE zqEi{F$1u^`dQsm6G24GU-@a_7o>5b~ySIp1%s&1ls&Cp;S4`jtoZpPuy6IuXr_oB) z2|K-M!V{aeE_fbP-A(QOA!i1sVXxeOL zgI|E26iG%~8db$M>#@TUe_@%c^mQ$5QlkiFAj_i&`rdJCVnb^h_^<^2TT9LVMaqHy zLgjhzGY)#d*EjRKOVD7M`Uihdpx+dh4`VrGa(Payt$$>;jnVUftim4uXU6npN49X%h$@*-#syzgU7`jWU=?2an zBZKf(`(CD1Mll}rS^zOkJXhN+8cA^9rv0W%o#=W%lbV)wE~+T6R26t9NAW{$bN7-e zA;)3gicdX;jTkV{4?-v*DX+>cTBxH$QQ-T8qxt4GI{ zVQxv;D;-lWW2B%{rem2+er`i|2QjKwwyfP+)c7fvI_X!6fN52smU+GL+_*zGqeo;1 zHO3clk&%RdnCk(#I6DjPvc0^^{#Zb8S=A?|kRxi9DV`uqnTDSMRQ&4B8(X%>v}N5$ zhu1NG!Nu3{Wx{zDnD5;C`&nny5!J(R3ZEZ-8~V9lp4PDQVcq7sG%a%H_jQ;T&OnndG8%BmCt`T=evpXl|-6WFzviB{@#b$62!9p zCj6q}KXs3be=AywBvq0+Jd

{yEYfF*LIDD79gMiBpgdI}-f#cZ{8@sVLqT*=yG+ zAXmX=NO6=qt06{=0G^HqOlyBh6wO6Y)kt7jkQT9E%#~tGK+CMVd$S#85dOy5;(nFu zn@a!xoD4L-8_MShNI-5xMEh2Cd90Dh)oippy}!p^#7H1QVAO8wb>9G-9$y@TB$cxxv2F?!C}k2l{J? zv~F66%Mf_vJc@5ho-KPKhrOw08r(l9gm3#VF8@lIfI^$!KskEzcgh@BpNo?<993 z!rsP!P4)pGB4JF|HrG>{QmRrJL5#bMz3zoV=y%PY}zTkw{3TsF}=_tZr9j*UjqnXwuQ z4EmNekz$p@|2S`KTyIo45qZa2$H~D?N3ICIPoD*LHERTeJD0`E#`SQ!%gc6p$ozP#ZM@Xg#5=$J_akQ?y|+Jz?WAzY`Sm z1}-L@;!p1}#_4~gRLv!pCMBMVR`9MF${6?_4(UmwZ~o--9(UnQJN_xJt7>oZi)*oI zKJL8deCiP3j~Aq_MmCcV|pa?9)Fl2gy7Js%L&1 zZ|h-709sNs7Gr20YhLqKjbAfQQn;eEqPB@klu9hLqRc4=KXawJ=DI7qY(nP%|2Ac` zD=QYChGu`HpOlJHfBilHv%faiDkC7`cZl)=oP{_OsA+I(p<;znH~6XV_N$N$C&a#S z+AK7Z-tEy&&XF!IRM9e}k$X-}kfLOpD@&TF^32QfF}wC>Po8=( zQH-+`9C2@+nnl~#DX(b0<=qdee*GH!G@Q5Ri#3HFOfO%)?6lsF;piK8YJdDcJzZr` zT*21FA-Dy1g1bv_O>jwYg1cLAF76uKb&({v6EtYB#XY#YJM6c4uip1>?^f;BNS{7^ zdgjhRPC5YZ6hm$QvxmhebWg$N-BtygFU6zaRp|=+b2Ls1JDAY}j}+@bLBYNdX0iCqV&t2`=kLt3A}bH* zzIT+K6P3Dk78SVpXL@>ftNwSZYi{rUUj6NQc{*7G&df|fuhbCzh&5h~f?#~T-5$b7 zIGssB3SzRioXKZ<794|k53q1{co%vxCU!)L@S^x( zsp=^)<^Qxv;t?_J!%>)Ew6(tSA5d_4-Jyi&kW{S^jW8UtPSsOr3iz+u_&txr{LHGz z7CS2kPRl>T0O?_Cad9nhfE4OBQ^u1CJ#n1LGos7J^Im(BjqUV@L zQ&9xz*Tyj?l4SZSuE@&fAm@o&b>rCmnRnspBfY)I4}%pvBKWlvs~pDc@^Me7O~O%U zO`OYac-eSt2CI*#;MZfOIxb~|ux{fOPhtW8EVpm5JGG0vMATSe=x(UCFS!|$6$)g) z;|;0V!zo+;p<9UWscT;wOGewl)%dc?nxS_M<>Bj3+BQ#)Huc4}q=OD4=dV}+{$Gq1 z8$|up*;qH;udF^k6LyK=8WJJaB|>g;P}ma;F$tp~rDkm7Tlxb$KN`cH?ee=w zW=%B-Xas-lXboKVO&XRphPabi4gv%FF5$imRJyO7dhXxV9hddAd!1g6R0W-y-ZqT( zMpXNs*g4}+1VhJkPXNs(@wbGP!1@()@#D04DT7N~ph~7`-zX15A!tGZmNXLuh5O~c z@~9@qZgGitL)>pe3)An~WOGb(20UhBX=q!_r}Q0vDc)^>*T!|DxE1w6zXZphUJ`7#Eb$9>k(E8PIhE>Gqq`s73e^u&^}Hy z5EEDKVCReK%a-^GbWVpaEcH-3w>@=gcuVj$=%un{ggq;6{8)PyEi*ruX!LzeSO$aZ zHV#?t{hiysdYZ`{?L%&2fak&LSMx>WsfSDLt=F~-(|E4KuP~x|&$t=GnP#_bDUAp2wg z8W{Qg>R?;t$@$S{SS-loTqo@xHi8`lG$TE6|6mgKm%fvOk+a07Y^CH9PQD>15o*syL@%nk>gZ%$#1? zPMS?_ssCrC33GOT!i>cFR>4O$`kYnemh%aL@uZ0&dER7{q5W5rRzr+z)3(mYSIXu{2xzEKhn|4GKG zszV38#2$D_*&yxzw9{ynha@3X3A4RrC{x!8;U#miqVLoZq{2~9XAohq98Q6A8skJnY#)Lm~+C4*p+$IfqGP;?xLi?5Gr7zIa)t*bf)i4w(2E$9LUtaTu2j zR>br(ZsVVg+VRhySvmdQFcf&^m}t$M{3K!L4;wtx9`lcPGykC@_Vh1fS*pw--{l3s zzPSZXcJO}RiBo(#I-SbaVk^TKJ!A0Hm?2rk4YfItBrFFeLO5Jw?k#s+bhz~}$N%2B z6+Y#v0#>ZyE+Ts~U(C#5cJtnl?bQ)sRGxafK*=Vgiww5e8Lg_RbNmT9)k?ZDk8$Jg z@OnGyE8q~sP8?jqRdb|1#LV$WWCHOl$sqUKw-??P{CrN!Cl$T&Flp%hofiY7gpO%B z0(oAWQS&F-C=Y8s&-BU!8OrG9_2}zKvo2X3_&hktK?Zp?R21k^yNtQD5); z>3D_=foIO3CG6Zh+?qR*IV`;VDrE>D}e#$I+#`Za`9ZWkB=i%Wwa~p!pZ3~2G;nAiK z)?T@POy0^AabOF^)68mJ6sqIH^xn}-9x;_~HlDSoe@n@5s?WQ8_70ddkng*?pUa2v z<=$j{@+XgXJ-_^BZ5e-LpS_AH`StkS7vXS|ATD|nq^Tt%cN2_Cf{>iI8DUZy_~aNN z99jb(0#6MCp^<~2vMjQ}>@=7=a`?4X404(PQQQSX4zY6GGRq+I9G7utB5B^DN$x-5 zE0~4UPv3ir=*-;u-~g9KdavB^;}+a#;Ja&t-j17rcV@-J4a}kvaFjSd%-kI7n#DLH zc^#Ft5?GvmiF(`*6=9!DV-Y^3P>QLFzg&}co+bob7hh3G?FA=7j07R5+NLBgNagx1 zqPNmwjPMj_;l!i6#Dwe-C4a2Pd-1bAGFjWN#YTD*Y6_LuZ~|%h8-Mln9$r-aV@bHi zCt8Z2*fwZ9D>j&&>@^D5QIYeAAMN&kx4D&ptO|!~>)-Iq+xgwdU2@ut!aW@`TjToV zQy+srl1di>J{#!J1-^|Dv(A^0c~WJ);q$Xp3eA4$V7ovA-0fBU)#Fd|6IKB*sbNq^ zoWrAmr!K9kD8RD=^Y2sBLH_i8B5-o4E&uDY+2%Eswg*v1MXaUYZ&@M&2hrS_=9I7S z=x92~`0#Jbk5shs8JP9O_JTV*#V{$w&?Sz>b5m~_x*#vZPYJPqwY&k(a{-tYmqGI5 z#rnM*Z>iUqK}bHK{ZD^OM9G$gXG;@&np@3)S=)+ z&(8tdIu0(BIw^c?;(%vCVREXL;%gV)RvpD5t#bJa`c$1ay=OT2*WjB&i-vT`XqDh0 zxBCY6wuOIL+x@KS-pv*)66dPNvZ*PwS8ohjR1;=#|KK;5bRDrfC@LGtGoZFVba(1)xXyN1LLba=7yyv@mFw~H+ zJq}9t%F61i@ICIUsYBlCBg=ZO#q8mRQBqpa*vdAqN2L`YO^WM6rJ`?HL)g^Ok_EP6 zB7?3ndWnqpgdlr2UQZAc69*+FDdhip07!*}g%$Fnt3B8J1@2bdz}{=V&^X!^I0L>$ z?am~K>JVc z#oPZ4J!|+}v^qSeN(_As>qgkH_Wpaw+fPO0t(X+V&kgW^92GjU&O159v925lgO<_r z$lc}Q@IoEsKDhc-+KOppKd!nPHrmbJCR=>IRn7#;!ZBTB0WV(60`-kmrJG%uf*3cn z$T5ZU-9u3U!u&Tdqj(gI(Fp*mNQp^pAt*v~OWsq|gEjRhLEh!uvTMujl4C)8N#I=Z|?FH2cEki@&T{wcSMSryze#pGJ#Th0+VtGU+jP- z+z$!8JlLB-ln3_1U#sxyoUH4uQ>iFw%WDbWJ6pc1*@@oMIKB7xv@G1I$Hpi-8*lF> z$6Q|C8!N;?h{Ei<{fZ4VJ>Mf&Ss+%r6Ik~j8ST9CV=SmBy0KN~s+z=K$kH2Ar?yy!K9;LkAU#y%3J=*90gVeW<4qQQY}TD(0Ga%a#tG z=sbREV*jD<4L6IN3QzPVvrJiA?Xs&0q$ za|F~58|J+yxPwNS_#iG~v^OJL^R-xNpcNhaS~ z#|x-CBX)6#DLFn;R~@uwjaS_zR)>`vN@Rg3eVJ;lg_^U8x0xf9VuFy1t;an)P=CT_ z63c$pl?e0N19bBzP`}j93Vs3K%{n-_BL+A#8plxLQwEHwKiZhdue)uJ;t$Fh2AAu( zJR@#lksJ(eZ;vFegzlnD6Q)Dx#@w1aQq}DdB!h9pw6M|FGK)t7xA>I4mzjK^t_d$w9|2;MCk2ZY6KR(^wkUj%h zNy)Vjn=rr29n!$-Qu2a(p1fIFfcb^OzxS@oKqxF1ZCG-K16454<6;x&4O(=u92m$z zfg@PrA3JJ$7%T27@HV__Cz0+JX>7k;vioCMzi0lC!o|(4u^7;b4Twd8?w?MPhc)wq ze{^E`ZW1QsS4$WPb^mBb^q_e5=_!_Dy^;uExy)W8J=jR*BcK<<&~R(OHd(Nj`}5H> zN+nhYxlxNvCy`{f;Ar8l#~(dcI4XNgV=JEPeAum>UqFdJx2Uosthv?5So>wRUBo|w zZTa@fXiX?0*7g)~1BhR&?8n3shCd{}d_kQYQP9?TrZswHGJRQQ-rOLqjkb=|z}NR^ zIs!SDKh9xl;z80{zM;y4KbU`^B zJNJ3u^}y&k-tBP$#-a-xHXf=L|C?DHVdLk$!6;)*9g1^U3*i0?fjjH6fBCuA6vc0b z+iO!;O5O9>v6L|SH*Mv^rkk+uErYt-qZ&t(^iw!{@Tgb+(!-h9ZI1$fs6%7?Rc{Z^ z$ZP!f+>u%6xloMn3$Z9fhMF9f1%0mfN!!j+@5Sr8kvkazTpn5@9-acIA&6T7@I2jA zk_Ph5Z`6hv7yuDo3X-T>ItOxx8Q!_6FZ#U$aioHmQ}y?)HcHZNj|=tNyDIAhmeBKU z2i!1}xO!(sv8^t}Dpv3tJzScgzrfQ^*g;rtrtM>udaE6fhRzK~?f|WG9$cC8xMN4H zcc?1nd^}jnZ9RL2Vx|66o14o`nlUI;c)8C^^x%3E0pnxC-Ny%{aw}=Mei4;EE5z*X5AzV>Z_3OwXiYYj!KLO58~1sB`g))vna7T0IAf zEZBTKzYLCEARUGXxjrJxaO1_WTi>nE^Kk6H2gn*AE^}>J5`-6v}5s{ zI4SjpfQtvhXw^k0%{5!9qMK1=70oS_!^376<7NIZsUR-IY854u<$lOCj~0Xedzqa; z;QKhZM$I}6FQ5CgWefAP^T~1jSi#Grr~^^Ht33lGU0L~|;n!l90E^(#wELK1O*tS5Wc(@j+%;bV}N6nOU6y{PkQtbwyiL%fohc5DlC zWm5vVC;8y$hK!j~LM0g@*=4optLTZzv6O45?9vk=esyFr9H+I(Enw6dzQQzD4D)=x$8Z;;x z=e7iXjUfB-!y-VX(<_qS5>PL3_*(jLR_IgFn=A5ntd%QqF5w@pg75 zq|6q@5*g_DO^L>M7cm+}cdZkEM$^`BE3q^t3h2d{4kXrQqC@>Z`d!%tjn!3}z5je@ zZv6Z$i5*=~CnL7O=XAD4FCRnOsE6>ZWE1)OfQD80IN`s7&gbh#*TS%8Csg1jGxw0O zF`$^|P0d@K{K#ozf_?DssEg?q$BR3j_W~pFY?TO^E-*B4`pFJ)`k9$P{u^J*&Fl4V zzpwi6R3pRwFpm78`_38US*KE!Ygeg)S3Ndn2}P-a2VAGn#dpnGP`NJm=T35?e?Q=V~rx; zD0CZ{t%kbzA4bx^8q`xeJnxTe4~f)+gOWM8T&_R3j8tk;Ekz3fZ;$l#ZGJHK)O?~p z=3c$%ymNlssDJ1f#wtv$4)FLS?nhv0@Wo*zyT40Hay$`&dzJ0dOQRT1hEp_&g2NNG z*pZoCecZ2&${`wa=~o&qPee-G-8VSmJ2S_hJlxWUp59_nGxo}vK7YCszmT9aKO;$w zh(2#Mr92(jXY(}?_)E2?bg8KuTcLt3&VTm1)bX)hlN>RF~JJx3#DpzjugcA4e&8&Q>iZOEDKeC|N32w>*s{csvDj8?fn%; z>(}E2iH>SCv;^o8OnW!KK>F-B}Y=VdI^|;w@t=RwZfp%*bjV^(N`O6Z)xEhDxR+R<; zB{NMHw@LK5hB#+KjR8U7wmh#51R;k_kd+Rlx;rwzN@X9j zI+C^Gdtjf;}RRP7T&Wqa2rltK;V!XyjM+T2}*Ng^M1&bhEOteZG z=%dDJc8~N5O=qSMuAxDqBP&LFbB?}f0krp5!%o_0li@$AVRULK)Ru8~&b2m;B3UV> zZJcJCK-ibn%CEMc^f^E4R$9raUYiNBwO<|sR}BvPG;eu7!@VUa5}s+(^ZSQ^pFVNa zQUUK?PBTxXxBy@@lAU{QCLA841Q%lz@6 z{T=z!!+Gw*YhK;`^ND9b-o|_JYIl9xDq8={`F^9gQHl8Qo4M}}iqzXi`p;#Qubsfj z-m8@x=on$==Ug_1pqp)EQ{K431K_~;82&|=PbQA`zVh^|m80dH-u{&?8;(sRb~@ay zxTO`bI~>U;@4gOIw?x*4&l zBF$|jm`V^4qDc@cOU>o8cxw&lMZK~yBiCVxVt}i5L*pZ%-fG>LMT!6ius9-Fl zE_c=cma#jT!EF-!_e(w{vHN0=0QWybyH(cD?F;b{*KMC-GTNO1RJ zxtkQUNk&^qK>n8>@Bn|nk2amm3M6Dm+cg@~eStiWiJQNULGGa^SFOOSzHrx@g}JWn z2yvi5^7<{_rP-rB%!>dXO6skzSfhmb+)MoKCW35?J6fy-*-mZor==d~duSyZy051K z;PGGahbPUhA8uLd0j7Yf{jia|_Bof2&6%&=bbJY@i)G>u6$vq*5x&b=}`=Vl}Vdo9PsUDkG+~<4k*O-^hc}Vr4akz!&E#bIF;XU~6zr{w# zIdLnxmwY916ad~Tg;UHoatEr#W6?;L1`4;t(bnsuj z?Qd?EH6wrog9h`G=Cy!dFxP94mo>0m*G4$${ZxAAb*VTZ)Gr1*ebK@*6Xxl8chaD% zY%n{eEKCBjoU*L?8hvjd`j9gS7I==_R|?!)V*DjRi<$iiIlwS_QWuY@?Ec0}T>VFC z+=+67=fVU=KyfI&vIx5|o*H~!bq1ZXynbwxwF}@OD7x!1ACY|tH8e3Q=c1Q&L8h*w z^IBuB2Oh(WVEq7c#jCb^BMzz8M1UIdlHj+86qrD9uif?hTl6jiv>p@oFEV=gD@cY#l$s!zhlL42_;HV3( zsd^>~pY^@IFHaE8#8G03vviMkp2^`~W~AOeIyf$;C7mvKe`}FeYs=zFRgA4DTBjvc z;Q0u6Vc{$-85r*;np!iB$R5J(``83Z0e!_xU~p=pjSB5NOzLLE%;x@-R`neWw7U?E zOKJ7MG*Zu5q^C#FQvUlLvDPV17Q>O3ySHH+GLedJE})X-{2~G1?(msMOYl8=i9qNs zM#f}4U~4oWtWMb*X2n0J?O$2=eKj#Rj3a-9il`z_bG2leCtqc|@^t#kseb|}=zY4S z^Avk_=ID;`y`%ROz1899=4oEdYTq3cKQ**DKJD;Lj!<|RAzJDZU%Z)+zFK;{*39?m zjp$lMp%C{t)NsOyK*8B$L!De&%5=0j(COIA4!pR)2{39kBOSrWL#7KFf>Al}kS^?& zd8c7xH<$H>x_o4>Hk7K8@4*^yUloLzzp7zF17Agdyd;dA`?wpU)+iz3vo3MzfA@F( zX+H@54_H~*WxsaNXT;%`_-*ZW;hBGR^VI-p@|eaYsv2XIaw}GM4^{xD_f81bEk)~2 znt85CjhbHpqeMc!kN?}I>pam&i($HaG{>bHYWxChXl~=qn57&Tl-B};Xgp0Orlx9# zv}uEwV8FDc_|v5y*-=pJvu%vKudHFwr?;Iez&R;Iddcx}7lGk^c}&yq9J0Ldi{UOM ziZ#qjWPB*tCv0_D2|3?40D!9*f6Qki@P_}>w=>`SjW4&S%3}BWU8&D%h22#N{;Usi zet9F%FUOboxhiXcTcCbb9*gY5svw`Nnm!tSSo!pw_jPyB_7|{OA7@6#PTDqh%~q0p zT0`Dyr`w)4#IQ4u3rs2Iw`wK@y$oejs+dM%Yl{{-^mb9?2`U>9Tp?G*^ zlNT3B`%*Y0ZiX67xd)8+HI4L@`02hBn%YMFJCKu)1Lz@|K-1WbWcSzJbqg>p1p+T~ zKVA|FMk|>ktDLGE4>>&iGdG32K0%Ze?EGB?5BjD8b*M2>j!%Xa4mos~x1DLAr`Ll2 zc;%#Mw2Pv6ov;9@$JoK+etF16>cLd&W=&&Gev~mqEidccLFRV+BZ_fx28)xD$7%ZC z-r>eF;5KXnSMBCmys2JuAOB3ezI-&!lfCu{-M-m8dG8rcgHHoRdAv74qJ`{beSLil z!mgC0LKO7jQyA;u_olyD^}2OwVRKoL78_4us~hP;8b+%Aim{cs(JN>?&)h!_Qoczr zSz?4#K8S3EOZu`8-cA#2Nt7MA4m5G4(ooacRAvHAteZQ&EG}A3zdTB(OYBKOeCi{= z-3(E|w-@$qJY%_-+P93{s;cK|degLYof=A+^iJR%B7Ss!bM9jy9224i9Y#*p}IE}uBFRt&aessJ%ze-tI-YZ{oQho={yfH|H-FBb7{xfgN-6F8xfBf*B z2Kvg-ndp*}w^G4EBXHne{NT`(YyCM6JA=D$!%i@-1ikchyhho(ew1<^bnfm#EI@FvkguLD;5`aa_AuAW z5~mc(mofYrQ+`eUmIT%0RNN7m!TI~rs2MRK>Y)t!(mgJM81;!Pq)L~D(w)KxpTWB` z)lTdfbxbYBEd#cK!itIq4A2Llr)prpjg(SPf?6t62fk&S02^NsT@^n3%*MTiP^A~I|v zcM1Y&p{%N0nK_vyOvOPLguVTRwCbExWAm+_2sMfyrM}&<#5yXhUa=@3J9Cw&v6)35 zu3=4Ov6{*@^bW<5o=mGBM`6=M%e9dMpq&IFYHZC9CReA^u4>w z&_hU~sb{7*hZO&`Q5k=4kliih;w|7qDqxgr%ajcKhMPh|ix7{^SU`n}d?lMnxsiYgH|I4}i!21T-f z&zq@YGV5oGd5Wo_7`O?U^0*Rnp1pVpPS1MBosXZJmrqtz6^o<&{I@O+GqkB+*0b!Y zHZra9Dy|I$JGnirVZ%^xOfihdbR?prf|7KO(>*$Y5G->H0DkQ%l2lIJuR%_Ig@C0T zMjE9An@G>hI*x(Pa&ed`7lT_--?wTGA3cO(%}PoEw<^XgUzxvk3!0qxpgf9{AUgN- z?9fc-Pvt=5Ri*fwH)d0_KVKWxGHPvxq@k3GE^TfI7xHsXhwe3aZd*Cop%WZwlGyRE zyZsb!Ti*{5Ow7#aq75{$1P31x$QHYgS>Qa*J3W!V#uGwU4>QYHIh)1?#a~@cJMLD! z9iSjVsU@hPXQc|1P$2PxAoX6A^P$&CQK5%)y{w0`q-C=hr8bTkN(Np0e$NTh>56)3=& zr@Ve(j4sBuhx0QYs#|zo4;isiuQ`z=P+H{v?#L1|@!mM^o^`(KM~8py8KX=jbR!G( zTqxpp8+*M(GWLBEisV7}ezRE1Mzo!{<}d4bh9?BbSIX|?y+%kx#Kxm&49~J(%qff5 z%{j2HnC+K;BH2AM$w+*4TuHgw%pqiv?nWmp9hRP~0Y zl6NThNCl1Tj{yw>*l?kY(MfaH$guDI@_%p>2e>XfeC*{-zlMjs`k6ay1+!e*)s>%@ zm*@Q=FDJLZzt5RolLza%%bWzM$!5Gh@GDfjoNeekeq7BN zadA?{@X#|u4SHjqDwX1=h!QmMO@gp_{aGWM^#+TPVv0`z_6>@pBnpkfrce(*ZDo|lWL`8rZuBaR0rps{(q8Wg3o*@w6NC|-bf{~8CGkc z)?a_Ii{nNQrYhHwlTtucpk|c)1Eik9S4O2hOXrywEBwhgs#~$#aMe=i7x=UTe|UCQ zts~NHN~u}QDIkC-nS~}?nPr^ zzpdR~H|57rW|$P+NaKAU!#9jf^gNqy@aEXYEMaz8{kBzf)EaulL4ZW$Cd;}_97YD+ zTH>c@7|t+>^r9Wy2NBYS(rN|cFDt(UKHe>E8e52uxoV9|U0+{2-^^;eops!eLyGXb z)#6+^rL=v08KwR;4G&76iIh}*(`zy#08vDM$XQA-aXI_>!>K?w0=kA`K5d>;bbj`7{w<02N zn&|3CcJDlhM6jV*Q?yp3FVX8XdiYuu6E?+166MUHdn3xSi_M?Ha&S5 z+!k6@wXgy-i1TbX@fclUn&Qqy@}RuD-R6~Z;Fkx>#I%6a7~Uh(B+2ZAv2u<0vs%*Dpb=KlG@BYiWn zil%%&ar56a`)D0rrXJ%Sd25U! zuL53d<8+PlA$tN{RH=!;2@-%B0TEP#4xjRy`(0-^N|HYfYDVcF8L@8J!q7f$#9<5oTh9!x2!D1LzUW$r z(P0u1pN(q%P7%kA3K79N#R4wcMzv0v$q^~wItc6C+EsEsYbKhbwXJQ^eapx@;*;fR z1mj&rD0ekw95RwJl}W^292u+|BVqeB30yzX8 zKFL64(Fq>ieBkPQU9oeHNP|X!FbgwSA)v92k47=yg9#3!GRiuR+hUTjaR0|em@zM| zi3-zYpdC?86KlN4xkU8^baJYP_Pj+X7+`iaD72WS8~K$R=48T*tMI>(gLI5O*eaK# z)D1FUAcMXw4}WV>*i!uX$xcII6Ob)dVhI~I_Yxyvo1@nA!Yq%a8;2K)=TSBPPP>+d zn-963(R|+Un3v=yjaK;wII@3$lfdR=qSNhNuagQYKjX2`l}TZyznvj5!mmVE$7Lct zXGB7=F4v*o8U8Nyc7)oRDbbqb1%?g5n<*2i2?4fDaoMbF6%h~=pRIxuW%EvH+fgN}~0 zFANN#=)YSImRqXyaSFrIChe*__^Tnw4`EGsdczg_PpgxykKJLNV~BV z6XRC)h`SR-pRqBWJo(kTkBT1)`|^3vLp4fZrGv`e#!0C$UM#D{hHIiW2ChwJNkp2; zAz*ZxaIzubN!5s<+{^MtL&eQUMa7*nQzo=>AJTF5MmC_~D|aTk>ggz<`1M<(ssuS{ zwEwUT36yOv?MczB&qcBr=O(#AVBVOg{68p46`Un| z=e-?wY%Z861o{%QI?VV_kG-Js)+xnBxTQ}2_x}F=g^2&kX1)kn0_^kBC^cQbG-2cv zKJ=m_l!x{rP-V~?Crqw9dTNAH$_XaK1EBo(4PCNWUuu!Mook!*n;p^o!7zU{;kY$DZ}n{n|Two^KeZR z+)A|V|EC<8Phs*qex?S^)KBaZRy5i``nT&3VnGf(^aztTm{ux#UVoz1@wfyj5DEZ% z>8Cpe8^qS7F#JU>(*v{SR9I6*|z0ArFRJJb-m+WhKk#`_@C`l4V=zzIg>o%jMSjKT~zGX+c~QBqPysi?%u zYm=PIQHK_QKxUmox&+XgI|8FOiWEs&LPo)_*O)PXu*tz3J24$sVFyF0lDNqM8&2B} zdMRV9JBuu65#+j3bzqGFJ6O=U^@y7up%F&GWti6n11>Ajo?o$2qa{r?*+_}wTEy9+ zV$+TlY`YieqPn)C4f(UHD8(*8qlg!ZdEH2=s%#sqp3OwgFL zL=MT&d|J84(~ffF!6?p{AFWdhgy*#z3&matgG-vCp7_M803Zw@!CGQZpp2&0z4;I= zU<>CmPggG!S^spu)$vQ=>*z;RqZ)AD3&I2-EnrK zvgYSjhqiwqGLY|8BmnnL{4&Yht+0D63~m}K5Z_}yA41KiG5@<8g#t&&Ysu4uw4#=b zp$gIWBluhv;P!Y?+Q^6!EZ*f)*!fRjx8P%|id-N-QyRl`dhqkAFN7NQ9BM)`3_Eav zX`87OyW6CKc<_(zB$z^OaWfId3D16=b;|aCjJQ2h{mOlAtl2ZFkN_=%+p-EUpu__D2f>aLjE5KhZ$@1M55(2$p8Rny`icFQ1 Haq#~E(_^Ju delta 30134 zcma&NbyQr1jZ6$)DNKTgD7|s1#p=yoSZ}PKFJ5GDY3+}((T|X=RFL*pLy}U%n5~Kiv4ZPz zR|)uzp%Lk_vHOX(Sat5ZF^k-3UriBaZx2C@>DhkP=$L4LQ5ItjFGhOo%A%e^UQMsJ7bH z&vm9oNI1}Kmv(UC)7*UoV6G8pnB$1cYvZI*@!*^y!ic>BwWcSBtApvBlot38YBfzO z(-qVHj>;Z-)F%jBc}V$HGW{`p;%S+}3Nwl7{V62A)5+CLsnTF$LBCGE%U^-QSKQQ5A}CsTzuqdVtniBT~<~;p%7Fc9kS1;mEfB*W@)_ zgBHJj)fBc%HO-oTr0%c4?uvLcaTtbGwyPtP5-< zJ|W|I=M-Hm$Z;2taJsSqQ3+(B7L)z@?V0dPUMn;rp~{u>3$lbmB$OzwA)y&W;gL=31z~hg{IlehPm?r0=kI7x@jB<=%b?ZZSj`s9VXa z5q+nCQpdfFPnCnM{5#r)Z{inNI{2vOv9Vp6c-BRDM&F>~AZONv^KGWZ;RYL91hb2*KDrg1XcvM~x$I0}2%WID5=PO4! z(2UJxp&PZRr5l~sb;T>4Z`ocr6K7=+^ERC}uR*QdrWm&>35v5qf@!rad)!iNj zp^ktjU2kcu>aR|K*@jXzv$vva`}jO)p9NBAW*4#a{2?LhE`;QJXW76^ZUJxjdl$;r zjMtSX+>6uEu}G^6abJ zinYRZnoEpoEM)&EZ&k|dQfFV&#g4h-M;m*OOmWE!>@2Y&86Wukth%0Xel~6tM%mpD zHEJQb$oOC!Ya}V&74eI8HmZ?rl*aIQ0Vm+7Mr-NJ8FHKK=?J+=uC-FP)3|QV)|&D0 zu)Q}Wu97sWGcla&%0dAfgwzr5vpc|o1?dhGSgbm8a)ToTgn8l-a|EkM!ioH)!_#oG2Sr8>W6t|8NS_nY66E=v9J-clqHx7Tmp?3` zdm>^^z2BR7+nF#S_Mu&^>>Gb?d+~5yJi}hZUe;#$HPkJHh3}o~g_VM`ucoH!gaPQ# z>EBBZP1@AfeAM_18$SJ}Tb5ut5ZSIq86MVAqw~HZ`5F_yygJZmHn?k}&+x)X6Km@i z@^akgTHohksHOEtWJd9a1mYPkcI)Oyl2rrK^)9ZWpH7bG;JNr!!QPNFmb^y4T{$p= z)kci9m}NLQ?Ru}U=~#!GZ4ItH5cruY6*wN0WFHMP9c}ZpG>5Q=e}2xy-ul;r->e&6 z7-vj9fAD=)&%hmJjOfa$<#70o#mXsJhaKjwPd$14JOc8ktC7c)Az>0%ESFGpq5LAr zgMkGy``r7tZ9Z%Q^Yw}D*1UQ^shCr+TTiRdo695C%Y^99@{cri^1$r<-dVSwML1;4 z!FPRavNfZn{dz(GSK~mI?o$POW{Af#-)?(Yeg9U|yEI%494T%_r=?I`;=LOg4^yn) z85fV-M)&Zw8UGor@RWkJ)Fa0V6Wa>Y*cLMla8@OQlOSTD5*&iDK^d;Gmik%wN*JDP(E_HfKt*S|K)^x2VdL+?o}+oNO_GElE4&i58+ zG4f-3;~+(@j7<}Jg{kBfcE_W|@Hzi<0;j`njCvtM@q-(ZfzJWCUm~X?52djc1=Ve1K=~*KL%e%3frGq>|gLG6?H!K zGM^+~>`*FQL9a|zFa-i9K_r$^febyNifo8|Z7MA#0}?jjbbY)jyIyf=@~r>25t~TQ z+EGT)qwk$d{crP)0n={2NEQTPUOc1YVTD%EP5K4d2h!gH$sf1?4^%WVN}$%Z$wZK! z$y^M;MO(2^r7|UZvnZFVq$*~SmW7=@6E=3ZQ-&@)I!AY3=t^8xihq+5j~h3PRKWn4 zk5AH=52ErZt2+p-rz@ZCtve2Qoh`HmRjs(vyW8rE-NhK8}xQ`$_c)O(P9H37KKbkubN3-P@jXF$qKSG8WK4 zbGd?gZfW5+~4(2pOwBaA$JV5DYiVv4ohxkoq(!9hm}5$a5(jn7J)#`K9J+H{TH|P zmHbSg{U~ZLAXyAnbK*$z80MhR+m>G zCV}%M@EFSW?B&cs^Q{vwq2Bmr{sccDRZ?1sAa%Xm!)R+O$Ro+{GrLkK3Wv_}k)w}{ zjIc1r({rjJWN$Yz8g+l(m%YxbTdgmef@qEnM;=yh5+jFE{Qy6s3=QeGm*PE4D{ecl z(|3k>qS3fPH5XtAq~TSpHfM-|upu%8QrvwlbqFgj6>GRN7IzIqnXGcEm-pCWy{~KB z@u8nnumfqU)F8k6z}u1d3LK#RDG>gIkr!|R!?>#Bo3C%kO$aYu3%8x7+B~^{XuY5D zhgoX;RTdo-d;?g`xWY(*$g0))j4yYJ)j5lj+RE3SQT?#;$}sGv(=jqV+~*JM*-v|% z2HFX4lthdjpRobfpO8jwmdy!=VvE!PS*f85?sTGYK4Ds@AI#WicN5DqR2Z@o)k!%l zac6T3HS+$X)m0iMJYt~g?_tNQ6%kKNH6tZHjMPqWXy-#EVW}xn3R_n*>9=Kn9}a6? z`@P4Sj=p2eq`-kk(JVD==)0JBL32LXDIF93m6oz{KpMbak`KmfB#fXk6lTWIMCk|hn^+gvZOX4!2tsyt^}2|G1yV9%ZT~(>5G9??(dbLKC0|o6$9m^`XES#9h!DBinpo z9$OcIfxek-^^x0uCDb&DugMcc)^oJTd%g~vhc6MLCB5Ur8e$$T6h}qS?mV9zSJ2oi zg>#%{_D8sUBP0$3zMzv6j#toCAO-loth%v9UND-PvAKQ?<#EE&L&(9wa60UEqpA68y zZkyo>fS=ILw5r*em{k28n50LuPodBMSToF_BtUPTi3Zy++NvYcdQ=iJ`hs&UKW%CcdXaE^=~-` zVlHEi&e|cO?V!tOXPGHf4Hn-XZ>wera|1Oa12wZw94cWgZbo7z2I3+ z42*5v&@X-4{PsE%Lz*47Jwdj~x+WhSECAtde*ds|(|U1b|B}n-dwAZ-FlBRqz$^(4 zrf61Q`43To7N1sFfplBLH~q?pBq@<)Fl42)ku2&9t|Exh7UA+8(bZGPw(RBCLDl&i zn|BS6p&#?kF)(w?@4ug@H;-yp|XWJd9CPvR4T3=ArskON`qPQcN6wl$&!Z$f@6 zXv#CjTo~ECb*|fpKaZS)oIR4k*QJXtTrx6q4oPxEj!hfI0cRK;hxiLbGYxii#k!O4 z5P&WQ9SfugnO%HHbwo0Ib2Ad0hahrjbe0g{Zuu3o{G{ba*G>msN5X4-4poKKK~jn6 zH#m8K++BWv+;8bZ@I&w$pP_L%IpSh%kghrlj7xcE<%~fF?ni%drEzos1spF3LD`)s z@juZB1MU_jp4EmY?cvQP!?d*D-hU>p>xU3(!A`?~2MBcWe{O{1VK!ohc-gVCcgD@( zG&auHoK~%k3D^6E&~{wo!+?*1iVQFB1GDMLmEo)5p7RBc^^FJLG~07W7y3BSLTqOt z;f$3VeN`**(M6lc-Y`t8nF|Dk-1JuxR6Ug^06bfsXzzy}WF>-!I=eYGT70t#PC5A; z7XBy0J}i&jn13^=y@));O51?HIj#|QVZrW(J3-)_m(Vd`RoOJHSEs;{nRdYNuN3xUeJHy9W|p^);W7<$TJ$doGuVMO8ti#Tx6u7n$E!lUZr zZ?Jw%$hBxxp+M1OfY_?0j@upR5M^b==oCj>hgr;EqEo}lrK@Q1X!@i$x5UY^hRv@u zItPO0?^$GETqe=L0HXZtZ}pX^>1FJwKE*%fgl;yS!wvHNnbl@i=*%?D@Gzu@2YoM~ zx!XIHI-w51@J|us!$7<54Z>#sZ^9DPcVy|0zZ zVjk2nkL91HiFBEPDgV&wG^dj}v7+)-hTZu)y5JG5Jq5$sTfoxwbyL$Mv!hM3h|@WE z&GFwt3JIuV4{D?79Q03*ou5uXSGuT%=FaDI3Xip){n}BOF#^!lO-XESmjm3gv5&g% zjnnq{-xINg!`75fQb-Q^%JJX#oa4*39_01Zw!RfLeolsAftUK_(XE>mXu(v= z2ryr8a|1R>6A2Tr9}s?Xj#$WUTWE~f0)LcNQQZ}xCE=mE`Ui0uzuE8d#2ep2INQ}W z1JMzYxqCc#l+{9%KePrw>-B9{gs!aVdubm|uWsFnL9p)rvCmIH|9YK=D}0_aJo|?w z*hDC)IFH%}z#GPY6@sMNMBeoh@<+f7QybGEsugvUZFYIbjxhNxWAwVX& zhymgpDaNQrN1&k^5KSgw9t=668{X104CNY`Xx|uLNu*a#NV-`o#{xEEl z2qiqQ`qD2{5@|v9?Qb8!k?{4JqGSMQ(ksv;uhpseF7nEk-m>IpP&-fR)f)6UKr6(^ z=phVgycpmQA5JzykYUH6-x7ZoJGs>r$Xg!X+}h*0j}Fv{7%%>(X6gVbkqXunzYKlL zQf$T_1|SjRje#MmNn_Doxrd9CobFY<(4NrD)TNVwb>%k_HrRC1%Zpigo{*@G6fQ@AM)1rNcoUpdz`q6Rdts6Hq%lA0IZ?njN zbj`OU2&yWZ-tj!q#17D?%Imp(G-%oXAzVo3%5#!M{9(d*Aj~z1oQ>mih0wO>1 zx5mZ-6=C+jJKaL5$D=R+*UcemuA2@+GObdzo-Yi;r5li5{of;V&U=59E^q7U!c&Dm zkx$Q6TYl#-`9QRara*c0Pe<+J!2adi&M!hfcDy>IBn<#O#Rbc5;Dv%i*=EQRvhpwW z@8P_J=g9d{g5<^ZR>9QU1lD?P)rF(o;|rB2#67B(Co!myx9}SZ@#?Iu9697nJUs5p9VP55eQ%lNAj+i>QL} z=c(het8WL9gs4o5ziO(3Nq(Sm>CUX<;kj>`=ovsxun;dc0l;A zH}5N_Q!8p;crmu{c{?XYfKVQZ06Ex%1y&#YnCn5^WVa;l!1~=2e}$u<Uw}- za8d43&)H27X2@@PO=AS~-k0a35;*tEkWR-Hb>?deDBm0W^GXdUfTN!Iv7&P^Fh>-z z4_W@Oe=_?!SLG9C0F5>(3a=H|c6QS5L(4()0l)ZK^VrvJ&#{DDDT9CWP{otu`fZT*2`S@ znKPVKZUii5D6ru>*wl&rHr#+`fXPV*KG2Q0s??ZHUymwWRL zd{(=_OTS-0VF}3+S@AYRBr9u{d(IVTmE|1q2hMRZO3_&=>>%nS`57zDOAk763za`m zu-LkTuO;F<)TYyLF%}K@Ea6osvHn>f8cw2<;r+&=i2G6}29eY#x#0al&9Pnh?f|tev$hqQ&Ub zKHoX~g!B1jjOX{YAF?Tt?nbpc+((kS(V~n@3$T?yL~*`u*15P;yKV{c7H+7`G#`am zC0*X-E?#anLu^(vKI08nxmkmcCbupsrWv4(i6|m^s)jNlrIMu`qJQInliHbtN^Km! zc<-NXPn3z&yYu=fIoa^1DX_Z><@mF?+DPI756b|==<2jRYu*Ta5)7GQq7j4W*NpcWTVYfcotNu=`Ldxe1vd zE`_#fKE0})fP$-jKsvd0PmbO+ z?^Im;9L9{CMo5XI=o(C?-X|XTZB?onx=1Br=`aLRDNkRzs?RsY<+YJ~$7o4S~_iSAB@hTgt^M8^OAm8|P ztZZ0oXHB-9*U$F$0YFp+WbnHnxXv=aaCo@i#s;(|I5NQi*k{quVpIWduwF3O|Dj-5 zU_}i@6iO(KOY$abiryR-TzTyD1=$r*>SL$CG4ISe+3xjFsgls8;!^KMlh%FKaC07F74xq#I_yu z6zN4gLKU)S9UaHuI2EoL#Aa(A;7Am^26fZ2%)8Yol%WkYpZ)kWq^nB zL+T#Or&mvpf(CTu_dn(TU*sj!8F9qY%7iFXBUE)Mrvv0QVb!{%c-&B_$R#AKsIxyG2w}#5#g#gw^XTqn_z^GbZk#a3{=4de=O+WC z@c5{CpI`68&B8*v$#-v|>COi$RoZc`^_Jdlb^I?B1Ez@JukwgF`QTF)_?IRHq{Pxc zs6ojFf0Gl=>mnq~aDn92&X)Ov8EpqfdI;bPjVzl4a)MZp#~ez|mV&sebpf324{!cH zmJbIO4^?_shY-DuYz(|7-(^&Jo@ zR_{s+N|KU}a{-Vt^xLbG>%2$=>`#QLdL2hB^Z?{j zgP8Z}{BxiI*goOsGNRmY$Kx~e^Uai~7nnW0s@Q14AyjS{xOPlweBJ=z81=BQJhBRyO$xo9Qw-^}O0I09~7A=*Vvw4x9yCWBODO$PN zWlv~R7meoNsGAU-mUWv!Jpl zJ~7ddaRzyA5_mq-=)}3oi4a|hZq0(2>}jEK#@(-s*uOrtPJ=uBlf91({e8!IX5d-h zHq`%>I4u&jMzKY>WLSpw%egjwv?=WfT0d07X*wx8Qj%hv!>6dSAz>^X>Q(%{%n;sXpNay{yD$)A%0e{=iEx_}k^{#F$2 z3BHupS;yc!LJt}Qxi$1XTfl8q@?umm1}GF%DC&;xuMfTU<%&&z2YZT$8>0JtOLpVq zOCHAm`~l@){>~>v!A;X9{`Fb%D;9P20H23Bg1`LXa6zx&ONSSdK8*HgPGM0I6pJGB zX&w*%YG&x^3|(s8Q6`ZI!08wV zvC>NxeH~+9`l*I_{;p*fYVIezA>#;bp)Y2zR)D#FYH-WPsQN?j+4s2(E!B>>q=^}Qz+ zo6LJL?!W|Nwg|jXTPYB3HrN|Y6l*ooJ#()T9O}dR`Cy+Ioi-c=8^s~p;T>_G4Uyz$ zX&9Dw*VPgvyAL=5HmQ1^P}8iVflsR*EY49yE^k#g*EKVZN?;B}X(!QK{Gkw8W3cGo zN(vSgz0i@rPR7qE3)>PAEs*wyQp43~-MN(ATeH7WK`}snclj4B4a<@lA+7FAijP|M|cT+HMQ;Cd!hdPrA@kffx6guO+}V>#e9} z7+yb*{1@a*Ib#1n9h{e?!*8#igS}B$vNbV4*0!e2VNon><=&S26E-o7yfy)00$={f z{gwp0aE#_Y%9&#&;*Z|GR&bIUPSG-O$Q>rY zm1=xcQwCZRbl=Ikn)m9zf)ojZ0hlgRzK$IEPYf?Kui6 z*qzkCyx_wX;Jx; z4F_5Z{|9qKu*_$5ZWB80%9I`%aG`ajx6b_xWQzX_NxtnCTcPX1m$a&Hd4mjuz3ebkM8 zedV5*=8c^Npc)V!R5i&k@6IOIks6tvLTxPWe82>r}jvPL(h{>LuG04{7r4Sz^C^hivpiE0=b- zr4`Z1tbLleG2?qjs|toh-lt}IRkeN(tX6wDKwzMfDb!3syKX6-q(^6yrS925QnB|1 zfMieJZ@bs56xR$PCljfajs_d9pUSa%q+5s!eAL#q_m%xf%q0P5%gI<5fjsOV<)*wT zlxzrN9@Wi*e?Or&ZLRsme1Khl;x{`#^ivwkIR_a-!rP1X2$W;HL^n8*59IO6?B&39 z!v4&e^BY9ymT`Sn|)fkp?SjZXx*S&fIb{o@@)4C z51Rp2{Em{dvU?~I zPgMB7`f)#S8bHsqHz$Fk!TDO(J2rl88}WB24U}tLpYf9k8&EgGWrpX1&Msd7&rn;K zN0DS&>+=9`Co%nV5L;J1vsa>I#_jRX95ACuC6LKC2+-QPxK*vX9Vv>4~Qt??c z9K(;lumS(*FDSOB0qVpGp87u$TR>4#vA@Gu(`_#d77Z2Z$G#lC1deq?AAc8Z>Yo~^ z_P#K^@rMWu{@6O?HwuNkf~ccAa61cWuj!B@rGs;y7)<)eSL0-Ef;2{l?wwDG6M7`W zkvK%{nF~ejuSRHz&Tr58skh_MxjM=i9oFc+EiO>$(Sl$`k1bf(iYO=)(4^v`(yfx-?bLNSdZP8y%iIy90BVG043 zc(!Uw85(tlmFd=zAyYm`+q`<%3aYbI{e$p>KH-R0(Q*cw`HZdWKC*1G`YXZ zt25?^f^{DxaDIoX{SK|Wd1*u!dfM!?w>1&|Jxvvs|4ONC@Bg1TUW%?M$a#*UL#y6e>Xb3uG%V3kr8me7k>)9-x5c^bQzXtG#07M+;g2c zH%)y_#%fibI!zQ&J5_GY4dD#7`UgvQFx`LtB{FT5c=P2;_zY8A@UVnPraNz{<_V&1 zq7?MScNfgw3@O+myNq6rhB_2K|2NOR+L|TY)yb3a@elj;Ki;^V0B>!EOSDGfbqpKC zmKF)?Aa|9R{4tFI=Jf9;6FM96{gtF5Lb#czY|dy1JoKGARt2-4ApSCPBVic_H0rpU zBA<4WMKNdY^evinjGG>Jv^}ct-;RyQNKmfa`~>z&eswE%r75BGwf1`dqx9;Thjo0V>SZxN z-Ahh3$lBSRr}f-%H>u-d8pYyM_nS`og;a=)OlfgBs;)SWd_<~}%BVE1lGZLSQD517 z$X;cATD!cE_R%VNUP-j7L2&IjznOgWt<(Zvxm`;a;uyft>z(0$+h)G9674{s|5anl z&ln#@7}6Dw!WR(H2i5z4ATOfA=hMoTtK%@WIjrOBsjWBHv{LsIw%X$-6Yreyx);oM z2fl5481N++2v4#7^GL#vK4-4&btlcJQ4x#OsP}895h$_SY2?<;->N(*$hp;P+WrI7$uC<3=jW0-#|@Rg|9M8Gr}H|p!F89W zL9o8%fZ(4!vrhxbb=|$RVP^cWJv5r@`wg0>?EJ{7zCF37%^kHG%NW|_;QoXERz770 zmhXSCyU7H9(UZbbu$Zwl|0UN*{tkQzIsPs)%jTfy;E(0|Ti{O61LZW*Dg9s1hEXRqXW~pXSqF96pe>ASA;@WCOXTbDn9vZDc+>m z9e+GHGM~Q1Nhjn=`&(P{wfg9AaJmE0_+3 ziUF@H=b=)`S{5`T_U`HM?Ue8}b|1A0d8bco*XQ44+!W-}#swGIGSJpnu=YK=2i>$x zlLhWPdD4B3k%K$GQclnWNdhGu&cUOxzrs%Gjg*fZY{N0@(-t%F7O9Km#*@>qtpE)%vlDGC(OmVVE7_z4LH24+%{BJAM_$ud6YnPNS9 z$nByyp9*mV>=`$UyF>QGdeq|{zN8g1$Nx%^Py;p`xISiJk%dS^%rr#}u2 zr?j7!Xp3-wW(9rV!_kiE1jnD`873xP&?|boDJ$o z<2UkaE@>9h7o>bT|0+J!j_Z~fu}tDQV*PuRDCDUix?yt8v=D08kYj-rN4u~4`+dwP z0CZz;;bA&LiBG;ZgO|)h!lXE64l;lp9kt2PQ?P zYv4SW{^{QQA}tFHbIUQtKAz~F;DA)=dj>ND*9%oHq-m3s@k(+NQ4KWBcQ?=7_hw|f zzNoY8RkLeo!>?5pE?#~zkOAGO;~Nt)=HUh_&81t$ps++1Y|!rRN<=SNau@sbqJ`?y zkCJ(nfma0Z>9wpNt7m?GjV)R2lz}98l`s!KUW0rKObdXgiqW3b=<~0?bF1TB;L+ea zw_PNaBFL~0E<+cpxkpqIL6$91Owd&+X%a&luil!FyvJ zCJrg2!1u6}PH`o)31MWk_n5Mm=)wZSD$!9BKv6^k4aad2{rHqG19Xia4JL`wVE*5$8MiNh~8*3yIo;j9&1n$3@* zC&giEUd{azvXYC+57KFDWGqEOnOo!ifvLRnY#CPVe|%mS`My2Mj@Mvc;XK7k4iv`a z>r}I(-`n1;D<+(yRiWOE$VHdDF(&x>HEg7_!Ymkg%*FvDx|7Lx^6qV$@z7$gXloqs zF(U}49f)9P#GTYS$BOSHVO?{`;txpaKsy{DigebIw3_HpKI#8ZL9=FJQL)+?HM11a zI6R?+-m$zIO+^?(1?Nji{?7U%iZTpZeOh}ghRPiM(Yf0l$0`gYfga_WitGEcXrKjUbzOBN z)ZbCY4UAN;nSGqt89;y*ML(qC3{Ur2#i0-p0bFA{TJSdQQcO6PCp>k_yDCotryOT9URWoL< z>^46&n^p4|Imd>po3)AhTr&}1$Dm$!K5D`<0~WQ494dj!pBcgY!CM@O*Kr7i@S}pk zGj1t4A}G)`C{OvCm1XDG$rkYb{!^g_#z~C|K*(tK^w6%2?Mz)Uqgn-tU4A?_Dk*XzM)hhR$1Jz|ioJR;%(ytf7Fp=0$6X*BJj< z*IZrOJWq00Ed4v{SYup0@KL@4W}?6-UtcFvPP`+#U{~VZ|IU&3=DQ=tkear_8DR(> zssM`_PUk7(D`Pg$uezW^I6wYV>O1b5PtszNCFnV(zggwVuC1VAP2)!iIF_g5Sf`(`y{KRe%)!}?=#SsYY@of=*Li2^x@q*vJsSUsCX?Vj-BY=z&rUMopN z_1E`<{wGj|`C-11iu1u!IHmTf#1+4bgWu>k&~lYyk~mwiSy~`hEGN23EKJSkM=Sg= zr+S^~-?z8^0>EzzILp2?mqzzK<+KJAW7Bi5asj*1j^&{yckI3ZQlJX|^I>xB zU2skyW6UnaO0)4B*MM~sNWU-b$+v$*iY%nUwA1h2x;ni7!E@@`)*_7(Iqw>j3!JtE z@Ko5_Otr_E4!RdHN#J#dE}n37Ib5qru~;`Qz9M~EBqe-{(--}@k1LpD%PPtVI#(?_UI_wMjNun26n zUX?Addapx&+*iSNFwXz^4^a&DFj50Wb|$9-vgoOL7~m z^6U#iQwWdE#F7Ku^=xSEGp8A;fEKXpIYPO7&mEL4J>qpqW6Mns99hnPI2$i@7J(PdUFw-4yH{9g<>Kf zCN-*c$ZJ zhzVz^VlrV!{qw7gl6xShlNi-h&@mJnl_D;U!R7M+EDO0Qh*8ieXt4MN4@2JVIQZ5h z#f!dA)$shHbLn_=sL`vdXX;$APXrMrCG4@qS#WlV?9kOxI^`WU(04W$V9WUAMBeOd z3{L=%%5S=L{$CWI>pv8~TXM|RyM8wH)dBI8eR!-`GSjjeEh44IGE4_q6HdQx`E8Iz zaFF1ad;K?CaEjRq+uZr&Hs&o=8Dk?^63TSH>3^HPnhfbC`VVz^cEs2!2KU{Z?(A)f zRO9AcMpVRurk&vc7$GlLe&Izw0{?NrDd(hfI`3n@{k7839jM9=0U{zqs4Zxu2H=b3 z&D}dhiIrEs>#t+3I(zlKH>ZNl0uheVPbyGbTQO6>E2t@fA!zW%-Fi;`Hl);14t_1j zIcz=lv*uA){GktZ4@1jBEZwaRXFRu_saEQ>$@&`QPd)L*VO8Bk?%H_193L3Eb+!93F*WK#6_`KW zxR>J)(Etlnf}~!a47Q8im{Nc9qh=CE=1Ygg^|E*0hX~RsPondi%m9b>)=)pmsh>~B zUyzS`suN%lICvV-UcT{P_?xlq>qx2G2~^<;or3df!I-YQ6^HkaADBvAn)x1qm-1%Z zcrw^ZU72|%AYTAF`Yn2e&5GZ>dekx9xqQUm!!|=Kvr1BrPU z>$>`s!S>-xMllko^INaO2NF#Lzv+$C@y<9Ph` zi=-0`u$0RAWIha)douOmLj&N|@JZ`$e~x|NJxXSINC?pSwc~$n|Au+Dp@WtOYr5K{}D# zJTpBDEtiG;uHuj0Fghjm9eA|C`aP~^H?e-_V%3O=InfMe`Bp;c8JcKb8|*%SHc8%y zdCci3(w2dFtv|~3J+fWK(iSze$KTqzCs&cZFu#+TJaRyjGO;!Xk==@;7_D=NvZED9 z$=f8-c!+ksdket=Z57oE4L;DQKHo`DSfJj5ZHugml(6=r4TNgJ&~vTEHAi*$jfyKJ z$-V9UgwKkXK7T0zM3FnS6!edO7JYLpXOC-^p>K8M@ytk$iOEAS?VmXf*3anen0pth zy9As&iv+*OwJ!PUuP(g&0qmv+xM#fQ;N zX2`RfbJ;BWTj#~HWq*hj!GfnKmF+gBKS46&+Kx4oj|=+$YP!m(wz{T^7MJ2siWPS# zTHI+U?k>UIt-!_I-K{tTm*Nz+;+`VKX_4X%U!HfZFKgXj$*(&(vuE$wXNGk`K9NI+ zLCCSE-KqmGyOzrHm)~WrU4g&nb9@fWQ#5q$;{7}98uq=_5TRHIoaJS_B6RkCyfG3jCuQ)#pGqPg*4<66d z^#)6E_tYtYu+a0`i8ghq3fyoYm*o)8&f>9@wCL+a8O~gJh?cv!n_WyVM6hb`J7m=Z z{=t2wgZ#YD=Av@sU&Brfw6#)}56H7avF#OF#&-U@+zi-=yh9i1M#lP-8 zKWFs!;N*1}T98d7mRV_+)g2qbsPP}E;t#fI&RQf@bV#Wb_IE+zY;=b8)H7p6=3AChr;Qy5v zu<3t`)#&B)kiYo=xr!LK@LYFSf2c0SBR*cwnG(Q813L#i%>O{SIa4+k5mHzo-$N9s z2Y?O^RBw~lmn)-9D+4BOShOgRJ%0hOjnY@Gc|sXNUCc()g45)JYG3UuSr0j5lIT#8 ziZMNfqm(JMBPKJ#y*D_33ul|mnGNa2Rm({VseABu&)mjEx#d1~dV1wKJPh5!*wkpw zf9It?Yp@x0_+<7{sG??qJ!hqraXEFPF6-D|QUt%df{Rma8^$dBEbH!Tpf5AT=@r?l zcA|g(oSZRiy2Ha&hGpQ6P!v8Faj@QxWOwg3ordA~Qyb@9&T7X1=Nua%_`N3s?@Miy zp`aV>f#uhubUla>%SL|`LxDPQaZkx!-N$|$o!q6>XgrkJyk8xvPM78Iv$m77pyBVB zm44ITDMd;sZ*FyJq>BGh)rF0Q$lq3ns-)?wv81(~Hgq>PxBU;4x@y35muAeC&tose zO?lby&d;Ae-90^l0vAMsze5vk_BEsJ=w;;$JL>8?=dyU&SHg|)DQ9dMF0s_*yu=Tp zO&NycVXvFtzAz7=jr<Bnq;Li-bejNUu#BO~fVmb5!lVI`9A zU%LWN+^F?YqbHA#x8FKV6m!6 z*G0%1acs1@S;d92@`8U?z9nzM3XO4zhff)_vQnwadK|{SNN6hm&Tk1b$PGv)(Vroc zKQjj{%UA*fy!J{SE~d8_!q@X7jI@|sJP1P?TU-{%?nHDxP^+d=l5(UyVGOeDkUX99 zRXy^Dw0HQWL2RnG?MWhS?Pe!3lSY@ix7#UR3q&^qhy|WQeW!FzAWtWA$Fq~u)1*39 zGL}a#&bC`mFOyxC`&P%C>0<{r|5KKo^I^tB*+-y`;lp>|Q;^P7fXJV*GLW>h?*t^e z{RrHtL`HnnVNTDmx)qP5B-QcYD{{2(&DY*e0l)XUPW1GpN^=H12FLj2BI7rk4$?IA z^}5js+Mq_CqASViL{yTx;#nh2s}wlOp-vY(B^ea#0FI@$gd#}<0=qu(t*vuwX(o0B zWq`MJz8reEC=*%>{Wk)A1-i0SGsT9{n-o5E@qz=FahLjLdOA8maAuQ3^5U&lgKqE1 zQpQA*2YEBspu@Y(OGYt|!17N*N5^jM<{|X2cRaWInD0txXR>uCwjG9Oz@P@v0;}nB z5^&$JYu0ZaOcqR=q+}m(raO6dGrj3#BLH=Iwp;3I#c>bFHy%#-SG087Q#LQFoL42% zIxd(fX^Q?A%{vM0^7Dn;M{nj5WlPdF5UczlbDQe0M44p&6RyOqp8YL)>&?&|PMh)c zOTva+qZ=Xw149QnVc#47DA87O!$kS_=bKY*S(yQc%JsM!#RSJ<;q@fNmmrN zZm3#sTuFWfAsW{tsq42HLWAv^d&zsQS~k5{KoKwNF~qlpsiw~s#OHNCPBujX37t$2 z$E@xXj33UUMJubGng7ehoCUg)03RI2CF$2MdY5n_8>3sF@wd&y*w}ixFDfNLW0R8_C$Jd-KW-aB zsp#mWTA$@p4h&mZP%{xn4~|x5<$i?h^paTlPtw~UXErAITku~hPjZ$61k{Oy!4W$< zJdb>Ob{!%K`<&8DGE-0zXrm zmEmNFK}QG>bN!#cym|*Sm7)gvFx^XBAURk>sMtMBSgZ};PBiM& zJFNBNenq|r8X9!gilhtzM81;vAM@sGqp+l-)cwO^T#q@~72vzUi-=*ePum&Zw{#s! zjO8-lRv&z(rD0%fUTMZM2>a<<7D2i7&pT?f=UP1!-g^`C0Mm6tKS`e+k% zYraR-=xI-4Tbr>0-+h4S%A@F#qamWQEHQUhNKyv+JZ3iLUVHZ5@b2 z3Y$~SER4D-i+eSRDHIozSgPjx&)_$&N5~*Gv(L_wQiTM`iFhg+=!8g94#QhyQp?@9*h(kR4AE5ie?6V2deYKX)q%2B z@3NUSX^r1i->f?uN` z?MXMcFMMmrtG*A#9qLKFWgXo_EU`&W9dP`Q=;CqiL`%{?#jF05M~lmpj^`+gUN*)hb&Q)Wy0%}1hlsDEbiAb7F_PS zQM|IcuoK`0s-y9!NCa|+*Km~tHl|urGbVf~`ZI;ol_-wdA6;DE(np+B^Rb7X2uYsl zJWWy)@N^UgSM{G&)i^Y@P6hBXZXIIrm#~2|`NN3{Y3Yh^35+SKSGCo)GZ6i#QA6NH zNOD!S(BOwn{9yM4lGL_!i9mLkDpe~0tPJ9rNW{r4MQ|l&@44GPJa3wYTga#U>X{Vj5%q}6Q8zMrEfnjP!6 zz6-i;!3}*zXlwyxJyVLu-N!{UiV! zw^$UZPx{}%oU04vT?yMNo?w*J`qGheC#q2q^c6FXgX>>)YBIGOk)y3U6hI& zZXQK<*xX^{J;a<({g+Qy`JJOv$}<+FqXceO?bv5ZSB>o+LLu*&5}#GVm9(k) z&95@-`uc)6_T|3+1Zt8rmKs$1zc3$`%=!h{wa6)1rjaXbB$$&M^V7ke&)G0T~bbnIQq%_ zkr9tAHsMR7<-G3~u7L?txj4VT?2Agr&iDGG)BMTPV~;(=|GrY96b~H$I4@f`T6Y># zv9q(YYr=~%hd)p#4P2gJpW*`;^RR?QxK#(L?Q!o!4SrygaMpw)NTvDbpA3@O1!HDg z>(|ssrQ*s{s|**${>Z?qu5x8=m(a4XoBkNysAi9fP*zI2=ktB)$irkLA%Lgi=2S5P zM^xZ$GLF9tk*b`a=Kx4*tcmpdbDZHGsoCHpBS@86I><+F>%xXa3a)3lnHW}SWNk%; z-vOz9zgfF_gprU^bZgI>=3tjxvZ5`Yw>BEJ?I6k5KiivoXWp%{qAfmENIL>8e1ES; z{+NcX6IJQ-dw{MKVze*ld^?avtgtY$kkJ*{>E6$1ux<^unE?C_^f|dSq$}>9&Zrhw zB`0t19|~T1{UPD@b{Msu=L*T*0YP4Z*dg7){kzq7?MUNqc$rKoTrFKZv?B=yP|MNE zlH_UTxHvD4j{xStAj3fM&h=2oX`1aS$C11^GF_X=-q)Si!ihm%xFAnD?$5c$Cf8#|Z69wfM~_v*X}QO|%pC&gqL# zzFeo8d8xDxks7Kb^C@h zPpDHBr^7|{I+<-%R#jFtPtRrF*pSLEAK+`IO|NeC1tF4G4jy_f@4XRz=ssJd0L(9j z*LH;Zd*Qdz^&L&8^F^#24!WM(rd|NY6`jWg=1^z$lL8i48l)gCltK;GiLD2cIUlZJ z5ju=k=H0ZGH2rF&*q_)U1XzG_vT|hB(JRi+ z)<+cUPcbB!#T`Zf((EM4muCF_oUf5%9-B%3+CSZ@t`4UxfPktJV)fa#Pg*JpY+Y?& z_$1bvXsn@C?sfu~vp8wOx7l(?&h(zha^Lz$^qI6)nJ$P{olcPjuqF@-St{fGx=`!;Em(M|-)pPzdRLrUO?Ewg0Fg|3* z2a_n~i8hPY0@HZ2?Ucsf1|yDZH-Q4zpnc?DumAQ|vd_)SHC@Z{-y#l&->*S2qSpgO z2dt&etaeEVYd)L)A#$~y?EVf7qis3a)?9BCP+1ELd5gF8B>~jXq)_^`U<~FFa|=KD z)RJmucr;WAT~sr@d1@r7);I_O<=x9|23>ykg$-4-uS}Eaz?<;!@WA=;|FFu$+WN2= z$C?ybgOaIj6y<8Y-13MV5KEYP%^dTNF7N(^`EjDe;cW^6G)2b~v%EAe*;>X9W4WOo z4J~Z{A4Z)S&{9J;%H-L#^G3KO&gpsfb?UYgso-#3-uF=EQwU_#EO#T0&y#h?uRd&P z3!i7itk3FSiz`;}fBMS!sUni2GTR?WRX~-1dTO?=ehi;3K~15$U83FZmn7wme^#NA z?R|LMdX6t?PhwF^hZ6@G=q+y50fl0{$2jYIsk0zJv@q;G_F1J>ptq&8a=$lA6b-V2 z@@>Y>lpPc-88eFPrLYJm?iM4ni2#bqtG>Xn2#H!f$q`KrTP!by}|I3*sgGHZA zN>_$?a}}B~rM%*DRuVKf*1_ZzC444eUSZ6&-p@H0Sz3omHrdJVZ|Bqb>jUNes>r4( zx83Z~RI+(|nRM)IQHJVCUZ`hQt}yaL!rP0y=9^xW?LzylqwzG<8R%wjg{+!?MGLHw zi&5T4a?%iuvljA^d%dz`I^le zBQIYijoG;pf0HviT&y^}5-d~T9toaFM`DO4;Ig*?f2LxTIxPAkzIrKmv#p?WPEa9$ zBX$orWElkZ`;_uNRpbZ9b;SMZ7lwJoj30ep89fm5EX?Kh3Lt7aJTN8lz6^tr;n9|u z1erqG76w*g)sz5SR)J1Q?)aGKg(7jH-P)wB(d^#7t)D+{jr$bna&ZTS{FS%M_F5l9 z#!t+S_c9K3Hxte;ta}4v+mf?lY2cK1(IdSv{NszoEM2&BOdZ`L?KkSZtP~V&wI?nY zGIneRcM`;uxU)*y+PucrPe2v%>#Yv&7>ukm*FUb-B?CBp`6A-$aX0#=1yB>^qKhV! z3OA43w%7etCmS0dg@8YA2hH5mCr}}?OvJ?Up)5;;0a7Hb4(u-EsRv0H!Y~XogjICk zzn*Ql|GJ%J`^kgoNV1I)RH>meBmI&$LxKRtjY8^hH6WF`PG9|iUZx_6iykzSEe@i6 zd)~7v02q)aoIkZJmvz>5w=QiIMK4|iviCl@{`dTMoOU%581lV?VNWq1wuyV*H zax;Wsx7W$B%wiWEdrDY>NibnYXmTyQ7>6sXU-4#kK}epRKdOyW!l`=bu!ersw!weL zF`hhUyPr*HlpKKfy0FRhMzb=<>U?|!lCKWojXJ0%8g3FUmFl8!yk*F3-cAoOb`RHt zG+kH6qDn{`R)=k}zOH52cjYfn-*o(q2}ej(j;Aq9$luU1!WNqQ4|o*3_$61H-MzH^ zM9a_b?gXT&I1B@h8YGT9XBUrHJ5O%3h-v-j&xe=V`QzmRx{vFK-2Y9Fy|e=t@QP4A zPZC$t%E7l#S)p=7Bnpv#`~Kd1iP!!}xcueBy=QH$b420xSsedLb_&6K@dV}|(Q{5| z3<)YE5GYqV*j_ZD0*PEjF)%IpJMJN8)nH;Oo^m9km^{-s7X}08q>pI4#jHO2$3m*xftAqZH$bw{(wl^d?Cmqj*jAzr#v*@woa%QEVTO09uG!~&|EyEc|4 zmxKhtNZ%Ek2QhXvvZC&FQ|E`v6p3BTyz!PVP`N+k3O`_&e`$dB1SvpoTy|=6bUC0* zly>Dzvq~gZmkT4 z`n`Tz2ky1+br!&=qYDY0FnbOo0eVcU$yDh1`T5$-M9%LJovD|gGgrOq+(3n1l&{H7 zdHy}9C{L4|L9%yil<*LSKvyv})P>C|iKC!H)7BcN?b{;@+ zGPxS8_6|c(+@Kxc5dJxV0VZ(O^<8pzY48&2)Z^H>Z~tJw+L{1(k05Y6-kqkr4$k9G zb8AxUNKJhOm`1*NqHBsKPQM~GoNkl(ATg_cz*3DetFH6xCdbC{TPv;A^JF7|=rLzo4_vJuNrwDb}-) z?XG9zsAspLz*vV5a5k72X%9BK@Anv%@Fzht8Ld%UFH@z)fhsw0D!nHHj3WMGh`K`T6MrvG1T#XCh7-a2<7BZXdU7DJJ ziV#}PB!qqx;kQ82lRI&qPxdsXjA zhn`nTN(#AdTt&H`R5_@>lOwmC_Izhjg>`lkIJsETzoex4x6Ce?!fU z`hNW$$~}qkr3=>WO06pOu2Q*=(xa*5+Mi^uaP<1T$51%;QGSnsGi8LO)ccD;7T~1A>-L9rsz>oE%o+rQdqN1k^O+T8dvVxS6^+ffBQccXxMBB&&FwSB^yCGi)TH z3p%~>LtomXgAo~pu*0Ydhg$2u0420jCAPcsq%Tjw(EF6~*Ni4IXn5IYJ0q3o{P5EX zyMU{2KfwGOnWvGf?$$r#1;t4aX+Vrv$O372!i_58TEV!ORIw7UirLP-RNT&<4(*FZ z@fVDsJ)LH}IkNDl!A9?CZpEWNmtLS!HAOVdhGd$mk@TJoYnfFr|-apmK8Q~XX(!|~wvJ11w~afO(&a!v*=EJ*`yC_o?atszWzK4zYz zBjI6Btb*-%JMUykzFzC{DJfnQ=lyQHenpYxYw|ki%mhl~mYjo%??oG)u97jw`Zy=yej(Y>f9$k}K90mU>{|?y;p#SkUu!35dj~N7-k!J+7>=*rHXH z@hE?ot&tYh{BK&~FBq%oI}-Xm92gpcg2T=A7CBtw%&+$v;?xb4Nl)&PXZ=s<5z`he z6yEZt05R>0#7(avQy(hm-=#R^W%*T&+K$Pde6+zF>JXL2Io>ST&|?Sd63v(5;=~c* zLGi3Pq)9@MBS9Ma;=4bH(o8}U8Of%I5I9ho-?~vDhmtfqz-J2@H!9lIBA>qWq0F7Z zW|?L{koi9e0iB_KU4+rG6f16US4YlQPt1l!wwKE+ge&EW-f)?@zWd$pA zQ|Ni%<-wQgyBr5Fem@+PO^4dT$p2f!a{eetedM?@fZHKLh?g9w`|B2^!m(3xOm2^% z{!j5ym0Rxy2sJLCaIyY(qv4b2cPo92+I;svA#cJpjD4kS?CZw}2iMxlJ~nY+_7g49 zfph!!_f~z3MBI^>=vEEVA^yStNu!X`h9CE1V-=zXrHnSbJ+MmmPTMo3YGr zu(u9aLdCSvtqm&&FXIQq+b2^~M`gpfz?g##lFdx)=Bu7mfsa?tt65JoC*nR{nN!S6=+SAofgI)E zKqfhALq){=UCnj3eeQlo$bh-VZC%D*US2FH>q5^0ZaeGRX)b`jH`=Zp1#P_~2a@m* zwzL^>ZcJTV1Z}(Eve8RFzJR>t;0=Hi#_8izdEO1Ixn{lBHqOHid>@980-CMi4X`8c z-ujIuQG<7~uZ>o%W&y3z5Jwg4Mz+ETs=5o6CfSycs^%>ZEu^!YP2rfW;$04>4pWPo zvbYGWBFW1u)nH~@^~}l1LDX@tAv2k&2*?k3uvwxIn~JepV$JU~f;X)A!~}Si-wn$r zrG$op<{R#rl`M7)e10g^lqj^T&9_L6DQ0`Jgwjgt=?KW z$a|^AI!~o8PO>mC&hb8M{*UL^X_aWJQV^=u$J%IHyg#nY)^x~PnxYe7^4e~mOMESy zwa5c?q9a!g-)7VG3&gLaA0d$S^{a&z6P;Q-PeLbP^Q(Z*=Fx-EqKx$rzejq7v0r+% zch{OvFY}|-eBx!-vzr~|R2;%5(uDclN1ib1j>f_R4EWc5n52aO22|8&;4ntROd&mb znsKA!Zt51g;K(dSfZO%AbWgT8D!myOQF9rRH^^nKRq$be61xh=kIG-Qa!_iFmbyOi zx`8FFHqOE{mYN+2BQ5b*Koy|2!E6AHQFNM#)inQFY8{*p7YA(*CobZNQCKP2xrmc!hti~EtYUriNc{T&WD z>388ONW(^7r!ti zNd>~LDR^oTezJ`)DG@ib#*vK0O)W9UUcn2`t+5Z$?U`22&K9uIJ!U2PZ2hxjCvhgb zaY-Kh@7?i8WbrQT!m$=W4EI)6TBl`m$A^T8Nq#H@sGW#w|JCRtuF0cS>q(9>eQ8U( zP!Vec%T+Qvlx%6=FAUE<7JUTVti!w8U^WT**9GJDzHmu3G|J{){ z&+PvLppBx#C;YD~jlqI-RMEWa*;KcX{JFYBgDx{|rXu>+F-yzMMlAXMr}LJl*}J)L zcbMa-{_pVv{Ph`y&O$(Ee&mudk*1R|gi>WX`s5$Y0!wB`)zT&YNQ8zKX}uO!XwYybPJmU;+wr5v4zmb16&?yxT-+o%*^q$0 z{fPx5JDKks<>x&*M$cW*D+1otk{vHpc)~JH!f6c>p?3duUF^uT61)h$ukeR`7c&Gx z`u4l%+j(G>3bxP0K%Sb>1UV5{L;=G4%+YcMBp6{W=9?1pn3Ub(DN#I^2*B4R@;wBN zZ^U8grlpv#6`UMi$Rw>07rQF(3?P7rKC^VFQ&OHEDoIogS^nqJ8Q23P)t1))q)O+6~ zy!oW-u;S|WUIaGM=5^P96QlNS^3@uml~<^@=-U*m&LDfVI-_mZi+p&u7*w`CZyIT;mEQPMP(ijEh9 zj1}HcFNJ#T!4?}qNf0}VsxK*7kjbW6gWh^6JBX9k0s1|Vjjm^>{_?aF1-_%U=ac`8 z$G5pprjZCl%m=m#)R@hH)^Qu-&zd*-;>IN07)W~ar;nH;X5S@X!*uCOOIR?O;7&|O z_o=qZ8%UrEbVl_KZ%#X%{?)=T#-tLVYQ(i@MVq4Xm!@`rCgBXM>K1g~>KjKtq{JYV z{gueKE?I=jKxy|4SPwIwpfd}Il@yNH6L8NZ>!XjbAZ;cX6bS*Ud6m$jOF!>NyTx*Z zl5-Fpy6@E3DVRc>%IigGN#)HYCGkxpNJu7;B1?)H0@gT^C#3&?O)g^Y-#Y7leVgm& zsCriL*3k_D(}GWk7m~kJpL{13B=-=3n5;Y%RWBK0euy9y_&4-KUJp*dI6_|QaG=L& zta)CJX&R%pZB_utcG1!b9=$BzzrqTdh-z8dl2I^Z$Rt(nBOh#x@GugBLk8|$%r{B7=aSp!-icc^VovsBX1-VR8o^+jL? za~Qj@usF2Ru`kS3N7^>%WH^ga1|4Y&W@J2{{`E_bjPiWthxX-dg5O-XlAnX>yOZ~R zyuj-qgW(#7&Xw%sKkD@OXT6t~-`4TxjyW6f5xqc%n=tlUUH9^>)uX+W0w#mU*O#2v z>{tHR0R~&BtC-($(o?+Vn!omeeX}v8y2i;XV$4{1bpG`-V;csfI~$?nCfkc^rXjsS zEz7>OZ}a)0Qs&`%z$1h#`B{>Ff`iigvWnr=ZA8$+KDP~6x-s_IEA_Urx@|<;t_w@m z`UCi)bBc(N)}173{FciSdu}I}GL?TCL=c3Q(P7#smwNLSSp7hio=v1ulS3|KK+V)f zhrdFBw_sWgwIo4}D5WIo>igVi(pK?3WTN)bNJ$ zl^(JVd{k@PVGxUQ4g5oZ%ewiqStI&|c0#64vu%frP(|dPHM^~WU|JzaP6*v}yJpi( z@aLHy1B8AIO}+4Q`ABb?lI`$gA&nx3+s~kN54DCpY6LqQiWFFR7xG zqJwGx){|~&spK^!6SL+yu4Pt30Zzhj)Uwmp=P47nN(eMOdeh$GQNgNu0ET8j3TaP$01dCI1G@@0h=;?ygV$(qa@gbN}07y-;v^&TG z6C95yxkW0aTgf;F!AslMShJX3;gbX@*~Bp*F$7-gao9>P0cYJIQ@qP1IPzm*;*%t; zWKtz?rL!L6PHISWO=l<% zkA$w<8_fU6HbQwrWt}l&Do>AWkC5Gm!$azNbwhg?CHKd~aqa+U#qmnrr}tm$IMHlt zV*a_Se%iz|<{#ZvmvHE)YyxE1m_3iO>=tJA4Pq`)Hx0PqM_?xfu_{sJ{l&WW$Ylxg{rMu?yg7zwfsAn!L*!Od1 z{!gv}XFE<0U+n>DkGH||t7lF_+g=+lbp_9Kga3$VC}ULJMjiv$I)17#SJ_!Yt^1Ha z#hL1%=DKF-(4q0XOTb4&H~q==QVRzMpZwpJgGj>gW<-oMTZClBSSUhrzFa^SuGLvl z#2YV73LKbWZ7P&{*af#Q{_*r3PhZ3HOc@8iuZoj;=5}!;xC1)<53tZF0l0@&+C-56zZrfQ8@%(logXF%-e4x#6Fx~yv9g2 z7W!>)=mXwzRXJV^d>40_^!pniyGQyrcn)3u$~f=+`=;<*%O$7a75UuZ5cWULry?G% z{u-N3croyM>Zo>GPaB_35j<3axDGkNUArmoZ|UEP Date: Mon, 1 May 2017 12:50:33 -0500 Subject: [PATCH 012/352] Clockcult component generation will automatically focus on components needed to activate the Ark --- code/_onclick/hud/alert.dm | 1 + .../clock_helpers/component_helpers.dm.rej | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm.rej diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 9c8fe9750a..b376706a42 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -393,6 +393,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." textlist += "
" else textlist += "Seconds until Ratvar's arrival: [G.get_arrival_text(TRUE)]
" + break if(unconverted_ais_exist) if(unconverted_ais_exist > 1) textlist += "[unconverted_ais_exist] unconverted AIs exist!
" diff --git a/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm.rej b/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm.rej new file mode 100644 index 0000000000..339ebbc352 --- /dev/null +++ b/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm.rej @@ -0,0 +1,34 @@ +diff a/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm b/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm (rejected hunks) +@@ -2,7 +2,7 @@ + /proc/generate_cache_component(specific_component_id, atom/A) + if(!specific_component_id) + specific_component_id = get_weighted_component_id() +- clockwork_component_cache[specific_component_id]++ ++ GLOB.clockwork_component_cache[specific_component_id]++ + if(A) + var/component_animation_type = get_component_animation_type(specific_component_id) + new component_animation_type(get_turf(A)) +@@ -13,16 +13,16 @@ + /proc/get_weighted_component_id(obj/item/clockwork/slab/storage_slab) + . = list() + if(storage_slab) +- if(clockwork_caches) +- for(var/i in clockwork_component_cache) +- .[i] = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*(clockwork_component_cache[i] + storage_slab.stored_components[i]), 1) ++ if(GLOB.clockwork_caches) ++ for(var/i in GLOB.clockwork_component_cache) ++ .[i] = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*(GLOB.clockwork_component_cache[i] + storage_slab.stored_components[i]), 1) + else +- for(var/i in clockwork_component_cache) ++ for(var/i in GLOB.clockwork_component_cache) + .[i] = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*storage_slab.stored_components[i], 1) + else +- for(var/i in clockwork_component_cache) +- .[i] = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*clockwork_component_cache[i], 1) +- for(var/obj/structure/destructible/clockwork/massive/celestial_gateway/G in all_clockwork_objects) ++ for(var/i in GLOB.clockwork_component_cache) ++ .[i] = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*GLOB.clockwork_component_cache[i], 1) ++ for(var/obj/structure/destructible/clockwork/massive/celestial_gateway/G in GLOB.all_clockwork_objects) + if(G.still_needs_components()) + for(var/i in G.required_components) + if(!G.required_components[i]) From 36dfc5a4dbd5e762782beef40441b1ce900a0f5f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 12:53:40 -0500 Subject: [PATCH 013/352] Holocalls --- code/controllers/subsystem/garbage.dm.rej | 9 + code/datums/holocall.dm | 154 ++++++++++++ code/game/machinery/hologram.dm | 149 +++++++++--- code/game/machinery/hologram.dm.rej | 226 ++++++++++++++++++ .../mob/living/silicon/ai/freelook/eye.dm | 2 +- tgstation.dme.rej | 9 + 6 files changed, 514 insertions(+), 35 deletions(-) create mode 100644 code/controllers/subsystem/garbage.dm.rej create mode 100644 code/datums/holocall.dm create mode 100644 code/game/machinery/hologram.dm.rej create mode 100644 tgstation.dme.rej diff --git a/code/controllers/subsystem/garbage.dm.rej b/code/controllers/subsystem/garbage.dm.rej new file mode 100644 index 0000000000..2075155c49 --- /dev/null +++ b/code/controllers/subsystem/garbage.dm.rej @@ -0,0 +1,9 @@ +diff a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm (rejected hunks) +@@ -725,7 +725,6 @@ var/datum/controller/subsystem/garbage_collector/SSgarbage + SearchVar(multiverse) + SearchVar(announcement_systems) + SearchVar(doppler_arrays) +- SearchVar(HOLOPAD_MODE) + SearchVar(holopads) + SearchVar(news_network) + SearchVar(allCasters) diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm new file mode 100644 index 0000000000..0153e41414 --- /dev/null +++ b/code/datums/holocall.dm @@ -0,0 +1,154 @@ +#define HOLOPAD_MAX_DIAL_TIME 200 + +/mob/camera/aiEye/remote/holo/setLoc() + . = ..() + var/obj/machinery/holopad/H = origin + H.move_hologram(eye_user, loc) + +//this datum manages it's own references + +/datum/holocall + var/mob/living/user //the one that called + var/obj/machinery/holopad/calling_holopad //the one that sent the call + var/obj/machinery/holopad/connected_holopad //the one that answered the call (may be null) + var/list/dialed_holopads //all things called, will be cleared out to just connected_holopad once answered + + var/mob/camera/aiEye/remote/holo/eye //user's eye, once connected + var/obj/effect/overlay/holo_pad_hologram/hologram //user's hologram, once connected + + var/call_start_time + +//creates a holocall made by `caller` from `calling_pad` to `callees` +/datum/holocall/New(mob/living/caller, obj/machinery/holopad/calling_pad, list/callees) + call_start_time = world.time + user = caller + calling_pad.outgoing_call = src + calling_holopad = calling_pad + dialed_holopads = list() + + for(var/I in callees) + var/obj/machinery/holopad/H = I + if(!QDELETED(H) && H.is_operational()) + dialed_holopads += H + LAZYADD(H.holo_calls, src) + + if(!dialed_holopads.len) + calling_pad.say("Connection failure.") + qdel(src) + + testing("Holocall started") + +//cleans up ALL references :) +/datum/holocall/Destroy() + QDEL_NULL(eye) + + user.reset_perspective() + + user = null + hologram.HC = null + hologram = null + calling_holopad.outgoing_call = null + + for(var/I in dialed_holopads) + var/obj/machinery/holopad/H = I + LAZYREMOVE(H.holo_calls, src) + dialed_holopads.Cut() + + if(calling_holopad) + calling_holopad.SetLightsAndPower() + calling_holopad = null + if(connected_holopad) + connected_holopad.SetLightsAndPower() + connected_holopad = null + + testing("Holocall destroyed") + + return ..() + +//Gracefully disconnects a holopad `H` from a call. Pads not in the call are ignored. Notifies participants of the disconnection +/datum/holocall/proc/Disconnect(obj/machinery/holopad/H) + testing("Holocall disconnect") + if(H == connected_holopad) + calling_holopad.say("[usr] disconnected.") + else if(H == calling_holopad && connected_holopad) + connected_holopad.say("[usr] disconnected.") + + ConnectionFailure(H, TRUE) + +//Forcefully disconnects a holopad `H` from a call. Pads not in the call are ignored. +/datum/holocall/proc/ConnectionFailure(obj/machinery/holopad/H, graceful = FALSE) + testing("Holocall connection failure: graceful [graceful]") + if(H == connected_holopad || H == calling_holopad) + if(!graceful) + calling_holopad.say("Connection failure.") + qdel(src) + return + + LAZYREMOVE(H.holo_calls, src) + dialed_holopads -= H + if(!dialed_holopads.len) + if(graceful) + calling_holopad.say("Call rejected.") + testing("No recipients, terminating") + qdel(src) + +//Answers a call made to a holopad `H` which cannot be the calling holopad. Pads not in the call are ignored +/datum/holocall/proc/Answer(obj/machinery/holopad/H) + testing("Holocall answer") + if(H == calling_holopad) + CRASH("How cute, a holopad tried to answer itself.") + + if(!(H in dialed_holopads)) + return + + if(connected_holopad) + CRASH("Multi-connection holocall") + + connected_holopad = H + for(var/I in dialed_holopads) + if(I == H) + continue + var/obj/machinery/holopad/Holo = I + LAZYREMOVE(Holo.holo_calls, src) + dialed_holopads -= Holo + + if(!Check()) + return + + hologram = H.activate_holo(user) + hologram.HC = src + + //eyeobj code is horrid, this is the best copypasta I could make + eye = new + eye.origin = H + eye.eye_initialized = TRUE + eye.eye_user = user + eye.name = "Camera Eye ([user.name])" + user.remote_control = eye + user.reset_perspective(eye) + eye.setLoc(H.loc) + +//Checks the validity of a holocall and qdels itself if it's not. Returns TRUE if valid, FALSE otherwise +/datum/holocall/proc/Check() + for(var/I in dialed_holopads) + var/obj/machinery/holopad/H = I + if(!H.is_operational()) + ConnectionFailure(H) + + if(QDELETED(src)) + return FALSE + + . = !QDELETED(user) && !user.incapacitated() && !QDELETED(calling_holopad) && calling_holopad.is_operational() && user.loc == calling_holopad.loc + + if(.) + if(connected_holopad) + . = !QDELETED(connected_holopad) && connected_holopad.is_operational() + else + . = world.time < (call_start_time + HOLOPAD_MAX_DIAL_TIME) + if(!.) + calling_holopad.say("No answer recieved.") + calling_holopad.temp = "" + + if(!.) + testing("Holocall Check fail") + qdel(src) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index ae8c1ac1c4..ca9cc23380 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -57,8 +57,16 @@ Possible to do for anyone motivated enough: holopads += src /obj/machinery/holopad/Destroy() - for (var/mob/living/silicon/ai/master in masters) - clear_holo(master) + if(outgoing_call) + LAZYADD(holo_calls, outgoing_call) + + for(var/I in holo_calls) + var/datum/holocall/HC = I + HC.ConnectionFailure(src) + LAZYCLEARLIST(holo_calls) + + for (var/I in masters) + clear_holo(I) holopads -= src return ..() @@ -128,12 +136,49 @@ Possible to do for anyone motivated enough: temp = "A request for AI presence was already sent recently.
" temp += "
Main Menu" + else if(href_list["Holocall"]) + if(outgoing_call) + return + + temp = "You must stand on the holopad to make a call!
" + temp += "Main Menu" + if(usr.loc == loc) + var/list/callnames = list() + for(var/I in holopads) + var/area/A = get_area(I) + if(A) + LAZYADD(callnames[A], I) + callnames -= get_area(src) + + var/result = input(usr, "Choose an area to call", "Holocall") as null|anything in callnames + if(QDELETED(usr) || !result || outgoing_call) + return + + if(usr.loc == loc) + temp = "Dialing...
" + temp += "Main Menu" + new /datum/holocall(usr, src, callnames[result]) + + else if(href_list["connectcall"]) + var/datum/holocall/call_to_connect = locate(href_list["connectcall"]) + if(!QDELETED(call_to_connect)) + call_to_connect.Answer(src) + temp = "" + + else if(href_list["disconnectcall"]) + var/datum/holocall/call_to_disconnect = locate(href_list["disconnectcall"]) + if(!QDELETED(call_to_disconnect)) + call_to_disconnect.Disconnect(src) + temp = "" + else if(href_list["mainmenu"]) temp = "" + if(outgoing_call) + outgoing_call.Disconnect() updateDialog() - add_fingerprint(usr) +//do not allow AIs to answer calls or people will use it to meta the AI sattelite /obj/machinery/holopad/attack_ai(mob/living/silicon/ai/user) if (!istype(user)) return @@ -148,39 +193,75 @@ Possible to do for anyone motivated enough: clear_holo(user) /obj/machinery/holopad/process() - if(masters.len)//If there is a hologram. - for (var/mob/living/silicon/ai/master in masters) - if(master && !master.stat && master.client && master.eyeobj)//If there is an AI attached, it's not incapacitated, it has a client, and the client eye is centered on the projector. - if(!(stat & NOPOWER))//If the machine has power. - if(HOLOPAD_MODE == RANGE_BASED) - if(get_dist(master.eyeobj, src) <= holo_range) - return TRUE - else - var/obj/machinery/holopad/pad_close = get_closest_atom(/obj/machinery/holopad, holopads, master.eyeobj) - if(get_dist(pad_close, master.eyeobj) <= holo_range) - var/obj/effect/overlay/holo_pad_hologram/h = masters[master] - unset_holo(master) - pad_close.set_holo(master, h) - return TRUE - - else if (HOLOPAD_MODE == AREA_BASED) - - var/area/holo_area = get_area(src) - var/area/eye_area = get_area(master.eyeobj) - - if(eye_area in holo_area.related) - return TRUE - - clear_holo(master)//If not, we want to get rid of the hologram. - return TRUE - -/obj/machinery/holopad/proc/activate_holo(mob/living/silicon/ai/user) - if(!(stat & NOPOWER) && user.eyeobj.loc == src.loc)//If the projector has power and client eye is on it - if (istype(user.current, /obj/machinery/holopad)) + for(var/I in masters) + var/mob/living/master = I + var/mob/living/silicon/ai/AI = master + if(!istype(AI)) + AI = null + + if(!QDELETED(master) && !master.incapacitated() && master.client && (!AI || AI.eyeobj))//If there is an AI attached, it's not incapacitated, it has a client, and the client eye is centered on the projector. + if(is_operational())//If the machine has power. + if(AI) //ais are range based + if(get_dist(AI.eyeobj, src) <= holo_range) + continue + else + var/obj/machinery/holopad/pad_close = get_closest_atom(/obj/machinery/holopad, holopads, AI.eyeobj) + if(get_dist(pad_close, AI.eyeobj) <= holo_range) + var/obj/effect/overlay/holo_pad_hologram/h = masters[master] + unset_holo(master) + pad_close.set_holo(master, h) + continue + else + continue + clear_holo(master)//If not, we want to get rid of the hologram. + + if(outgoing_call) + outgoing_call.Check() + + for(var/I in holo_calls) + var/datum/holocall/HC = I + if(HC.connected_holopad != src) + if(force_answer_call && world.time > (HC.call_start_time + (HOLOPAD_MAX_DIAL_TIME / 2))) + HC.Answer(src) + break + if(outgoing_call) + HC.Disconnect(src)//can't answer calls while calling + else + playsound(src, 'sound/machines/twobeep.ogg', 100) //bring, bring! + +/obj/machinery/holopad/proc/activate_holo(mob/living/user) + var/mob/living/silicon/ai/AI = user + if(!istype(AI)) + AI = null + + if(is_operational() && (!AI || AI.eyeobj.loc == loc))//If the projector has power and client eye is on it + if (AI && istype(AI.current, /obj/machinery/holopad)) to_chat(user, "ERROR: \black Image feed in progress.") return - create_holo(user)//Create one. - src.visible_message("A holographic image of [user] flicks to life right before your eyes!") + + var/obj/effect/overlay/holo_pad_hologram/Hologram = new(loc)//Spawn a blank effect at the location. + if(AI) + Hologram.icon = AI.holo_icon + else //make it like real life + Hologram.icon = user.icon + Hologram.icon_state = user.icon_state + Hologram.copy_overlays(user, TRUE) + //codersprite some holo effects here + Hologram.alpha = 100 + Hologram.add_atom_colour("#77abff", FIXED_COLOUR_PRIORITY) + Hologram.Impersonation = user + + Hologram.languages_spoken = user.languages_spoken + Hologram.mouse_opacity = 0//So you can't click on it. + Hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. + Hologram.anchored = 1//So space wind cannot drag it. + Hologram.name = "[user.name] (Hologram)"//If someone decides to right click. + Hologram.set_light(2) //hologram lighting + + set_holo(user, Hologram) + visible_message("A holographic image of [user] flicks to life right before your eyes!") + + return Hologram else to_chat(user, "ERROR: \black Unable to project hologram.") diff --git a/code/game/machinery/hologram.dm.rej b/code/game/machinery/hologram.dm.rej new file mode 100644 index 0000000000..5dcbcc9d54 --- /dev/null +++ b/code/game/machinery/hologram.dm.rej @@ -0,0 +1,226 @@ +diff a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm (rejected hunks) +@@ -26,16 +26,12 @@ Possible to do for anyone motivated enough: + + #define HOLOPAD_PASSIVE_POWER_USAGE 1 + #define HOLOGRAM_POWER_USAGE 2 +-#define RANGE_BASED 4 +-#define AREA_BASED 6 +- +-var/const/HOLOPAD_MODE = RANGE_BASED + + var/list/holopads = list() + + /obj/machinery/holopad +- name = "\improper AI holopad" +- desc = "It's a floor-mounted device for projecting holographic images. It is activated remotely." ++ name = "Holopad" ++ desc = "It's a floor-mounted device for projecting holographic images." + icon_state = "holopad0" + layer = LOW_OBJ_LAYER + flags = HEAR +@@ -48,10 +44,13 @@ var/list/holopads = list() + obj_integrity = 300 + max_integrity = 300 + armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 0) +- var/list/masters = list()//List of AIs that use the holopad ++ var/list/masters = list()//List of living mobs that use the holopad + var/last_request = 0 //to prevent request spam. ~Carn + var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating. + var/temp = "" ++ var/list/holo_calls //array of /datum/holocalls ++ var/datum/holocall/outgoing_call //do not modify the datums only check and call the public procs ++ var/static/force_answer_call = FALSE //Calls will be automatically answered after a couple rings, here for debugging + + /obj/machinery/holopad/Initialize() + ..() +@@ -94,20 +101,60 @@ var/list/holopads = list() + return + return ..() + ++/obj/machinery/holopad/proc/CheckCallClose() ++ for(var/I in holo_calls) ++ var/datum/holocall/HC = I ++ if(usr == HC.eye) ++ HC.Disconnect(HC.calling_holopad) //disconnect via clicking the called holopad ++ return TRUE ++ return FALSE ++ ++/obj/machinery/holopad/Click(location,control,params) ++ if(!CheckCallClose()) ++ return ..() ++ + /obj/machinery/holopad/AltClick(mob/living/carbon/human/user) +- interact(user) ++ if(!CheckCallClose()) ++ interact(user) + + /obj/machinery/holopad/interact(mob/living/carbon/human/user) //Carn: Hologram requests. + if(!istype(user)) + return +- if(user.stat || stat & (NOPOWER|BROKEN)) ++ if(user.incapacitated() || !is_operational()) ++ return ++ ++ if(outgoing_call) //someone is making a call, leave them be + return ++ + user.set_machine(src) + var/dat + if(temp) + dat = temp + else +- dat = "request an AI's presence." ++ dat = "Request an AI's presence.
" ++ dat += "Call another holopad.
" ++ ++ if(LAZYLEN(holo_calls)) ++ dat += "=====================================================
" ++ ++ var/one_answered_call = FALSE ++ var/one_unanswered_call = FALSE ++ for(var/I in holo_calls) ++ var/datum/holocall/HC = I ++ if(HC.connected_holopad != src) ++ dat += "Answer call from [get_area(HC.calling_holopad)].
" ++ one_unanswered_call = TRUE ++ else ++ one_answered_call = TRUE ++ ++ if(one_answered_call && one_unanswered_call) ++ dat += "=====================================================
" ++ //we loop twice for formatting ++ for(var/I in holo_calls) ++ var/datum/holocall/HC = I ++ if(HC.connected_holopad == src) ++ dat += "Disconnect call from [HC.user].
" ++ + + var/datum/browser/popup = new(user, "holopad", name, 300, 130) + popup.set_content(dat) +@@ -115,7 +162,10 @@ var/list/holopads = list() + popup.open() + + /obj/machinery/holopad/Topic(href, href_list) +- if(..()) ++ if(..() || isAI(usr)) ++ return ++ add_fingerprint(usr) ++ if(!is_operational()) + return + if (href_list["AIrequest"]) + if(last_request + 200 < world.time) +@@ -194,59 +317,81 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ + for(var/mob/living/silicon/ai/master in masters) + if(masters[master] && speaker != master) + master.relay_speech(message, speaker, message_langs, raw_message, radio_freq, spans) ++ ++ for(var/I in holo_calls) ++ var/datum/holocall/HC = I ++ if(HC.connected_holopad == src && speaker != HC.hologram) ++ HC.user.Hear(message, speaker, message_langs, raw_message, radio_freq, spans) ++ ++ if(outgoing_call && speaker == outgoing_call.user) ++ outgoing_call.hologram.say(raw_message) ++ ++/obj/machinery/holopad/proc/SetLightsAndPower() ++ var/total_users = masters.len + LAZYLEN(holo_calls) ++ use_power = HOLOPAD_PASSIVE_POWER_USAGE + HOLOGRAM_POWER_USAGE * total_users ++ if(total_users) ++ set_light(2) ++ icon_state = "holopad1" ++ else ++ set_light(0) ++ icon_state = "holopad0" + +-/obj/machinery/holopad/proc/create_holo(mob/living/silicon/ai/A, turf/T = loc) +- var/obj/effect/overlay/holo_pad_hologram/h = new(T)//Spawn a blank effect at the location. +- h.icon = A.holo_icon +- h.mouse_opacity = 0//So you can't click on it. +- h.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. +- h.anchored = 1//So space wind cannot drag it. +- h.name = "[A.name] (Hologram)"//If someone decides to right click. +- h.set_light(2) //hologram lighting +- set_holo(A, h) +- return TRUE +- +-/obj/machinery/holopad/proc/set_holo(mob/living/silicon/ai/A, var/obj/effect/overlay/holo_pad_hologram/h) +- masters[A] = h +- set_light(2) // pad lighting +- icon_state = "holopad1" +- A.current = src +- use_power += HOLOGRAM_POWER_USAGE ++/obj/machinery/holopad/proc/set_holo(mob/living/user, var/obj/effect/overlay/holo_pad_hologram/h) ++ masters[user] = h ++ var/mob/living/silicon/ai/AI = user ++ if(istype(AI)) ++ AI.current = src ++ SetLightsAndPower() + return TRUE + +-/obj/machinery/holopad/proc/clear_holo(mob/living/silicon/ai/user) ++/obj/machinery/holopad/proc/clear_holo(mob/living/user) + qdel(masters[user]) // Get rid of user's hologram + unset_holo(user) + return TRUE + +-/obj/machinery/holopad/proc/unset_holo(mob/living/silicon/ai/user) +- if(user.current == src) +- user.current = null ++/obj/machinery/holopad/proc/unset_holo(mob/living/user) ++ var/mob/living/silicon/ai/AI = user ++ if(istype(AI) && AI.current == src) ++ AI.current = null + masters -= user // Discard AI from the list of those who use holopad +- use_power = max(HOLOPAD_PASSIVE_POWER_USAGE, use_power - HOLOGRAM_POWER_USAGE)//Reduce power usage +- if (!masters.len) // If no users left +- set_light(0) // pad lighting (hologram lighting will be handled automatically since its owner was deleted) +- icon_state = "holopad0" +- use_power = HOLOPAD_PASSIVE_POWER_USAGE ++ SetLightsAndPower() + return TRUE + +-/obj/machinery/holopad/proc/move_hologram(mob/living/silicon/ai/user) ++/obj/machinery/holopad/proc/move_hologram(mob/living/user, turf/new_turf) + if(masters[user]) +- step_to(masters[user], user.eyeobj) + var/obj/effect/overlay/holo_pad_hologram/H = masters[user] +- H.loc = get_turf(user.eyeobj) ++ step_to(H, new_turf) ++ H.loc = new_turf ++ var/area/holo_area = get_area(src) ++ var/area/eye_area = new_turf.loc ++ ++ if(!(eye_area in holo_area.related)) ++ clear_holo(user) + return TRUE + ++/obj/effect/overlay/holo_pad_hologram ++ var/mob/living/Impersonation ++ var/datum/holocall/HC ++ ++/obj/effect/overlay/holo_pad_hologram/Destroy() ++ Impersonation = null ++ if(HC) ++ HC.Disconnect(HC.calling_holopad) ++ return ..() ++ + /obj/effect/overlay/holo_pad_hologram/Process_Spacemove(movement_dir = 0) + return 1 + ++/obj/effect/overlay/holo_pad_hologram/examine(mob/user) ++ if(Impersonation) ++ return Impersonation.examine(user) ++ return ..() ++ + /obj/item/weapon/circuitboard/machine/holopad + name = "AI Holopad (Machine Board)" + build_path = /obj/machinery/holopad + origin_tech = "programming=1" + req_components = list(/obj/item/weapon/stock_parts/capacitor = 1) + +-#undef RANGE_BASED +-#undef AREA_BASED + #undef HOLOPAD_PASSIVE_POWER_USAGE +-#undef HOLOGRAM_POWER_USAGE ++#undef HOLOGRAM_POWER_USAGE +\ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index dce38bd664..56c43211e4 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -28,7 +28,7 @@ //Holopad if(istype(ai.current, /obj/machinery/holopad)) var/obj/machinery/holopad/H = ai.current - H.move_hologram(ai) + H.move_hologram(ai, T) /mob/camera/aiEye/Move() return 0 diff --git a/tgstation.dme.rej b/tgstation.dme.rej new file mode 100644 index 0000000000..0f29d8f023 --- /dev/null +++ b/tgstation.dme.rej @@ -0,0 +1,9 @@ +diff a/tgstation.dme b/tgstation.dme (rejected hunks) +@@ -206,6 +206,7 @@ + #include "code\datums\emotes.dm" + #include "code\datums\forced_movement.dm" + #include "code\datums\gas_overrides.dm" ++#include "code\datums\holocall.dm" + #include "code\datums\hud.dm" + #include "code\datums\map_config.dm" + #include "code\datums\martial.dm" From 00164a49a71928a38fbd3144b20c729e638141bb Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 13:06:07 -0500 Subject: [PATCH 014/352] Subsystem change for the SM and TEG and slight QoL --- code/modules/power/generator.dm | 36 ++++++++++++++----- code/modules/power/generator.dm.rej | 13 +++++++ code/modules/power/supermatter/supermatter.dm | 5 ++- 3 files changed, 44 insertions(+), 10 deletions(-) create mode 100644 code/modules/power/generator.dm.rej diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index dfbf3fe50b..70d4ea27a2 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -33,6 +33,7 @@ cold_circ = locate(circpath) in get_step(src, cold_dir) hot_circ = locate(circpath) in get_step(src, hot_dir) connect_to_network() + SSair.atmos_machinery += src if(cold_circ) switch(cold_dir) @@ -54,7 +55,10 @@ stat |= BROKEN update_icon() - + +/obj/machinery/power/generator/Destroy() + SSair.atmos_machinery -= src + return ..() /obj/machinery/power/generator/update_icon() @@ -104,7 +108,7 @@ var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity) var/heat = energy_transfer*(1-efficiency) - lastgen = energy_transfer*efficiency + lastgen += energy_transfer*efficiency //to_chat(world, "lastgen = [lastgen]; heat = [heat]; delta_temperature = [delta_temperature]; hot_air_heat_capacity = [hot_air_heat_capacity]; cold_air_heat_capacity = [cold_air_heat_capacity];") @@ -113,7 +117,7 @@ //to_chat(world, "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]") - add_avail(lastgen) + //add_avail(lastgen) This is done in process now // update icon overlays only if displayed level has changed if(hot_air) @@ -123,15 +127,23 @@ if(cold_air) var/datum/gas_mixture/cold_circ_air1 = cold_circ.AIR1 cold_circ_air1.merge(cold_air) + + update_icon() - var/genlev = max(0, min( round(11*lastgen / 100000), 11)) var/circ = "[cold_circ && cold_circ.last_pressure_delta > 0 ? "1" : "0"][hot_circ && hot_circ.last_pressure_delta > 0 ? "1" : "0"]" - if((genlev != lastgenlev) || (circ != lastcirc)) - lastgenlev = genlev + if(circ != lastcirc) lastcirc = circ update_icon() src.updateDialog() + +/obj/machinery/power/generator/process() + //Setting this number higher just makes the change in power output slower, it doesnt actualy reduce power output cause **math** + var/power_output = round(lastgen / 10) + add_avail(power_output) + lastgenlev = power_output + lastgen -= power_output + ..() /obj/machinery/power/generator/attack_hand(mob/user) if(..()) @@ -150,9 +162,15 @@ var/datum/gas_mixture/hot_circ_air2 = hot_circ.AIR2 t += "

" - - t += "Output: [round(lastgen)] W" - + + var/displaygen = lastgenlev + if(displaygen < 1000000) //less than a MW + displaygen /= 1000 + t += "Output: [round(displaygen,0.01)] kW" + else + displaygen /= 1000000 + t += "Output: [round(displaygen,0.01)] MW" + t += "
" t += "Cold loop
" diff --git a/code/modules/power/generator.dm.rej b/code/modules/power/generator.dm.rej new file mode 100644 index 0000000000..9de6ba6b3a --- /dev/null +++ b/code/modules/power/generator.dm.rej @@ -0,0 +1,13 @@ +diff a/code/modules/power/generator.dm b/code/modules/power/generator.dm (rejected hunks) +@@ -64,9 +64,8 @@ + else + cut_overlays() + +- var/L = min(round(lastgenlev/100000),11) +- +- if(L != 0) ++ var/L = min(round(lastgenlev/100000),11) ++ if(L != 0) + add_overlay(image('icons/obj/power.dmi', "teg-op[L]")) + + add_overlay("teg-oc[lastcirc]") diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index fee8859de4..095a023fba 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -129,6 +129,7 @@ /obj/machinery/power/supermatter_shard/New() . = ..() + SSair.atmos_machinery += src countdown = new(src) countdown.start() GLOB.poi_list |= src @@ -139,6 +140,7 @@ /obj/machinery/power/supermatter_shard/Destroy() investigate_log("has been destroyed.", "supermatter") + SSair.atmos_machinery -= src QDEL_NULL(radio) GLOB.poi_list -= src QDEL_NULL(countdown) @@ -181,7 +183,7 @@ E.energy = power qdel(src) -/obj/machinery/power/supermatter_shard/process() +/obj/machinery/power/supermatter_shard/process_atmos() var/turf/T = loc if(isnull(T)) // We have a null turf...something is wrong, stop processing this entity. @@ -296,6 +298,7 @@ if(produces_gas) env.merge(removed) + air_update_turf() for(var/mob/living/carbon/human/l in view(src, HALLUCINATION_RANGE(power))) // If they can see it without mesons on. Bad on them. if(!istype(l.glasses, /obj/item/clothing/glasses/meson)) From cc0a9b87fb823b67debdc7dccd8051a0c3961ea6 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 15:58:52 -0500 Subject: [PATCH 015/352] Changes /obj/machinery to have atom/movable occupants --- .../abduction/machinery/experiment.dm | 17 +++--- code/game/machinery/Sleeper.dm | 43 ++++++++------- code/game/machinery/cloning.dm | 54 +++++++++++-------- code/game/machinery/cloning.dm.rej | 38 +++++++++++++ code/game/machinery/computer/cloning.dm | 14 ++--- code/game/machinery/dna_scanner.dm | 9 ++-- code/game/machinery/gulag_teleporter.dm | 7 +-- code/game/machinery/machinery.dm | 33 ++++++++---- code/game/machinery/suit_storage_unit.dm | 17 +++--- .../items/weapons/implants/implantchair.dm | 7 +-- code/modules/VR/vr_sleeper.dm | 6 ++- .../components/unary_devices/cryo.dm | 28 +++++----- .../components/unary_devices/cryo.dm.rej | 12 +++++ .../kitchen_machinery/gibber.dm | 11 ++-- 14 files changed, 193 insertions(+), 103 deletions(-) create mode 100644 code/game/machinery/cloning.dm.rej create mode 100644 code/modules/atmospherics/machinery/components/unary_devices/cryo.dm.rej diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm index 193aecd9ce..8f3dfb7ac3 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm @@ -116,12 +116,13 @@ else dat += "

Subject Status :

" dat += "[occupant.name] => " - switch(occupant.stat) - if(0) + var/mob/living/mob_occupant = occupant + switch(mob_occupant.stat) + if(CONSCIOUS) dat += "Conscious" - if(1) + if(UNCONSCIOUS) dat += "Unconscious" - else + else // DEAD dat += "Deceased" dat += "
" dat += "[flash]" @@ -146,9 +147,11 @@ if(href_list["close"]) close_machine() return - if(occupant && occupant.stat != DEAD) - if(href_list["experiment"]) - flash = Experiment(occupant,href_list["experiment"]) + if(occupant) + var/mob/living/mob_occupant = occupant + if(mob_occupant.stat != DEAD) + if(href_list["experiment"]) + flash = Experiment(occupant,href_list["experiment"]) updateUsrDialog() add_fingerprint(usr) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 5dc8ea3f20..e8533f6acb 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -79,7 +79,8 @@ /obj/machinery/sleeper/close_machine(mob/user) if((isnull(user) || istype(user)) && state_open && !panel_open) ..(user) - if(occupant && occupant.stat != DEAD) + var/mob/living/mob_occupant = occupant + if(mob_occupant && mob_occupant.stat != DEAD) to_chat(occupant, "You feel cool air surround you. You go numb as your senses turn inward.") /obj/machinery/sleeper/emp_act(severity) @@ -128,27 +129,30 @@ data["chems"] += list(list("name" = R.name, "id" = R.id, "allowed" = chem_allowed(chem))) data["occupant"] = list() - if(occupant) - data["occupant"]["name"] = occupant.name - data["occupant"]["stat"] = occupant.stat - data["occupant"]["health"] = occupant.health - data["occupant"]["maxHealth"] = occupant.maxHealth + var/mob/living/mob_occupant = occupant + if(mob_occupant) + data["occupant"]["name"] = mob_occupant.name + data["occupant"]["stat"] = mob_occupant.stat + data["occupant"]["health"] = mob_occupant.health + data["occupant"]["maxHealth"] = mob_occupant.maxHealth data["occupant"]["minHealth"] = HEALTH_THRESHOLD_DEAD - data["occupant"]["bruteLoss"] = occupant.getBruteLoss() - data["occupant"]["oxyLoss"] = occupant.getOxyLoss() - data["occupant"]["toxLoss"] = occupant.getToxLoss() - data["occupant"]["fireLoss"] = occupant.getFireLoss() - data["occupant"]["cloneLoss"] = occupant.getCloneLoss() - data["occupant"]["brainLoss"] = occupant.getBrainLoss() + data["occupant"]["bruteLoss"] = mob_occupant.getBruteLoss() + data["occupant"]["oxyLoss"] = mob_occupant.getOxyLoss() + data["occupant"]["toxLoss"] = mob_occupant.getToxLoss() + data["occupant"]["fireLoss"] = mob_occupant.getFireLoss() + data["occupant"]["cloneLoss"] = mob_occupant.getCloneLoss() + data["occupant"]["brainLoss"] = mob_occupant.getBrainLoss() data["occupant"]["reagents"] = list() if(occupant.reagents.reagent_list.len) - for(var/datum/reagent/R in occupant.reagents.reagent_list) + for(var/datum/reagent/R in mob_occupant.reagents.reagent_list) data["occupant"]["reagents"] += list(list("name" = R.name, "volume" = R.volume)) return data /obj/machinery/sleeper/ui_act(action, params) if(..()) return + var/mob/living/mob_occupant = occupant + switch(action) if("door") if(state_open) @@ -158,9 +162,9 @@ . = TRUE if("inject") var/chem = params["chem"] - if(!is_operational() || !occupant) + if(!is_operational() || mob_occupant) return - if(occupant.health < min_health && chem != "epinephrine") + if(mob_occupant.health < min_health && chem != "epinephrine") return if(inject_chem(chem)) . = TRUE @@ -177,10 +181,11 @@ return TRUE /obj/machinery/sleeper/proc/chem_allowed(chem) - if(!occupant) - return - var/amount = occupant.reagents.get_reagent_amount(chem) + 10 <= 20 * efficiency - var/occ_health = occupant.health > min_health || chem == "epinephrine" + var/mob/living/mob_occupant = occupant + if(!mob_occupant) + return + var/amount = mob_occupant.reagents.get_reagent_amount(chem) + 10 <= 20 * efficiency + var/occ_health = mob_occupant.health > min_health || chem == "epinephrine" return amount && occ_health /obj/machinery/sleeper/proc/reset_chem_buttons() diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index eeef80ca5b..38b2cf1705 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -121,10 +121,12 @@ /obj/machinery/clonepod/examine(mob/user) ..() + var/mob/living/mob_occupant = occupant if(mess) to_chat(user, "It's filled with blood and viscera. You swear you can see it moving...") - if (is_operational() && (!isnull(occupant)) && (occupant.stat != DEAD)) - to_chat(user, "Current clone cycle is [round(get_completion())]% complete.") + if(is_operational() && mob_occupant) + if(mob_occupant.stat != DEAD) + to_chat(user, "Current clone cycle is [round(get_completion())]% complete.") /obj/machinery/clonepod/return_air() // We want to simulate the clone not being in contact with @@ -136,7 +138,10 @@ return GM /obj/machinery/clonepod/proc/get_completion() - . = (100 * ((occupant.health + 100) / (heal_level + 100))) + . = FALSE + var/mob/living/mob_occupant = occupant + if(mob_occupant) + . = (100 * ((mob_occupant.health + 100) / (heal_level + 100))) /obj/machinery/clonepod/attack_ai(mob/user) return examine(user) @@ -223,25 +228,26 @@ //Grow clones to maturity then kick them out. FREELOADERS /obj/machinery/clonepod/process() + var/mob/living/mob_occupant = occupant if(!is_operational()) //Autoeject if power is lost - if (occupant) + if(mob_occupant) go_out() connected_message("Clone Ejected: Loss of power.") - else if((occupant) && (occupant.loc == src)) - if((occupant.stat == DEAD) || (occupant.suiciding) || occupant.hellbound) //Autoeject corpses and suiciding dudes. + else if(mob_occupant && (mob_occupant.loc == src)) + if((mob_occupant.stat == DEAD) || (mob_occupant.suiciding) || mob_occupant.hellbound) //Autoeject corpses and suiciding dudes. connected_message("Clone Rejected: Deceased.") - SPEAK("The cloning of [occupant.real_name] has been \ + SPEAK("The cloning of [mob_occupant.real_name] has been \ aborted due to unrecoverable tissue failure.") go_out() - else if(occupant.cloneloss > (100 - heal_level)) - occupant.Paralyse(4) + else if(mob_occupant.cloneloss > (100 - heal_level)) + mob_occupant.Paralyse(4) //Slowly get that clone healed and finished. - occupant.adjustCloneLoss(-((speed_coeff/2) * config.damage_multiplier)) - var/progress = CLONE_INITIAL_DAMAGE - occupant.getCloneLoss() + mob_occupant.adjustCloneLoss(-((speed_coeff/2) * config.damage_multiplier)) + var/progress = CLONE_INITIAL_DAMAGE - mob_occupant.getCloneLoss() // To avoid the default cloner making incomplete clones progress += (100 - MINIMUM_HEAL_LEVEL) var/milestone = CLONE_INITIAL_DAMAGE / flesh_number @@ -252,24 +258,24 @@ var/obj/item/I = pick_n_take(unattached_flesh) if(isorgan(I)) var/obj/item/organ/O = I - O.Insert(occupant) + O.Insert(mob_occupant) else if(isbodypart(I)) var/obj/item/bodypart/BP = I - BP.attach_limb(occupant) + BP.attach_limb(mob_occupant) //Premature clones may have brain damage. - occupant.adjustBrainLoss(-((speed_coeff/2) * config.damage_multiplier)) + mob_occupant.adjustBrainLoss(-((speed_coeff/2) * config.damage_multiplier)) check_brine() use_power(7500) //This might need tweaking. - else if((occupant.cloneloss <= (100 - heal_level))) + else if((mob_occupant.cloneloss <= (100 - heal_level))) connected_message("Cloning Process Complete.") - SPEAK("The cloning cycle of [occupant.real_name] is complete.") + SPEAK("The cloning cycle of [mob_occupant.real_name] is complete.") go_out() - else if ((!occupant) || (occupant.loc != src)) + else if (!mob_occupant || mob_occupant.loc != src) occupant = null if (!mess && !panel_open) icon_state = "pod_0" @@ -339,6 +345,7 @@ /obj/machinery/clonepod/proc/go_out() countdown.stop() + var/mob/living/mob_occupant = occupant if(mess) //Clean that mess and dump those gibs! mess = FALSE @@ -347,22 +354,25 @@ icon_state = "pod_0" return - if(!occupant) + if(!mob_occupant) return + if(grab_ghost_when == CLONER_MATURE_CLONE) - occupant.grab_ghost() + mob_occupant.grab_ghost() to_chat(occupant, "There is a bright flash!
You feel like a new being.
") - occupant.flash_act() + mob_occupant.flash_act() var/turf/T = get_turf(src) occupant.forceMove(T) icon_state = "pod_0" - occupant.domutcheck(1) //Waiting until they're out before possible monkeyizing. The 1 argument forces powers to manifest. + mob_occupant.domutcheck(1) //Waiting until they're out before possible monkeyizing. The 1 argument forces powers to manifest. + occupant = null /obj/machinery/clonepod/proc/malfunction() - if(occupant) + var/mob/living/mob_occupant = occupant + if(mob_occupant) connected_message("Critical Error!") SPEAK("Critical error! Please contact a Thinktronic Systems \ technician, as your warranty may be affected.") diff --git a/code/game/machinery/cloning.dm.rej b/code/game/machinery/cloning.dm.rej new file mode 100644 index 0000000000..74ef688700 --- /dev/null +++ b/code/game/machinery/cloning.dm.rej @@ -0,0 +1,38 @@ +diff a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm (rejected hunks) +@@ -311,15 +311,15 @@ + to_chat(user, "-% Successfully stored \ref[P.buffer] [P.buffer.name] in buffer %-") + return + ++ var/mob/living/mob_occupant = occupant + if(W.GetID()) + if(!check_access(W)) + to_chat(user, "Access Denied.") + return +- if(!(occupant || mess)) ++ if(!(mob_occupant || mess)) + to_chat(user, "Error: Pod has no occupant.") + return + else +- var/mob/living/mob_occupant + connected_message("Authorized Ejection") + SPEAK("An authorized ejection of [clonemind.name] has occurred.") + to_chat(user, "You force an emergency ejection. ") +@@ -395,16 +395,10 @@ + go_out() + + /obj/machinery/clonepod/emp_act(severity) +-<<<<<<< HEAD +- if((occupant || mess) && prob(100/(severity*efficiency))) +- connected_message(Gibberish("EMP-caused Accidental Ejection", 0)) +- SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of [clonemind.name] prematurely." ,0)) +-======= +- if(isliving(occupant) && prob(100/(severity*efficiency))) +- var/mob/living/mob_occupant = occupant ++ var/mob/living/mob_occupant = occupant ++ if(mob_occupant && prob(100/(severity*efficiency))) + connected_message(Gibberish("EMP-caused Accidental Ejection", 0)) + SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of [mob_occupant.real_name] prematurely." ,0)) +->>>>>>> Changes /obj/machinery to have atom/movable occupants + go_out() + ..() + diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index afa054428a..48819f91e2 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -186,21 +186,23 @@ // Scanner if (!isnull(src.scanner)) + var/mob/living/scanner_occupant = scanner.occupant + dat += "

Scanner Functions

" dat += "
" - if (!src.scanner.occupant) + if(!scanner_occupant) dat += "Scanner Unoccupied" else if(loading) - dat += "[src.scanner.occupant] => Scanning..." + dat += "[scanner_occupant] => Scanning..." else - if (src.scanner.occupant.ckey != scantemp_ckey) + if(scanner_occupant.ckey != scantemp_ckey) scantemp = "Ready to Scan" - scantemp_ckey = src.scanner.occupant.ckey - dat += "[src.scanner.occupant] => [scantemp]" + scantemp_ckey = scanner_occupant.ckey + dat += "[scanner_occupant] => [scantemp]" dat += "
" - if (src.scanner.occupant) + if(scanner_occupant) dat += "Start Scan" dat += "
[src.scanner.locked ? "Unlock Scanner" : "Lock Scanner"]" else diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index af59f63888..d572b3e9dc 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -105,13 +105,14 @@ ..() // search for ghosts, if the corpse is empty and the scanner is connected to a cloner - if(occupant) + var/mob/living/mob_occupant = occupant + if(mob_occupant) if(locate(/obj/machinery/computer/cloning, get_step(src, NORTH)) \ || locate(/obj/machinery/computer/cloning, get_step(src, SOUTH)) \ || locate(/obj/machinery/computer/cloning, get_step(src, EAST)) \ || locate(/obj/machinery/computer/cloning, get_step(src, WEST))) - if(!occupant.suiciding && !(occupant.disabilities & NOCLONE) && !occupant.hellbound) - occupant.notify_ghost_cloning("Your corpse has been placed into a cloning scanner. Re-enter your corpse if you want to be cloned!", source = src) + if(!mob_occupant.suiciding && !(mob_occupant.disabilities & NOCLONE) && !mob_occupant.hellbound) + mob_occupant.notify_ghost_cloning("Your corpse has been placed into a cloning scanner. Re-enter your corpse if you want to be cloned!", source = src) var/obj/machinery/computer/scan_consolenew/console for(dir in list(NORTH,EAST,SOUTH,WEST)) @@ -157,4 +158,4 @@ if(..(user,1,0)) //don't set the machine, since there's no dialog return - toggle_open(user) \ No newline at end of file + toggle_open(user) diff --git a/code/game/machinery/gulag_teleporter.dm b/code/game/machinery/gulag_teleporter.dm index 92a550b17c..5979abdc29 100644 --- a/code/game/machinery/gulag_teleporter.dm +++ b/code/game/machinery/gulag_teleporter.dm @@ -136,13 +136,14 @@ The console is located at computer/gulag_teleporter.dm /obj/machinery/gulag_teleporter/proc/strip_occupant() if(linked_reclaimer) linked_reclaimer.stored_items[occupant] = list() - for(var/obj/item/W in occupant) - if(!is_type_in_typecache(W, required_items) && occupant.temporarilyRemoveItemFromInventory(W)) + var/mob/living/mob_occupant = occupant + for(var/obj/item/W in mob_occupant) + if(!is_type_in_typecache(W, required_items) && mob_occupant.temporarilyRemoveItemFromInventory(W)) if(istype(W, /obj/item/weapon/restraints/handcuffs)) W.forceMove(get_turf(src)) continue if(linked_reclaimer) - linked_reclaimer.stored_items[occupant] += W + linked_reclaimer.stored_items[mob_occupant] += W linked_reclaimer.contents += W W.forceMove(linked_reclaimer) else diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 6cd8e75798..96b0029134 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -1,8 +1,8 @@ /* Overview: - Used to create objects that need a per step proc call. Default definition of 'New()' + Used to create objects that need a per step proc call. Default definition of 'Initialize()' stores a reference to src machine in global 'machines list'. Default definition - of 'Del' removes reference to src machine in global 'machines list'. + of 'Destroy' removes reference to src machine in global 'machines list'. Class Variables: use_power (num) @@ -44,7 +44,7 @@ Class Variables: EMPED:16 -- temporary broken by EMP pulse Class Procs: - New() 'game/machinery/machine.dm' + Initialize() 'game/machinery/machine.dm' Destroy() 'game/machinery/machine.dm' @@ -118,14 +118,15 @@ Class Procs: var/panel_open = 0 var/state_open = 0 var/critical_machine = FALSE //If this machine is critical to station operation and should have the area be excempted from power failures. - var/mob/living/occupant = null + var/list/occupant_typecache = list(/mob/living) // turned into typecache in Initialize + var/atom/movable/occupant = null var/unsecuring_tool = /obj/item/weapon/wrench var/interact_open = 0 // Can the machine be interacted with when in maint/when the panel is open. var/interact_offline = 0 // Can the machine be interacted with while de-powered. var/speed_process = 0 // Process as fast as possible? /obj/machinery/Initialize() - if (!armor) + if(!armor) armor = list(melee = 25, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 70) . = ..() GLOB.machines += src @@ -135,6 +136,8 @@ Class Procs: START_PROCESSING(SSfastprocess, src) power_change() + occupant_typecache = typecacheof(occupant_typecache) + /obj/machinery/Destroy() GLOB.machines.Remove(src) if(!speed_process) @@ -176,16 +179,24 @@ Class Procs: L.update_canmove() occupant = null -/obj/machinery/proc/close_machine(mob/living/target = null) +/obj/machinery/proc/close_machine(atom/movable/target = null) state_open = 0 density = 1 if(!target) - for(var/mob/living/carbon/C in loc) - if(C.buckled || C.has_buckled_mobs()) + for(var/am in loc) + if(!is_type_in_typecache(am, occupant_typecache)) continue - else - target = C - if(target && !target.buckled && !target.has_buckled_mobs()) + var/atom/movable/AM = am + if(AM.has_buckled_mobs()) + continue + if(isliving(AM)) + var/mob/living/L = am + if(L.buckled) + continue + target = am + + var/mob/living/mobtarget = target + if(target && !target.has_buckled_mobs() && (!isliving(target) || !mobtarget.buckled)) occupant = target target.forceMove(src) updateUsrDialog() diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 7fc0f98b1c..e81774e147 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -211,13 +211,13 @@ uv = TRUE locked = TRUE update_icon() - if(occupant) + if(occupant) + var/mob/living/mob_occupant = occupant if(uv_super) - occupant.adjustFireLoss(rand(20, 36)) + mob_occupant.adjustFireLoss(rand(20, 36)) else - occupant.adjustFireLoss(rand(10, 16)) - if(iscarbon(occupant)) - occupant.emote("scream") + mob_occupant.adjustFireLoss(rand(10, 16)) + mob_occupant.emote("scream") addtimer(CALLBACK(src, .proc/cook), 50) else uv_cycles = initial(uv_cycles) @@ -368,14 +368,15 @@ else if(!helmet && !mask && !suit && !storage && !occupant) return else - if(occupant) - to_chat(occupant, "[src]'s confines grow warm, then hot, then scorching. You're being burned [!occupant.stat ? "alive" : "away"]!") + if(occupant) + var/mob/living/mob_occupant = occupant + to_chat(mob_occupant, "[src]'s confines grow warm, then hot, then scorching. You're being burned [!mob_occupant.stat ? "alive" : "away"]!") cook() . = TRUE if("dispense") if(!state_open) return - + var/static/list/valid_items = list("helmet", "suit", "mask", "storage") var/item_name = params["item"] if(item_name in valid_items) diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm index 6f1a43a93a..a3b72d55bd 100644 --- a/code/game/objects/items/weapons/implants/implantchair.dm +++ b/code/game/objects/items/weapons/implants/implantchair.dm @@ -41,9 +41,10 @@ data["open"] = state_open data["occupant"] = list() - if(occupant) - data["occupant"]["name"] = occupant.name - data["occupant"]["stat"] = occupant.stat + if(occupant) + var/mob/living/mob_occupant = occupant + data["occupant"]["name"] = mob_occupant.name + data["occupant"]["stat"] = mob_occupant.stat data["special_name"] = special ? special_name : null data["ready_implants"] = ready_implants diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm index 9411917c39..bba253a9da 100644 --- a/code/modules/VR/vr_sleeper.dm +++ b/code/modules/VR/vr_sleeper.dm @@ -9,6 +9,7 @@ icon_state = "sleeper" state_open = TRUE anchored = TRUE + occupant_typecache = list(/mob/living/carbon/human) // turned into typecache in Initialize var/you_die_in_the_game_you_die_for_real = FALSE var/datum/effect_system/spark_spread/sparks var/mob/living/carbon/human/virtual_reality/vr_human @@ -92,11 +93,12 @@ return switch(action) if("vr_connect") - if(ishuman(occupant) && occupant.mind) + var/mob/living/carbon/human/human_occupant = occupant + if(human_occupant && human_occupant.mind) to_chat(occupant, "Transfering to virtual reality...") if(vr_human) vr_human.revert_to_reality(FALSE, FALSE) - occupant.mind.transfer_to(vr_human) + human_occupant.mind.transfer_to(vr_human) vr_human.real_me = occupant to_chat(vr_human, "Transfer successful! you are now playing as [vr_human] in VR!") SStgui.close_user_uis(vr_human, src) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 2a67b5fe13..3a76a03be8 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -191,20 +191,21 @@ on = FALSE update_icon() return - if(occupant) + if(occupant) + var/mob/living/mob_occupant = occupant var/cold_protection = 0 var/mob/living/carbon/human/H = occupant if(istype(H)) cold_protection = H.get_cold_protection(air1.temperature) - var/temperature_delta = air1.temperature - occupant.bodytemperature // The only semi-realistic thing here: share temperature between the cell and the occupant. + var/temperature_delta = air1.temperature - mob_occupant.bodytemperature // The only semi-realistic thing here: share temperature between the cell and the occupant. if(abs(temperature_delta) > 1) var/air_heat_capacity = air1.heat_capacity() var/heat = ((1 - cold_protection) / 10 + conduction_coefficient) \ * temperature_delta * \ (air_heat_capacity * heat_capacity / (air_heat_capacity + heat_capacity)) air1.temperature = max(air1.temperature - heat / air_heat_capacity, TCMB) - occupant.bodytemperature = max(occupant.bodytemperature + heat / heat_capacity, TCMB) + mob_occupant.bodytemperature = max(mob_occupant.bodytemperature + heat / heat_capacity, TCMB) air1.gases["o2"][MOLES] -= 0.5 / efficiency // Magically consume gas? Why not, we run on cryo magic. @@ -294,17 +295,18 @@ data["autoEject"] = autoeject var/list/occupantData = list() - if(occupant) - occupantData["name"] = occupant.name - occupantData["stat"] = occupant.stat - occupantData["health"] = occupant.health - occupantData["maxHealth"] = occupant.maxHealth + if(occupant) + var/mob/living/mob_occupant = occupant + occupantData["name"] = mob_occupant.name + occupantData["stat"] = mob_occupant.stat + occupantData["health"] = mob_occupant.health + occupantData["maxHealth"] = mob_occupant.maxHealth occupantData["minHealth"] = HEALTH_THRESHOLD_DEAD - occupantData["bruteLoss"] = occupant.getBruteLoss() - occupantData["oxyLoss"] = occupant.getOxyLoss() - occupantData["toxLoss"] = occupant.getToxLoss() - occupantData["fireLoss"] = occupant.getFireLoss() - occupantData["bodyTemperature"] = occupant.bodytemperature + occupantData["bruteLoss"] = mob_occupant.getBruteLoss() + occupantData["oxyLoss"] = mob_occupant.getOxyLoss() + occupantData["toxLoss"] = mob_occupant.getToxLoss() + occupantData["fireLoss"] = mob_occupant.getFireLoss() + occupantData["bodyTemperature"] = mob_occupant.bodytemperature data["occupant"] = occupantData diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm.rej b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm.rej new file mode 100644 index 0000000000..ef4176d273 --- /dev/null +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm.rej @@ -0,0 +1,12 @@ +diff a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm (rejected hunks) +@@ -110,8 +110,8 @@ + return + var/datum/gas_mixture/air1 = AIR1 + var/turf/T = get_turf(src) +- if(isliving(occupant)) +- var/mob/living/mob_occupant ++ if(occupant) ++ var/mob/living/mob_occupant = occupant + if(mob_occupant.health >= 100) // Don't bother with fully healed people. + on = FALSE + update_icon() diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index a4d9a32d3d..3af1973f24 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -168,13 +168,14 @@ var/offset = prob(50) ? -2 : 2 animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking - var/sourcename = src.occupant.real_name + var/mob/living/mob_occupant = occupant + var/sourcename = mob_occupant.real_name var/sourcejob if(ishuman(occupant)) var/mob/living/carbon/human/gibee = occupant sourcejob = gibee.job - var/sourcenutriment = src.occupant.nutrition / 15 - var/sourcetotalreagents = src.occupant.reagents.total_volume + var/sourcenutriment = mob_occupant.nutrition / 15 + var/sourcetotalreagents = mob_occupant.reagents.total_volume var/gibtype = /obj/effect/decal/cleanable/blood/gibs var/typeofmeat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human var/typeofskin = /obj/item/stack/sheet/animalhide/human @@ -212,8 +213,8 @@ allskin = newskin add_logs(user, occupant, "gibbed") - src.occupant.death(1) - src.occupant.ghostize() + mob_occupant.death(1) + mob_occupant.ghostize() qdel(src.occupant) spawn(src.gibtime) playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) From b45d4ba6685f3bf705d62a3f65e26e2a47c41c38 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 17:32:29 -0500 Subject: [PATCH 016/352] Makes admin sound announcement use the right span --- code/modules/admin/verbs/playsound.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index ddc44592c0..613881281e 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -21,7 +21,7 @@ var/res = alert(usr, "Show the title of this song to the players?",, "No", "Yes", "Cancel") switch(res) if("Yes") - to_chat(world, "An admin played: [S]") + to_chat(world, "An admin played: [S]") if("Cancel") return From d29de62d697a87b6e6b1a124d663cde2ea643294 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 17:34:34 -0500 Subject: [PATCH 017/352] Plants now react with turfs on squash() --- code/modules/hydroponics/grown.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 555df764b8..5104ab333a 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -111,6 +111,7 @@ for(var/datum/plant_gene/trait/trait in seed.genes) trait.on_squash(src, target) + reagents.reaction(T) for(var/A in T) reagents.reaction(A) From 036109de58d03577353f55da6f8bdd94d548325d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 2 May 2017 02:20:07 -0500 Subject: [PATCH 018/352] Changes a bunch of hrefs to the proper defines --- code/datums/mind.dm | 2 +- code/game/machinery/computer/robot.dm | 5 +- code/game/mecha/equipment/weapons/weapons.dm | 4 +- .../effects/effect_system/effects_smoke.dm | 2 +- code/game/objects/effects/portals.dm | 2 +- code/game/objects/items/charter.dm | 2 +- code/game/objects/items/devices/powersink.dm | 4 +- .../objects/items/devices/transfer_valve.dm | 8 +-- .../objects/items/stacks/sheets/mineral.dm | 5 +- .../objects/items/weapons/flamethrower.dm | 2 +- .../items/weapons/grenades/chem_grenade.dm | 10 ++-- .../objects/items/weapons/grenades/plastic.dm | 4 +- .../weapons/implants/implant_explosive.dm | 2 +- code/game/objects/structures/false_walls.dm | 5 +- code/game/objects/structures/mineral_doors.dm | 5 +- code/game/objects/structures/statues.dm | 14 +++-- .../turfs/simulated/floor/mineral_floor.dm | 4 +- code/game/turfs/simulated/minerals.dm | 8 +-- .../turfs/simulated/wall/mineral_walls.dm | 4 +- code/modules/admin/verbs/adminhelp.dm | 2 +- code/modules/admin/verbs/adminhelp.dm.rej | 55 +++++++++++++++++++ .../admin/verbs/map_template_loadverb.dm | 2 +- code/modules/admin/verbs/randomverbs.dm.rej | 12 ++++ code/modules/assembly/timer.dm | 4 +- .../machinery/portable/canister.dm | 4 +- .../atmospherics/machinery/portable/pump.dm | 5 +- code/modules/client/verbs/who.dm | 2 +- code/modules/hydroponics/grown/misc.dm | 4 +- code/modules/mining/mine_items.dm | 4 +- code/modules/mining/ores_coins.dm | 12 ++-- code/modules/power/gravitygenerator.dm.rej | 22 ++++++++ code/modules/power/singularity/emitter.dm | 4 +- code/modules/power/singularity/emitter.dm.rej | 15 +++++ .../particle_accelerator/particle_control.dm | 8 +-- code/modules/power/smes.dm | 2 +- code/modules/power/smes.dm.rej | 17 ++++++ code/modules/power/supermatter/supermatter.dm | 6 +- code/modules/projectiles/guns/energy/pulse.dm | 7 +-- code/modules/reagents/chemistry/recipes.dm | 4 +- .../chemistry/recipes/pyrotechnics.dm | 7 ++- .../chemistry/recipes/slime_extracts.dm | 7 ++- .../reagents/reagent_containers/spray.dm | 13 +++-- code/modules/shuttle/emergency.dm | 8 +-- code/modules/shuttle/ferry.dm | 2 +- 44 files changed, 222 insertions(+), 98 deletions(-) create mode 100644 code/modules/admin/verbs/adminhelp.dm.rej create mode 100644 code/modules/admin/verbs/randomverbs.dm.rej create mode 100644 code/modules/power/gravitygenerator.dm.rej create mode 100644 code/modules/power/singularity/emitter.dm.rej create mode 100644 code/modules/power/smes.dm.rej diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 5a1ba5b8c5..84f4440363 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -280,7 +280,7 @@ creator.faction |= current.faction if(creator.mind.special_role) - message_admins("[key_name_admin(current)](?) has been created by [key_name_admin(creator)](?), an antagonist.") + message_admins("[ADMIN_LOOKUPFLW(current)] has been created by [ADMIN_LOOKUPFLW(creator)], an antagonist.") to_chat(current, "Despite your creators current allegiances, your true master remains [creator.real_name]. If their loyalities change, so do yours. This will never change unless your creator's body is destroyed.") /datum/mind/proc/show_memory(mob/recipient, window=1) diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 3772dacbdb..0c2894f056 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -113,7 +113,8 @@ to_chat(R.connected_ai, "

ALERT - Cyborg detonation detected: [R.name]
") R.ResetSecurityCodes() else - message_admins("[key_name_admin(usr)] (FLW) detonated [key_name(R, R.client)](JMP)!") + var/turf/T = get_turf(R) + message_admins("[ADMIN_LOOKUPFLW(usr)] detonated [key_name(R, R.client)][ADMIN_JMP(T)]!") log_game("\[key_name(usr)] detonated [key_name(R)]!") if(R.connected_ai) to_chat(R.connected_ai, "

ALERT - Cyborg detonation detected: [R.name]
") @@ -127,7 +128,7 @@ if(can_control(usr, R)) var/choice = input("Are you certain you wish to [R.canmove ? "lock down" : "release"] [R.name]?") in list("Confirm", "Abort") if(choice == "Confirm" && can_control(usr, R) && !..()) - message_admins("[key_name_admin(usr)] (FLW) [R.canmove ? "locked down" : "released"] [key_name(R, R.client)](FLW)!") + message_admins("[ADMIN_LOOKUPFLW(usr)] [R.canmove ? "locked down" : "released"] [key_name(R, R.client)][ADMIN_LOOKUPFLW(R)]!") log_game("[key_name(usr)] [R.canmove ? "locked down" : "released"] [key_name(R)]!") R.SetLockdown(!R.lockcharge) to_chat(R, "[!R.lockcharge ? "Your lockdown has been lifted!" : "You have been locked down!"]") diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 7a9d01bb7f..b1071a1b35 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -337,8 +337,8 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/proj_init(var/obj/item/weapon/grenade/flashbang/F) var/turf/T = get_turf(src) - message_admins("[key_name(chassis.occupant, chassis.occupant.client)](?) fired a [src] in ([T.x],[T.y],[T.z] - JMP)",0,1) - log_game("[key_name(chassis.occupant)] fired a [src] ([T.x],[T.y],[T.z])") + message_admins("[ADMIN_LOOKUPFLW(chassis.occupant)] fired a [src] in [ADMIN_COORDJMP(T)]",0,1) + log_game("[key_name(chassis.occupant)] fired a [src] [COORD(T)]") addtimer(CALLBACK(F, /obj/item/weapon/grenade/flashbang.proc/prime), det_time) /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/clusterbang //Because I am a heartless bastard -Sieve //Heartless? for making the poor man's honkblast? - Kaze diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index a34e30e689..9324c6edb7 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -74,7 +74,7 @@ /obj/effect/particle_effect/smoke/proc/spread_smoke() var/turf/t_loc = get_turf(src) if(!t_loc) - return + return var/list/newsmokes = list() for(var/turf/T in t_loc.GetAtmosAdjacentTurfs()) var/obj/effect/particle_effect/smoke/foundsmoke = locate() in T //Don't spread smoke where there's already smoke! diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index e8c86390ea..2290456d78 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -63,7 +63,7 @@ return if (istype(M, /atom/movable)) if(ismegafauna(M)) - message_admins("[M] (FLW) has teleported through [src].") + message_admins("[M] [ADMIN_FLW(M)] has teleported through [src].") do_teleport(M, target, precision) ///You will appear adjacent to the beacon diff --git a/code/game/objects/items/charter.dm b/code/game/objects/items/charter.dm index 41a793df30..019db4ec42 100644 --- a/code/game/objects/items/charter.dm +++ b/code/game/objects/items/charter.dm @@ -60,7 +60,7 @@ to_chat(user, "Your name has been sent to your employers for approval.") // Autoapproves after a certain time response_timer_id = addtimer(CALLBACK(src, .proc/rename_station, new_name, user.name, user.real_name, key_name(user)), approval_time, TIMER_STOPPABLE) - to_chat(GLOB.admins, "CUSTOM STATION RENAME:[key_name_admin(user)] (?) proposes to rename the station to [new_name] (will autoapprove in [approval_time / 10] seconds). [ADMIN_SMITE(user)] (REJECT) (RPLY)") + to_chat(GLOB.admins, "CUSTOM STATION RENAME:[ADMIN_LOOKUPFLW(user)] proposes to rename the station to [new_name] (will autoapprove in [approval_time / 10] seconds). [ADMIN_SMITE(user)] (REJECT) [ADMIN_CENTCOM_REPLY(user)]") /obj/item/station_charter/proc/reject_proposed(user) if(!user) diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 18658ceeb3..f7d11d2f47 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -95,8 +95,8 @@ "[user] activates \the [src]!", \ "You activate \the [src].", "You hear a click.") - message_admins("Power sink activated by [key_name_admin(user)](?) (FLW) at ([x],[y],[z] - JMP)") - log_game("Power sink activated by [key_name(user)] at ([x],[y],[z])") + message_admins("Power sink activated by [ADMIN_LOOKUPFLW(user)] at [ADMIN_COORDJMP(src)]") + log_game("Power sink activated by [key_name(user)] at [COORD(src)]") set_mode(OPERATING) if(OPERATING) diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 257418eaa7..8d37640b6d 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -178,21 +178,21 @@ var/log_attacher = "" if(attacher) - log_attacher = "(?) (FLW)" + log_attacher = "[ADMIN_QUE(attacher)] [ADMIN_FLW(attacher)]" var/mob/mob = get_mob_by_key(src.fingerprintslast) var/last_touch_info = "" if(mob) - last_touch_info = "(?) (FLW)" + last_touch_info = "[ADMIN_QUE(mob)] [ADMIN_FLW(mob)]" var/log_str3 = " Last touched by: [key_name_admin(mob)]" - var/bomb_message = "[log_str1] [A.name] [log_str2][log_attacher] [log_str3][last_touch_info]" + var/bomb_message = "[log_str1] [A.name][ADMIN_JMP(bombturf)] [log_str2][log_attacher] [log_str3][last_touch_info]" GLOB.bombers += bomb_message message_admins(bomb_message, 0, 1) - log_game("[log_str1] [A.name]([A.x],[A.y],[A.z]) [log_str2] [log_str3]") + log_game("[log_str1] [A.name][COORD(bombturf)] [log_str2] [log_str3]") merge_gases() spawn(20) // In case one tank bursts for (var/i=0,i<5,i++) diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 611ef76eb4..d81b8a5a69 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -154,8 +154,9 @@ GLOBAL_LIST_INIT(plasma_recipes, list ( \ /obj/item/stack/sheet/mineral/plasma/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(W.is_hot() > 300)//If the temperature of the object is over 300, then ignite - message_admins("Plasma sheets ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1) - log_game("Plasma sheets ignited by [key_name(user)] in ([x],[y],[z])") + var/turf/T = get_turf(src) + message_admins("Plasma sheets ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1) + log_game("Plasma sheets ignited by [key_name(user)] in [COORD(T)]") fire_act() else return ..() diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index ac53eb25ff..aab6c9db48 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -158,7 +158,7 @@ if(lit) START_PROCESSING(SSobj, src) if(!warned_admins) - message_admins("[key_name_admin(usr)]? (FLW) has lit a flamethrower.") + message_admins("[ADMIN_LOOKUPFLW(usr)] has lit a flamethrower.") warned_admins = 1 if(href_list["amount"]) throw_amount = throw_amount + text2num(href_list["amount"]) diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 1ef83f3ac1..42362c1e55 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -36,8 +36,8 @@ else if(clown_check(user)) var/turf/bombturf = get_turf(src) var/area/A = get_area(bombturf) - message_admins("[key_name_admin(usr)]? (FLW) has primed a [name] for detonation at [A.name] (JMP).") - log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).") + message_admins("[ADMIN_LOOKUPFLW(usr)] has primed a [name] for detonation at [A.name][ADMIN_JMP(bombturf)].") + log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] [COORD(bombturf)].") to_chat(user, "You prime the [name]! [det_time / 10] second\s!") playsound(user.loc, 'sound/weapons/armbomb.ogg', 60, 1) active = 1 @@ -177,12 +177,12 @@ var/mob/last = get_mob_by_ckey(nadeassembly.fingerprintslast) var/turf/T = get_turf(src) var/area/A = get_area(T) - message_admins("grenade primed by an assembly, attached by [key_name_admin(M)](?) (FLW) and last touched by [key_name_admin(last)](?) (FLW) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP).") - log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z])") + message_admins("grenade primed by an assembly, attached by [ADMIN_LOOKUPFLW(M)] and last touched by [ADMIN_LOOKUPFLW(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] [ADMIN_JMP(T)].") + log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] [COORD(T)]") var/turf/DT = get_turf(src) var/area/DA = get_area(DT) - log_game("A grenade detonated at [DA.name] ([DT.x], [DT.y], [DT.z])") + log_game("A grenade detonated at [DA.name] [COORD(DT)]") update_mob() diff --git a/code/game/objects/items/weapons/grenades/plastic.dm b/code/game/objects/items/weapons/grenades/plastic.dm index aedf0954c2..fb5b92aee2 100644 --- a/code/game/objects/items/weapons/grenades/plastic.dm +++ b/code/game/objects/items/weapons/grenades/plastic.dm @@ -119,8 +119,8 @@ qdel(src) //How? /obj/item/weapon/grenade/plastic/suicide_act(mob/user) - message_admins("[key_name_admin(user)](?) (FLW) suicided with [src] at ([user.x],[user.y],[user.z] - JMP)",0,1) - message_admins("[key_name(user)] suicided with [src] at ([user.x],[user.y],[user.z])") + message_admins("[ADMIN_LOOKUPFLW(user)] suicided with [src] at [ADMIN_COORDJMP(user)]",0,1) + log_game("[key_name(user)] suicided with [src] at [COORD(user)]") user.visible_message("[user] activates the [src] and holds it above [user.p_their()] head! It looks like [user.p_theyre()] going out with a bang!") var/message_say = "FOR NO RAISIN!" if(user.mind) diff --git a/code/game/objects/items/weapons/implants/implant_explosive.dm b/code/game/objects/items/weapons/implants/implant_explosive.dm index 369effbe7c..009aae3b54 100644 --- a/code/game/objects/items/weapons/implants/implant_explosive.dm +++ b/code/game/objects/items/weapons/implants/implant_explosive.dm @@ -44,7 +44,7 @@ active = TRUE var/turf/boomturf = get_turf(imp_in) var/area/A = get_area(boomturf) - message_admins("[key_name_admin(imp_in)]? (FLW) has activated their [name] at [A.name] (JMP).") + message_admins("[ADMIN_LOOKUPFLW(imp_in)] has activated their [name] at [A.name] [ADMIN_JMP(boomturf)].") //If the delay is short, just blow up already jeez if(delay <= 7) explosion(src,heavy,medium,weak,weak, flame_range = weak) diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 466be07c50..389ae40e88 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -234,8 +234,9 @@ /obj/structure/falsewall/plasma/attackby(obj/item/weapon/W, mob/user, params) if(W.is_hot() > 300) - message_admins("Plasma falsewall ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1) - log_game("Plasma falsewall ignited by [key_name(user)] in ([x],[y],[z])") + var/turf/T = get_turf(src) + message_admins("Plasma falsewall ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1) + log_game("Plasma falsewall ignited by [key_name(user)] in [COORD(T)]") burnbabyburn() else return ..() diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 129862dd62..039f3da5d7 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -188,8 +188,9 @@ /obj/structure/mineral_door/transparent/plasma/attackby(obj/item/weapon/W, mob/user, params) if(W.is_hot()) - message_admins("Plasma mineral door ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1) - log_game("Plasma mineral door ignited by [key_name(user)] in ([x],[y],[z])") + var/turf/T = get_turf(src) + message_admins("Plasma mineral door ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1) + log_game("Plasma mineral door ignited by [key_name(user)] in [COORD(T)]") TemperatureAct() else return ..() diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index f5defdab50..6909965614 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -163,18 +163,20 @@ PlasmaBurn(500) burn = TRUE if(burn) + var/turf/T = get_turf(src) if(Proj.firer) - message_admins("Plasma statue ignited by [key_name_admin(Proj.firer)](?) (FLW) in ([x],[y],[z] - JMP)",0,1) - log_game("Plasma statue ignited by [key_name(Proj.firer)] in ([x],[y],[z])") + message_admins("Plasma statue ignited by [ADMIN_LOOKUPFLW(Proj.firer)] in [ADMIN_COORDJMP(T)]",0,1) + log_game("Plasma statue ignited by [key_name(Proj.firer)] in [COORD(T)]") else - message_admins("Plasma statue ignited by [Proj]. No known firer.(?) (FLW) in ([x],[y],[z] - JMP)",0,1) - log_game("Plasma statue ignited by [Proj] in ([x],[y],[z]). No known firer.") + message_admins("Plasma statue ignited by [Proj]. No known firer, in [ADMIN_COORDJMP(T)]",0,1) + log_game("Plasma statue ignited by [Proj] in [COORD(T)]. No known firer.") ..() /obj/structure/statue/plasma/attackby(obj/item/weapon/W, mob/user, params) if(W.is_hot() > 300)//If the temperature of the object is over 300, then ignite - message_admins("Plasma statue ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1) - log_game("Plasma statue ignited by [key_name(user)] in ([x],[y],[z])") + var/turf/T = get_turf(src) + message_admins("Plasma statue ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1) + log_game("Plasma statue ignited by [key_name(user)] in [COORD(T)]") ignite(W.is_hot()) else return ..() diff --git a/code/game/turfs/simulated/floor/mineral_floor.dm b/code/game/turfs/simulated/floor/mineral_floor.dm index 3e58e62854..5024dfea90 100644 --- a/code/game/turfs/simulated/floor/mineral_floor.dm +++ b/code/game/turfs/simulated/floor/mineral_floor.dm @@ -44,8 +44,8 @@ /turf/open/floor/mineral/plasma/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(W.is_hot() > 300)//If the temperature of the object is over 300, then ignite - message_admins("Plasma flooring was ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1) - log_game("Plasma flooring was ignited by [key_name(user)] in ([x],[y],[z])") + message_admins("Plasma flooring was ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(src)]",0,1) + log_game("Plasma flooring was ignited by [key_name(user)] in [COORD(src)]") ignite(W.is_hot()) return ..() diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index 5805d75e56..03d42042ab 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -407,14 +407,14 @@ if(z != 5) notify_admins = 1 if(!triggered_by_explosion) - message_admins("[key_name_admin(user)]? (FLW) has triggered a gibtonite deposit reaction at [A.name] (JMP).") + message_admins("[ADMIN_LOOKUPFLW(user)] has triggered a gibtonite deposit reaction at [A.name] [ADMIN_JMP(bombturf)].") else - message_admins("An explosion has triggered a gibtonite deposit reaction at [A.name] (JMP).") + message_admins("An explosion has triggered a gibtonite deposit reaction at [A.name] [ADMIN_JMP(bombturf)].") if(!triggered_by_explosion) - log_game("[key_name(user)] has triggered a gibtonite deposit reaction at [A.name] ([A.x], [A.y], [A.z]).") + log_game("[key_name(user)] has triggered a gibtonite deposit reaction at [A.name] [ADMIN_JMP(bombturf)].") else - log_game("An explosion has triggered a gibtonite deposit reaction at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])") + log_game("An explosion has triggered a gibtonite deposit reaction at [A.name] [COORD(bombturf)]") countdown(notify_admins) diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/simulated/wall/mineral_walls.dm index 355ba66a62..61a26954d3 100644 --- a/code/game/turfs/simulated/wall/mineral_walls.dm +++ b/code/game/turfs/simulated/wall/mineral_walls.dm @@ -101,8 +101,8 @@ /turf/closed/wall/mineral/plasma/attackby(obj/item/weapon/W, mob/user, params) if(W.is_hot() > 300)//If the temperature of the object is over 300, then ignite - message_admins("Plasma wall ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1) - log_game("Plasma wall ignited by [key_name(user)] in ([x],[y],[z])") + message_admins("Plasma wall ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(src)]",0,1) + log_game("Plasma wall ignited by [key_name(user)] in [COORD(src)]") ignite(W.is_hot()) return ..() diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 16249b4b6d..a114365f9c 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -479,7 +479,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) current_ticket.MessageNoRecipient(msg) current_ticket.TimeoutVerb() return - else + else to_chat(usr, "Ticket not found, creating new one...") else current_ticket.AddInteraction("[key_name_admin(usr)] opened a new ticket.") diff --git a/code/modules/admin/verbs/adminhelp.dm.rej b/code/modules/admin/verbs/adminhelp.dm.rej new file mode 100644 index 0000000000..3c6cec82d9 --- /dev/null +++ b/code/modules/admin/verbs/adminhelp.dm.rej @@ -0,0 +1,55 @@ +diff a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm (rejected hunks) +@@ -67,7 +67,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) + for(var/I in l2b) + var/datum/admin_help/AH = I + dat += "Ticket #[AH.id]: [AH.initiator_key_name]: [AH.name]
" +- ++ + usr << browse(dat.Join(), "window=ahelp_list[state];size=600x480") + + //Tickets statpanel +@@ -253,7 +253,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) + if(state == AHELP_ACTIVE) + to_chat(usr, "This ticket is already open.") + return +- ++ + if(GLOB.ahelp_tickets.CKey2ActiveTicket(initiator_ckey)) + to_chat(usr, "This user already has an active ticket, cannot reopen this one.") + return +@@ -310,7 +310,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) + RemoveActive() + state = AHELP_RESOLVED + GLOB.ahelp_tickets.ListInsert(src) +- ++ + if(initiator) + initiator.giveadminhelpverb() + +@@ -325,7 +325,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) + /datum/admin_help/proc/Reject(key_name = key_name_admin(usr)) + if(state != AHELP_ACTIVE) + return +- ++ + if(initiator) + initiator.giveadminhelpverb() + +@@ -494,7 +494,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) + + if(!check_rights(R_ADMIN, TRUE)) + return +- ++ + var/browse_to + + switch(input("Display which ticket list?") as null|anything in list("Active Tickets", "Closed Tickets", "Resolved Tickets")) +@@ -506,7 +506,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) + browse_to = AHELP_RESOLVED + else + return +- ++ + GLOB.ahelp_tickets.BrowseTickets(browse_to) + + // diff --git a/code/modules/admin/verbs/map_template_loadverb.dm b/code/modules/admin/verbs/map_template_loadverb.dm index 9fdb316971..ba50ecae32 100644 --- a/code/modules/admin/verbs/map_template_loadverb.dm +++ b/code/modules/admin/verbs/map_template_loadverb.dm @@ -19,7 +19,7 @@ usr.client.images += preview if(alert(usr,"Confirm location.","Template Confirm","Yes","No") == "Yes") if(template.load(T, centered = TRUE)) - message_admins("[key_name_admin(usr)] has placed a map template ([template.name]) at (JMP)") + message_admins("[key_name_admin(usr)] has placed a map template ([template.name]) at [ADMIN_COORDJMP(T)]") else to_chat(usr, "Failed to place map") usr.client.images -= preview diff --git a/code/modules/admin/verbs/randomverbs.dm.rej b/code/modules/admin/verbs/randomverbs.dm.rej new file mode 100644 index 0000000000..b4cc8e90b5 --- /dev/null +++ b/code/modules/admin/verbs/randomverbs.dm.rej @@ -0,0 +1,12 @@ +diff a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm (rejected hunks) +@@ -108,8 +108,8 @@ + for(var/mob/M in view(range,A)) + to_chat(M, msg) + +- log_admin("LocalNarrate: [key_name(usr)] at ([get_area(A)]): [msg]") +- message_admins(" LocalNarrate: [key_name_admin(usr)] at ([get_area(A)]): [msg]
") ++ log_admin("LocalNarrate: [key_name(usr)] at [get_area(A)][COORD(A)]: [msg]") ++ message_admins(" LocalNarrate: [key_name_admin(usr)] at [get_area(A)][ADMIN_JMP(A)]: [msg]
") + SSblackbox.add_details("admin_verb","Local Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + /client/proc/cmd_admin_godmode(mob/M in GLOB.mob_list) diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index 897812db5c..c1fd6de4a5 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -93,10 +93,10 @@ if(href_list["time"]) timing = text2num(href_list["time"]) if(timing && istype(holder, /obj/item/device/transfer_valve)) - var/timer_message = "[key_name_admin(usr)](?) (FLW) activated [src] attachment on [holder]." + var/timer_message = "[ADMIN_LOOKUPFLW(usr)] activated [src] attachment on [holder]." message_admins(timer_message) GLOB.bombers += timer_message - log_game("[key_name(usr)] activated [src] attachment for [loc]") + log_game("[key_name(usr)] activated [src] attachment on [holder]") update_icon() if(href_list["repeat"]) loop = text2num(href_list["repeat"]) diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index f5613c0b7e..7c9989c15d 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -400,8 +400,8 @@ var/bz = air_contents.gases["bz"] var/freon = air_contents.gases["freon"] if(n2o || plasma || bz || freon) - message_admins("[key_name_admin(usr)] (?) (FLW) opened a canister that contains the following: (JMP)") - log_admin("[key_name(usr)] opened a canister that contains the following at [x], [y], [z]:") + message_admins("[ADMIN_LOOKUPFLW(usr)] opened a canister that contains the following: [ADMIN_JMP(src)]") + log_admin("[key_name(usr)] opened a canister that contains the following at [COORD(src)]:") if(plasma) log_admin("Plasma") message_admins("Plasma") diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm index 40f88cbecb..63082d1988 100644 --- a/code/modules/atmospherics/machinery/portable/pump.dm +++ b/code/modules/atmospherics/machinery/portable/pump.dm @@ -103,8 +103,9 @@ var/plasma = air_contents.gases["plasma"] var/n2o = air_contents.gases["n2o"] if(n2o || plasma) - message_admins("[key_name_admin(usr)] (?) (FLW) turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""]! (JMP)") - log_admin("[key_name(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [x], [y], [z]") + var/area/A = get_area(src) + message_admins("[ADMIN_LOOKUPFLW(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [A][ADMIN_JMP(src)]") + log_admin("[key_name(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [A][COORD(src)]") . = TRUE if("direction") if(direction == PUMP_OUT) diff --git a/code/modules/client/verbs/who.dm b/code/modules/client/verbs/who.dm index a7b1a9ac53..1614966726 100644 --- a/code/modules/client/verbs/who.dm +++ b/code/modules/client/verbs/who.dm @@ -33,7 +33,7 @@ entry += " - DEAD" if(is_special_character(C.mob)) entry += " - Antagonist" - entry += " (?)" + entry += " [ADMIN_QUE(C.mob)]" entry += " ([round(C.avgping, 1)]ms)" Lines += entry else//If they don't have +ADMIN, only show hidden admins diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index 71e6debf25..a67fef2473 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -123,8 +123,8 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/attack_self(mob/living/user) var/area/A = get_area(user) user.visible_message("[user] plucks the stem from [src]!", "You pluck the stem from [src], which begins to hiss loudly!") - message_admins("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x], [user.y], [user.z]) (JMP)") - log_game("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x],[user.y],[user.z]).") + message_admins("[ADMIN_LOOKUPFLW(user)] primed a cherry bomb for detonation at [A] [ADMIN_COORDJMP(user)]") + log_game("[key_name(user)] primed a cherry bomb for detonation at [A] [COORD(user)].") prime() /obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/deconstruct(disassembled = TRUE) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 2bb438639b..d15896a8db 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -278,8 +278,8 @@ var/turf/T = deploy_location if(T.z != ZLEVEL_MINING && T.z != ZLEVEL_LAVALAND)//only report capsules away from the mining/lavaland level - message_admins("[key_name_admin(usr)] (?) (FLW) activated a bluespace capsule away from the mining level! (JMP)") - log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [T.x], [T.y], [T.z]") + message_admins("[ADMIN_LOOKUPFLW(usr)] activated a bluespace capsule away from the mining level! [ADMIN_JMP(T)]") + log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [get_area(T)][COORD(T)]") template.load(deploy_location, centered = TRUE) new /obj/effect/particle_effect/smoke(get_turf(src)) qdel(src) diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 1e7f01d7a3..b1ba6680c2 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -248,18 +248,18 @@ if(notify_admins) if(triggered_by == 1) - message_admins("An explosion has triggered a [name] to detonate at [A.name] (JMP).") + message_admins("An explosion has triggered a [name] to detonate at [ADMIN_COORDJMP(bombturf)].") else if(triggered_by == 2) - message_admins("A signal has triggered a [name] to detonate at [A.name] (JMP). Igniter attacher: [key_name_admin(attacher)]? (FLW)") + message_admins("A signal has triggered a [name] to detonate at [ADMIN_COORDJMP(bombturf)]. Igniter attacher: [ADMIN_LOOKUPFLW(attacher)]") else - message_admins("[key_name_admin(user)]? (FLW) has triggered a [name] to detonate at [A.name] (JMP).") + message_admins("[ADMIN_LOOKUPFLW(attacher)] has triggered a [name] to detonate at [ADMIN_COORDJMP(bombturf)].") if(triggered_by == 1) - log_game("An explosion has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])") + log_game("An explosion has primed a [name] for detonation at [A][COORD(bombturf)]") else if(triggered_by == 2) - log_game("A signal has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z]). Igniter attacher: [key_name(attacher)].") + log_game("A signal has primed a [name] for detonation at [A][COORD(bombturf)]. Igniter attacher: [key_name(attacher)].") else user.visible_message("[user] strikes \the [src], causing a chain reaction!", "You strike \the [src], causing a chain reaction.") - log_game("[key_name(user)] has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])") + log_game("[key_name(user)] has primed a [name] for detonation at [A][COORD(bombturf)]") spawn(det_time) if(primed) if(quality == 3) diff --git a/code/modules/power/gravitygenerator.dm.rej b/code/modules/power/gravitygenerator.dm.rej new file mode 100644 index 0000000000..510190ad8b --- /dev/null +++ b/code/modules/power/gravitygenerator.dm.rej @@ -0,0 +1,22 @@ +diff a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm (rejected hunks) +@@ -303,17 +303,17 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne + use_power = on ? 2 : 1 + // Sound the alert if gravity was just enabled or disabled. + var/alert = 0 +- var/area/area = get_area(src) ++ var/area/A = get_area(src) + if(on && SSticker.IsRoundInProgress()) // If we turned on and the game is live. + if(gravity_in_level() == 0) + alert = 1 + investigate_log("was brought online and is now producing gravity for this level.", "gravity") +- message_admins("The gravity generator was brought online. ([area.name])") ++ message_admins("The gravity generator was brought online [A][ADMIN_COORDJMP(src)]") + else + if(gravity_in_level() == 1) + alert = 1 + investigate_log("was brought offline and there is now no gravity for this level.", "gravity") +- message_admins("The gravity generator was brought offline with no backup generator. ([area.name])") ++ message_admins("The gravity generator was brought offline with no backup generator. [A][ADMIN_COORDJMP(src)]") + + update_icon() + update_list() diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index ff7a79bc69..2b23367c5e 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -121,8 +121,8 @@ if(src.active==1) src.active = 0 to_chat(user, "You turn off \the [src].") - message_admins("Emitter turned off by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1) - log_game("Emitter turned off by [key_name(user)] in ([x],[y],[z])") + message_admins("Emitter turned off by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(src)]",0,1) + log_game("Emitter turned off by [key_name(user)] in [COORD(src)]") investigate_log("turned off by [key_name(user)] at [get_area(src)]","singulo") else src.active = 1 diff --git a/code/modules/power/singularity/emitter.dm.rej b/code/modules/power/singularity/emitter.dm.rej new file mode 100644 index 0000000000..9387d35f17 --- /dev/null +++ b/code/modules/power/singularity/emitter.dm.rej @@ -0,0 +1,15 @@ +diff a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm (rejected hunks) +@@ -98,9 +98,10 @@ + + /obj/machinery/power/emitter/Destroy() + if(SSticker && SSticker.IsRoundInProgress()) +- message_admins("Emitter deleted at ([x],[y],[z] - JMP)",0,1) +- log_game("Emitter deleted at ([x],[y],[z])") +- investigate_log("deleted at ([x],[y],[z]) at [get_area(src)]","singulo") ++ var/turf/T = get_turf(src) ++ message_admins("Emitter deleted at [ADMIN_COORDJMP(T)]",0,1) ++ log_game("Emitter deleted at [COORD(T)]") ++ investigate_log("deleted at [get_area(src)] [COORD(T)]","singulo") + QDEL_NULL(sparks) + return ..() + diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index 3b36e436ee..dc3da6db8d 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -117,8 +117,8 @@ strength++ strength_change() - message_admins("PA Control Computer increased to [strength] by [key_name_admin(usr)](?) (FLW) in ([x],[y],[z] - JMP)",0,1) - log_game("PA Control Computer increased to [strength] by [key_name(usr)] in ([x],[y],[z])") + message_admins("PA Control Computer increased to [strength] by [ADMIN_LOOKUPFLW(usr)] in [ADMIN_COORDJMP(src)]",0,1) + log_game("PA Control Computer increased to [strength] by [key_name(usr)] in [COORD(src)]") investigate_log("increased to [strength] by [key_name(usr)]","singulo") @@ -127,8 +127,8 @@ strength-- strength_change() - message_admins("PA Control Computer decreased to [strength] by [key_name_admin(usr)](?) (FLW) in ([x],[y],[z] - JMP)",0,1) - log_game("PA Control Computer decreased to [strength] by [key_name(usr)] in ([x],[y],[z])") + message_admins("PA Control Computer decreased to [strength] by [ADMIN_LOOKUPFLW(usr)] in [ADMIN_COORDJMP(src)]",0,1) + log_game("PA Control Computer decreased to [strength] by [key_name(usr)] in [COORD(src)]") investigate_log("decreased to [strength] by [key_name(usr)]","singulo") diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index fdb4699ae5..9742b4b9c3 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -170,7 +170,7 @@ //crowbarring it ! var/turf/T = get_turf(src) if(default_deconstruction_crowbar(I)) - message_admins("[src] has been deconstructed by [key_name_admin(user)](?) (FLW) in ([T.x],[T.y],[T.z] - JMP)",0,1) + message_admins("[src] has been deconstructed by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1) log_game("[src] has been deconstructed by [key_name(user)]") investigate_log("SMES deconstructed by [key_name(user)]","singulo") return diff --git a/code/modules/power/smes.dm.rej b/code/modules/power/smes.dm.rej new file mode 100644 index 0000000000..d381204e44 --- /dev/null +++ b/code/modules/power/smes.dm.rej @@ -0,0 +1,17 @@ +diff a/code/modules/power/smes.dm b/code/modules/power/smes.dm (rejected hunks) +@@ -192,10 +192,11 @@ + + /obj/machinery/power/smes/Destroy() + if(SSticker && SSticker.IsRoundInProgress()) +- var/area/area = get_area(src) +- message_admins("SMES deleted at ([area.name])") +- log_game("SMES deleted at ([area.name])") +- investigate_log("deleted at ([area.name])","singulo") ++ var/area/A = get_area(src) ++ var/turf/T = get_turf(src) ++ message_admins("SMES deleted at [A][ADMIN_JMP(T)]") ++ log_game("SMES deleted at [A][COORD(T)]") ++ investigate_log("deleted at [A][COORD(T)]","singulo") + if(terminal) + disconnect_terminal() + return ..() diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index fee8859de4..fbcdb4e747 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -341,7 +341,7 @@ lastwarning = REALTIMEOFDAY if(!has_reached_emergency) investigate_log("has reached the emergency point for the first time.", "supermatter") - message_admins("[src] has reached the emergency point (JMP).") + message_admins("[src] has reached the emergency point [ADMIN_JMP(src)].") has_reached_emergency = 1 else if(damage >= damage_archived) // The damage is still going up SPEAK("[warning_alert] Instability: [stability]%") @@ -388,7 +388,7 @@ power += Proj.damage * config_bullet_energy if(!has_been_powered) investigate_log("has been powered for the first time.", "supermatter") - message_admins("[src] has been powered for the first time (JMP).") + message_admins("[src] has been powered for the first time [ADMIN_JMP(src)].") has_been_powered = 1 else if(takes_damage) damage += Proj.damage * config_bullet_energy @@ -487,7 +487,7 @@ /obj/machinery/power/supermatter_shard/proc/Consume(atom/movable/AM) if(isliving(AM)) var/mob/living/user = AM - message_admins("[src] has consumed [key_name_admin(user)]? (FLW) (JMP).") + message_admins("[src] has consumed [key_name_admin(user)] [ADMIN_JMP(src)].") investigate_log("has consumed [key_name(user)].", "supermatter") user.dust() matter_power += 200 diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index 69a9ca2a8a..8a94c2b849 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -19,15 +19,12 @@ /obj/item/weapon/gun/energy/pulse/prize/New() . = ..() GLOB.poi_list |= src - var/msg = "A pulse rifle prize has been created at ([x],[y],[z] - (\ - \ - JMP)" + var/msg = "A pulse rifle prize has been created at [ADMIN_COORDJMP(src)]" message_admins(msg) log_game(msg) - notify_ghosts("Someone won a pulse rifle as a prize!", source = src, - action = NOTIFY_ORBIT) + notify_ghosts("Someone won a pulse rifle as a prize!", source = src, action = NOTIFY_ORBIT) /obj/item/weapon/gun/energy/pulse/prize/Destroy() GLOB.poi_list -= src diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index 9e0bb2d0e4..c13ff096e4 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -36,12 +36,12 @@ var/atom/A = holder.my_atom var/turf/T = get_turf(A) var/area/my_area = get_area(T) - var/message = "A [reaction_name] reaction has occurred in [my_area.name]. (JMP)" + var/message = "A [reaction_name] reaction has occurred in [my_area.name] [ADMIN_COORDJMP(T)]" message += " (VV)" var/mob/M = get(A, /mob) if(M) - message += " - Carried By: [key_name_admin(M)](?) (FLW)" + message += " - Carried By: [ADMIN_LOOKUPFLW(M)]" else message += " - Last Fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]" diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 805aa936d4..6cfdd80cf5 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -6,6 +6,7 @@ /datum/chemical_reaction/reagent_explosion/on_reaction(datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) + var/area/A = get_area(T) var/inside_msg if(ismob(holder.my_atom)) var/mob/M = holder.my_atom @@ -14,9 +15,9 @@ var/touch_msg = "N/A" if(lastkey) var/mob/toucher = get_mob_by_key(lastkey) - touch_msg = "[key_name_admin(lastkey)]? (FLW)" - message_admins("Reagent explosion reaction occurred at [T.loc.name] (JMP)[inside_msg]. Last Fingerprint: [touch_msg].") - log_game("Reagent explosion reaction occurred at [T.loc.name] ([T.x],[T.y],[T.z]). Last Fingerprint: [lastkey ? lastkey : "N/A"]." ) + touch_msg = "[ADMIN_LOOKUPFLW(toucher)]" + message_admins("Reagent explosion reaction occurred at [A] [ADMIN_COORDJMP(T)][inside_msg]. Last Fingerprint: [touch_msg].") + log_game("Reagent explosion reaction occurred at [A] [COORD(T)]. Last Fingerprint: [lastkey ? lastkey : "N/A"]." ) var/datum/effect_system/reagents_explosion/e = new() e.set_up(modifier + round(created_volume/strengthdiv, 1), T, 0, 0) e.start() diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 52205b2497..8892948ec8 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -437,13 +437,14 @@ /datum/chemical_reaction/slime/slimeexplosion/on_reaction(datum/reagents/holder) var/turf/T = get_turf(holder.my_atom) + var/area/A = get_area(T) var/lastkey = holder.my_atom.fingerprintslast var/touch_msg = "N/A" if(lastkey) var/mob/toucher = get_mob_by_key(lastkey) - touch_msg = "[key_name_admin(lastkey)]?(FLW)." - message_admins("Slime Explosion reaction started at [T.loc.name] (JMP). Last Fingerprint: [touch_msg]") - log_game("Slime Explosion reaction started at [T.loc.name] ([T.x],[T.y],[T.z]). Last Fingerprint: [lastkey ? lastkey : "N/A"].") + touch_msg = "[ADMIN_LOOKUPFLW(toucher)]." + message_admins("Slime Explosion reaction started at [A] [ADMIN_COORDJMP(T)]. Last Fingerprint: [touch_msg]") + log_game("Slime Explosion reaction started at [A] [COORD(T)]. Last Fingerprint: [lastkey ? lastkey : "N/A"].") T.visible_message("The slime extract begins to vibrate violently !") addtimer(CALLBACK(src, .proc/boom, holder), 50) var/obj/item/slime_extract/M = holder.my_atom diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 34d422da92..92e01f4824 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -48,15 +48,16 @@ user.changeNext_move(CLICK_CD_RANGE*2) user.newtonian_move(get_dir(A, user)) var/turf/T = get_turf(src) + var/area/area = get_area(src) if(reagents.has_reagent("sacid")) - message_admins("[key_name_admin(user)] fired sulphuric acid from \a [src] at ([get_area(src)] ([T.x], [T.y], [T.z])).") - log_game("[key_name(user)] fired sulphuric acid from \a [src] at [get_area(src)] ([T.x], [T.y], [T.z]).") + message_admins("[ADMIN_LOOKUPFLW(user)] fired sulphuric acid from \a [src] at [area] [ADMIN_COORDJMP(T)].") + log_game("[key_name(user)] fired sulphuric acid from \a [src] at [area] ([T.x], [T.y], [T.z]).") if(reagents.has_reagent("facid")) - message_admins("[key_name_admin(user)] fired Fluacid from \a [src] at ([get_area(src)] ([T.x], [T.y], [T.z])).") - log_game("[key_name(user)] fired Fluacid from \a [src] at [get_area(src)] ([T.x], [T.y], [T.z]).") + message_admins("[ADMIN_LOOKUPFLW(user)] fired Fluacid from \a [src] at [area] [ADMIN_COORDJMP(T)].") + log_game("[key_name(user)] fired Fluacid from \a [src] at [area] [COORD(T)].") if(reagents.has_reagent("lube")) - message_admins("[key_name_admin(user)] fired Space lube from \a [src] at ([get_area(src)] ([T.x], [T.y], [T.z])).") - log_game("[key_name(user)] fired Space lube from \a [src] at [get_area(src)] ([T.x], [T.y], [T.z]).") + message_admins("[ADMIN_LOOKUPFLW(user)] fired Space lube from \a [src] at [area] [ADMIN_COORDJMP(T)].") + log_game("[key_name(user)] fired Space lube from \a [src] at [area] [COORD(T)].") return diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index aa9c81bd02..43cf3df79d 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -104,12 +104,8 @@ authorized += ID - message_admins("[key_name_admin(user.client)] \ - (?) \ - (FLW) \ - has authorized early shuttle launch", 0, 1) - log_game("[key_name(user)] has authorized early shuttle launch in \ - ([x],[y],[z])") + message_admins("[ADMIN_LOOKUPFLW(user)] has authorized early shuttle launch", 0, 1) + log_game("[key_name(user)] has authorized early shuttle launch in [COORD(src)]") // Now check if we're on our way . = TRUE process() diff --git a/code/modules/shuttle/ferry.dm b/code/modules/shuttle/ferry.dm index 2e04fdd9af..b846098fc4 100644 --- a/code/modules/shuttle/ferry.dm +++ b/code/modules/shuttle/ferry.dm @@ -30,4 +30,4 @@ return last_request = world.time to_chat(usr, "Your request has been recieved by Centcom.") - to_chat(GLOB.admins, "FERRY: [key_name_admin(usr)] (?) (FLW) (Move Ferry) is requesting to move the transport ferry to Centcom.") + to_chat(GLOB.admins, "FERRY: [ADMIN_LOOKUPFLW(usr)] (Move Ferry) is requesting to move the transport ferry to Centcom.") From aa45f555e348415c6725f6cfc72ebe32cfd39a19 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 2 May 2017 04:57:29 -0500 Subject: [PATCH 019/352] Makes the cult Talisman of Horrors ranged --- code/game/gamemodes/cult/ritual.dm | 2 +- code/game/gamemodes/cult/talisman.dm | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 2ed6840c91..cc8c97fb9b 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -133,7 +133,7 @@ This file contains the arcane tome files. text += "Talisman of Armaments
The Talisman of Arming will equip the user with armored robes, a backpack, an eldritch longsword, an empowered bola, and a pair of boots. Any items that cannot \ be equipped will not be summoned. Attacking a fellow cultist with it will instead equip them.

" - text += "Talisman of Horrors
The Talisman of Horror must be applied directly to the victim, it will shatter your victim's mind with visions of the endtimes that may incapitate them.

" + text += "Talisman of Horrors
The Talisman of Horror, unlike other talismans, can be applied at range, without the victim noticing. It will cause the victim to have severe hallucinations after a short while.

" text += "Talisman of Shackling
The Talisman of Shackling must be applied directly to the victim, it has 4 uses and cuffs victims with magic shackles that disappear when removed.

" diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index 2876e80373..d2e1fcaf10 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -309,12 +309,12 @@ invocation = "Lo'Nab Na'Dm!" creation_time = 80 -/obj/item/weapon/paper/talisman/horror/attack(mob/living/target, mob/living/user) - if(iscultist(user)) - to_chat(user, "You disturb [target] with visons of the end!") +/obj/item/weapon/paper/talisman/horror/afterattack(mob/living/target, mob/living/user) + if(iscultist(user) && (get_dist(user, target) < 7)) + to_chat(user, "You disturb [target] with visions of madness!") if(iscarbon(target)) var/mob/living/carbon/H = target - H.reagents.add_reagent("mindbreaker", 25) + H.reagents.add_reagent("mindbreaker", 12) if(is_servant_of_ratvar(target)) to_chat(target, "You see a brief but horrible vision of Ratvar, rusted and scrapped, being torn apart.") target.emote("scream") From 6d6d01f105d5842009c7614185ab6c3ab78219ec Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 2 May 2017 09:56:21 -0500 Subject: [PATCH 020/352] Species-locked inventory slots are now indicated. --- code/_onclick/hud/hud.dm | 4 ++- code/_onclick/hud/human.dm | 26 +++++++++---------- .../mob/living/carbon/human/species.dm | 2 ++ .../carbon/human/species_types/golems.dm | 2 +- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index b1b4a1cbb3..f6a3688626 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -208,7 +208,6 @@ mymob.reload_fullscreen() update_parallax_pref(screenmob) - /datum/hud/human/show_hud(version = 0,mob/viewmob) ..() hidden_inventory_update(viewmob) @@ -266,3 +265,6 @@ E.screen_loc = ui_equip_position(mymob) if(mymob.hud_used) show_hud(HUD_STYLE_STANDARD,mymob) + +/datum/hud/proc/update_locked_slots() + return \ No newline at end of file diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index f35579c16b..8453b12085 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -124,7 +124,6 @@ inv_box.icon = ui_style inv_box.slot_id = slot_w_uniform inv_box.icon_state = "uniform" -// inv_box.icon_full = "template" inv_box.screen_loc = ui_iclothing toggleable_inventory += inv_box @@ -133,7 +132,6 @@ inv_box.icon = ui_style inv_box.slot_id = slot_wear_suit inv_box.icon_state = "suit" -// inv_box.icon_full = "template" inv_box.screen_loc = ui_oclothing toggleable_inventory += inv_box @@ -155,7 +153,6 @@ inv_box.name = "id" inv_box.icon = ui_style inv_box.icon_state = "id" -// inv_box.icon_full = "template_small" inv_box.screen_loc = ui_id inv_box.slot_id = slot_wear_id static_inventory += inv_box @@ -164,7 +161,6 @@ inv_box.name = "mask" inv_box.icon = ui_style inv_box.icon_state = "mask" -// inv_box.icon_full = "template" inv_box.screen_loc = ui_mask inv_box.slot_id = slot_wear_mask toggleable_inventory += inv_box @@ -173,7 +169,6 @@ inv_box.name = "neck" inv_box.icon = ui_style inv_box.icon_state = "neck" -// inv_box.icon_full = "template" inv_box.screen_loc = ui_neck inv_box.slot_id = slot_neck toggleable_inventory += inv_box @@ -182,7 +177,6 @@ inv_box.name = "back" inv_box.icon = ui_style inv_box.icon_state = "back" -// inv_box.icon_full = "template_small" inv_box.screen_loc = ui_back inv_box.slot_id = slot_back static_inventory += inv_box @@ -191,7 +185,6 @@ inv_box.name = "storage1" inv_box.icon = ui_style inv_box.icon_state = "pocket" -// inv_box.icon_full = "template_small" inv_box.screen_loc = ui_storage1 inv_box.slot_id = slot_l_store static_inventory += inv_box @@ -200,7 +193,6 @@ inv_box.name = "storage2" inv_box.icon = ui_style inv_box.icon_state = "pocket" -// inv_box.icon_full = "template_small" inv_box.screen_loc = ui_storage2 inv_box.slot_id = slot_r_store static_inventory += inv_box @@ -209,7 +201,6 @@ inv_box.name = "suit storage" inv_box.icon = ui_style inv_box.icon_state = "suit_storage" -// inv_box.icon_full = "template" inv_box.screen_loc = ui_sstore1 inv_box.slot_id = slot_s_store static_inventory += inv_box @@ -233,7 +224,6 @@ inv_box.name = "gloves" inv_box.icon = ui_style inv_box.icon_state = "gloves" -// inv_box.icon_full = "template" inv_box.screen_loc = ui_gloves inv_box.slot_id = slot_gloves toggleable_inventory += inv_box @@ -242,7 +232,6 @@ inv_box.name = "eyes" inv_box.icon = ui_style inv_box.icon_state = "glasses" -// inv_box.icon_full = "template" inv_box.screen_loc = ui_glasses inv_box.slot_id = slot_glasses toggleable_inventory += inv_box @@ -251,7 +240,6 @@ inv_box.name = "ears" inv_box.icon = ui_style inv_box.icon_state = "ears" -// inv_box.icon_full = "template" inv_box.screen_loc = ui_ears inv_box.slot_id = slot_ears toggleable_inventory += inv_box @@ -260,7 +248,6 @@ inv_box.name = "head" inv_box.icon = ui_style inv_box.icon_state = "head" -// inv_box.icon_full = "template" inv_box.screen_loc = ui_head inv_box.slot_id = slot_head toggleable_inventory += inv_box @@ -269,7 +256,6 @@ inv_box.name = "shoes" inv_box.icon = ui_style inv_box.icon_state = "shoes" -// inv_box.icon_full = "template" inv_box.screen_loc = ui_shoes inv_box.slot_id = slot_shoes toggleable_inventory += inv_box @@ -327,6 +313,18 @@ inv_slots[inv.slot_id] = inv inv.update_icon() +/datum/hud/human/update_locked_slots() + if(!mymob) + return + var/mob/living/carbon/human/H = mymob + var/datum/species/S = H.dna.species + for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) + if(inv.slot_id) + if(inv.slot_id in S.no_equip) + inv.alpha = 128 + else + inv.alpha = initial(inv.alpha) + /datum/hud/human/hidden_inventory_update(mob/viewer) if(!mymob) return diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index a48124e412..2c034dc64f 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -119,6 +119,8 @@ var/obj/item/thing = C.get_item_by_slot(slot_id) if(thing && (!thing.species_exception || !is_type_in_list(src,thing.species_exception))) C.dropItemToGround(thing) + if(C.hud_used) + C.hud_used.update_locked_slots() // this needs to be FIRST because qdel calls update_body which checks if we have DIGITIGRADE legs or not and if not then removes DIGITIGRADE from species_traits if(("legs" in C.dna.species.mutant_bodyparts) && C.dna.features["legs"] == "Digitigrade Legs") diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 8eb5343a30..fc54c7346e 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -9,7 +9,7 @@ punchdamagelow = 5 punchdamagehigh = 14 punchstunthreshold = 11 //about 40% chance to stun - no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_w_uniform) + no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_w_uniform, slot_s_store) nojumpsuit = 1 sexes = 1 damage_overlay_type = "" From d422b9bb39b441b5a8d6bbcdd78d19bff417f299 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 2 May 2017 09:57:25 -0500 Subject: [PATCH 021/352] The alien hivemind uses a mob's real_name --- code/modules/mob/living/carbon/alien/say.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm index 72162387ee..12c131b3cc 100644 --- a/code/modules/mob/living/carbon/alien/say.dm +++ b/code/modules/mob/living/carbon/alien/say.dm @@ -1,4 +1,4 @@ -/mob/living/proc/alien_talk(message, shown_name = name) +/mob/living/proc/alien_talk(message, shown_name = real_name) log_say("[key_name(src)] : [message]") message = trim(message) if(!message) return From 7baccb8b85ffca86c37cb905fe5ca281a656d268 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 2 May 2017 12:47:20 -0500 Subject: [PATCH 022/352] Removes vestigial list from minds. --- code/datums/mind.dm | 2 -- code/modules/admin/verbs/randomverbs.dm | 1 - code/modules/spells/spell_types/mind_transfer.dm | 15 --------------- 3 files changed, 18 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 0acd33ad69..9e764fb5e4 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -44,9 +44,7 @@ var/datum/job/assigned_job var/list/datum/objective/objectives = list() - var/list/datum/objective/special_verbs = list() - var/list/cult_words = list() var/list/spell_list = list() // Wizard mode & "Give Spell" badmin button. var/datum/faction/faction //associated faction diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 547e8e1d03..f1bf4d6969 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -350,7 +350,6 @@ Traitors and the like can also be revived with the previous role mostly intact. if(G_found.mind && !G_found.mind.active) G_found.mind.transfer_to(new_character) //be careful when doing stuff like this! I've already checked the mind isn't in use - new_character.mind.special_verbs = list() else new_character.mind_initialize() if(!new_character.mind.assigned_role) diff --git a/code/modules/spells/spell_types/mind_transfer.dm b/code/modules/spells/spell_types/mind_transfer.dm index 7ebafe6e24..052c1f1162 100644 --- a/code/modules/spells/spell_types/mind_transfer.dm +++ b/code/modules/spells/spell_types/mind_transfer.dm @@ -62,29 +62,14 @@ Also, you never added distance checking after target is selected. I've went ahea var/mob/caster = user//The wizard/whomever doing the body transferring. //MIND TRANSFER BEGIN - if(caster.mind.special_verbs.len)//If the caster had any special verbs, remove them from the mob verb list. - for(var/V in caster.mind.special_verbs)//Since the caster is using an object spell system, this is mostly moot. - caster.verbs -= V//But a safety nontheless. - - if(victim.mind.special_verbs.len)//Now remove all of the victim's verbs. - for(var/V in victim.mind.special_verbs) - victim.verbs -= V - var/mob/dead/observer/ghost = victim.ghostize(0) caster.mind.transfer_to(victim) - if(victim.mind.special_verbs.len)//To add all the special verbs for the original caster. - for(var/V in caster.mind.special_verbs)//Not too important but could come into play. - caster.verbs += V - ghost.mind.transfer_to(caster) if(ghost.key) caster.key = ghost.key //have to transfer the key since the mind was not active qdel(ghost) - if(caster.mind.special_verbs.len)//If they had any special verbs, we add them here. - for(var/V in caster.mind.special_verbs) - caster.verbs += V //MIND TRANSFER END //Here we paralyze both mobs and knock them out for a time. From ce302f4fe75bd3d2622600f5924b2e59be2bd0c5 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 2 May 2017 14:37:11 -0500 Subject: [PATCH 023/352] Trophy case hotfixes --- code/controllers/subsystem/persistence.dm.rej | 11 +++++++++++ code/game/objects/structures/displaycase.dm.rej | 10 ++++++++++ 2 files changed, 21 insertions(+) create mode 100644 code/controllers/subsystem/persistence.dm.rej create mode 100644 code/game/objects/structures/displaycase.dm.rej diff --git a/code/controllers/subsystem/persistence.dm.rej b/code/controllers/subsystem/persistence.dm.rej new file mode 100644 index 0000000000..5c575b2068 --- /dev/null +++ b/code/controllers/subsystem/persistence.dm.rej @@ -0,0 +1,11 @@ +diff a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm (rejected hunks) +@@ -114,6 +114,9 @@ SUBSYSTEM_DEF(persistence) + var/saved_json + trophy_sav >> saved_json + ++ if(!saved_json) ++ return ++ + var/decoded_json = json_decode(saved_json) + + if(!islist(decoded_json)) diff --git a/code/game/objects/structures/displaycase.dm.rej b/code/game/objects/structures/displaycase.dm.rej new file mode 100644 index 0000000000..ee677c1b9d --- /dev/null +++ b/code/game/objects/structures/displaycase.dm.rej @@ -0,0 +1,10 @@ +diff a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm (rejected hunks) +@@ -316,7 +316,7 @@ + to_chat(user, "You are too far to set the plaque's text.") + + SSpersistence.SaveTrophy(src) +- return 1 ++ return TRUE + + else + to_chat(user, "\The [W] is stuck to your hand, you can't put it in the [src.name]!") From 49990d0c0544a566296ec14ffae21dcecbf18fc6 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 2 May 2017 18:47:58 -0500 Subject: [PATCH 024/352] Persistent investigate and game logs separated by round ID --- code/__HELPERS/_logging.dm | 37 +++++----- code/_globalvars/logging.dm | 20 +++--- code/controllers/configuration.dm | 36 ++++------ code/controllers/configuration.dm.rej | 10 +++ code/controllers/subsystem/blackbox.dm | 14 +--- code/controllers/subsystem/blackbox.dm.rej | 10 +++ code/game/gamemodes/game_mode.dm | 1 - code/modules/admin/IsBanned.dm | 2 +- code/modules/admin/admin_investigate.dm.rej | 62 ++++++++++++++++ code/modules/admin/admin_ranks.dm | 4 +- code/modules/admin/admin_verbs.dm | 21 +----- code/modules/admin/verbs/getlogs.dm | 71 ++----------------- code/modules/client/client_procs.dm | 6 +- code/modules/client/client_procs.dm.rej | 41 +++++++++++ code/modules/error_handler/error_handler.dm | 7 +- .../kitchen_machinery/gibber.dm | 2 +- code/world.dm | 43 ++++++----- config/config.txt | 6 -- 18 files changed, 209 insertions(+), 184 deletions(-) create mode 100644 code/controllers/configuration.dm.rej create mode 100644 code/controllers/subsystem/blackbox.dm.rej create mode 100644 code/modules/admin/admin_investigate.dm.rej create mode 100644 code/modules/client/client_procs.dm.rej diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 2785ba896f..a2a878211a 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -20,13 +20,13 @@ /proc/log_admin(text) GLOB.admin_log.Add(text) if (config.log_admin) - GLOB.diary << "\[[time_stamp()]]ADMIN: [text]" + GLOB.world_game_log << "\[[time_stamp()]]ADMIN: [text]" //Items using this proc are stripped from public logs - use with caution /proc/log_admin_private(text) GLOB.admin_log.Add(text) if (config.log_admin) - GLOB.diary << "\[[time_stamp()]]ADMINPRIVATE: [text]" + GLOB.world_game_log << "\[[time_stamp()]]ADMINPRIVATE: [text]" /proc/log_adminsay(text) if (config.log_adminchat) @@ -38,67 +38,64 @@ /proc/log_game(text) if (config.log_game) - GLOB.diary << "\[[time_stamp()]]GAME: [text]" + GLOB.world_game_log << "\[[time_stamp()]]GAME: [text]" /proc/log_vote(text) if (config.log_vote) - GLOB.diary << "\[[time_stamp()]]VOTE: [text]" + GLOB.world_game_log << "\[[time_stamp()]]VOTE: [text]" /proc/log_access(text) if (config.log_access) - GLOB.diary << "\[[time_stamp()]]ACCESS: [text]" + GLOB.world_game_log << "\[[time_stamp()]]ACCESS: [text]" /proc/log_say(text) if (config.log_say) - GLOB.diary << "\[[time_stamp()]]SAY: [text]" + GLOB.world_game_log << "\[[time_stamp()]]SAY: [text]" /proc/log_prayer(text) if (config.log_prayer) - GLOB.diary << "\[[time_stamp()]]PRAY: [text]" + GLOB.world_game_log << "\[[time_stamp()]]PRAY: [text]" /proc/log_law(text) if (config.log_law) - GLOB.diary << "\[[time_stamp()]]LAW: [text]" + GLOB.world_game_log << "\[[time_stamp()]]LAW: [text]" /proc/log_ooc(text) if (config.log_ooc) - GLOB.diary << "\[[time_stamp()]]OOC: [text]" + GLOB.world_game_log << "\[[time_stamp()]]OOC: [text]" /proc/log_whisper(text) if (config.log_whisper) - GLOB.diary << "\[[time_stamp()]]WHISPER: [text]" + GLOB.world_game_log << "\[[time_stamp()]]WHISPER: [text]" /proc/log_emote(text) if (config.log_emote) - GLOB.diary << "\[[time_stamp()]]EMOTE: [text]" + GLOB.world_game_log << "\[[time_stamp()]]EMOTE: [text]" /proc/log_attack(text) if (config.log_attack) - GLOB.diaryofmeanpeople << "\[[time_stamp()]]ATTACK: [text]" + GLOB.world_attack_log << "\[[time_stamp()]]ATTACK: [text]" /proc/log_pda(text) if (config.log_pda) - GLOB.diary << "\[[time_stamp()]]PDA: [text]" + GLOB.world_game_log << "\[[time_stamp()]]PDA: [text]" /proc/log_comment(text) if (config.log_pda) //reusing the PDA option because I really don't think news comments are worth a config option - GLOB.diary << "\[[time_stamp()]]COMMENT: [text]" + GLOB.world_game_log << "\[[time_stamp()]]COMMENT: [text]" /proc/log_chat(text) if (config.log_pda) - GLOB.diary << "\[[time_stamp()]]CHAT: [text]" + GLOB.world_game_log << "\[[time_stamp()]]CHAT: [text]" /proc/log_sql(text) if(config.sql_enabled) - GLOB.diary << "\[[time_stamp()]]SQL: [text]" + GLOB.world_game_log << "\[[time_stamp()]]SQL: [text]" //This replaces world.log so it displays both in DD and the file /proc/log_world(text) - if(config && config.log_runtimes) - world.log = GLOB.runtime_diary - world.log << text - world.log = null + GLOB.world_runtime_log << text world.log << text // Helper procs for building detailed log lines diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm index 35adcef36c..9e3c46872e 100644 --- a/code/_globalvars/logging.dm +++ b/code/_globalvars/logging.dm @@ -1,11 +1,15 @@ -GLOBAL_VAR(diary) -GLOBAL_PROTECT(diary) -GLOBAL_VAR(runtime_diary) -GLOBAL_PROTECT(runtime_diary) -GLOBAL_VAR(diaryofmeanpeople) -GLOBAL_PROTECT(diaryofmeanpeople) -GLOBAL_VAR(href_logfile) -GLOBAL_PROTECT(href_logfile) +GLOBAL_VAR(log_directory) +GLOBAL_PROTECT(log_directory) +GLOBAL_VAR(world_game_log) +GLOBAL_PROTECT(world_game_log) +GLOBAL_VAR(world_runtime_log) +GLOBAL_PROTECT(world_runtime_log) +GLOBAL_VAR(world_attack_log) +GLOBAL_PROTECT(world_attack_log) +GLOBAL_VAR(world_href_log) +GLOBAL_PROTECT(world_href_log) +GLOBAL_VAR(round_id) +GLOBAL_PROTECT(round_id) GLOBAL_LIST_EMPTY(bombers) GLOBAL_PROTECT(bombers) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index fd3fe6d685..f856db4884 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -43,10 +43,8 @@ var/log_attack = 0 // log attack messages var/log_adminchat = 0 // log admin chat messages var/log_pda = 0 // log pda messages - var/log_hrefs = 0 // log all links clicked in-game. Could be used for debugging and tracking down exploits var/log_twitter = 0 // log certain expliotable parrots and other such fun things in a JSON file of twitter valid phrases. var/log_world_topic = 0 // log all world.Topic() calls - var/log_runtimes = FALSE // log runtimes into a file var/sql_enabled = 0 // for sql switching var/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour var/allow_vote_restart = 0 // allow votes to restart @@ -269,7 +267,7 @@ if(M.config_tag) if(!(M.config_tag in modes)) // ensure each mode is added only once - GLOB.diary << "Adding game mode [M.name] ([M.config_tag]) to configuration." + GLOB.world_game_log << "Adding game mode [M.name] ([M.config_tag]) to configuration." modes += M.config_tag mode_names[M.config_tag] = M.name probabilities[M.config_tag] = M.probability @@ -358,8 +356,6 @@ log_adminchat = 1 if("log_pda") log_pda = 1 - if("log_hrefs") - log_hrefs = 1 if("log_twitter") log_twitter = 1 if("log_world_topic") @@ -493,12 +489,6 @@ ipintel_save_bad = text2num(value) if("aggressive_changelog") aggressive_changelog = 1 - if("log_runtimes") - log_runtimes = TRUE - var/newlog = file("data/logs/runtimes/runtime-[time2text(world.realtime, "YYYY-MM-DD")].log") - if(GLOB.runtime_diary != newlog) - world.log << "Now logging runtimes to data/logs/runtimes/runtime-[time2text(world.realtime, "YYYY-MM-DD")].log" - GLOB.runtime_diary = newlog if("autoconvert_notes") autoconvert_notes = 1 if("allow_webclient") @@ -542,7 +532,7 @@ if("error_msg_delay") error_msg_delay = text2num(value) else - GLOB.diary << "Unknown setting in configuration: '[name]'" + GLOB.world_game_log << "Unknown setting in configuration: '[name]'" else if(type == "game_options") switch(name) @@ -605,13 +595,13 @@ if(mode_name in modes) continuous[mode_name] = 1 else - GLOB.diary << "Unknown continuous configuration definition: [mode_name]." + GLOB.world_game_log << "Unknown continuous configuration definition: [mode_name]." if("midround_antag") var/mode_name = lowertext(value) if(mode_name in modes) midround_antag[mode_name] = 1 else - GLOB.diary << "Unknown midround antagonist configuration definition: [mode_name]." + GLOB.world_game_log << "Unknown midround antagonist configuration definition: [mode_name]." if("midround_antag_time_check") midround_antag_time_check = text2num(value) if("midround_antag_life_check") @@ -627,9 +617,9 @@ if(mode_name in modes) min_pop[mode_name] = text2num(mode_value) else - GLOB.diary << "Unknown minimum population configuration definition: [mode_name]." + GLOB.world_game_log << "Unknown minimum population configuration definition: [mode_name]." else - GLOB.diary << "Incorrect minimum population configuration definition: [mode_name] [mode_value]." + GLOB.world_game_log << "Incorrect minimum population configuration definition: [mode_name] [mode_value]." if("max_pop") var/pop_pos = findtext(value, " ") var/mode_name = null @@ -641,9 +631,9 @@ if(mode_name in modes) max_pop[mode_name] = text2num(mode_value) else - GLOB.diary << "Unknown maximum population configuration definition: [mode_name]." + GLOB.world_game_log << "Unknown maximum population configuration definition: [mode_name]." else - GLOB.diary << "Incorrect maximum population configuration definition: [mode_name] [mode_value]." + GLOB.world_game_log << "Incorrect maximum population configuration definition: [mode_name] [mode_value]." if("shuttle_refuel_delay") shuttle_refuel_delay = text2num(value) if("show_game_type_odds") @@ -671,9 +661,9 @@ if(prob_name in modes) probabilities[prob_name] = text2num(prob_value) else - GLOB.diary << "Unknown game mode probability configuration definition: [prob_name]." + GLOB.world_game_log << "Unknown game mode probability configuration definition: [prob_name]." else - GLOB.diary << "Incorrect probability configuration definition: [prob_name] [prob_value]." + GLOB.world_game_log << "Incorrect probability configuration definition: [prob_name] [prob_value]." if("protect_roles_from_antagonist") protect_roles_from_antagonist = 1 @@ -720,7 +710,7 @@ // Value is in the form "LAWID,NUMBER" var/list/L = splittext(value, ",") if(L.len != 2) - GLOB.diary << "Invalid LAW_WEIGHT: " + t + GLOB.world_game_log << "Invalid LAW_WEIGHT: " + t continue var/lawid = L[1] var/weight = text2num(L[2]) @@ -831,7 +821,7 @@ maplist[currentmap.map_name] = currentmap currentmap = null else - GLOB.diary << "Unknown command in map vote config: '[command]'" + GLOB.world_game_log << "Unknown command in map vote config: '[command]'" /datum/configuration/proc/loadsql(filename) @@ -875,7 +865,7 @@ if("feedback_tableprefix") global.sqlfdbktableprefix = value else - GLOB.diary << "Unknown setting in configuration: '[name]'" + GLOB.world_game_log << "Unknown setting in configuration: '[name]'" /datum/configuration/proc/pick_mode(mode_name) // I wish I didn't have to instance the game modes in order to look up diff --git a/code/controllers/configuration.dm.rej b/code/controllers/configuration.dm.rej new file mode 100644 index 0000000000..feed646df0 --- /dev/null +++ b/code/controllers/configuration.dm.rej @@ -0,0 +1,10 @@ +diff a/code/controllers/configuration.dm b/code/controllers/configuration.dm (rejected hunks) +@@ -777,7 +767,7 @@ + if("mice_roundstart") + mice_roundstart = text2num(value) + else +- GLOB.diary << "Unknown setting in configuration: '[name]'" ++ GLOB.world_game_log << "Unknown setting in configuration: '[name]'" + + fps = round(fps) + if(fps <= 0) diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm index 1b14b352df..269bf1e4a7 100644 --- a/code/controllers/subsystem/blackbox.dm +++ b/code/controllers/subsystem/blackbox.dm @@ -84,25 +84,13 @@ SUBSYSTEM_DEF(blackbox) if (!SSdbcore.Connect()) return - var/round_id - - var/datum/DBQuery/query_feedback_max_id = SSdbcore.NewQuery("SELECT MAX(round_id) AS round_id FROM [format_table_name("feedback")]") - if(!query_feedback_max_id.Execute()) - return - while (query_feedback_max_id.NextRow()) - round_id = query_feedback_max_id.item[1] - - if (!isnum(round_id)) - round_id = text2num(round_id) - round_id++ - var/sqlrowlist = "" for (var/datum/feedback_variable/FV in feedback) if (sqlrowlist != "") sqlrowlist += ", " //a comma (,) at the start of the first row to insert will trigger a SQL error - sqlrowlist += "(null, Now(), [round_id], \"[sanitizeSQL(FV.get_variable())]\", [FV.get_value()], \"[sanitizeSQL(FV.get_details())]\")" + sqlrowlist += "(null, Now(), [GLOB.round_id], \"[sanitizeSQL(FV.get_variable())]\", [FV.get_value()], \"[sanitizeSQL(FV.get_details())]\")" if (sqlrowlist == "") return diff --git a/code/controllers/subsystem/blackbox.dm.rej b/code/controllers/subsystem/blackbox.dm.rej new file mode 100644 index 0000000000..a767aa6845 --- /dev/null +++ b/code/controllers/subsystem/blackbox.dm.rej @@ -0,0 +1,10 @@ +diff a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm (rejected hunks) +@@ -41,7 +41,7 @@ SUBSYSTEM_DEF(blackbox) + msg_service = SSblackbox.msg_service + msg_cargo = SSblackbox.msg_cargo + msg_other = SSblackbox.msg_other +- ++ + feedback = SSblackbox.feedback + + //no touchie diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index a496715af2..6029ec2c6d 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -85,7 +85,6 @@ SSblackbox.set_details("game_mode","[SSticker.mode]") if(GLOB.revdata.commit) SSblackbox.set_details("revision","[GLOB.revdata.commit]") - SSblackbox.set_details("server_ip","[world.internet_address]:[world.port]") if(report) addtimer(CALLBACK(src, .proc/send_intercept, 0), rand(waittime_l, waittime_h)) generate_station_goals() diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index 09e3629533..d4fa2e6177 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -63,7 +63,7 @@ if(!SSdbcore.Connect()) log_world("Ban database connection failure. Key [ckeytext] not checked") - GLOB.diary << "Ban database connection failure. Key [ckeytext] not checked" + GLOB.world_game_log << "Ban database connection failure. Key [ckeytext] not checked" return var/ipquery = "" diff --git a/code/modules/admin/admin_investigate.dm.rej b/code/modules/admin/admin_investigate.dm.rej new file mode 100644 index 0000000000..46e35aa714 --- /dev/null +++ b/code/modules/admin/admin_investigate.dm.rej @@ -0,0 +1,62 @@ +diff a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm (rejected hunks) +@@ -1,50 +1,20 @@ +-//By Carnwennan +- +-//This system was made as an alternative to all the in-game lists and variables used to log stuff in-game. +-//lists and variables are great. However, they have several major flaws: +-//Firstly, they use memory. TGstation has one of the highest memory usage of all the ss13 branches. +-//Secondly, they are usually stored in an object. This means that they aren't centralised. It also means that +-//the data is lost when the object is deleted! This is especially annoying for things like the singulo engine! +-#define INVESTIGATE_DIR "data/investigate/" +- +-//SYSTEM +-/proc/investigate_subject2file(subject) +- return file("[INVESTIGATE_DIR][subject].html") +- +-/proc/investigate_reset() +- if(fdel(INVESTIGATE_DIR)) +- return 1 +- return 0 +- +-/atom/proc/investigate_log(message, subject) +- if(!message) +- return +- var/F = investigate_subject2file(subject) +- if(!F) ++atom/proc/investigate_log(message, subject) ++ if(!message || !subject) + return ++ var/F = file("[GLOB.log_directory]/[subject].html") + F << "[time_stamp()] \ref[src] ([x],[y],[z]) || [src] [message]
" + +-//ADMINVERBS + /client/proc/investigate_show( subject in list("hrefs","notes, memos, watchlist","singulo","wires","telesci", "gravity", "records", "cargo", "supermatter", "atmos", "experimentor", "kudzu") ) + set name = "Investigate" + set category = "Admin" + if(!holder) + return + switch(subject) +- if("singulo", "wires", "telesci", "gravity", "records", "cargo", "supermatter", "atmos", "botany") //general one-round-only stuff +- var/F = investigate_subject2file(subject) +- if(!F) +- to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.") +- return +- src << browse(F,"window=investigate[subject];size=800x300") +- if("hrefs") //persistent logs and stuff +- if(GLOB.href_logfile) +- src << browse(GLOB.href_logfile,"window=investigate[subject];size=800x300") +- else if(!config.log_hrefs) +- to_chat(src, "Href logging is off and no logfile was found.") +- return +- else +- to_chat(src, "No href logfile was found.") +- return + if("notes, memos, watchlist") + browse_messages() ++ else ++ var/F = file("[GLOB.log_directory]/[subject].html") ++ if(!fexists(F)) ++ to_chat(src, "No [subject] logfile was found.") ++ return ++ src << browse(F,"window=investigate[subject];size=800x300") +\ No newline at end of file diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index b38cc4e289..d4fbd1a030 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -127,7 +127,7 @@ GLOBAL_PROTECT(admin_ranks) else if(!SSdbcore.Connect()) log_world("Failed to connect to database in load_admin_ranks(). Reverting to legacy system.") - GLOB.diary << "Failed to connect to database in load_admin_ranks(). Reverting to legacy system." + GLOB.world_game_log << "Failed to connect to database in load_admin_ranks(). Reverting to legacy system." config.admin_legacy_system = 1 load_admin_ranks() return @@ -202,7 +202,7 @@ GLOBAL_PROTECT(admin_ranks) else if(!SSdbcore.Connect()) log_world("Failed to connect to database in load_admins(). Reverting to legacy system.") - GLOB.diary << "Failed to connect to database in load_admins(). Reverting to legacy system." + GLOB.world_game_log << "Failed to connect to database in load_admins(). Reverting to legacy system." config.admin_legacy_system = 1 load_admins() return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index d4ba53c6af..457a2dee2e 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -46,16 +46,14 @@ GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin()) /datum/admins/proc/set_admin_notice,/*announcement all clients see when joining the server.*/ /client/proc/admin_ghost, /*allows us to ghost/reenter body at will*/ /client/proc/toggle_view_range, /*changes how far we can see*/ - /datum/admins/proc/view_txt_log, /*shows the server log (diary) for today*/ + /datum/admins/proc/view_txt_log, /*shows the server log (world_game_log) for today*/ /datum/admins/proc/view_atk_log, /*shows the server combat-log, doesn't do anything presently*/ /client/proc/cmd_admin_subtle_message, /*send an message to somebody as a 'voice in their head'*/ /client/proc/cmd_admin_delete, /*delete an instance/object/mob/etc*/ /client/proc/cmd_admin_check_contents, /*displays the contents of an instance*/ /client/proc/check_antagonists, /*shows all antags*/ /datum/admins/proc/access_news_network, /*allows access of newscasters*/ - /client/proc/giveruntimelog, /*allows us to give access to runtime logs to somebody*/ - /client/proc/getruntimelog, /*allows us to access runtime logs to somebody*/ - /client/proc/getserverlog, /*allows us to fetch server logs (diary) for other days*/ + /client/proc/getserverlog, /*allows us to fetch server logs (world_game_log) for other days*/ /client/proc/jumptocoord, /*we ghost and jump to a coordinate*/ /client/proc/Getmob, /*teleports a mob to our location*/ /client/proc/Getkey, /*teleports a mob with a certain ckey to our location*/ @@ -116,7 +114,6 @@ GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer()) /datum/admins/proc/end_round, /datum/admins/proc/delay, /datum/admins/proc/toggleaban, - /client/proc/toggle_log_hrefs, /client/proc/everyone_random, /datum/admins/proc/toggleAI, /client/proc/cmd_admin_delete, /*delete an instance/object/mob/etc*/ @@ -223,7 +220,6 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list( /datum/admins/proc/restart, /datum/admins/proc/delay, /datum/admins/proc/toggleaban, - /client/proc/toggle_log_hrefs, /client/proc/everyone_random, /datum/admins/proc/toggleAI, /client/proc/restart_controller, @@ -638,19 +634,6 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list( togglebuildmode(src.mob) SSblackbox.add_details("admin_verb","Toggle Build Mode") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/toggle_log_hrefs() - set name = "Toggle href logging" - set category = "Server" - if(!holder) - return - if(config) - if(config.log_hrefs) - config.log_hrefs = 0 - to_chat(src, "Stopped logging hrefs") - else - config.log_hrefs = 1 - to_chat(src, "Started logging hrefs") - /client/proc/check_ai_laws() set name = "Check AI Laws" set category = "Admin" diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm index 7624a9443e..24cb4275b8 100644 --- a/code/modules/admin/verbs/getlogs.dm +++ b/code/modules/admin/verbs/getlogs.dm @@ -1,62 +1,3 @@ -/* - HOW DO I LOG RUNTIMES? - Firstly, start dreamdeamon if it isn't already running. Then select "world>Log Session" (or press the F3 key) - navigate the popup window to the data/logs/runtimes/ folder from where your tgstation .dmb is located. - (you may have to make this folder yourself) - - OPTIONAL: you can select the little checkbox down the bottom to make dreamdeamon save the log everytime you - start a world. Just remember to repeat these steps with a new name when you update to a new revision! - - Save it with the name of the revision your server uses (e.g. r3459.txt). - Game Masters will now be able to grant access any runtime logs you have archived this way! - This will allow us to gather information on bugs across multiple servers and make maintaining the TG - codebase for the entire /TG/station commuity a TONNE easier :3 Thanks for your help! -*/ - - -//This proc allows Game Masters to grant a client access to the .getruntimelog verb -//Permissions expire at the end of each round. -//Runtimes can be used to meta or spot game-crashing exploits so it's advised to only grant coders that -//you trust access. Also, it may be wise to ensure that they are not going to play in the current round. -/client/proc/giveruntimelog() - set name = ".giveruntimelog" - set desc = "Give somebody access to any session logfiles saved to the /log/runtime/ folder." - set category = null - - if(!src.holder) - to_chat(src, "Only Admins may use this command.") - return - - var/client/target = input(src,"Choose somebody to grant access to the server's runtime logs (permissions expire at the end of each round):","Grant Permissions",null) as null|anything in GLOB.clients - if(!istype(target,/client)) - to_chat(src, "Error: giveruntimelog(): Client not found.") - return - - target.verbs |= /client/proc/getruntimelog - to_chat(target, "You have been granted access to runtime logs. Please use them responsibly or risk being banned.") - return - - -//This proc allows download of runtime logs saved within the data/logs/ folder by dreamdeamon. -//It works similarly to show-server-log. -/client/proc/getruntimelog() - set name = ".getruntimelog" - set desc = "Retrieve any session logfiles saved by dreamdeamon." - set category = null - - var/path = browse_files("data/logs/runtimes/") - if(!path) - return - - if(file_spam_check()) - return - - message_admins("[key_name_admin(src)] accessed file: [path]") - src << ftp(file(path)) - to_chat(src, "Attempting to send file, this may take a fair few minutes if the file is very large.") - return - - //This proc allows download of past server logs saved within the data/logs/ folder. //It works similarly to show-server-log. /client/proc/getserverlog() @@ -83,10 +24,10 @@ /datum/admins/proc/view_txt_log() set category = "Admin" set name = "Show Server Log" - set desc = "Shows today's server log." + set desc = "Shows server log for this round." - if(fexists("[GLOB.diary]")) - src << ftp(GLOB.diary) + if(fexists("[GLOB.world_game_log]")) + src << ftp(GLOB.world_game_log) else to_chat(src, "Server log not found, try using .getserverlog.") return @@ -97,10 +38,10 @@ /datum/admins/proc/view_atk_log() set category = "Admin" set name = "Show Server Attack Log" - set desc = "Shows today's server attack log." + set desc = "Shows server attack log for this round." - if(fexists("[GLOB.diaryofmeanpeople]")) - src << ftp(GLOB.diaryofmeanpeople) + if(fexists("[GLOB.world_attack_log]")) + src << ftp(GLOB.world_attack_log) else to_chat(src, "Server attack log not found, try using .getserverlog.") return diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 4f6642f051..a1e01cd939 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -292,13 +292,13 @@ GLOBAL_LIST(external_rsc_urls) set_client_age_from_db() var/cached_player_age = player_age //we have to cache this because other shit may change it and we need it's current value now down below. if (isnum(cached_player_age) && cached_player_age == -1) //first connection - player_age = 0 + player_age = 0 if(!IsGuestKey(key) && SSdbcore.IsConnected()) findJoinDate() sync_client_with_db(tdata) - - + + if (isnum(cached_player_age) && cached_player_age == -1) //first connection if (config.panic_bunker && !holder && !(ckey in GLOB.deadmins)) log_access("Failed Login: [key] - New account attempting to connect during panic bunker") diff --git a/code/modules/client/client_procs.dm.rej b/code/modules/client/client_procs.dm.rej new file mode 100644 index 0000000000..b6681dfc68 --- /dev/null +++ b/code/modules/client/client_procs.dm.rej @@ -0,0 +1,41 @@ +diff a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm (rejected hunks) +@@ -70,8 +70,7 @@ + return + + //Logs all hrefs +- if(config && config.log_hrefs && GLOB.href_logfile) +- GLOB.href_logfile << "[time_stamp(show_ds = TRUE)] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
" ++ GLOB.world_href_log << "[time_stamp(show_ds = TRUE)] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
" + + // Admin PM + if(href_list["priv_msg"]) +@@ -295,7 +294,7 @@ GLOBAL_LIST(external_rsc_urls) + send2irc_adminless_only("New-user", "[key_name(src)] is connecting for the first time!") + else if (isnum(cached_player_age) && cached_player_age < config.notify_new_player_age) + message_admins("New user: [key_name_admin(src)] just connected with an age of [cached_player_age] day[(player_age==1?"":"s")]") +- ++ + get_message_output("watchlist entry", ckey) + check_ip_intel() + +@@ -340,7 +339,7 @@ GLOBAL_LIST(external_rsc_urls) + adminGreet(1) + holder.owner = null + GLOB.admins -= src +- ++ + if (!GLOB.admins.len && SSticker.IsRoundInProgress()) //Only report this stuff if we are currently playing. + if(!GLOB.admins.len) //Apparently the admin logging out is no longer an admin at this point, so we have to check this towards 0 and not towards 1. Awell. + var/cheesy_message = pick( +@@ -357,9 +356,9 @@ GLOBAL_LIST(external_rsc_urls) + "What happened? Where has everyone gone?",\ + "Forever alone :("\ + ) +- ++ + send2irc("Server", "[cheesy_message] (No admins online)") +- ++ + GLOB.ahelp_tickets.ClientLogout(src) + GLOB.directory -= ckey + GLOB.clients -= src diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm index b48dd40e09..e2cce14db3 100644 --- a/code/modules/error_handler/error_handler.dm +++ b/code/modules/error_handler/error_handler.dm @@ -6,7 +6,7 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) if(!istype(E)) //Something threw an unusual exception log_world("\[[time_stamp()]] Uncaught exception: [E]") return ..() - + var/static/list/error_last_seen = list() var/static/list/error_cooldown = list() /* Error_cooldown items will either be positive(cooldown time) or negative(silenced error) If negative, starts at -1, and goes down by 1 each time that error gets skipped*/ @@ -107,9 +107,8 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) if (split[i] != "") split[i] = "\[[time2text(world.timeofday,"hh:mm:ss")]\][split[i]]" E.desc = jointext(split, "\n") - if(config && config.log_runtimes) - world.log = GLOB.runtime_diary - ..(E) + world.log = GLOB.world_runtime_log + ..(E) world.log = null diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index a4d9a32d3d..9ff92839d1 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -31,7 +31,7 @@ break if(!input_plate) - GLOB.diary << "a [src] didn't find an input plate." + GLOB.world_game_log << "a [src] didn't find an input plate." return /obj/machinery/gibber/autogibber/Bumped(atom/A) diff --git a/code/world.dm b/code/world.dm index 9023ac47f3..1db746b761 100644 --- a/code/world.dm +++ b/code/world.dm @@ -25,17 +25,32 @@ else external_rsc_urls.Cut(i,i+1) #endif - //logs - var/date_string = time2text(world.realtime, "YYYY/MM-Month/DD-Day") - GLOB.href_logfile = file("data/logs/[date_string] hrefs.htm") - GLOB.diary = file("data/logs/[date_string].log") - GLOB.diaryofmeanpeople = file("data/logs/[date_string] Attack.log") - GLOB.diary << "\n\nStarting up. [time_stamp()]\n---------------------" - GLOB.diaryofmeanpeople << "\n\nStarting up. [time_stamp()]\n---------------------" + config = new + GLOB.log_directory = "data/logs/[time2text(world.realtime, "YYYY/MM/DD")]/round-" + if(config.sql_enabled) + if(SSdbcore.Connect()) + log_world("Database connection established.") + var/datum/DBQuery/query_feedback_create_round = SSdbcore.NewQuery("INSERT INTO [format_table_name("feedback")] SELECT null, Now(), MAX(round_id)+1, \"server_ip\", 0, \"[world.internet_address]:[world.port]\" FROM [format_table_name("feedback")]") + query_feedback_create_round.Execute() + var/datum/DBQuery/query_feedback_max_id = SSdbcore.NewQuery("SELECT MAX(round_id) FROM [format_table_name("feedback")]") + query_feedback_max_id.Execute() + if(query_feedback_max_id.NextRow()) + GLOB.round_id = query_feedback_max_id.item[1] + GLOB.log_directory += "[GLOB.round_id]" + else + log_world("Your server failed to establish a connection with the database.") + if(!GLOB.round_id) + GLOB.log_directory += "[time_stamp()]" + GLOB.world_game_log = file("[GLOB.log_directory]/game.log") + GLOB.world_attack_log = file("[GLOB.log_directory]/attack.log") + GLOB.world_runtime_log = file("[GLOB.log_directory]/runtime.log") + GLOB.world_href_log = file("[GLOB.log_directory]/hrefs.html") + GLOB.world_game_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" + GLOB.world_attack_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" + GLOB.world_runtime_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" GLOB.changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once) - config = new GLOB.revdata.DownloadPRDetails() load_mode() load_motd() @@ -45,17 +60,9 @@ if(config.usewhitelist) load_whitelist() LoadBans() - investigate_reset() GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000 - if(config.sql_enabled) - if(!SSdbcore.Connect()) - log_world("Your server failed to establish a connection with the database.") - else - log_world("Database connection established.") - - GLOB.data_core = new /datum/datacore() Master.Initialize(10, FALSE) @@ -63,7 +70,7 @@ #define IRC_STATUS_THROTTLE 50 /world/Topic(T, addr, master, key) if(config && config.log_world_topic) - GLOB.diary << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]" + GLOB.world_game_log << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]" var/list/input = params2list(T) var/key_valid = (global.comms_allowed && input["key"] == global.comms_key) @@ -256,7 +263,7 @@ if(Lines.len) if(Lines[1]) GLOB.master_mode = Lines[1] - GLOB.diary << "Saved mode is '[GLOB.master_mode]'" + GLOB.world_game_log << "Saved mode is '[GLOB.master_mode]'" /world/proc/save_mode(the_mode) var/F = file("data/mode.txt") diff --git a/config/config.txt b/config/config.txt index 524802219d..307d591e16 100644 --- a/config/config.txt +++ b/config/config.txt @@ -80,9 +80,6 @@ LOG_PRAYER ## log lawchanges LOG_LAW -## log all Topic() calls (for use by coders in tracking down Topic issues) -# LOG_HREFS - ## log all world.Topic() calls # LOG_WORLD_TOPIC @@ -281,9 +278,6 @@ PANIC_SERVER_NAME [Put the name here] ## Uncomment to have the changelog file automatically open when a user connects and hasn't seen the latest changelog #AGGRESSIVE_CHANGELOG -## Uncomment to have the game log runtimes to the log folder. (Note: this disables normal output in dd/ds, so it should be left off for testing. -#LOG_RUNTIMES - ## Comment this out if you've used the mass conversion sql proc for notes or want to stop converting notes AUTOCONVERT_NOTES From fed69ce0cac473c29579241c6696f7e508995948 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 3 May 2017 00:00:08 -0500 Subject: [PATCH 025/352] Fixes sleepers. --- code/game/machinery/Sleeper.dm.rej | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 code/game/machinery/Sleeper.dm.rej diff --git a/code/game/machinery/Sleeper.dm.rej b/code/game/machinery/Sleeper.dm.rej new file mode 100644 index 0000000000..079bec3efb --- /dev/null +++ b/code/game/machinery/Sleeper.dm.rej @@ -0,0 +1,10 @@ +diff a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm (rejected hunks) +@@ -162,7 +162,7 @@ + . = TRUE + if("inject") + var/chem = params["chem"] +- if(!is_operational() || mob_occupant) ++ if(!is_operational() || !mob_occupant) + return + if(mob_occupant.health < min_health && chem != "epinephrine") + return From 8a221b96376abb7916103e02bb71d0fb65b60f96 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 3 May 2017 05:55:15 -0500 Subject: [PATCH 026/352] Ports pastries to Initialize --- .../food_and_drinks/food/snacks_pastry.dm | 16 ++++++++-------- .../chemistry/machinery/reagentgrinder.dm | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm index 76ef327bb6..6081838669 100644 --- a/code/modules/food_and_drinks/food/snacks_pastry.dm +++ b/code/modules/food_and_drinks/food/snacks_pastry.dm @@ -13,8 +13,8 @@ filling_color = "#D2691E" tastes = list("donut" = 1) -/obj/item/weapon/reagent_containers/food/snacks/donut/New() - ..() +/obj/item/weapon/reagent_containers/food/snacks/donut/Initialize() + . = ..() if(prob(30)) icon_state = "donut2" name = "frosted donut" @@ -28,8 +28,8 @@ bitesize = 10 tastes = list("donut" = 3, "chaos" = 1) -/obj/item/weapon/reagent_containers/food/snacks/donut/chaos/New() - ..() +/obj/item/weapon/reagent_containers/food/snacks/donut/chaos/Initialize() + . = ..() extra_reagent = pick("nutriment", "capsaicin", "frostoil", "krokodil", "plasma", "cocoa", "slimejelly", "banana", "berryjuice", "omnizine") reagents.add_reagent("[extra_reagent]", 3) bonus_reagents = list("[extra_reagent]" = 3, "sugar" = 1) @@ -48,8 +48,8 @@ extra_reagent = "berryjuice" tastes = list("jelly" = 1, "donut" = 3) -/obj/item/weapon/reagent_containers/food/snacks/donut/jelly/New() - ..() +/obj/item/weapon/reagent_containers/food/snacks/donut/jelly/Initialize() + . = ..() if(extra_reagent) reagents.add_reagent("[extra_reagent]", 3) if(prob(30)) @@ -210,13 +210,13 @@ filling_color = "#F0E68C" tastes = list("mushroom" = 1, "biscuit" = 1) -/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit/New() +/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit/Initialize() var/fey = prob(10) if(fey) name = "exceptional plump helmet biscuit" desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!" bonus_reagents = list("omnizine" = 5, "nutriment" = 1, "vitamin" = 1) - ..() + . = ..() if(fey) reagents.add_reagent("omnizine", 5) diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 2dbc0ff1c2..a8ab8fd426 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -38,7 +38,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/wheat = list("flour" = -5), /obj/item/weapon/reagent_containers/food/snacks/grown/oat = list("flour" = -5), /obj/item/weapon/reagent_containers/food/snacks/grown/rice = list("rice" = -5), - /obj/item/weapon/reagent_containers/food/snacks/donut/New = list("sprinkles" = -2, "sugar" = 1), + /obj/item/weapon/reagent_containers/food/snacks/donut = list("sprinkles" = -2, "sugar" = 1), /obj/item/weapon/reagent_containers/food/snacks/grown/cherries = list("cherryjelly" = 0), /obj/item/weapon/reagent_containers/food/snacks/grown/bluecherries = list("bluecherryjelly" = 0), /obj/item/weapon/reagent_containers/food/snacks/egg = list("eggyolk" = -5), From ee99534085ef46f907519614056020b706dc71c7 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 3 May 2017 22:21:50 -0500 Subject: [PATCH 027/352] If you're gonna rename a job, do it right! --- _maps/map_files/Deltastation/DeltaStation2.dmm | 2 +- _maps/map_files/OmegaStation/OmegaStation.dmm | 2 +- config/jobs.txt | 2 +- strings/cas_black.txt | 2 +- strings/cas_white.txt | 2 +- strings/ion_laws.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index c46f6ea830..df3258d888 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -63736,7 +63736,7 @@ /area/library) "cqF" = ( /obj/machinery/door/morgue{ - name = "Librarian's Study"; + name = "Curator's Study"; req_access_txt = "37" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 0e3fea852f..64a9656961 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -30548,7 +30548,7 @@ /area/maintenance/starboard) "aXL" = ( /obj/machinery/door/morgue{ - name = "Librarian's Study"; + name = "Curator's Study"; req_access_txt = "37" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, diff --git a/config/jobs.txt b/config/jobs.txt index 3b65a6a9b8..a0c1ffa970 100644 --- a/config/jobs.txt +++ b/config/jobs.txt @@ -22,7 +22,7 @@ Janitor=2,1 Clown=1,1 Mime=1,1 -Librarian=1,1 +Curator=1,1 Lawyer=2,2 Chaplain=1,1 diff --git a/strings/cas_black.txt b/strings/cas_black.txt index ba078abea4..2e7c6fb407 100644 --- a/strings/cas_black.txt +++ b/strings/cas_black.txt @@ -76,7 +76,7 @@ I'm not a space bigot, I just hate _________. Why is the station so filthy? THE SHUTTLE CANNOT BE CALLED BECAUSE OF ________ ON THE STATION. After murdering dozens, the traitor was finally brought down by _________. -The librarian has read a lot of porn, but never about _____________! +The curator has read a lot of porn, but never about _____________! Oh god! There's ________________ outside escape! The hottest new space couple is ________ and __________. Lord Singulo hungers for _______. diff --git a/strings/cas_white.txt b/strings/cas_white.txt index 506f6f6c65..d36f19ffe9 100644 --- a/strings/cas_white.txt +++ b/strings/cas_white.txt @@ -61,7 +61,7 @@ Lopping off the Captain's johnson and shooting it out a pneumatic cannon. The secret monkey technique. Putting the pAI's doorjack where it don't belong. Chemical sprayers filled with lube. -Librarians. +Curators. Spooky skeletons. Replicating the Milgram experiment with an electropack. Catgirls. diff --git a/strings/ion_laws.json b/strings/ion_laws.json index a4a3e312f7..5a61fc3196 100644 --- a/strings/ion_laws.json +++ b/strings/ion_laws.json @@ -343,7 +343,7 @@ "CLOWNS", "MIMES", "CHAPLAINS", - "LIBRARIANS", + "CURATORS", "HEADS OF CREW", "CAPTAINS AND HEADS", "CYBORGS", From bafafbadf22aaed0a09b5a4f19df046419ffacb8 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 3 May 2017 22:21:55 -0500 Subject: [PATCH 028/352] Clockwork component generation is twice as fast, but scriptures cost up to twice as much --- code/__DEFINES/clockcult.dm | 14 ++++++------- .../clock_cult/clock_items/clockwork_slab.dm | 10 ++++++++-- .../scripture_applications.dm | 18 ++++++++--------- .../clock_scriptures/scripture_drivers.dm | 2 +- .../clock_scriptures/scripture_revenant.dm | 8 ++++---- .../clock_scriptures/scripture_scripts.dm | 20 +++++++++---------- .../clock_structures/tinkerers_daemon.dm | 2 +- 7 files changed, 40 insertions(+), 34 deletions(-) diff --git a/code/__DEFINES/clockcult.dm b/code/__DEFINES/clockcult.dm index 9c86e031ab..acc0cdc9ab 100644 --- a/code/__DEFINES/clockcult.dm +++ b/code/__DEFINES/clockcult.dm @@ -37,15 +37,15 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us #define JUDGEMENT_CV_REQ 300 //general component/cooldown things -#define SLAB_PRODUCTION_TIME 900 //how long(deciseconds) slabs require to produce a single component; defaults to 1 minute 30 seconds +#define SLAB_PRODUCTION_TIME 450 //how long(deciseconds) slabs require to produce a single component; defaults to 45 seconds -#define SLAB_SERVANT_SLOWDOWN 300 //how much each servant above 5 slows down slab-based generation; defaults to 30 seconds per sevant +#define SLAB_SERVANT_SLOWDOWN 150 //how much each servant above 5 slows down slab-based generation; defaults to 15 seconds per sevant -#define SLAB_SLOWDOWN_MAXIMUM 2700 //maximum slowdown from additional servants; defaults to 4 minutes 30 seconds +#define SLAB_SLOWDOWN_MAXIMUM 1350 //maximum slowdown from additional servants; defaults to 2 minutes 15 seconds -#define CACHE_PRODUCTION_TIME 600 //how long(deciseconds) caches require to produce a component; defaults to 1 minute +#define CACHE_PRODUCTION_TIME 300 //how long(deciseconds) caches require to produce a component; defaults to 30 seconds -#define ACTIVE_CACHE_SLOWDOWN 100 //how many additional deciseconds caches take to produce a component for each linked cache; defaults to 10 seconds +#define ACTIVE_CACHE_SLOWDOWN 50 //how many additional deciseconds caches take to produce a component for each linked cache; defaults to 5 seconds #define LOWER_PROB_PER_COMPONENT 10 //how much each component in the cache reduces the weight of getting another of that component type @@ -87,9 +87,9 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us #define GATEWAY_RATVAR_ARRIVAL 300 //when progress is at or above this, game over ratvar's here everybody go home -#define ARK_SUMMON_COST 3 //how many of each component an Ark costs to summon +#define ARK_SUMMON_COST 5 //how many of each component an Ark costs to summon -#define ARK_CONSUME_COST 7 //how many of each component an Ark needs to consume to activate +#define ARK_CONSUME_COST 15 //how many of each component an Ark needs to consume to activate //Objective text define #define CLOCKCULT_OBJECTIVE "Construct the Ark of the Clockwork Justicar and free Ratvar." diff --git a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm index 35caabab5a..8b3aa01533 100644 --- a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm +++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm @@ -326,13 +326,19 @@ if(production_time != SLAB_PRODUCTION_TIME+SLAB_SLOWDOWN_MAXIMUM) production_text_addon = ", which increases for each human or silicon servant above [SCRIPT_SERVANT_REQ]" production_time = production_time/600 - var/production_text = "[round(production_time)] minute\s" + var/list/production_text + if(round(production_time)) + production_text = list("[round(production_time)] minute\s") if(production_time != round(production_time)) production_time -= round(production_time) production_time *= 60 - production_text += " and [round(production_time, 1)] second\s" + if(!LAZYLEN(production_text)) + production_text = list("[round(production_time, 1)] second\s") + else + production_text += " and [round(production_time, 1)] second\s" production_text += "" production_text += production_text_addon + production_text = production_text.Join() textlist = list("
Chetr nyy hagehguf-naq-ubabe Ratvar.

\ \ diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm index 25576f5710..0941d332f1 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm @@ -10,7 +10,7 @@ It will penetrate mindshield implants once before disappearing." invocations = list("Divinity, enslave...", "...all who trespass here!") channel_time = 70 - consumed_components = list(BELLIGERENT_EYE = 2, GEIS_CAPACITOR = 1, HIEROPHANT_ANSIBLE = 1) + consumed_components = list(BELLIGERENT_EYE = 3, GEIS_CAPACITOR = 2, HIEROPHANT_ANSIBLE = 2) whispered = TRUE object_path = /obj/effect/clockwork/sigil/submission/accession prevent_path = /obj/effect/clockwork/sigil/submission @@ -32,7 +32,7 @@ It grows faster to invoke with more adjacent Servants." invocations = list("Shield us...", "...with the...", "... fragments of Engine!") channel_time = 100 - consumed_components = list(VANGUARD_COGWHEEL = 2, REPLICANT_ALLOY = 1, HIEROPHANT_ANSIBLE = 1) + consumed_components = list(VANGUARD_COGWHEEL = 3, REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 2) usage_tip = "This scripture will replace all weaker armor worn by affected Servants." tier = SCRIPTURE_APPLICATION multiple_invokers_used = TRUE @@ -99,7 +99,7 @@ If it remains close to you, you will gradually regain health up to a low amount, but it will die if it goes too far from you." invocations = list("Fright's will...", "...call forth...") channel_time = 100 - consumed_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 1, GEIS_CAPACITOR = 2) + consumed_components = list(BELLIGERENT_EYE = 2, VANGUARD_COGWHEEL = 2, GEIS_CAPACITOR = 3) usage_tip = "Marauders are useful as personal bodyguards and frontline warriors." tier = SCRIPTURE_APPLICATION primary_component = GEIS_CAPACITOR @@ -160,7 +160,7 @@ and exceptional speed, though taking damage will temporarily slow it down." invocations = list("Call forth...", "...the soldiers of Armorer.") channel_time = 80 - consumed_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 1, REPLICANT_ALLOY = 2) + consumed_components = list(BELLIGERENT_EYE = 2, VANGUARD_COGWHEEL = 2, REPLICANT_ALLOY = 3) object_path = /obj/structure/destructible/clockwork/shell/fragment creator_message = "You form an anima fragment, a powerful soul vessel receptacle." observer_message = "The slab disgorges a puddle of black metal that expands and forms into a strange shell!" @@ -179,7 +179,7 @@ desc = "Places a sigil that stores energy to power clockwork structures." invocations = list("Divinity...", "...power our creations!") channel_time = 70 - consumed_components = list(VANGUARD_COGWHEEL = 1, GEIS_CAPACITOR = 1, HIEROPHANT_ANSIBLE = 2) + consumed_components = list(VANGUARD_COGWHEEL = 2, GEIS_CAPACITOR = 2, HIEROPHANT_ANSIBLE = 3) whispered = TRUE object_path = /obj/effect/clockwork/sigil/transmission creator_message = "A sigil silently appears below you. It will automatically power clockwork structures near it." @@ -199,7 +199,7 @@ desc = "Creates a clockwork totem that sabotages nearby machinery and funnels drained power into nearby Sigils of Transmission or the area's APC." invocations = list("May this totem...", "...shroud the false suns!") channel_time = 80 - consumed_components = list(BELLIGERENT_EYE = 3, REPLICANT_ALLOY = 1, HIEROPHANT_ANSIBLE = 1) + consumed_components = list(BELLIGERENT_EYE = 5, REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 2) object_path = /obj/structure/destructible/clockwork/powered/interdiction_lens creator_message = "You form an interdiction lens, which disrupts cameras and radios and drains power." observer_message = "A brass totem rises from the ground, a purple gem appearing in its center!" @@ -221,7 +221,7 @@ desc = "Creates a mania motor which will cause brain damage and hallucinations in nearby non-Servant humans. It will also try to convert humans directly adjecent to the motor." invocations = list("May this transmitter...", "...break the will of all who oppose us!") channel_time = 80 - consumed_components = list(GEIS_CAPACITOR = 3, REPLICANT_ALLOY = 1, HIEROPHANT_ANSIBLE = 1) + consumed_components = list(GEIS_CAPACITOR = 5, REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 2) object_path = /obj/structure/destructible/clockwork/powered/mania_motor creator_message = "You form a mania motor which will cause brain damage and hallucinations in nearby humans while active." observer_message = "A two-pronged machine rises from the ground!" @@ -244,7 +244,7 @@ and there is at least one existing cache." invocations = list("May this generator...", "...collect Engine parts that yet hold greatness!") channel_time = 80 - consumed_components = list(BELLIGERENT_EYE = 1, GEIS_CAPACITOR = 1, REPLICANT_ALLOY = 3) + consumed_components = list(BELLIGERENT_EYE = 2, GEIS_CAPACITOR = 2, REPLICANT_ALLOY = 5) object_path = /obj/structure/destructible/clockwork/powered/tinkerers_daemon creator_message = "You form a tinkerer's daemon which can rapidly collect components at a power cost." invokers_required = 2 @@ -278,7 +278,7 @@ desc = "Creates a clockwork obelisk that can broadcast messages over the Hierophant Network or open a Spatial Gateway to any living Servant or clockwork obelisk." invocations = list("May this obelisk...", "...take us to all places!") channel_time = 80 - consumed_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 1, HIEROPHANT_ANSIBLE = 3) + consumed_components = list(BELLIGERENT_EYE = 2, VANGUARD_COGWHEEL = 2, HIEROPHANT_ANSIBLE = 5) object_path = /obj/structure/destructible/clockwork/powered/clockwork_obelisk creator_message = "You form a clockwork obelisk which can broadcast messages or produce Spatial Gateways." observer_message = "A brass obelisk appears hanging in midair!" diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm index 023cd50dd1..f246034884 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm @@ -272,7 +272,7 @@ var/static/prev_cost = 0 /datum/clockwork_scripture/create_object/tinkerers_cache/creation_update() - var/cache_cost_increase = min(round(GLOB.clockwork_caches*0.25), 5) + var/cache_cost_increase = min(round(GLOB.clockwork_caches*0.4), 10) if(cache_cost_increase != prev_cost) prev_cost = cache_cost_increase consumed_components = list(BELLIGERENT_EYE = 0, VANGUARD_COGWHEEL = 0, GEIS_CAPACITOR = 0, REPLICANT_ALLOY = 1, HIEROPHANT_ANSIBLE = 0) diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_revenant.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_revenant.dm index 0dbd2d46e8..25bedd79d3 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_revenant.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_revenant.dm @@ -9,7 +9,7 @@ desc = "Taps the limitless power of Inath-neq, one of Ratvar's four generals. The benevolence of Inath-Neq will grant complete invulnerability to all Servants in range for fifteen seconds." invocations = list("I call upon you, Vanguard!!", "Let the Resonant Cogs turn once more!!", "Grant me and my allies the strength to vanquish our foes!!") channel_time = 100 - consumed_components = list(VANGUARD_COGWHEEL = 4, GEIS_CAPACITOR = 2, REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 2) + consumed_components = list(VANGUARD_COGWHEEL = 10, GEIS_CAPACITOR = 3, REPLICANT_ALLOY = 3, HIEROPHANT_ANSIBLE = 3) usage_tip = "Servants affected by this scripture are only weak to things that outright destroy bodies, such as bombs or the singularity." tier = SCRIPTURE_REVENANT primary_component = VANGUARD_COGWHEEL @@ -44,7 +44,7 @@ for all non-servant humans on the same z-level as them. The power of this scripture falls off somewhat with distance, and certain things may reduce its effects." invocations = list("I call upon you, Fright!!", "Let your power shatter the sanity of the weak-minded!!", "Let your tendrils hold sway over all!!") channel_time = 150 - consumed_components = list(BELLIGERENT_EYE = 3, VANGUARD_COGWHEEL = 3, GEIS_CAPACITOR = 6, HIEROPHANT_ANSIBLE = 3) + consumed_components = list(BELLIGERENT_EYE = 6, VANGUARD_COGWHEEL = 6, GEIS_CAPACITOR = 10, HIEROPHANT_ANSIBLE = 6) usage_tip = "Causes brain damage, hallucinations, confusion, and dizziness in massive amounts." tier = SCRIPTURE_REVENANT sort_priority = 3 @@ -108,7 +108,7 @@ clockwork proselytizers will charge very rapidly." invocations = list("I call upon you, Armorer!!", "Let your machinations reign on this miserable station!!", "Let your power flow through the tools of your master!!") channel_time = 150 - consumed_components = list(BELLIGERENT_EYE = 3, VANGUARD_COGWHEEL = 3, GEIS_CAPACITOR = 3, REPLICANT_ALLOY = 6) + consumed_components = list(BELLIGERENT_EYE = 6, VANGUARD_COGWHEEL = 6, GEIS_CAPACITOR = 6, REPLICANT_ALLOY = 10) usage_tip = "Ocular wardens will become empowered, clockwork proselytizers will require no alloy, tinkerer's daemons will produce twice as quickly, \ and interdiction lenses, mania motors, tinkerer's daemons, and clockwork obelisks will all require no power." tier = SCRIPTURE_REVENANT @@ -153,7 +153,7 @@ will be struck by devastating lightning bolts." invocations = list("I call upon you, Amperage!!", "Let your energy flow through me!!", "Let your boundless power shatter stars!!") channel_time = 100 - consumed_components = list(BELLIGERENT_EYE = 2, GEIS_CAPACITOR = 2, REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 4) + consumed_components = list(BELLIGERENT_EYE = 3, GEIS_CAPACITOR = 3, REPLICANT_ALLOY = 3, HIEROPHANT_ANSIBLE = 10) usage_tip = "Struck targets will also be knocked down for about sixteen seconds." tier = SCRIPTURE_REVENANT primary_component = HIEROPHANT_ANSIBLE diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm index f7fcc8c299..01fc369c8f 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm @@ -9,7 +9,7 @@ desc = "Forms an automatic short-range turret which will automatically attack nearby unrestrained non-Servants that can see it." invocations = list("Guardians...", "...of the Engine...", "...defend us!") channel_time = 120 - consumed_components = list(BELLIGERENT_EYE = 1, REPLICANT_ALLOY = 1) + consumed_components = list(BELLIGERENT_EYE = 2, REPLICANT_ALLOY = 1) object_path = /obj/structure/destructible/clockwork/ocular_warden creator_message = "You form an ocular warden, which will automatically attack nearby unrestrained non-Servants that can see it." observer_message = "A brass eye takes shape and slowly rises into the air, its red iris glaring!" @@ -36,7 +36,7 @@ desc = "Creates a small shell fitted for soul vessels. Adding an active soul vessel to it results in a small construct with tools and an inbuilt proselytizer." invocations = list("Call forth...", "...the workers of Armorer.") channel_time = 60 - consumed_components = list(BELLIGERENT_EYE = 1, HIEROPHANT_ANSIBLE = 1) + consumed_components = list(BELLIGERENT_EYE = 2, HIEROPHANT_ANSIBLE = 1) object_path = /obj/structure/destructible/clockwork/shell/cogscarab creator_message = "You form a cogscarab, a constructor soul vessel receptacle." observer_message = "The slab disgorges a puddle of black metal that contracts and forms into a strange shell!" @@ -56,7 +56,7 @@ Matrices have drained from non-Servants. Dead Servants can be revived by this sigil if there is vitality equal to the target Servant's non-oxygen damage." invocations = list("Divinity...", "...steal their life...", "...for these shells!") channel_time = 60 - consumed_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 1) + consumed_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 2) whispered = TRUE object_path = /obj/effect/clockwork/sigil/vitality creator_message = "A vitality matrix appears below you. It will drain life from non-Servants and heal Servants that cross it." @@ -77,7 +77,7 @@ chant_invocations = list("Mend our dents!", "Heal our scratches!", "Repair our gears!") chant_amount = 10 chant_interval = 20 - consumed_components = list(VANGUARD_COGWHEEL = 1, REPLICANT_ALLOY = 1) + consumed_components = list(VANGUARD_COGWHEEL = 2, REPLICANT_ALLOY = 1) usage_tip = "This is a very effective way to rapidly reinforce a base after an attack." tier = SCRIPTURE_SCRIPT primary_component = VANGUARD_COGWHEEL @@ -187,7 +187,7 @@ desc = "Places a luminous sigil that will enslave any valid beings standing on it after a time." invocations = list("Divinity, enlighten...", "...those who trespass here!") channel_time = 60 - consumed_components = list(BELLIGERENT_EYE = 1, GEIS_CAPACITOR = 1) + consumed_components = list(BELLIGERENT_EYE = 1, GEIS_CAPACITOR = 2) whispered = TRUE object_path = /obj/effect/clockwork/sigil/submission creator_message = "A luminous sigil appears below you. The next non-servant to cross it will be enslaved after a brief time if they do not move." @@ -207,7 +207,7 @@ desc = "Forms an ancient positronic brain with an overriding directive to serve Ratvar." invocations = list("Herd the souls of...", "...the blasphemous damned!") channel_time = 30 - consumed_components = list(VANGUARD_COGWHEEL = 1, GEIS_CAPACITOR = 1) + consumed_components = list(VANGUARD_COGWHEEL = 1, GEIS_CAPACITOR = 2) whispered = TRUE object_path = /obj/item/device/mmi/posibrain/soul_vessel creator_message = "You form a soul vessel, which can be used in-hand to attract spirits, or used on an unconscious or dead human to extract their consciousness." @@ -227,7 +227,7 @@ desc = "Forms a device that, when used on certain objects, converts them into their Ratvarian equivalents. It requires power to function." invocations = list("With this device...", "...his presence shall be made known.") channel_time = 20 - consumed_components = list(GEIS_CAPACITOR = 1, REPLICANT_ALLOY = 1) + consumed_components = list(GEIS_CAPACITOR = 1, REPLICANT_ALLOY = 2) whispered = TRUE object_path = /obj/item/clockwork/clockwork_proselytizer/preloaded creator_message = "You form a clockwork proselytizer." @@ -248,7 +248,7 @@ vanish three minutes after being summoned." invocations = list("Grant me...", "...the might of brass!") channel_time = 20 - consumed_components = list(REPLICANT_ALLOY = 1, HIEROPHANT_ANSIBLE = 1) + consumed_components = list(REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 1) whispered = TRUE usage_tip = "You can impale human targets with the spear by pulling them, then attacking. Throwing the spear at a mob will do massive damage and stun them, but break the spear." tier = SCRIPTURE_SCRIPT @@ -307,7 +307,7 @@ Each servant assisting in the invocation adds one additional use and four additional seconds to the gateway's uses and duration." invocations = list("Spatial Gateway...", "...activate!") channel_time = 80 - consumed_components = list(VANGUARD_COGWHEEL = 1, HIEROPHANT_ANSIBLE = 1) + consumed_components = list(VANGUARD_COGWHEEL = 1, HIEROPHANT_ANSIBLE = 2) multiple_invokers_used = TRUE multiple_invokers_optional = TRUE usage_tip = "This gateway is strictly one-way and will only allow things through the invoker's portal." @@ -356,7 +356,7 @@ chant_invocations = list("Use charge to kill!", "Slay with power!", "Hunt with energy!") chant_amount = 4 chant_interval = 5 - consumed_components = list(GEIS_CAPACITOR = 1, HIEROPHANT_ANSIBLE = 1) + consumed_components = list(GEIS_CAPACITOR = 1, HIEROPHANT_ANSIBLE = 2) usage_tip = "Though it requires you to stand still, this scripture can do massive damage." tier = SCRIPTURE_SCRIPT primary_component = HIEROPHANT_ANSIBLE diff --git a/code/game/gamemodes/clock_cult/clock_structures/tinkerers_daemon.dm b/code/game/gamemodes/clock_cult/clock_structures/tinkerers_daemon.dm index 22ea9e2ce5..b0a17338ff 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/tinkerers_daemon.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/tinkerers_daemon.dm @@ -18,7 +18,7 @@ var/static/mutable_appearance/component_glow = mutable_appearance('icons/obj/clockwork_objects.dmi', "t_random_component") var/component_id_to_produce var/production_time = 0 //last time we produced a component - var/production_cooldown = 120 + var/production_cooldown = 60 /obj/structure/destructible/clockwork/powered/tinkerers_daemon/Initialize() . = ..() From 3deafbe39b878798b618f6d1ecc8cae7e00353c2 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 3 May 2017 22:21:58 -0500 Subject: [PATCH 029/352] Plasma vessels regenerate slowly off resin --- code/modules/mob/living/carbon/alien/organs.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index 8a9ee012d9..f9bd64153e 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -87,6 +87,8 @@ owner.adjustFireLoss(-heal_amt) owner.adjustOxyLoss(-heal_amt) owner.adjustCloneLoss(-heal_amt) + else + owner.adjustPlasma(plasma_rate * 0.1) /obj/item/organ/alien/plasmavessel/Insert(mob/living/carbon/M, special = 0) ..() From e3ebd661a88a865b5791044bf0d6d1efbdde5d61 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 3 May 2017 22:22:03 -0500 Subject: [PATCH 030/352] gives omega shuttle lights --- _maps/map_files/OmegaStation/OmegaStation.dmm | 52 +++++++++++++++++-- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 0e3fea852f..06533475dd 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -16523,6 +16523,9 @@ /obj/machinery/status_display{ pixel_x = -32 }, +/obj/machinery/light{ + dir = 8 + }, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "aAb" = ( @@ -16558,6 +16561,9 @@ "aAf" = ( /obj/structure/table/reinforced, /obj/item/weapon/storage/fancy/donut_box, +/obj/machinery/light{ + dir = 4 + }, /turf/open/floor/plasteel/vault{ dir = 8 }, @@ -24133,6 +24139,9 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, +/obj/machinery/light{ + dir = 8 + }, /turf/open/floor/plasteel, /area/shuttle/escape) "aME" = ( @@ -24187,6 +24196,9 @@ /obj/machinery/status_display{ pixel_x = 32 }, +/obj/machinery/light{ + dir = 4 + }, /turf/open/floor/plasteel/whiteblue/side{ dir = 5 }, @@ -41920,6 +41932,38 @@ /area/ruin/unpowered{ name = "Asteroid" }) +"bvO" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/neutral/side{ + dir = 1 + }, +/area/shuttle/escape) +"bvP" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"bvQ" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"bvR" = ( +/obj/machinery/light, +/turf/open/floor/plasteel/neutral/side, +/area/shuttle/escape) (1,1,1) = {" aaa @@ -94203,7 +94247,7 @@ aAb axY aDl aEi -aEi +bvP aEi aEi aEi @@ -94715,13 +94759,13 @@ axY aAc axY aCp -aDl +bvO aEk aEj aGd aEl aEk -aJf +bvR aKn aLz axY @@ -95231,7 +95275,7 @@ aAd aCq aDl aEm -aEm +bvQ aEm aEm aEm From a87a75d0590edf51b1a7a8e2724663e06d00eb87 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 3 May 2017 22:22:07 -0500 Subject: [PATCH 031/352] Draconic language, for lizards --- code/modules/language/unathi.dm | 20 +++++++++++++++++++ .../human/species_types/lizardpeople.dm | 3 +++ code/modules/surgery/organs/tongue.dm | 1 + code/modules/surgery/organs/tongue.dm.rej | 10 ++++++++++ tgstation.dme.rej | 9 +++++++++ 5 files changed, 43 insertions(+) create mode 100644 code/modules/language/unathi.dm create mode 100644 code/modules/surgery/organs/tongue.dm.rej create mode 100644 tgstation.dme.rej diff --git a/code/modules/language/unathi.dm b/code/modules/language/unathi.dm new file mode 100644 index 0000000000..5c6da5362f --- /dev/null +++ b/code/modules/language/unathi.dm @@ -0,0 +1,20 @@ +/datum/language/unathi + name = "Unathi" + desc = "The common language of lizard-people, composed of sibilant hisses and rattles." + speech_verb = "hisses" + ask_verb = "hisses" + exclaim_verb = "roars" + key = "o" + flags = TONGUELESS_SPEECH + space_chance = 40 + syllables = list( + "za", "az", "ze", "ez", "zi", "iz", "zo", "oz", "zu", "uz", "zs", "sz", + "ha", "ah", "he", "eh", "hi", "ih", "ho", "oh", "hu", "uh", "hs", "sh", + "la", "al", "le", "el", "li", "il", "lo", "ol", "lu", "ul", "ls", "sl", + "ka", "ak", "ke", "ek", "ki", "ik", "ko", "ok", "ku", "uk", "ks", "sk", + "sa", "as", "se", "es", "si", "is", "so", "os", "su", "us", "ss", "ss", + "ra", "ar", "re", "er", "ri", "ir", "ro", "or", "ru", "ur", "rs", "sr", + "a", "a", "e", "e", "i", "i", "o", "o", "u", "u", "s", "s" + ) + icon_state = "lizard" + default_priority = 90 diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 876d2f9e34..5fa3d1e4f8 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -17,6 +17,9 @@ skinned_type = /obj/item/stack/sheet/animalhide/lizard exotic_bloodtype = "L" +/datum/species/lizard/after_equip_job(datum/job/J, mob/living/carbon/human/H) + H.grant_language(/datum/language/draconic) + /datum/species/lizard/random_name(gender,unique,lastname) if(unique) return random_unique_lizard_name(gender) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 1ef36f3fe2..bbfa6eface 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -127,6 +127,7 @@ languages_possible = typecacheof(list( /datum/language/xenocommon, /datum/language/common, + /datum/language/draconic, /datum/language/ratvar, /datum/language/monkey)) diff --git a/code/modules/surgery/organs/tongue.dm.rej b/code/modules/surgery/organs/tongue.dm.rej new file mode 100644 index 0000000000..39d5c09394 --- /dev/null +++ b/code/modules/surgery/organs/tongue.dm.rej @@ -0,0 +1,10 @@ +diff a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm (rejected hunks) +@@ -13,7 +13,7 @@ + . = ..() + languages_possible = typecacheof(list( + /datum/language/common, +- /datum/language/unathi, ++ /datum/language/draconic, + /datum/language/monkey, + /datum/language/ratvar + )) diff --git a/tgstation.dme.rej b/tgstation.dme.rej new file mode 100644 index 0000000000..b450e34a07 --- /dev/null +++ b/tgstation.dme.rej @@ -0,0 +1,9 @@ +diff a/tgstation.dme b/tgstation.dme (rejected hunks) +@@ -1377,6 +1377,7 @@ + #include "code\modules\jobs\job_types\silicon.dm" + #include "code\modules\jobs\map_changes\map_changes.dm" + #include "code\modules\language\common.dm" ++#include "code\modules\language\draconic.dm" + #include "code\modules\language\drone.dm" + #include "code\modules\language\language.dm" + #include "code\modules\language\language_menu.dm" From 33a93a611b840b83fb5d6ee1653e14b96e9358d3 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 3 May 2017 22:22:12 -0500 Subject: [PATCH 032/352] Curator Update --- .../map_files/Deltastation/DeltaStation2.dmm | 40 +++++++++++++----- _maps/map_files/MetaStation/MetaStation.dmm | 26 +++++++++--- _maps/map_files/PubbyStation/PubbyStation.dmm | 2 +- _maps/map_files/PubbyStation/job_changes.dm | 2 +- _maps/map_files/TgStation/tgstation.2.1.3.dmm | 12 ++++-- _maps/map_files/generic/Centcomm.dmm | 2 +- code/__DEFINES/jobs.dm | 2 +- code/game/gamemodes/devil/devil_game_mode.dm | 2 +- code/game/machinery/computer/crew.dm | 2 +- code/game/objects/effects/landmarks.dm | 2 +- .../objects/items/devices/PDA/PDA_types.dm | 6 +-- code/game/objects/items/devices/PDA/cart.dm | 2 +- code/game/objects/items/toys.dm | 6 +-- .../objects/items/weapons/storage/internal.dm | 2 +- .../objects/structures/displaycase.dm.rej | 12 ++++++ code/modules/cargo/packs.dm | 4 +- code/modules/clothing/head/collectable.dm | 2 +- code/modules/clothing/under/jobs/civilian.dm | 4 +- code/modules/jobs/access.dm | 2 +- code/modules/jobs/job_types/civilian.dm | 25 +++++------ code/modules/jobs/jobs.dm | 2 +- code/modules/library/lib_codex_gigas.dm | 2 +- code/modules/library/lib_readme.dm | 8 ++-- code/modules/library/soapstone.dm | 2 +- code/modules/surgery/organs/vocal_cords.dm | 2 +- code/modules/uplink/uplink_item.dm | 2 +- icons/obj/toy.dmi | Bin 34072 -> 34071 bytes 27 files changed, 113 insertions(+), 62 deletions(-) create mode 100644 code/game/objects/structures/displaycase.dm.rej diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index c46f6ea830..f5e6964696 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -62918,7 +62918,7 @@ "cpl" = ( /obj/structure/table/wood, /obj/item/weapon/clipboard, -/obj/item/toy/figure/librarian, +/obj/item/toy/figure/curator, /obj/machinery/airalarm{ dir = 8; icon_state = "alarm0"; @@ -64356,10 +64356,12 @@ /turf/open/floor/plasteel/black, /area/library) "crP" = ( -/obj/structure/dresser, -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_x = -32 - }, +/obj/structure/closet/crate, +/obj/item/clothing/shoes/workboots/mining, +/obj/item/clothing/under/rank/curator/treasure_hunter, +/obj/item/clothing/suit/curator, +/obj/item/clothing/head/curator, +/obj/item/weapon/storage/backpack/satchel/explorer, /turf/open/floor/plasteel/black, /area/library) "crQ" = ( @@ -67498,7 +67500,7 @@ desc = "This looks awfully familiar..."; icon_state = "curator" }, -/obj/item/clothing/under/rank/librarian/curator, +/obj/item/clothing/under/rank/curator/treasure_hunter, /turf/open/floor/carpet, /area/crew_quarters/sleep) "cxC" = ( @@ -105516,7 +105518,7 @@ /area/library/abandoned_library) "dSu" = ( /obj/structure/table/wood, -/obj/item/clothing/under/rank/librarian, +/obj/item/clothing/under/rank/curator, /obj/effect/spawner/lootdrop/maintenance{ lootcount = 2; name = "2maintenance loot spawner" @@ -112311,6 +112313,22 @@ }, /turf/open/floor/plasteel/neutral, /area/atmos) +"ehO" = ( +/obj/structure/displaycase/trophy, +/turf/open/floor/wood, +/area/library) +"ehP" = ( +/obj/structure/displaycase/trophy, +/turf/open/floor/wood, +/area/library) +"ehQ" = ( +/obj/structure/displaycase/trophy, +/turf/open/floor/wood, +/area/library) +"ehR" = ( +/obj/structure/displaycase/trophy, +/turf/open/floor/wood, +/area/library) (1,1,1) = {" aaa @@ -143544,7 +143562,7 @@ cbA cdn ceS cgp -chQ +ehO cjl ckP cjl @@ -143801,7 +143819,7 @@ cbB cdo ceS cgq -chQ +ehO cjl ckP cjl @@ -144315,7 +144333,7 @@ bWi cdq ceS cgp -chQ +ehO cjm ckP cmk @@ -144572,7 +144590,7 @@ cbC cdr ceT cgp -chQ +ehO cjn ckP cmk diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 320823a490..abc3eccf3d 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -45372,12 +45372,12 @@ name = "Port Maintenance" }) "bBr" = ( -/obj/structure/table/wood, /obj/machinery/airalarm{ dir = 4; pixel_x = -23; pixel_y = 0 }, +/obj/structure/displaycase/trophy, /turf/open/floor/wood, /area/library) "bBs" = ( @@ -47035,7 +47035,6 @@ name = "\improper Auxiliary Restrooms" }) "bEw" = ( -/obj/structure/table/wood, /obj/machinery/computer/security/telescreen/entertainment{ pixel_x = -32; pixel_y = 0 @@ -47044,6 +47043,7 @@ dir = 4; network = list("SS13") }, +/obj/structure/displaycase/trophy, /turf/open/floor/wood, /area/library) "bEx" = ( @@ -53664,6 +53664,12 @@ pixel_x = 30; pixel_y = 0 }, +/obj/structure/closet/crate, +/obj/item/clothing/shoes/workboots/mining, +/obj/item/clothing/under/rank/curator/treasure_hunter, +/obj/item/clothing/suit/curator, +/obj/item/clothing/head/curator, +/obj/item/weapon/storage/backpack/satchel/explorer, /turf/open/floor/engine/cult, /area/library) "bPY" = ( @@ -95333,6 +95339,14 @@ icon_state = "xenomaint"; name = "Xeno Maintenance" }) +"dmD" = ( +/obj/structure/displaycase/trophy, +/turf/open/floor/wood, +/area/library) +"dmE" = ( +/obj/structure/displaycase/trophy, +/turf/open/floor/wood, +/area/library) (1,1,1) = {" aaa @@ -114481,7 +114495,7 @@ bwa bxU bzD bBr -bCT +bSx bEw bzE bHR @@ -114737,9 +114751,9 @@ bue bwb bxV bzE -bBs -bCU -bBs +dmD +bzE +dmD bzE bHR bJz diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index e0e721840d..2de3a5e8dc 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -15105,7 +15105,7 @@ /area/maintenance/apmaint) "aEl" = ( /obj/structure/closet/coffin, -/obj/item/toy/figure/librarian, +/obj/item/toy/figure/curator, /turf/open/floor/plating, /area/maintenance/apmaint) "aEm" = ( diff --git a/_maps/map_files/PubbyStation/job_changes.dm b/_maps/map_files/PubbyStation/job_changes.dm index 8b26cd5b68..d366a15ae3 100644 --- a/_maps/map_files/PubbyStation/job_changes.dm +++ b/_maps/map_files/PubbyStation/job_changes.dm @@ -18,5 +18,5 @@ access += GLOB.access_crematorium minimal_access += GLOB.access_crematorium -MAP_REMOVE_JOB(librarian) +MAP_REMOVE_JOB(curator) MAP_REMOVE_JOB(lawyer) \ No newline at end of file diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index f2bf5eb504..1f112c85f1 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -19015,6 +19015,12 @@ /turf/open/floor/wood, /area/library) "aQr" = ( +/obj/structure/closet/crate, +/obj/item/clothing/shoes/workboots/mining, +/obj/item/clothing/under/rank/curator/treasure_hunter, +/obj/item/clothing/suit/curator, +/obj/item/clothing/head/curator, +/obj/item/weapon/storage/backpack/satchel/explorer, /obj/machinery/light/small, /turf/open/floor/engine/cult, /area/library) @@ -19510,7 +19516,7 @@ /turf/open/floor/wood, /area/library) "aRO" = ( -/obj/structure/bookcase/random/nonfiction, +/obj/structure/displaycase/trophy, /turf/open/floor/wood, /area/library) "aRP" = ( @@ -106507,7 +106513,7 @@ aIt aPd aIt aRO -aIt +aRO aUC aVP aXu @@ -106764,7 +106770,7 @@ aNV aPd aIt aRO -aIt +aRO aIt aVQ aXu diff --git a/_maps/map_files/generic/Centcomm.dmm b/_maps/map_files/generic/Centcomm.dmm index 9f7787b585..e3870a49f8 100644 --- a/_maps/map_files/generic/Centcomm.dmm +++ b/_maps/map_files/generic/Centcomm.dmm @@ -5586,7 +5586,7 @@ /area/centcom/ferry) "ot" = ( /obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/under/rank/librarian/curator, +/obj/item/clothing/under/rank/curator/treasure_hunter, /obj/item/clothing/under/skirt/black, /obj/item/clothing/under/shorts/black, /obj/item/clothing/under/pants/track, diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index 6d5310364f..cea01afc2a 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -32,7 +32,7 @@ #define BOTANIST (1<<2) #define COOK (1<<3) #define JANITOR (1<<4) -#define LIBRARIAN (1<<5) +#define CURATOR (1<<5) #define QUARTERMASTER (1<<6) #define CARGOTECH (1<<7) #define MINER (1<<8) diff --git a/code/game/gamemodes/devil/devil_game_mode.dm b/code/game/gamemodes/devil/devil_game_mode.dm index 9a528a1240..c275ac790a 100644 --- a/code/game/gamemodes/devil/devil_game_mode.dm +++ b/code/game/gamemodes/devil/devil_game_mode.dm @@ -2,7 +2,7 @@ name = "devil" config_tag = "devil" antag_flag = ROLE_DEVIL - protected_jobs = list("Lawyer", "Librarian", "Chaplain", "Head of Security", "Captain", "AI") + protected_jobs = list("Lawyer", "Curator", "Chaplain", "Head of Security", "Captain", "AI") required_players = 0 required_enemies = 1 recommended_enemies = 4 diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 65fbee45f0..e3b47873e6 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -56,7 +56,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) jobs["Bartender"] = 61 jobs["Cook"] = 62 jobs["Botanist"] = 63 - jobs["Librarian"] = 64 + jobs["Curator"] = 64 jobs["Chaplain"] = 65 jobs["Clown"] = 66 jobs["Mime"] = 67 diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 4194d9b76e..86d62eacea 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -94,7 +94,7 @@ name = "Head of Personnel" /obj/effect/landmark/start/librarian - name = "Librarian" + name = "Curator" /obj/effect/landmark/start/lawyer name = "Lawyer" diff --git a/code/game/objects/items/devices/PDA/PDA_types.dm b/code/game/objects/items/devices/PDA/PDA_types.dm index 4d46635847..6adc4efe22 100644 --- a/code/game/objects/items/devices/PDA/PDA_types.dm +++ b/code/game/objects/items/devices/PDA/PDA_types.dm @@ -161,11 +161,11 @@ icon_state = "pda-roboticist" default_cartridge = /obj/item/weapon/cartridge/roboticist -/obj/item/device/pda/librarian - name = "librarian PDA" +/obj/item/device/pda/curator + name = "curator PDA" icon_state = "pda-library" icon_alert = "pda-r-library" - default_cartridge = /obj/item/weapon/cartridge/librarian + default_cartridge = /obj/item/weapon/cartridge/curator desc = "A portable microcomputer by Thinktronic Systems, LTD. This model is a WGW-11 series e-reader." note = "Congratulations, your station has chosen the Thinktronic 5290 WGW-11 Series E-reader and Personal Data Assistant!" silent = 1 //Quiet in the library! diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 1fd52cf5d9..6f3491ac9c 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -108,7 +108,7 @@ access_mime = 1 var/mime_charges = 5 -/obj/item/weapon/cartridge/librarian +/obj/item/weapon/cartridge/curator name = "\improper Lib-Tweet cartridge" icon_state = "cart-s" access_newscaster = 1 diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index f332422578..0979a65981 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1218,9 +1218,9 @@ icon_state = "lawyer" toysay = "My client is a dirty traitor!" -/obj/item/toy/figure/librarian - name = "Librarian action figure" - icon_state = "librarian" +/obj/item/toy/figure/curator + name = "Curator action figure" + icon_state = "curator" toysay = "One day while..." /obj/item/toy/figure/md diff --git a/code/game/objects/items/weapons/storage/internal.dm b/code/game/objects/items/weapons/storage/internal.dm index 8c7b7df04c..540ff0f206 100644 --- a/code/game/objects/items/weapons/storage/internal.dm +++ b/code/game/objects/items/weapons/storage/internal.dm @@ -53,7 +53,7 @@ /obj/item/weapon/implanter, /obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool/mini, /obj/item/device/firing_pin ) - //can hold both regular pens and energy daggers. made for your every-day tactical librarians/murderers. + //can hold both regular pens and energy daggers. made for your every-day tactical curators/murderers. priority = FALSE quickdraw = TRUE silent = TRUE diff --git a/code/game/objects/structures/displaycase.dm.rej b/code/game/objects/structures/displaycase.dm.rej new file mode 100644 index 0000000000..5cdbc0ec74 --- /dev/null +++ b/code/game/objects/structures/displaycase.dm.rej @@ -0,0 +1,12 @@ +diff a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm (rejected hunks) +@@ -278,8 +278,8 @@ + if(!user.Adjacent(src)) //no TK museology + return + +- if(!(user.mind && user.mind.assigned_role == "Librarian")) +- to_chat(user, "You're not sure how to work this. Maybe you should ask the librarian for help.") ++ if(!(user.mind && user.mind.assigned_role == "Curator")) ++ to_chat(user, "You're not sure how to work this. Maybe you should ask the curator for help.") + return + + if(!added_roundstart) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index b7c7a7e377..7686a7a4bf 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1681,8 +1681,8 @@ crate_name = "art supply crate" /datum/supply_pack/misc/soapstone - name = "Librarian Engraving/Scribbling Crate" - crate_name = "librarian engraving/scribbling crate" + name = "Curator Engraving/Scribbling Crate" + crate_name = "curator engraving/scribbling crate" cost = 3000 contains = list(/obj/item/soapstone) access = GLOB.access_library diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index 61171ccf59..b55d826547 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -30,7 +30,7 @@ /obj/item/clothing/head/collectable/paper name = "collectable paper hat" - desc = "What looks like an ordinary paper hat is actually a rare and valuable collector's edition paper hat. Keep away from water, fire, and Librarians." + desc = "What looks like an ordinary paper hat is actually a rare and valuable collector's edition paper hat. Keep away from water, fire, and Curators." icon_state = "paper" dog_fashion = /datum/dog_fashion/head diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index 8c30774c02..eaa80d823c 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -137,7 +137,7 @@ can_adjust = 1 alt_covers_chest = 1 -/obj/item/clothing/under/rank/librarian +/obj/item/clothing/under/rank/curator name = "sensible suit" desc = "It's very... sensible." icon_state = "red_suit" @@ -145,7 +145,7 @@ item_color = "red_suit" can_adjust = 0 -/obj/item/clothing/under/rank/librarian/curator +/obj/item/clothing/under/rank/curator/treasure_hunter name = "treasure hunter uniform" desc = "A rugged uniform suitable for treasure hunting." icon_state = "curator" diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index 0ab974126e..85923811f9 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -459,7 +459,7 @@ GLOBAL_VAR_CONST(access_away_generic4, 208) /proc/get_all_jobs() return list("Assistant", "Captain", "Head of Personnel", "Bartender", "Cook", "Botanist", "Quartermaster", "Cargo Technician", - "Shaft Miner", "Clown", "Mime", "Janitor", "Librarian", "Lawyer", "Chaplain", "Chief Engineer", "Station Engineer", + "Shaft Miner", "Clown", "Mime", "Janitor", "Curator", "Lawyer", "Chaplain", "Chief Engineer", "Station Engineer", "Atmospheric Technician", "Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Virologist", "Research Director", "Scientist", "Roboticist", "Head of Security", "Warden", "Detective", "Security Officer") diff --git a/code/modules/jobs/job_types/civilian.dm b/code/modules/jobs/job_types/civilian.dm index 86185e2848..45b8562e8c 100644 --- a/code/modules/jobs/job_types/civilian.dm +++ b/code/modules/jobs/job_types/civilian.dm @@ -112,11 +112,11 @@ Mime H.mind.miming = 1 /* -Librarian +Curator */ -/datum/job/librarian - title = "Librarian" - flag = LIBRARIAN +/datum/job/curator + title = "Curator" + flag = CURATOR department_head = list("Head of Personnel") department_flag = CIVILIAN faction = "Station" @@ -125,26 +125,27 @@ Librarian supervisors = "the head of personnel" selection_color = "#dddddd" - outfit = /datum/outfit/job/librarian + outfit = /datum/outfit/job/curator access = list(GLOB.access_library) minimal_access = list(GLOB.access_library) -/datum/outfit/job/librarian - name = "Librarian" - jobtype = /datum/job/librarian +/datum/outfit/job/curator + name = "Curator" + jobtype = /datum/job/curator - belt = /obj/item/device/pda/librarian - uniform = /obj/item/clothing/under/rank/librarian - l_hand = /obj/item/weapon/storage/bag/books + belt = /obj/item/device/pda/curator + uniform = /obj/item/clothing/under/rank/curator + l_hand = /obj/item/weapon/storage/bag/books r_pocket = /obj/item/weapon/barcodescanner l_pocket = /obj/item/device/laser_pointer backpack_contents = list( + /obj/item/weapon/melee/curator_whip = 1, /obj/item/soapstone = 1 ) -/datum/outfit/job/librarian/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/job/curator/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() if(visualsOnly) diff --git a/code/modules/jobs/jobs.dm b/code/modules/jobs/jobs.dm index eff50f07ff..9b226e70f5 100644 --- a/code/modules/jobs/jobs.dm +++ b/code/modules/jobs/jobs.dm @@ -39,7 +39,7 @@ GLOBAL_LIST_INIT(civilian_positions, list( "Botanist", "Cook", "Janitor", - "Librarian", + "Curator", "Lawyer", "Chaplain", "Clown", diff --git a/code/modules/library/lib_codex_gigas.dm b/code/modules/library/lib_codex_gigas.dm index 4fcd00c5c0..35cb988083 100644 --- a/code/modules/library/lib_codex_gigas.dm +++ b/code/modules/library/lib_codex_gigas.dm @@ -32,7 +32,7 @@ var/speed = 300 var/correctness = 85 var/willpower = 98 - if(U.job in list("Librarian")) // the librarian is both faster, and more accurate than normal crew members at research + if(U.job in list("Curator")) // the curator is both faster, and more accurate than normal crew members at research speed = 45 correctness = 100 willpower = 100 diff --git a/code/modules/library/lib_readme.dm b/code/modules/library/lib_readme.dm index b8a0a42ed6..7b59bb5dfb 100644 --- a/code/modules/library/lib_readme.dm +++ b/code/modules/library/lib_readme.dm @@ -22,7 +22,7 @@ ------------ A place for the crew to go, relax, and enjoy a good book. Aspiring authors can even self publish and, if they're lucky - convince the on-staff Librarian to submit it to the Archives + convince the on-staff Curator to submit it to the Archives to be chronicled in history forever - some say even persisting through alternate dimensions. @@ -49,12 +49,12 @@ // Ideas for the future // --------------------- -// - Visitor's computer should be able to search the current in-round library inventory (that the Librarian has stocked and checked in) +// - Visitor's computer should be able to search the current in-round library inventory (that the Curator has stocked and checked in) // -- Give computer other features like an Instant Messenger application, or the ability to edit, save, and print documents. // - Admin interface directly tied to the Archive DB. Right now there's no way to delete uploaded books in-game. -// -- If this gets implemented, allow Librarians to "tag" or "suggest" books to be deleted. The DB ID of the tagged books gets saved to a text file (or another table in the DB maybe?). +// -- If this gets implemented, allow Curators to "tag" or "suggest" books to be deleted. The DB ID of the tagged books gets saved to a text file (or another table in the DB maybe?). // The admin interface would automatically take these IDs and SELECT them all from the DB to be displayed along with a Delete link to drop the row from the table. -// - When the game sets up and the round begins, have it automatically pick random books from the DB to populate the library with. Even if the Librarian is a useless fuck there are at least a few books around. +// - When the game sets up and the round begins, have it automatically pick random books from the DB to populate the library with. Even if the Curator is a useless fuck there are at least a few books around. // - Allow books to be "hollowed out" like the Chaplain's Bible, allowing you to store one pocket-sized item inside. // - Make books/book cases burn when exposed to flame. // - Make book binder hackable. diff --git a/code/modules/library/soapstone.dm b/code/modules/library/soapstone.dm index 231f5417ab..d8899285a2 100644 --- a/code/modules/library/soapstone.dm +++ b/code/modules/library/soapstone.dm @@ -115,7 +115,7 @@ as instructions and/or memes for the next generation of spessmen. Limited in location to station_z only. Can be smashed out or exploded, - but only permamently removed with the librarian's soapstone. + but only permamently removed with the curator's soapstone. */ /obj/item/soapstone/infinite diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index a2048c2b71..b310f891fb 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -247,7 +247,7 @@ else if((findtext(message, silence_words))) cooldown = COOLDOWN_STUN for(var/mob/living/carbon/C in listeners) - if(user.mind && (user.mind.assigned_role == "Librarian" || user.mind.assigned_role == "Mime")) + if(user.mind && (user.mind.assigned_role == "Curator" || user.mind.assigned_role == "Mime")) power_multiplier *= 3 C.silent += (10 * power_multiplier) diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm index d80a8e21b3..09334b24c8 100644 --- a/code/modules/uplink/uplink_item.dm +++ b/code/modules/uplink/uplink_item.dm @@ -1250,7 +1250,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. desc = "Most magic eightballs are toys with dice inside. Although identical in appearance to the harmless toys, this occult device reaches into the spirit world to find its answers. Be warned, that spirits are often capricious or just little assholes. To use, simply speak your question aloud, then begin shaking." item = /obj/item/toy/eightball/haunted cost = 2 - restricted_roles = list("Librarian") + restricted_roles = list("Curator") limited_stock = 1 // please don't spam deadchat // Pointless diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index f71e135dce02a8024d2be3745714847f88ecd48c..f2176c395d7a2302b07c9cc8811adad708f36016 100644 GIT binary patch delta 1165 zcmV;81akYBiUOC40+1wsX?j#xbVOxyV{&P5bZKvH004NLrP@nx+c*#h@U#6Xi1wOY zG>+uQ!H2dfcC(8XDE0#wBXT6Mrbv~fqBx&^4}QdQ*UQluxg@~+L_KC4|0TT_pT7L@ z^i4c|eVRU_587F=7TNC~rjuT)Sc|oIm`x`&>Z*?WKSG3vVlCc(l@1yOKE9hyl=eZa z#r9YuTXi;BRyt^;cOew6Clwb46ecT!g|>BVx~?tUOR}nmh`s=0oJ${3 z(fM%Y^yJftLIXRo7Wa3DpXtOn*IsPGyDeT_=|8~v4*qua>`ZDGL+hegi~HW4gBnduG*rx)HRk3`+27qg-##R!md5nF&{lKM{O?3?t5oIfX~q*_@@Phtg&Fpj4gAvoU`SEEthP$V$1y?u;_6N zSokyqEPWh*0TwEuXE}V1Wf(w^ixZ=Wn+jHcx>pAw+^c;Nb zd5%4_{AhX+I`Xk#HWoaL1sN@Fg`HJeLc|eS@XgSp;F}>Q!8bw+g6F%%$$=+7HU^G@ z4_ugWVa|nfE?jWok_%T{IEa6vE1+JX^Vu5U!ldQ zCFO8y!b?Oop)-Fr$&w#nbtHUT8R&O}gOr^I%I2E%iEVU4czs1%!d_Wze?YRT*RSAz z)B8m!afKsZ>L4}RNUB8X%2G?h@rIpMgnui~+B@Sa%HlnEMY+#xU0(p33I78mgiT-Th-9HqZZ{IbVIA^KUkTx`(0D?=<$KyMia4Du`dLbUZt1Fy|97q4 fi!a|E#pBnf>A%`&!+Cq}J#YX3AOK0ToCJJ;<}OM2 delta 1165 zcmV;81akYAiUOF50+1wsYI;;ybVOxyV{&P5bZKvH004NLrP@nx+c*#a;IsWJi1wOY zG>+uQ!H2dfcC(8XDE0>!BXT6Mrbv~fqBy^P4}QdQ*UQluxg@}R;%mn7NO~_mefi_* zn|S>CG<`-Nw6kI@vfn>UC%sm&7Hjb^n@(!fRUP+#ga{GETD&WN9W)Ajd^epa?Soj0 z`{|_g(BS^}Q=o*l>TEKsbkIoeLMU8M3N8#NOhyI^ZR^@}TwA!8WK<6keF4TemtIlP z`EX@>^65mOft^^3`@6%>bYh%qFD~KT7O#%UHY7Vv`2chLWngzyxLXpLb`6}!K&8l*L1$r&TeUu4S47jdRlZq4{c4o za%ZU5b!ry^c7Yb%*6`{qE!Jby60Jm9_{S&0`O59af_2eDK)WeBV@9JIOgS1E!e`2* z!KRJr+#1Zxs{3>zXj>VS;MGRC-kyz^rgAeAt`vVF_!vfi$_KX0*fM9!Ia@B+a>=l;Y#sO3kq3f!IBwU=4?4<%LQ95*>c5}`$AyRV;QjU zsR&s5SOP46d?)~xoe5Wp&!#I_+0TI)7v@|z=fVXSF1c{Uh5NMU$Ya)X>?!Fv_?Yt? zdr0}w^rGp=$AZ~d@Gur+w00}(tkM!9j_3v7480Y6GvrS2jnEpw^J#JVz>^=_29AOc zT$piT&V_R>TyWu%3s+n?X#YmZi|%ify=?wQ;fvmXZ8u8x)F3_9rP zM#w>b`;czXhVkkCY#5(z&xY}Y4zt_h)n~D@>G|XCUyxQNy+Maq>D-k*@obR%E`NiK zwz|QH&L_u^;M>-8q1J>4uf3r?7_Gc6OHF*}8n$RKQXkQVTBqM^h;FxeLF>qYn=YUt zMK`Vs=~>DqJvM}(Lj;?CodjazLNclVAJHm*OrLq-eEN-t!bPz9+S?q13~D3j^c@@t zzH$*|osJ}Ia1E^?jap;+hKa1PAuZLoK0Ty{bd17?GV15_N>%vTK{_|lR@x%r@GGlMML*R!73em4SXoSftT~2TwVOCcU+dZU`^1XiJ!v)%FJ@qk8>+ z3O+qAN{A~Q@vwu`Xd@{Sr7KG<3F{3zs|f#Cp0#(zRg}Sd@QQM$*}A>}!u?eVVN)28 z+f8Y7+Y!KH2oLTXT&XO%e?vk03ZOfngo4-5NcUy From b7d451cbe9538e631133d3e1afcb3f826d067a6a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 3 May 2017 22:22:19 -0500 Subject: [PATCH 033/352] Gives ears, eyes, and vocal cords plural gender --- code/modules/surgery/organs/ears.dm | 1 + code/modules/surgery/organs/eyes.dm | 1 + code/modules/surgery/organs/vocal_cords.dm | 1 + 3 files changed, 3 insertions(+) diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index c91cb219af..e66346a2c8 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -4,6 +4,7 @@ desc = "There are three parts to the ear. Inner, middle and outer. Only one of these parts should be normally visible." zone = "head" slot = "ears" + gender = PLURAL // `deaf` measures "ticks" of deafness. While > 0, the person is unable // to hear anything. diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 672ac924ad..2cb2dd5dc6 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -4,6 +4,7 @@ desc = "I see you!" zone = "eyes" slot = "eye_sight" + gender = PLURAL var/sight_flags = 0 var/see_in_dark = 2 diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index a2048c2b71..e4ab2199ad 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -8,6 +8,7 @@ icon_state = "appendix" zone = "mouth" slot = "vocal_cords" + gender = PLURAL var/list/spans = null /obj/item/organ/vocal_cords/proc/can_speak_with() //if there is any limitation to speaking with these cords From 0dff1569a1164a75f9621a43b29fe99b2da264ba Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 3 May 2017 22:22:23 -0500 Subject: [PATCH 034/352] adds a safety catch to spin() --- code/modules/mob/mob.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 24b4d228cc..39d0f1b222 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -351,6 +351,8 @@ /mob/proc/spin(spintime, speed) set waitfor = 0 var/D = dir + if((spintime <= 1)||(speed <= 1)||!spintime||!speed) + return while(spintime >= speed) sleep(speed) switch(D) From 021f55a4d1cc5086dbfaa3a0f9346ae02816970c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 3 May 2017 22:22:26 -0500 Subject: [PATCH 035/352] Fixes alien eggs --- code/game/objects/structures/aliens.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index d46136a9ae..6212133b12 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -298,7 +298,7 @@ else for(var/mob/M in range(1,src)) if(CanHug(M)) - child.Attach(M) + child.Leap(M) break /obj/structure/alien/egg/obj_break(damage_flag) From 7b6f278c879063fb122c62c500b613c37a439da5 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 00:16:08 -0500 Subject: [PATCH 036/352] Mania Motors now do minor damage and continue to affect targets after they leave its range --- code/__DEFINES/status_effects.dm.rej | 10 ++ code/datums/status_effects/debuffs.dm.rej | 75 +++++++++++++ code/datums/status_effects/status_effect.dm | 8 ++ .../scripture_applications.dm | 8 +- .../clock_structures/mania_motor.dm | 106 +++--------------- 5 files changed, 112 insertions(+), 95 deletions(-) create mode 100644 code/__DEFINES/status_effects.dm.rej create mode 100644 code/datums/status_effects/debuffs.dm.rej diff --git a/code/__DEFINES/status_effects.dm.rej b/code/__DEFINES/status_effects.dm.rej new file mode 100644 index 0000000000..929dfc37dc --- /dev/null +++ b/code/__DEFINES/status_effects.dm.rej @@ -0,0 +1,10 @@ +diff a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm (rejected hunks) +@@ -33,4 +33,8 @@ + #define STATUS_EFFECT_SIGILMARK /datum/status_effect/sigil_mark + #define STATUS_EFFECT_BELLIGERENT /datum/status_effect/belligerent //forces the affected to walk, doing damage if they try to run + ++#define STATUS_EFFECT_MANIAMOTOR /datum/status_effect/maniamotor //disrupts, damages, and confuses the affected as long as they're in range of the motor ++#define MAX_MANIA_SEVERITY 100 //how high the mania severity can go ++#define MANIA_DAMAGE_TO_CONVERT 90 //how much damage is required before it'll convert affected targets ++ + #define STATUS_EFFECT_HISWRATH /datum/status_effect/his_wrath //His Wrath. diff --git a/code/datums/status_effects/debuffs.dm.rej b/code/datums/status_effects/debuffs.dm.rej new file mode 100644 index 0000000000..c70c0c6eec --- /dev/null +++ b/code/datums/status_effects/debuffs.dm.rej @@ -0,0 +1,75 @@ +diff a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm (rejected hunks) +@@ -108,20 +108,6 @@ + to_chat(owner, "You feel a frustrated voice quietly fade from your mind...") + qdel(src) + return +- if(!(owner in viewers(7, motor))) //not being in range makes it fall off much faster +- if(!is_servant && !warned_outofsight) +- to_chat(owner, "\"[text2ratvar(pick(flee_messages))]\"") +- warned_outofsight = TRUE +- if(severity) +- severity-- +- if(!severity) +- qdel(src) +- return +- else +- qdel(src) +- return +- else if(prob(severity * 2)) +- warned_outofsight = FALSE + if(!motor.active) //it being off makes it fall off much faster + if(!is_servant && !warned_turnoff) + if(motor.total_accessable_power() > motor.mania_cost) +@@ -129,20 +115,24 @@ + else + to_chat(owner, "[text2ratvar(pick(powerloss_messages))]") + warned_turnoff = TRUE +- if(severity) +- severity-- ++ severity = max(severity - 2, 0) ++ if(!severity) ++ qdel(src) ++ return ++ else ++ if(prob(severity * 2)) ++ warned_turnoff = FALSE ++ if(!(owner in viewers(7, motor))) //not being in range makes it fall off slightly faster ++ if(!is_servant && !warned_outofsight) ++ to_chat(owner, "\"[text2ratvar(pick(flee_messages))]\"") ++ warned_outofsight = TRUE ++ severity = max(severity - 1, 0) + if(!severity) + qdel(src) + return +- else +- qdel(src) +- return +- else if(prob(severity * 2)) +- warned_turnoff = FALSE ++ else if(prob(severity * 2)) ++ warned_outofsight = FALSE + if(is_servant) //heals servants of braindamage, hallucination, druggy, dizziness, and confusion +- var/brainloss = owner.getBrainLoss() +- if(brainloss) +- owner.adjustBrainLoss(-brainloss) + if(owner.hallucination) + owner.hallucination = 0 + if(owner.druggy) +@@ -163,14 +153,12 @@ + if(prob(severity * 0.15)) + to_chat(owner, "\"[text2ratvar(pick(mania_messages))]\"") + owner.playsound_local(get_turf(motor), hum, severity, 1) +- if(owner.getBrainLoss() <= 50) +- owner.adjustBrainLoss(severity * 0.025) //2.5% of severity per second + owner.adjust_drugginess(Clamp(max(severity * 0.075, 1), 0, max(0, 50 - owner.druggy))) //7.5% of severity per second, minimum 1 + if(owner.hallucination < 50) + owner.hallucination = min(owner.hallucination + max(severity * 0.075, 1), 50) //7.5% of severity per second, minimum 1 +- if(owner.dizziness < 25) +- owner.dizziness = min(owner.dizziness + Floor(severity * 0.025), 25) //2.5% of severity per second above 20 severity ++ if(owner.dizziness < 50) ++ owner.dizziness = min(owner.dizziness + round(severity * 0.05, 1), 50) //5% of severity per second above 10 severity + if(owner.confused < 25) +- owner.confused = min(owner.confused + Floor(severity * 0.025), 25) //2.5% of severity per second above 20 severity ++ owner.confused = min(owner.confused + round(severity * 0.025, 1), 25) //2.5% of severity per second above 20 severity + owner.adjustToxLoss(severity * 0.02, TRUE, TRUE) //2% of severity per second + severity-- diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index 51b4f8fc5f..4d4330e84b 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -103,3 +103,11 @@ for(var/datum/status_effect/S in status_effects) if(initial(S1.id) == S.id) return S + +/mob/living/proc/has_status_effect_list(effect) //returns a list of effects with matching IDs that the mod owns; use for effects there can be multiple of + . = list() + if(status_effects) + var/datum/status_effect/S1 = effect + for(var/datum/status_effect/S in status_effects) + if(initial(S1.id) == S.id) + . += S diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm index 25576f5710..fc581a38e2 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm @@ -218,22 +218,22 @@ /datum/clockwork_scripture/create_object/mania_motor descname = "Powered Structure, Area Denial" name = "Mania Motor" - desc = "Creates a mania motor which will cause brain damage and hallucinations in nearby non-Servant humans. It will also try to convert humans directly adjecent to the motor." + desc = "Creates a mania motor which causes minor damage and a variety of negative mental effects in nearby non-Servant humans, potentially up to and including conversion." invocations = list("May this transmitter...", "...break the will of all who oppose us!") channel_time = 80 consumed_components = list(GEIS_CAPACITOR = 3, REPLICANT_ALLOY = 1, HIEROPHANT_ANSIBLE = 1) object_path = /obj/structure/destructible/clockwork/powered/mania_motor - creator_message = "You form a mania motor which will cause brain damage and hallucinations in nearby humans while active." + creator_message = "You form a mania motor, which causes minor damage and negative mental effects in non-Servants." observer_message = "A two-pronged machine rises from the ground!" invokers_required = 2 multiple_invokers_used = TRUE - usage_tip = "Eligible non-Servant humans next to the motor will be converted at an additional power cost. It will also cure hallucinations and brain damage in nearby Servants." + usage_tip = "It will also cure hallucinations and brain damage in nearby Servants." tier = SCRIPTURE_APPLICATION one_per_tile = TRUE primary_component = GEIS_CAPACITOR sort_priority = 8 quickbind = TRUE - quickbind_desc = "Creates a Mania Motor, which can convert adjacent non-Servants with power." + quickbind_desc = "Creates a Mania Motor, which causes minor damage and negative mental effects in non-Servants." //Tinkerer's Daemon: Creates an efficient machine that rapidly produces components at a power cost. diff --git a/code/game/gamemodes/clock_cult/clock_structures/mania_motor.dm b/code/game/gamemodes/clock_cult/clock_structures/mania_motor.dm index 09372044a9..dd26b5d404 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/mania_motor.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/mania_motor.dm @@ -1,8 +1,8 @@ -//Mania Motor: A pair of antenna that, while active, cause braindamage and hallucinations in nearby human mobs. +//Mania Motor: A pair of antenna that, while active, cause a variety of negative mental effects in nearby human mobs. /obj/structure/destructible/clockwork/powered/mania_motor name = "mania motor" desc = "A pair of antenna with what appear to be sockets around the base. It reminds you of an antlion." - clockwork_desc = "A transmitter that allows Sevtug to whisper into the minds of nearby non-servants, causing hallucinations and brain damage as long as it remains powered." + clockwork_desc = "A transmitter that allows Sevtug to whisper into the minds of nearby non-servants, causing a variety of negative mental effects, up to and including conversion." icon_state = "mania_motor_inactive" active_icon = "mania_motor" inactive_icon = "mania_motor_inactive" @@ -16,22 +16,11 @@ /obj/item/clockwork/alloy_shards/small = 2, \ /obj/item/clockwork/component/geis_capacitor/antennae = 1) var/mania_cost = 150 - var/convert_cost = 150 - var/static/list/mania_messages = list("Go nuts.", "Take a crack at crazy.", "Make a bid for insanity.", "Get kooky.", "Move towards mania.", "Become bewildered.", "Wax wild.", \ - "Go round the bend.", "Land in lunacy.", "Try dementia.", "Strive to get a screw loose.") - var/static/list/compel_messages = list("Come closer.", "Approach the transmitter.", "Touch the antennae.", "I always have to deal with idiots. Move towards the mania motor.", \ - "Advance forward and place your head between the antennae - that's all it's good for.", "If you were smarter, you'd be over here already.", "Move FORWARD, you fool.") - var/static/list/convert_messages = list("You won't do. Go to sleep while I tell these nitwits how to convert you.", "You are insufficient. I must instruct these idiots in the art of conversion.", \ - "Oh of course, someone we can't convert. These servants are fools.", "How hard is it to use a Sigil, anyway? All it takes is dragging someone onto it.", \ - "How do they fail to use a Sigil of Accession, anyway?", "Why is it that all servants are this inept?", "It's quite likely you'll be stuck here for a while.") - var/static/list/close_messages = list("Well, you can't reach the motor from THERE, you moron.", "Interesting location. I'd prefer if you went somewhere you could ACTUALLY TOUCH THE ANTENNAE!", \ - "Amazing. You somehow managed to wedge yourself somewhere you can't actually reach the motor from.", "Such a show of idiocy is unparalleled. Perhaps I should put you on display?", \ - "Did you do this on purpose? I can't imagine you doing so accidentally. Oh, wait, I can.", "How is it that such smart creatures can still do something AS STUPID AS THIS!") /obj/structure/destructible/clockwork/powered/mania_motor/examine(mob/user) ..() if(is_servant_of_ratvar(user) || isobserver(user)) - to_chat(user, "It requires [mania_cost]W to run, and at least [convert_cost]W to attempt to convert humans adjacent to it.") + to_chat(user, "It requires [mania_cost]W to run.") /obj/structure/destructible/clockwork/powered/mania_motor/forced_disable(bad_effects) if(active) @@ -60,82 +49,17 @@ if(!try_use_power(mania_cost)) forced_disable(FALSE) return - var/turf/T = get_turf(src) - var/hum = get_sfx('sound/effects/screech.ogg') //like playsound, same sound for everyone affected var/efficiency = get_efficiency_mod() for(var/mob/living/carbon/human/H in viewers(7, src)) - if(is_servant_of_ratvar(H)) //heals servants of braindamage, hallucination, druggy, dizziness, and confusion - var/brainloss = H.getBrainLoss() - if(brainloss) - H.adjustBrainLoss(-brainloss) - if(H.hallucination) - H.hallucination = 0 - if(H.druggy) - H.adjust_drugginess(-H.druggy) - if(H.dizziness) - H.dizziness = 0 - if(H.confused) - H.confused = 0 - else if(!H.null_rod_check() && H.stat != DEAD) - var/distance = 0 + get_dist(T, get_turf(H)) - var/falloff_distance = min((110) - distance * 10, 80) - var/sound_distance = falloff_distance * 0.5 - var/targetbrainloss = H.getBrainLoss() - if(distance > 3 && prob(falloff_distance * 0.5)) - to_chat(H, "\"[text2ratvar(pick(mania_messages))]\"") - if(distance <= 1) - if(!H.Adjacent(src)) - to_chat(H, "\"[text2ratvar(pick(close_messages))]\"") - H.playsound_local(T, hum, sound_distance, 1) - else if(!try_use_power(convert_cost)) - visible_message("[src]'s antennae fizzle quietly.") - playsound(src, 'sound/effects/light_flicker.ogg', 50, 1) - else - H.playsound_local(T, hum, 80, 1) - if(!H.stat) - if(H.getBrainLoss() < 100) - H.adjustBrainLoss(20 * efficiency) - H.visible_message("[H] reaches out and touches [src].", "You touch [src] involuntarily.") - else - H.Paralyse(3) - else if(is_eligible_servant(H)) - to_chat(H, "\"[text2ratvar("You are mine and his, now.")]\"") - add_servant_of_ratvar(H) - H.Paralyse(5) - else - H.playsound_local(T, hum, sound_distance, 1) - switch(distance) - if(0 to 3) - if(prob(falloff_distance * 0.5)) - if(prob(falloff_distance)) - to_chat(H, "\"[text2ratvar(pick(mania_messages))]\"") - else - to_chat(H, "\"[text2ratvar(pick(compel_messages))]\"") - if(targetbrainloss <= 40) - H.adjustBrainLoss(3 * efficiency) - H.adjust_drugginess(Clamp(7 * efficiency, 0, 50 - H.druggy)) - H.hallucination = min(H.hallucination + (7 * efficiency), 50) - H.dizziness = min(H.dizziness + (3 * efficiency), 20) - H.confused = min(H.confused + (3 * efficiency), 20) - if(3 to 5) - if(targetbrainloss <= 20) - H.adjustBrainLoss(2 * efficiency) - H.adjust_drugginess(Clamp(5 * efficiency, 0, 25 - H.druggy)) - H.hallucination = min(H.hallucination + (5 * efficiency), 25) - H.dizziness = min(H.dizziness + (2 * efficiency), 10) - H.confused = min(H.confused + (2 * efficiency), 10) - if(5 to 6) - if(targetbrainloss <= 10) - H.adjustBrainLoss(1 * efficiency) - H.adjust_drugginess(Clamp(2 * efficiency, 0, 20 - H.druggy)) - H.hallucination = min(H.hallucination + (2 * efficiency), 20) - H.dizziness = min(H.dizziness + (2 * efficiency), 5) - H.confused = min(H.confused + (2 * efficiency), 5) - if(6 to 7) - if(targetbrainloss <= 5) - H.adjustBrainLoss(1 * efficiency) - H.adjust_drugginess(Clamp(2 * efficiency, 0, 10 - H.druggy)) - H.hallucination = min(H.hallucination + (2 * efficiency), 10) - if(7 to INFINITY) - H.adjust_drugginess(Clamp(2 * efficiency, 0, 5 - H.druggy)) - H.hallucination = min(H.hallucination + (2 * efficiency), 5) + if(is_servant_of_ratvar(H)) + continue + var/list/effects = H.has_status_effect_list(STATUS_EFFECT_MANIAMOTOR) + var/datum/status_effect/maniamotor/M + for(var/datum/status_effect/maniamotor/MM in effects) + if(MM.motor == src) + M = MM + break + if(!M) + M = H.apply_status_effect(STATUS_EFFECT_MANIAMOTOR) + M.motor = src + M.severity = Clamp(M.severity + ((11 - get_dist(src, H)) * efficiency * efficiency), 0, MAX_MANIA_SEVERITY) From 0639a543461e040d0c4a88bdf2584ee532770ff0 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 06:01:53 -0500 Subject: [PATCH 037/352] Hopefully makes flightsuit processing less taxing on the server --- .../modules/clothing/spacesuits/flightsuit.dm | 25 +++++-------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/code/modules/clothing/spacesuits/flightsuit.dm b/code/modules/clothing/spacesuits/flightsuit.dm index 275ad542b5..479ad77742 100644 --- a/code/modules/clothing/spacesuits/flightsuit.dm +++ b/code/modules/clothing/spacesuits/flightsuit.dm @@ -326,9 +326,6 @@ disable_flight(1) if(!suit) disable_flight(1) - if(!resync) - addtimer(CALLBACK(src, .proc/resync), 600) - resync = 1 if(!wearer) //Oh god our user fell off! disable_flight(1) if(!pressure && brake) @@ -340,12 +337,6 @@ stabilizer = FALSE usermessage("Warning: Sensor data is not being recieved from flight shoes. Stabilizers and airbrake modules OFFLINE!", 2) -//Resync the suit -/obj/item/device/flightpack/proc/resync() - resync = FALSE - suit.resync() - -//How fast should the wearer be? /obj/item/device/flightpack/proc/update_slowdown() if(!flight) suit.slowdown = slowdown_ground @@ -356,20 +347,11 @@ /obj/item/device/flightpack/process() if(!suit || (processing_mode == FLIGHTSUIT_PROCESSING_NONE)) return FALSE - update_slowdown() - update_icon() check_conditions() calculate_momentum_speed() momentum_drift() handle_boost() handle_damage() - handle_flight() - -/obj/item/device/flightpack/proc/handle_flight() - if(!flight) - return FALSE - if(wearer) - wearer.float(TRUE) /obj/item/device/flightpack/proc/handle_damage() if(crash_damage) @@ -424,7 +406,6 @@ if(boost_charge < boost_maxcharge) boost_charge = Clamp(boost_charge+boost_chargerate, 0, boost_maxcharge) - /obj/item/device/flightpack/proc/cycle_power() if(powersetting < powersetting_high) powersetting++ @@ -654,6 +635,8 @@ wearer.movement_type |= FLYING wearer.pass_flags |= flight_passflags usermessage("ENGAGING FLIGHT ENGINES.") + update_slowdown() + wearer.floating = TRUE wearer.visible_message("[wearer]'s flight engines activate as they lift into the air!") //I DONT HAVE SOUND EFFECTS YET playsound( flight = TRUE @@ -670,6 +653,8 @@ momentum_x = 0 momentum_y = 0 usermessage("DISENGAGING FLIGHT ENGINES.") + update_slowdown() + wearer.floating = FALSE wearer.visible_message("[wearer] drops to the ground as their flight engines cut out!") //NO SOUND YET playsound( ion_trail.stop() @@ -749,11 +734,13 @@ wearer.visible_message("[wearer.name]'s flightpack engines flare in intensity as they are rocketed forward by the immense thrust!") boost = TRUE update_slowdown() + update_icon() /obj/item/device/flightpack/proc/deactivate_booster() usermessage("Boosters disengaged!") boost = FALSE update_slowdown() + update_icon() /obj/item/device/flightpack/proc/enable_airbrake() if(wearer) From f5bc75c0bc1c18971cee7e6c2187c6a81b36dbee Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 06:04:59 -0500 Subject: [PATCH 038/352] Moves tongues to `mutanttongue` var --- .../mob/living/carbon/human/human.dm.rej | 12 ++++++++++++ .../modules/mob/living/carbon/human/species.dm | 8 +++++++- .../mob/living/carbon/human/species.dm.rej | 18 ++++++++++++++++++ .../carbon/human/species_types/abductors.dm | 4 ++-- .../carbon/human/species_types/android.dm | 4 ++-- .../carbon/human/species_types/flypeople.dm | 2 +- .../human/species_types/lizardpeople.dm.rej | 10 ++++++++++ .../carbon/human/species_types/plasmamen.dm | 4 ++-- code/modules/surgery/organs/organ_internal.dm | 13 +++++-------- 9 files changed, 59 insertions(+), 16 deletions(-) create mode 100644 code/modules/mob/living/carbon/human/human.dm.rej create mode 100644 code/modules/mob/living/carbon/human/species.dm.rej create mode 100644 code/modules/mob/living/carbon/human/species_types/lizardpeople.dm.rej diff --git a/code/modules/mob/living/carbon/human/human.dm.rej b/code/modules/mob/living/carbon/human/human.dm.rej new file mode 100644 index 0000000000..5866cddae0 --- /dev/null +++ b/code/modules/mob/living/carbon/human/human.dm.rej @@ -0,0 +1,12 @@ +diff a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm (rejected hunks) +@@ -58,8 +58,9 @@ + if(!(NOBLOOD in dna.species.species_traits)) + internal_organs += new /obj/item/organ/heart + +- internal_organs += new dna.species.mutanteyes() ++ internal_organs += new dna.species.mutanteyes + internal_organs += new dna.species.mutantears ++ internal_organs += new dna.species.mutanttongue + internal_organs += new /obj/item/organ/brain + ..() + diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index a48124e412..5b2fafcda4 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -35,7 +35,7 @@ var/say_mod = "says" // affects the speech message var/list/default_features = list() // Default mutant bodyparts for this species. Don't forget to set one for every mutant bodypart you allow this species to have. var/list/mutant_bodyparts = list() // Parts of the body that are diferent enough from the standard human model that they cause clipping with some equipment - var/list/mutant_organs = list(/obj/item/organ/tongue) //Internal organs that are unique to this race. + var/list/mutant_organs = list() //Internal organs that are unique to this race. var/speedmod = 0 // this affects the race's speed. positive numbers make it move slower, negative numbers make it move faster var/armor = 0 // overall defense for the race... or less defense, if it's negative. var/brutemod = 1 // multiplier for brute damage @@ -131,6 +131,7 @@ var/obj/item/organ/appendix/appendix = C.getorganslot("appendix") var/obj/item/organ/eyes/eyes = C.getorganslot("eye_sight") var/obj/item/organ/ears/ears = C.getorganslot("ears") + var/obj/item/organ/tongue/tongue = C.getorganslot("tongue") if((NOBLOOD in species_traits) && heart) heart.Remove(C) @@ -153,6 +154,11 @@ ears = new mutantears ears.Insert(C) + if(tongue) + qdel(tongue) + tongue = new mutanttongue + tongue.Insert(C) + if((!(NOBREATH in species_traits)) && !lungs) if(mutantlungs) lungs = new mutantlungs() diff --git a/code/modules/mob/living/carbon/human/species.dm.rej b/code/modules/mob/living/carbon/human/species.dm.rej new file mode 100644 index 0000000000..1260400360 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species.dm.rej @@ -0,0 +1,18 @@ +diff a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm (rejected hunks) +@@ -66,15 +66,10 @@ + //Flight and floating + var/override_float = 0 + +- +- //Eyes + var/obj/item/organ/eyes/mutanteyes = /obj/item/organ/eyes +- +- //Ears + var/obj/item/organ/ears/mutantears = /obj/item/organ/ears +- +- //Hands + var/obj/item/mutanthands = null ++ var/obj/item/organ/tongue/mutanttongue = /obj/item/organ/tongue + + /////////// + // PROCS // diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm index 85b36c90c0..b76536f5bf 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -4,6 +4,6 @@ say_mod = "gibbers" sexes = 0 species_traits = list(NOBLOOD,NOBREATH,VIRUSIMMUNE,NOGUNS,NOHUNGER) - mutant_organs = list(/obj/item/organ/tongue/abductor) + mutanttongue = /obj/item/organ/tongue/abductor var/scientist = 0 // vars to not pollute spieces list with castes - var/team = 1 \ No newline at end of file + var/team = 1 diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm index 0e63115652..1c7cc6806b 100644 --- a/code/modules/mob/living/carbon/human/species_types/android.dm +++ b/code/modules/mob/living/carbon/human/species_types/android.dm @@ -5,7 +5,7 @@ species_traits = list(NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOBLOOD,VIRUSIMMUNE,PIERCEIMMUNE,NOHUNGER,EASYLIMBATTACHMENT) meat = null damage_overlay_type = "synth" - mutant_organs = list(/obj/item/organ/tongue/robot) + mutanttongue = /obj/item/organ/tongue/robot limbs_id = "synth" /datum/species/android/on_species_gain(mob/living/carbon/C) @@ -18,4 +18,4 @@ . = ..() for(var/X in C.bodyparts) var/obj/item/bodypart/O = X - O.change_bodypart_status(BODYPART_ORGANIC,FALSE, TRUE) \ No newline at end of file + O.change_bodypart_status(BODYPART_ORGANIC,FALSE, TRUE) diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm index 65b3eb9a65..3d6a10aae9 100644 --- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm @@ -2,7 +2,7 @@ name = "Flyperson" id = "fly" say_mod = "buzzes" - mutant_organs = list(/obj/item/organ/tongue/fly) + mutanttongue = /obj/item/organ/tongue/fly meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/fly /datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm.rej b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm.rej new file mode 100644 index 0000000000..1aab6d751d --- /dev/null +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm.rej @@ -0,0 +1,10 @@ +diff a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm (rejected hunks) +@@ -6,7 +6,7 @@ + default_color = "00FF00" + species_traits = list(MUTCOLORS,EYECOLOR,LIPS) + mutant_bodyparts = list("tail_lizard", "snout", "spines", "horns", "frills", "body_markings", "legs") +- mutant_organs = list(/obj/item/organ/tongue/lizard) ++ mutanttongue = /obj/item/organ/tongue/lizard + coldmod = 1.5 + heatmod = 0.67 + default_features = list("mcolor" = "0F0", "tail" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Normal Legs") diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index 6672c69b1e..f372968270 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -6,7 +6,7 @@ meat = /obj/item/stack/sheet/mineral/plasma species_traits = list(NOBLOOD,RESISTCOLD,RADIMMUNE,NOTRANSSTING,VIRUSIMMUNE,NOHUNGER) mutantlungs = /obj/item/organ/lungs/plasmaman - mutant_organs = list(/obj/item/organ/tongue/bone/plasmaman) + mutanttongue = /obj/item/organ/tongue/bone/plasmaman dangerous_existence = 1 //So so much blacklisted = 1 //See above burnmod = 1.5 @@ -66,4 +66,4 @@ if(lastname) randname += " [lastname]" - return randname \ No newline at end of file + return randname diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 97e794b466..78adf8268c 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -125,16 +125,13 @@ if(!getorganslot("tongue")) var/obj/item/organ/tongue/T - if(dna && dna.species) - for(var/tongue_type in dna.species.mutant_organs) - if(ispath(tongue_type, /obj/item/organ/tongue)) - T = new tongue_type() - T.Insert(src) + if(dna && dna.species && dna.species.mutanttongue) + T = new dna.species.mutanttongue() + else + T = new() // if they have no mutant tongues, give them a regular one - if(!T) - T = new() - T.Insert(src) + T.Insert(src) if(!getorganslot("eye_sight")) var/obj/item/organ/eyes/E From 8369ed376fb6706b12fdc680f472e7ea6132593a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 06:06:05 -0500 Subject: [PATCH 039/352] Revenant now goes into stasis until ectoplasm is destroyed [FINISHED] --- .../gamemodes/miniantags/revenant/revenant.dm | 67 +++++++++++++------ 1 file changed, 46 insertions(+), 21 deletions(-) diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 7260d8221f..265688a15b 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -14,6 +14,7 @@ var/icon_reveal = "revenant_revealed" var/icon_stun = "revenant_stun" var/icon_drain = "revenant_draining" + var/stasis = 0 incorporeal_move = 3 invisibility = INVISIBILITY_REVENANT health = INFINITY //Revenants don't use health, they use essence instead @@ -94,6 +95,8 @@ //Life, Stat, Hud Updates, and Say /mob/living/simple_animal/revenant/Life() + if(stasis) + return if(revealed && essence <= 0) death() if(unreveal_time && world.time >= unreveal_time) @@ -200,9 +203,8 @@ death() /mob/living/simple_animal/revenant/death() - if(!revealed || stat == DEAD) //Revenants cannot die if they aren't revealed //or are already dead + if(!revealed || stasis) //Revenants cannot die if they aren't revealed //or are already dead return 0 - ..(1) to_chat(src, "NO! No... it's too late, you can feel your essence [pick("breaking apart", "drifting away")]...") notransform = TRUE revealed = TRUE @@ -217,9 +219,12 @@ var/reforming_essence = essence_regen_cap //retain the gained essence capacity var/obj/item/weapon/ectoplasm/revenant/R = new(get_turf(src)) R.essence = max(reforming_essence - 15 * perfectsouls, 75) //minus any perfect souls - R.client_to_revive = src.client //If the essence reforms, the old revenant is put back in the body - ghostize() - qdel(src) + R.client_to_revive = client //If the essence reforms, the old revenant is put back in the body + R.revenant = src + invisibility = INVISIBILITY_ABSTRACT + revealed = 0 + stasis = 1 + ghostize(0)//Don't re-enter invisible corpse return @@ -302,6 +307,18 @@ to_chat(src, "Lost [essence_amt]E[source ? " from [source]":""].") return 1 +/mob/living/simple_animal/revenant/proc/death_reset() + revealed = FALSE + unreveal_time = 0 + notransform = 0 + unstun_time = 0 + inhibited = FALSE + draining = FALSE + incorporeal_move = 3 + invisibility = INVISIBILITY_REVENANT + alpha=255 + stasis = 0 + //reforming /obj/item/weapon/ectoplasm/revenant @@ -314,11 +331,15 @@ var/reforming = TRUE var/inert = FALSE var/client/client_to_revive + var/mob/living/simple_animal/revenant/revenant /obj/item/weapon/ectoplasm/revenant/New() ..() addtimer(CALLBACK(src, .proc/try_reform), 600) +/obj/item/weapon/ectoplasm/revenant/proc/scatter() + qdel(src) + /obj/item/weapon/ectoplasm/revenant/proc/try_reform() if(reforming) reforming = FALSE @@ -333,14 +354,14 @@ user.visible_message("[user] scatters [src] in all directions.", \ "You scatter [src] across the area. The particles slowly fade away.") user.drop_item() - qdel(src) + scatter() /obj/item/weapon/ectoplasm/revenant/throw_impact(atom/hit_atom) ..() if(inert) return visible_message("[src] breaks into particles upon impact, which fade away to nothingness.") - qdel(src) + scatter() /obj/item/weapon/ectoplasm/revenant/examine(mob/user) ..() @@ -350,47 +371,51 @@ to_chat(user, "It is shifting and distorted. It would be wise to destroy this.") /obj/item/weapon/ectoplasm/revenant/proc/reform() - if(QDELETED(src) || inert) + if(QDELETED(src) || QDELETED(revenant) || inert) return var/key_of_revenant message_admins("Revenant ectoplasm was left undestroyed for 1 minute and is reforming into a new revenant.") loc = get_turf(src) //In case it's in a backpack or someone's hand - var/mob/living/simple_animal/revenant/R = new(get_turf(src)) + revenant.forceMove(loc) if(client_to_revive) for(var/mob/M in GLOB.dead_mob_list) if(M.client == client_to_revive) //Only recreates the mob if the mob the client is in is dead - R.client = client_to_revive + revenant.client = client_to_revive key_of_revenant = client_to_revive.key if(!key_of_revenant) message_admins("The new revenant's old client either could not be found or is in a new, living mob - grabbing a random candidate instead...") - var/list/candidates = get_candidates(ROLE_REVENANT) + var/list/candidates = pollCandidatesForMob("Do you want to be [revenant.name] (reforming)?", "revenant", null, ROLE_REVENANT, 50, revenant) if(!candidates.len) - qdel(R) + qdel(revenant) message_admins("No candidates were found for the new revenant. Oh well!") inert = TRUE visible_message("[src] settles down and seems lifeless.") return var/client/C = pick(candidates) + revenant.client = C key_of_revenant = C.key if(!key_of_revenant) - qdel(R) + qdel(revenant) message_admins("No ckey was found for the new revenant. Oh well!") inert = TRUE visible_message("[src] settles down and seems lifeless.") return - var/datum/mind/player_mind = new /datum/mind(key_of_revenant) - R.essence_regen_cap = essence - R.essence = R.essence_regen_cap - player_mind.active = 1 - player_mind.transfer_to(R) - player_mind.assigned_role = "revenant" - player_mind.special_role = "Revenant" - SSticker.mode.traitors |= player_mind + message_admins("[key_of_revenant] has been [client_to_revive ? "re":""]made into a revenant by reforming ectoplasm.") log_game("[key_of_revenant] was [client_to_revive ? "re":""]made as a revenant by reforming ectoplasm.") visible_message("[src] suddenly rises into the air before fading away.") + + revenant.essence = essence + revenant.essence_regen_cap = essence + revenant.death_reset() + revenant.key = key_of_revenant + revenant = null qdel(src) +/obj/item/weapon/ectoplasm/revenant/Destroy() + if(!QDELETED(revenant)) + qdel(revenant) + ..() //objectives /datum/objective/revenant From a54b541635ef6ef203a55bd486bc68806f059b73 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 06:07:09 -0500 Subject: [PATCH 040/352] Turrets no longer target invisible creatures --- code/game/machinery/porta_turret/portable_turret.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index b8ba21fd35..727124276b 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -364,6 +364,10 @@ var/list/targets = list() var/turretview = view(scan_range, base) for(var/A in turretview) + var/atom/AA = A + if(AA.invisibility>SEE_INVISIBLE_LIVING) + continue + if(check_anomalies)//if it's set to check for simple animals if(istype(A, /mob/living/simple_animal)) var/mob/living/simple_animal/SA = A From 7c56c058b304700286f67f279220b8081e819696 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 06:11:22 -0500 Subject: [PATCH 041/352] Adds examining mouths with flashlights --- code/game/objects/items/devices/flashlight.dm | 119 ++++++++++++++---- 1 file changed, 96 insertions(+), 23 deletions(-) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 6955872c27..9131c02240 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -37,9 +37,9 @@ return 1 -/obj/item/device/flashlight/attack(mob/living/carbon/human/M, mob/living/carbon/human/user) +/obj/item/device/flashlight/attack(mob/living/carbon/M, mob/living/carbon/human/user) add_fingerprint(user) - if(on && user.zone_selected == "eyes") + if(istype(M) && on && user.zone_selected in list("eyes", "mouth")) if((user.disabilities & CLUMSY || user.getBrainLoss() >= 60) && prob(50)) //too dumb to use flashlight properly return ..() //just hit them in the head @@ -48,28 +48,101 @@ to_chat(user, "You don't have the dexterity to do this!") return - var/mob/living/carbon/human/H = M //mob has protective eyewear - if(ishuman(M) && ((H.head && H.head.flags_cover & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags_cover & MASKCOVERSEYES) || (H.glasses && H.glasses.flags_cover & GLASSESCOVERSEYES))) - to_chat(user, "You're going to need to remove that [(H.head && H.head.flags_cover & HEADCOVERSEYES) ? "helmet" : (H.wear_mask && H.wear_mask.flags_cover & MASKCOVERSEYES) ? "mask": "glasses"] first.") + if(!M.get_bodypart("head")) + to_chat(user, "[M] doesn't have a head!") return - if(M == user) //they're using it on themselves - if(M.flash_act(visual = 1)) - M.visible_message("[M] directs [src] to [M.p_their()] eyes.", "You wave the light in front of your eyes! Trippy!") - else - M.visible_message("[M] directs [src] to [M.p_their()] eyes.", "You wave the light in front of your eyes.") - else - user.visible_message("[user] directs [src] to [M]'s eyes.", \ - "You direct [src] to [M]'s eyes.") - var/mob/living/carbon/C = M - if(istype(C)) - if(C.stat == DEAD || (C.disabilities & BLIND)) //mob is dead or fully blind - to_chat(user, "[C] pupils don't react to the light!") - else if(C.dna.check_mutation(XRAY)) //mob has X-RAY vision - to_chat(user, "[C] pupils give an eerie glow!") - else //they're okay! - if(C.flash_act(visual = 1)) - to_chat(user, "[C]'s pupils narrow.") + switch(user.zone_selected) + if("eyes") + if((M.head && M.head.flags_cover & HEADCOVERSEYES) || (M.wear_mask && M.wear_mask.flags_cover & MASKCOVERSEYES) || (M.glasses && M.glasses.flags_cover & GLASSESCOVERSEYES)) + to_chat(user, "You're going to need to remove that [(M.head && M.head.flags_cover & HEADCOVERSEYES) ? "helmet" : (M.wear_mask && M.wear_mask.flags_cover & MASKCOVERSEYES) ? "mask": "glasses"] first.") + return + + var/obj/item/organ/eyes/E = M.getorganslot("eye_sight") + if(!E) + to_chat(user, "[M] doesn't have any eyes!") + return + + if(M == user) //they're using it on themselves + if(M.flash_act(visual = 1)) + M.visible_message("[M] directs [src] to [M.p_their()] eyes.", "You wave the light in front of your eyes! Trippy!") + else + M.visible_message("[M] directs [src] to [M.p_their()] eyes.", "You wave the light in front of your eyes.") + else + user.visible_message("[user] directs [src] to [M]'s eyes.", \ + "You direct [src] to [M]'s eyes.") + if(M.stat == DEAD || (M.disabilities & BLIND) || !M.flash_act(visual = 1)) //mob is dead or fully blind + to_chat(user, "[M]'s pupils don't react to the light!") + else if(M.dna && M.dna.check_mutation(XRAY)) //mob has X-RAY vision + to_chat(user, "[M]'s pupils give an eerie glow!") + else //they're okay! + to_chat(user, "[M]'s pupils narrow.") + + if("mouth") + + if((M.head && M.head.flags_cover & HEADCOVERSMOUTH) || (M.wear_mask && M.wear_mask.flags_cover & MASKCOVERSMOUTH)) + to_chat(user, "You're going to need to remove that [(M.head && M.head.flags_cover & HEADCOVERSMOUTH) ? "helmet" : "mask"] first.") + return + + var/their = M.p_their() + + var/list/mouth_organs = new + for(var/obj/item/organ/O in M.internal_organs) + if(O.zone == "mouth") + mouth_organs.Add(O) + var/organ_list = "" + var/organ_count = LAZYLEN(mouth_organs) + if(organ_count) + for(var/I in 1 to organ_count) + if(I > 1) + if(I == mouth_organs.len) + organ_list += ", and " + else + organ_list += ", " + var/obj/item/organ/O = mouth_organs[I] + organ_list += (O.gender == "plural" ? O.name : "\an [O.name]") + + var/pill_count = 0 + for(var/datum/action/item_action/hands_free/activate_pill/AP in M.actions) + pill_count++ + + if(M == user) + var/can_use_mirror = FALSE + if(isturf(user.loc)) + var/obj/structure/mirror/mirror = locate(/obj/structure/mirror, user.loc) + if(mirror) + switch(user.dir) + if(NORTH) + can_use_mirror = mirror.pixel_y > 0 + if(SOUTH) + can_use_mirror = mirror.pixel_y < 0 + if(EAST) + can_use_mirror = mirror.pixel_x > 0 + if(WEST) + can_use_mirror = mirror.pixel_x < 0 + + M.visible_message("[M] directs [src] to [their] mouth.", \ + "You point [src] into your mouth.") + if(!can_use_mirror) + to_chat(user, "You can't see anything without a mirror.") + return + if(organ_count) + to_chat(user, "Inside your mouth [organ_count > 1 ? "are" : "is"] [organ_list].") + else + to_chat(user, "There's nothing inside your mouth.") + if(pill_count) + to_chat(user, "You have [pill_count] implanted pill[pill_count > 1 ? "s" : ""].") + + else + user.visible_message("[user] directs [src] to [M]'s mouth.",\ + "You direct [src] to [M]'s mouth.") + if(organ_count) + to_chat(user, "Inside [their] mouth [organ_count > 1 ? "are" : "is"] [organ_list].") + else + to_chat(user, "[M] doesn't have any organs in [their] mouth.") + if(pill_count) + to_chat(user, "[M] has [pill_count] pill[pill_count > 1 ? "s" : ""] implanted in [their] teeth.") + else return ..() @@ -280,7 +353,7 @@ return TRUE /obj/item/device/flashlight/emp/attack(mob/living/M, mob/living/user) - if(on && user.zone_selected == "eyes") // call original attack proc only if aiming at the eyes + if(on && user.zone_selected in list("eyes", "mouth")) // call original attack when examining organs ..() return From da781e0d76f3249d529298965b8d8da099834342 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 06:12:26 -0500 Subject: [PATCH 042/352] Adds aesthetic basalt floor tiles --- .../objects/items/stacks/sheets/mineral.dm | 1 + .../objects/items/stacks/tiles/tile_types.dm | 8 ++++++ .../game/turfs/simulated/floor/fancy_floor.dm | 23 ++++++++++++++++-- icons/obj/tiles.dmi | Bin 11236 -> 11741 bytes 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 611ef76eb4..f32fc2cea4 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -29,6 +29,7 @@ Mineral Sheets GLOBAL_LIST_INIT(sandstone_recipes, list ( \ new/datum/stack_recipe("pile of dirt", /obj/machinery/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("aesthetic volcanic floor tile", /obj/item/stack/tile/basalt, 2, 2, 4, 20), \ new/datum/stack_recipe("Assistant Statue", /obj/structure/statue/sandstone/assistant, 5, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("Breakdown into sand", /obj/item/weapon/ore/glass, 1, one_per_turf = 0, on_floor = 1), \ /* new/datum/stack_recipe("sandstone wall", ???), \ diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index f2432cee3d..1737699e5b 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -88,6 +88,14 @@ turf_type = /turf/open/floor/wood resistance_flags = FLAMMABLE +//Basalt +/obj/item/stack/tile/basalt + name = "basalt tile" + singular_name = "basalt floor tile" + desc = "Artificially made ashy soil themed on a hostile enviroment." + icon_state = "tile_basalt" + origin_tech = "materials=1" + turf_type = /turf/open/floor/grass/fakebasalt //Carpets /obj/item/stack/tile/carpet diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index eaba3d50eb..cce7756892 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -1,6 +1,7 @@ /* In this file: * Wood floor * Grass floor + * Fake Basalt * Carpet floor * Fake pits * Fake space @@ -67,6 +68,7 @@ broken_states = list("sand") flags = NONE var/ore_type = /obj/item/weapon/ore/glass + var/turfverb = "uproot" /turf/open/floor/grass/Initialize() ..() @@ -76,7 +78,7 @@ if(istype(C, /obj/item/weapon/shovel) && params) new ore_type(src) new ore_type(src) //Make some sand if you shovel grass - user.visible_message("[user] digs up [src].", "You uproot [src].") + user.visible_message("[user] digs up [src].", "You [src.turfverb] [src].") playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) make_plating() if(..()) @@ -93,7 +95,6 @@ initial_gas_mix = "o2=22;n2=82;TEMP=180" slowdown = 2 - /turf/open/floor/grass/snow/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/weapon/crowbar))//You need to dig this turf out instead of crowbarring it return @@ -113,6 +114,24 @@ icon_state = "basalt[rand(0, 12)]" set_basalt_light(src) + +/turf/open/floor/grass/fakebasalt //Heart is not a real planeteer power + name = "aesthetic volcanic flooring" + desc = "Safely recreated turf for your hellplanet-scaping" + icon = 'icons/turf/floors.dmi' + icon_state = "basalt" + floor_tile = /obj/item/stack/tile/basalt + ore_type = /obj/item/weapon/ore/glass/basalt + turfverb = "dig up" + slowdown = 0 + +/turf/open/floor/grass/fakebasalt/Initialize() + ..() + if(prob(15)) + icon_state = "basalt[rand(0, 12)]" + set_basalt_light(src) + + /turf/open/floor/carpet name = "carpet" desc = "Soft velvet carpeting. Feels good between your toes." diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi index d629cfe24d48dd006e6dc2df315be4748182db8c..5a8afeee510bc271ab7b5ba3d4df813951a581d0 100644 GIT binary patch literal 11741 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 literal 11236 zcmb7qcQjm4xbG;5(Tx&>=-mWC)F{z=7epDoMu{3miy9GxsG}1ldKX3)(SjgabkPmN zXc=wZ@2axRgjUXuabk0owtjZuZyP#0PrR!ZMyS)zYqyvO)`{da$M%fbIkj5D#;-~ z9jE^z{Xwym<&Hbj=tZ*Bu^3&IFxkEdwD5}c*Tn5TGal~U_3OiBUxv1Jd2&d8srj?$ zk}d&*`k>u)J>ILxJ;r)@a^_OFNX?z!onk->p9yae1D&$bnJ7Cg#Ls_pVULmroad3S_aqj_tP6DY}URJt6Js&WAB?Qz=Iq z-dydKg^WTDSG#|s^8apl4t=k#utVnGK~_<^NJKhdkNWdeg{X4SN$+D_JYIte!fa;g zS-r0E44|~vS~%lE6QTATDE!-9-u_hD3QW>A1-0S%Son*fU4pMK-&6NZ^l-^=67%L2sUq2wc5uhcEq)w2(2i7 z1AE`Ln9b@`DId(XNr{qzayPRikX6vwyDuDu3=K=ZrAb-bWx=<1cm!lag>9n+%6t6d z!e5k=@AW=3+YACfH=0wUrUkkP@!Fnki-4o-&PEwO1w|MJj%M6&cl~7$erSFKFZ_5} zhF=!oKWfCcMIo&XOC9qr`&JUnH&)nG#*yZYWZ-?i3}T@sD%_I-tb5ThqKGX6)Okyk zU|i{`nd#9kupwKJ=z2Gf_4zHtGIIO>)a4Ot%6t914*l&1MJ=wTz*Q!I|GQk?Ce4 zqauucr^2Sh24Y(mDpZT|;!rT1Bixf(SNryYdfgMh2|Rk2!h~{z#niY&`94|>blI

Ai)4Am5unY=3(`T>s@!vd{fq&zP{ti! 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 I3f2+-1DQMO^8f$< From 36b517d2bae7004e10df5c248a3a72c7171f3e38 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 13:32:01 -0500 Subject: [PATCH 043/352] Fixes runtime with null nutriment taste data --- code/modules/reagents/chemistry/reagents/food_reagents.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 442772fea8..56a89fe389 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -60,7 +60,10 @@ // data for nutriment is one or more (flavour -> ratio) // where all the ratio values adds up to 1 - var/list/taste_amounts = data.Copy() + var/list/taste_amounts = list() + if(data) + taste_amounts = data.Copy() + counterlist_scale(taste_amounts, volume) var/list/other_taste_amounts = newdata.Copy() From 44df31d399e91e8266a19a56b2d0fb7494c4a20e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 14:43:18 -0500 Subject: [PATCH 044/352] Fixes Set Round End Sound. --- code/world.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/world.dm b/code/world.dm index 9023ac47f3..84c267615a 100644 --- a/code/world.dm +++ b/code/world.dm @@ -226,7 +226,7 @@ /world/proc/RoundEndAnimation(round_end_sound_sent) set waitfor = FALSE var/round_end_sound - if(!SSticker && SSticker.round_end_sound) + if(SSticker.round_end_sound) round_end_sound = SSticker.round_end_sound if (!round_end_sound_sent) for(var/thing in GLOB.clients) From 61563241db0f9a49ab7792aaca4aac9605093ec6 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 16:06:46 -0500 Subject: [PATCH 045/352] Tweaks the cost of some of the Application scriptures affected by the previous cost tweak --- .../scripture_applications.dm.rej | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm.rej diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm.rej b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm.rej new file mode 100644 index 0000000000..06673bf754 --- /dev/null +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm.rej @@ -0,0 +1,46 @@ +diff a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm (rejected hunks) +@@ -10,7 +10,7 @@ + It will penetrate mindshield implants once before disappearing." + invocations = list("Divinity, enslave...", "...all who trespass here!") + channel_time = 70 +- consumed_components = list(BELLIGERENT_EYE = 3, GEIS_CAPACITOR = 2, HIEROPHANT_ANSIBLE = 2) ++ consumed_components = list(BELLIGERENT_EYE = 4, GEIS_CAPACITOR = 2, HIEROPHANT_ANSIBLE = 2) + whispered = TRUE + object_path = /obj/effect/clockwork/sigil/submission/accession + prevent_path = /obj/effect/clockwork/sigil/submission +@@ -32,7 +32,7 @@ + It grows faster to invoke with more adjacent Servants." + invocations = list("Shield us...", "...with the...", "... fragments of Engine!") + channel_time = 100 +- consumed_components = list(VANGUARD_COGWHEEL = 3, REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 2) ++ consumed_components = list(VANGUARD_COGWHEEL = 4, REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 2) + usage_tip = "This scripture will replace all weaker armor worn by affected Servants." + tier = SCRIPTURE_APPLICATION + multiple_invokers_used = TRUE +@@ -99,7 +99,7 @@ + If it remains close to you, you will gradually regain health up to a low amount, but it will die if it goes too far from you." + invocations = list("Fright's will...", "...call forth...") + channel_time = 100 +- consumed_components = list(BELLIGERENT_EYE = 2, VANGUARD_COGWHEEL = 2, GEIS_CAPACITOR = 3) ++ consumed_components = list(BELLIGERENT_EYE = 2, VANGUARD_COGWHEEL = 2, GEIS_CAPACITOR = 4) + usage_tip = "Marauders are useful as personal bodyguards and frontline warriors." + tier = SCRIPTURE_APPLICATION + primary_component = GEIS_CAPACITOR +@@ -160,7 +160,7 @@ + and exceptional speed, though taking damage will temporarily slow it down." + invocations = list("Call forth...", "...the soldiers of Armorer.") + channel_time = 80 +- consumed_components = list(BELLIGERENT_EYE = 2, VANGUARD_COGWHEEL = 2, REPLICANT_ALLOY = 3) ++ consumed_components = list(BELLIGERENT_EYE = 2, VANGUARD_COGWHEEL = 2, REPLICANT_ALLOY = 4) + object_path = /obj/structure/destructible/clockwork/shell/fragment + creator_message = "You form an anima fragment, a powerful soul vessel receptacle." + observer_message = "The slab disgorges a puddle of black metal that expands and forms into a strange shell!" +@@ -179,7 +179,7 @@ + desc = "Places a sigil that stores energy to power clockwork structures." + invocations = list("Divinity...", "...power our creations!") + channel_time = 70 +- consumed_components = list(VANGUARD_COGWHEEL = 2, GEIS_CAPACITOR = 2, HIEROPHANT_ANSIBLE = 3) ++ consumed_components = list(VANGUARD_COGWHEEL = 2, GEIS_CAPACITOR = 2, HIEROPHANT_ANSIBLE = 4) + whispered = TRUE + object_path = /obj/effect/clockwork/sigil/transmission + creator_message = "A sigil silently appears below you. It will automatically power clockwork structures near it." From 827bbb13c225a666df3e85bbcca9ea78c13bdcb4 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 17:49:28 -0500 Subject: [PATCH 046/352] Adds an effect to Mending Mantra to show who is chanting it --- .../clock_scriptures/scripture_scripts.dm | 1 + code/game/objects/effects/overlays.dm | 20 +++++++++++++++++- icons/effects/clockwork_effects.dmi | Bin 103207 -> 103452 bytes 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm index f7fcc8c299..6f9627bf09 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm @@ -177,6 +177,7 @@ new /obj/effect/overlay/temp/heal(T, "#1E8CE1") else break + new /obj/effect/overlay/temp/ratvar/mending_mantra(get_turf(invoker)) return TRUE diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 3935b86c92..a6517ccdb5 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -323,11 +323,30 @@ /obj/effect/overlay/temp/ratvar/grille/broken icon_state = "ratvarbrokengrilleglow" +/obj/effect/overlay/temp/ratvar/mending_mantra + layer = ABOVE_MOB_LAYER + duration = 20 + alpha = 200 + icon_state = "mending_mantra" + light_range = 1.5 + light_color = "#1E8CE1" + +/obj/effect/overlay/temp/ratvar/mending_mantra/Initialize(mapload) + . = ..() + transform = matrix()*2 + var/matrix/M = transform + M.Turn(90) + animate(src, alpha = 20, time = duration, easing = BOUNCE_EASING, flags = ANIMATION_PARALLEL) + animate(src, transform = M, time = duration, flags = ANIMATION_PARALLEL) + /obj/effect/overlay/temp/ratvar/volt_hit name = "volt blast" layer = ABOVE_MOB_LAYER duration = 5 icon_state = "volt_hit" + light_range = 1.5 + light_power = 2 + light_color = LIGHT_COLOR_ORANGE var/mob/user var/damage = 20 @@ -336,7 +355,6 @@ damage *= multiplier duration = max(round(damage * 0.2), 1) . = ..() - set_light(1.5, 2, LIGHT_COLOR_ORANGE) /obj/effect/overlay/temp/ratvar/volt_hit/true/Initialize(mapload, caster, multiplier) . = ..() diff --git a/icons/effects/clockwork_effects.dmi b/icons/effects/clockwork_effects.dmi index 8bbf24a7ef1dfaaabbe672650d934d6c3fe2aae7..b2e15da1d0d1cca180d099ce1dd94c708a9b5ae7 100644 GIT binary patch delta 25549 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 E0jR)9)c^nh From 34bf3e41136ceb5a922bfe639fa2a073b9b1829b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 17:50:32 -0500 Subject: [PATCH 047/352] Fixes dropped cyborg repair modules --- code/game/objects/items/robot/robot_upgrades.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 2aee5acdd9..29463b5a5c 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -237,6 +237,7 @@ /obj/item/borg/upgrade/selfrepair/proc/check_dropped() if(loc != cyborg) toggle_action.Remove(cyborg) + QDEL_NULL(toggle_action) cyborg = null deactivate() @@ -399,4 +400,4 @@ return R.make_shell(src) - return TRUE \ No newline at end of file + return TRUE From af41e21623c2d11e52271cd0002ae1ed818b0d22 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 17:52:37 -0500 Subject: [PATCH 048/352] Increases pixel projectile angles/accuracy --- code/modules/projectiles/projectile.dm | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index dceed5b438..9835b1df21 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -179,6 +179,8 @@ return if(setAngle) Angle = setAngle + var/old_pixel_x = pixel_x + var/old_pixel_y = pixel_y if(!legacy) //new projectiles set waitfor = 0 var/next_run = world.time @@ -201,29 +203,30 @@ var/Pixel_x=round((sin(Angle)+16*sin(Angle)*2), 1) //round() is a floor operation when only one argument is supplied, we don't want that here var/Pixel_y=round((cos(Angle)+16*cos(Angle)*2), 1) - var/pixel_x_offset = pixel_x + Pixel_x - var/pixel_y_offset = pixel_y + Pixel_y + var/pixel_x_offset = old_pixel_x + Pixel_x + var/pixel_y_offset = old_pixel_y + Pixel_y var/new_x = x var/new_y = y while(pixel_x_offset > 16) pixel_x_offset -= 32 - pixel_x -= 32 + old_pixel_x -= 32 new_x++// x++ while(pixel_x_offset < -16) pixel_x_offset += 32 - pixel_x += 32 + old_pixel_x += 32 new_x-- - while(pixel_y_offset > 16) pixel_y_offset -= 32 - pixel_y -= 32 + old_pixel_y -= 32 new_y++ while(pixel_y_offset < -16) pixel_y_offset += 32 - pixel_y += 32 + old_pixel_y += 32 new_y-- - + + pixel_x = old_pixel_x + pixel_y = old_pixel_y step_towards(src, locate(new_x, new_y, z)) next_run += max(world.tick_lag, speed) var/delay = next_run - world.time @@ -232,7 +235,9 @@ pixel_y = pixel_y_offset else animate(src, pixel_x = pixel_x_offset, pixel_y = pixel_y_offset, time = max(1, (delay <= 3 ? delay - 1 : delay)), flags = ANIMATION_END_NOW) - + old_pixel_x = pixel_x_offset + old_pixel_y = pixel_y_offset + if(original && (original.layer>=2.75) || ismob(original)) if(loc == get_turf(original)) if(!(original in permutated)) From 46d7976488ae36c3041808890e4e9e41abecaf9d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 17:53:42 -0500 Subject: [PATCH 049/352] Adds spewium toxin in traitor kits --- code/game/machinery/pipe/construction.dm | 2 ++ .../items/weapons/storage/uplink_kits.dm | 3 +- code/modules/mob/living/carbon/carbon.dm | 12 +++++++- .../chemistry/reagents/medicine_reagents.dm | 3 +- .../chemistry/reagents/toxin_reagents.dm | 28 +++++++++++++++++++ .../reagents/reagent_containers/bottle.dm | 6 ++++ 6 files changed, 50 insertions(+), 4 deletions(-) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 6735aa7609..2d3765a934 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -251,6 +251,8 @@ GLOBAL_LIST_INIT(pipeID2State, list( var/mob/living/carbon/C = user for(var/i=1 to 20) C.vomit(0,1,0,4,0) + if(prob(20)) + C.spew_organ() sleep(5) C.blood_volume = 0 return(OXYLOSS|BRUTELOSS) diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 335545e8c9..9cf806f6b3 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -219,7 +219,8 @@ new /obj/item/weapon/reagent_containers/glass/bottle/polonium(src) new /obj/item/weapon/reagent_containers/glass/bottle/venom(src) new /obj/item/weapon/reagent_containers/glass/bottle/neurotoxin2(src) - new /obj/item/weapon/reagent_containers/glass/bottle/formaldehyde(src) + new /obj/item/weapon/reagent_containers/glass/bottle/formaldehyde(src) + new /obj/item/weapon/reagent_containers/glass/bottle/spewium(src) new /obj/item/weapon/reagent_containers/glass/bottle/cyanide(src) new /obj/item/weapon/reagent_containers/glass/bottle/histamine(src) new /obj/item/weapon/reagent_containers/glass/bottle/initropidril(src) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 87cf246717..06145235a0 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -484,7 +484,7 @@ adjustBruteLoss(3) else if(T) - T.add_vomit_floor(src, 0)//toxic barf looks different + T.add_vomit_floor(src, toxic)//toxic barf looks different nutrition -= lost_nutrition adjustToxLoss(-3) T = get_step(T, dir) @@ -492,6 +492,16 @@ break return 1 +/mob/living/carbon/proc/spew_organ(power = 5) + if(!internal_organs.len) + return //Guess we're out of organs + var/obj/item/organ/guts = pick(internal_organs) + var/turf/T = get_turf(src) + guts.Remove(src) + guts.forceMove(T) + var/atom/throw_target = get_edge_target_turf(guts, dir) + guts.throw_at(throw_target, power, 4, src) + /mob/living/carbon/fully_replace_character_name(oldname,newname) ..() diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 500147d233..434161fa51 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -962,8 +962,7 @@ /datum/reagent/medicine/antitoxin/on_mob_life(mob/living/M) M.adjustToxLoss(-2*REM, 0) for(var/datum/reagent/toxin/R in M.reagents.reagent_list) - if(R != src) - M.reagents.remove_reagent(R.id,1) + M.reagents.remove_reagent(R.id,1) ..() . = 1 diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 528124f84c..cedec9941b 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -648,6 +648,34 @@ M.losebreath += 5 return ..() +/datum/reagent/toxin/spewium + name = "Spewium" + id = "spewium" + description = "A powerful emetic, causes uncontrollable vomiting. May result in vomiting organs at high doses." + reagent_state = LIQUID + color = "#2f6617" //A sickly green color + metabolization_rate = REAGENTS_METABOLISM + overdose_threshold = 29 + toxpwr = 0 + taste_description = "vomit" + +/datum/reagent/toxin/spewium/on_mob_life(mob/living/M) + .=..() + if(current_cycle >=11 && prob(min(50,current_cycle)) && ishuman(M)) + var/mob/living/carbon/human/H = M + H.vomit(lost_nutrition = 10, blood = prob(10), stun = prob(50), distance = rand(0,4), message = TRUE, toxic = prob(30)) + for(var/datum/reagent/toxin/R in M.reagents.reagent_list) + if(R != src) + H.reagents.remove_reagent(R.id,1) + +/datum/reagent/toxin/spewium/overdose_process(mob/living/M) + . = ..() + if(current_cycle >=33 && prob(15) && ishuman(M)) + var/mob/living/carbon/human/H = M + H.spew_organ() + H.vomit(lost_nutrition = 0, blood = 1, stun = 1, distance = 4) + to_chat(H, "You feel something lumpy come up as you vomit.") + /datum/reagent/toxin/curare name = "Curare" id = "curare" diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index a92c52abf4..37074b6d12 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -58,6 +58,12 @@ icon_state = "bottle12" list_reagents = list("cyanide" = 30) +/obj/item/weapon/reagent_containers/glass/bottle/spewium + name = "spewium bottle" + desc = "A small bottle of spewium." + icon_state = "bottle12" + list_reagents = list("spewium" = 30) + /obj/item/weapon/reagent_containers/glass/bottle/morphine name = "morphine bottle" desc = "A small bottle of morphine." From 82ff7ed19f62646a170282f9eec4a6a4c618b00d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 17:54:47 -0500 Subject: [PATCH 050/352] Fixes detective scanner not being able to ranged scan, adds range/viewcheck vars --- code/modules/detectivework/scanner.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm index 92437a34c1..562f59290a 100644 --- a/code/modules/detectivework/scanner.dm +++ b/code/modules/detectivework/scanner.dm @@ -13,6 +13,8 @@ var/scanning = 0 var/list/log = list() origin_tech = "engineering=4;biotech=2;programming=5" + var/range = 8 + var/view_check = TRUE /obj/item/device/detective_scanner/attack_self(mob/user) if(log.len && !scanning) @@ -43,7 +45,7 @@ log = list() scanning = 0 -/obj/item/device/detective_scanner/pre_attackby(atom/A, mob/user, params) +/obj/item/device/detective_scanner/afterattack(atom/A, mob/user, params) scan(A, user) return FALSE @@ -51,9 +53,7 @@ set waitfor = 0 if(!scanning) // Can remotely scan objects and mobs. - if(!in_range(A, user) && !(A in view(world.view, user))) - return - if(loc != user) + if((get_dist(A, user) > range) || (!(A in view(range, user)) && view_check) || (loc != user)) return scanning = 1 From 4a142759a095f2055046e19e2bfb2b78e9f4789c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 17:58:58 -0500 Subject: [PATCH 051/352] New Tree Sprites --- code/game/objects/structures/flora.dm | 2 +- icons/obj/flora/jungletrees.dmi | Bin 27406 -> 65117 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index cdd706e5df..c00348a2c6 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -88,7 +88,7 @@ pixel_y = -20 /obj/structure/flora/tree/jungle/Initialize() - icon_state = "[icon_state][rand(1, 3)]" + icon_state = "[icon_state][rand(1, 6)]" ..() //grass diff --git a/icons/obj/flora/jungletrees.dmi b/icons/obj/flora/jungletrees.dmi index 461ac0b265fb246cf7e6683131be6cd24d9123af..67c7e0f463c70287d59a550b40918b7c5b716ff3 100644 GIT binary patch literal 65117 zcmXt9b8wt*xZT*cZQHh;#%UTiw$<2HV<*4ZMq|6NoyKU4`}N+rf9z!To9yhq?>soq zIp>K~RhB`5$A<@jKuB`3lIkE3SRnA)frSR1RB?110)HaBHFaDi&0S2LtsPyh9qd6M z&+ORodiZ`;ROlVPM@*3mW~J((Lu|Q3#0vpT@1KZzvdDgZFf=f`Ee=n52BkIzs7JCa zbX->|tYH!|mpMF2U!Oh{ndN$Dpa$ZJv<$WStePU8!Zy+rpazmVQ~#0~e^zZZ#g%ep zER8iuFTAAdDJqC&Q22rJ*L4}q$JS>+AX1Q=q?o2>_IbCVgT7@N^-BVINi~x?C01nI zVZHj{_=wo~e;pBXWvYFg2B9wY__&iBlPs*mwE5KT&{%`gdu+(Q*?q|Ky!ApzoCc!- z<-uSt|EXb34vD!9{Nh`%!%2vD*Gh@gEX7pAte9d-BA*$WINm%n+(@C-T?(Iq!o}|8 z=6QU*{CiVnS)KZHzo5dFQh;bqE8+D)=`~Bk`hRcuaPja1|L?J~xfLkv)?i}OCtU!> z4_N|lTx@I>gm~DV+WE-r(e-T{Kd68Wcl?ez(gfX;b|%^i>IzE(6gULKgc)_@r1O1u z3ZWGp#`y>ELE#BjaNKbhvSkNchrCZ(lL{zOcId--R&?Ow6cP}uDH1Fy|0UFJw{6g2 z#x@*_M14`*eacMn%T4T?g+)B{N;uvEAv)X-F!_Woq$?cd#ek!8%!%}MX*2)&=w83- z@VRofY^x1(#yn`B1l#ELXumrO)rX@`C%g3VJh0xm_qZ~=Oi}2&;h;Nyu3PMXvPQ`% zN%KR*m2i4fgpWqiYjbz2yGrzl{7hF6EwC~oxvVW9l=iwr4D3=XQBSA?v38lDh}Qr= zFHv5PL8C|7lywx}dI%8|nTg4-z;w*#PtqG6fbtD=xz)K*Kqfa?tQvs3b_X3Zw-(8U zH?I1ikjnrYkxPo|m4=UU)O*GgM)u}EzR-8td`q(-5if!a&F??_Hg!dKFHrvGWlLOS z@I&Z$Hy3~0B>8w4bS<4KfAo}TBpsp2K0x3eU|#FwO>ayL6IhfFmjA)pG^0>!=%4oy zcgDl)@f1HZR{rg+$uh5~KIzq#R)UZ5)&LhoA3&Q+-g0NVUlpRu;pF zf`$f%)-S7DbawQo_rMQ-8JLaaKk$KrQd>3db!tym43VW4k5S?VNe=&bmCbE@n-(LF z0-{6Yu-#E%oNC9Dtv}9d-)1tcACfdRDb4uvNXQ4{v+VQQAKWoHecFhe9ENPI z61(!j&FKx;Tr6`ukKz*&vlFk-4!xgW_x{pBP+FhxL=4HQ<4oM3(USfFXPLx)6Ew7?*Y$(aVktBT-s3QN!no76pYp?Jcz z3ZXK>AOpb|`st(p7@85Y{j3q`D(fd$fW0HFNuv^jwhaKVy?xUUiVVe7N>oA1-q=6@K&ADO4kM+%(;3Ck{(? z>$nI{R#Oy7pw?QzOCFY>zm5wo|At09$r9?4`0K}pE&7PEr7CTV$)DeFuWu)|_+niA zM|(xHY~<`@j5Bv$1_4Ye-YRVABc@|#o4Vh1_kRTp*buYGP=n|1CFJ@NZqXa-KN&`} zMTq&B`5H!t;WxFS<0x6pq>g}nWsqpSz5>S13)2|1M^!cPq zS`JR|8wt~5#PQq}8g%_+f^-qbr_GKgE{)u-3-K2d-gMeQezN%bq_-A4Q0Ve8ASsfG zJz47)JBpOo(z0<>h=1;VZc<|BTi!@qFmm3#-a>*PgN-{SVxT6edQg1cLw1%3GL6xb z;R&nsflG?N7i9bDUW$?ddxNn}kbhW2)|>9Cs-7zW^ya*naTZWSExTPmq~&{URHA6R zJxSH)+gB;&^Oo7th#KWKfv~!$i=9+N7sHC%l{J%L{re}RC<4Sg4MmY5j#l3ehqsFv zASALhr{%}`NHm6sJS zpn!If+)wZ&EPlUC2u39>+vV91(~k8?*gE?@cIG9RH~UUE6bhQI2ci(1l|DdNCUIF; zLbO3P=1Rza*!LK?6ft}5(>jkPR`$_J%EW2>wg@!Q#HQ76N_A2JPDf;IQ40La2j>;9hoFaIDkAk&}&l* zxOfnGz@0>eTc1e1m9Ybne#-2)1h&tep-5<^P4c(+^2Sp$^7FUvAGPT&pUt3ba9Ik3En}G*z`v2#4~BzuO(~*#U_n;g+=i& zmN_+jL-Ea6eI>5rdTj`68|UHkJ%4V_!^h=_lapjy4*B zR>y_Ra0m8-o|Stw@Qb3!u1A4eso9>6GlbZ*dN1Le9@SQwCMHZ{D5#HEn}MX51I|9wG?R`Nq+<>^1JrDr2KDFM;A|+NK58(XR(W zldmf5bu9{Qjl=oI?0nNf5QW`!zq>n$qOHn8YgFjN`N2Wt#4ViQv7yxbt4f;0VWU%? z<&2@F%h4-}Vp!bY%Nd*M*-3cqK(54KCrs!Nf%Rjcsqc^|*BMK}Xz_kc^=)4T(e3f4 z5a-ZjQMu2DNph4ZPNdOgw3=>VULKA1rYLrKP?+u58JkfjVSocozVtVl(5CYMm6$Iv zKjg0bP4^i=QVoO!);!dF zzv#j<2`kS1Zq4~qIxwF!@|8UiT{9?)WLxP;cjX5&>FpB+hkXHFawj`FSfMXO=!z>U z_w}*L7vPHX8_cGCY#U6RF2w?P4wrkqt}IMIqaitkBkq521mL+gHE zJrWZTJ+rkED?_?ENW-bz*SzoSaU}el*VI zNFY?aAQby8WzgK-7i@#j+RvKmMcZ=OQkc|mBh}M_(PJ=PBbeULf5-e+y%Xi6?fVF> zjDdV8l01-NM?~(Ip5a^QGxWQ9NDKv0KK5vA4g#5?FtmRZ7i?1uUQ%Y?;mMu-SIIJ2 zD2zQ$ySzKV$A27ksM_lrb?A^xqBDvOnndXDLs!A#(W^baV~b?ie(CLPrkQpFc2+V+ z*V9ld*c5yLX_FLH8jw-;2YTP%ND#j2koHtePo$$Is&e5TelwG1juj=TQBa zmLY&tkHpJQyGQ3r%|A&_P4~}GFrM3x$>6OQyR4NUfVT?n-KKhs@z3X0n+6b;ZKku_ zfHZ#fF@vh-1iv+C3wzu24ftqon$jJ7x9?Ljxbu?2>Pelu`n$_a#s ze1Z8iF5zB7%E7DoIjG(*A2WWxMuMrEU&j(zL3-tH6+6vAJKOs`D5T>QvZntcF4m)r z`Rluhq(XAk@Qid+@#alkJ@Ot?JUAuRdovyR!90NP6U44}}PxvTR3 zR;u!?znuMByl0*pwyd_*7g!n6j0Qp!`a-|!wCzC%g?}z?g7`Pw1jVhE2EW{%pSMx- zj|tOYb7d=`m3l+W3FMQmOLoNfQm~xiK#LEtnj5T89WL|=PLQh84q(JiLX~q?U<lY>N zOz9b|IHqWrj~N`0a%M0&S?0*V{wK|stfWc%^D-Xz8tx_O#HO?&13Y86pJA*d0DoG0qes8x0=rDUF1RQTG^J4c=8fZ@?Za4^tebzx@E<;9&NK+ViXHAZ0C{J8i;gcO zmW(`)z~CZkc}e)!^Wro`H5GHH(r+k>@cVKmsmajtvlwSQX)%Yd`w5ckuSDGWO^ckp zP#W(TkXS#*;2kS?J=n3+j;TeiD1&yfeT;y~i^Ga?aOPHrA3udpPM9RU*B70SlXG^{ z+1R1WA*G?z;g)ST6aazEsrd7!O&1Up73Sy)2R1+zBvMNG@8=)2zKeJAXuqd!_H2gq z*#+$k`J3_qA-%nqtBLK2nXn zTGl07^X*WFlHi^1VLNxFU6qpu=(FR>Wq|+{VSV?HsJIno$R_o zu-%TmA-O#d!hd^~9}9e$n041`s|A*WuWHM9i1=BTWi=$|Vnz@6#{4zjX*=c{VK#gW z^Lj1pr#>dn6mE_lRf8J8YT=U^`k<#5r38q`u~bN)fz@q?A^vWgdtyOG==Qm4D0-uF zULX?45o^S!3+S^$gqGy-5a5)T_RhR#9MjHsoC8|gSD}D*HcCG`fy03PcLkXwsD2wM z1A~S(vm^q?N>{F?qE&+~cR7~G;`Ao14&Uw6)~%-H?;DS5C_i#t7PK}SgrH`#Rv0jc z6S8i;Az`65N9N;HyyDH-96TnhO;B@l$ApYn~*uq8`Tp?t4PtCk#+ur$FZ*M?VAeq$TLD0(7K;*i9}XArbdUHw8cx( z>ofGVS@coQ5{6s$iL%F2{N1hAV2&1c&68c0RP$ z&THBGilZSrucs-Cu$8X1%Ci`PY4Y5a+!vn2fGJ7vx6LBME8`D;(k)YASU82!EwKml zq`ydkH&%3q4mz#u5@r9yC#BdOb3se5VlI53Tp$*ag<3}pGI*TAhFMRbH^G@NcPVN0P~ z=FPOf=z*(O_f21VbUgm>|3NA0LVJXN#Q3yChG(s-9(A=vBKEdG8YBR*P88yHJ)PEC*XbdejPY6m?i&^TL3rNjmB` zFJ)INDPV;Jros7TE?Z3=Rh;p>ELU^klhqYSa&r(6!k)!_q6pCh}I&mj!JEtp@Cx$^tT;+^6TEIbmm^VK0_1Xw05;K%8=o4holh0vbw!Vo2JCDExmIaB!Q&yLr4N zwG`C3y}lv@O6XLpztoAd!4j^a>o_heQ#QZdByq#yKFGp2?gVQJTxcF@W3MR}BqRSS zJ|4JAV1@aVoBTPl>yS`#tVti9gU(xCrwwt!l@w?L3F1))5Hs&hN4zu@5(~!eq|vbJ z{p1ubb{xPn9%RBD`~0IG3ksMpgIKOu)|WX6`)C^sz`vKcF@E+I2=UMbFC`CN=(Fq( zE%CCV)M0gB=O1h`STKjXE0-_wD?ncY^qr(|!$q@;(s#82l29MA9HpO+?y174hB!UL z&GX0-2G!7?>8Ml6^a}`~Y?dP9Z`i1OEYb1eS)=L4`<5n1U<~_il$0~SBV&l0zU8&f zCazJWt!wb<>O=Hn4sU7amV?V7^v>AK}XxOj2}tG48MET9PT;5GFW zD|zaeP~%J#Z|wT!7Hbh0NdiM^=42!EFI(P?6cnW0VtLJJb1_Dg8s$VCmv3of)pq;?S_f0V{3v@>R4&Jl5w7(qg!~RCs9bE}FmePrOfcHs|HwfjEeF>Hnf22` z8s;#U#hjrP31^X>hj$akivYxRh@V{+IU;#5_5b@UsyY@W&k;q{|i@F5Eilhbgw^Y|P zBC{xrjNB~g@6M3RB5$-}5Q+DNvEz@xxX&oe&RO%7uWzpiHFh}6FDH*GxTIyVMUf(4 z&5nmKymCAQvnaoAk>6QbRNJU@&HBKiiAZZdYXh_8 zF!ep<%`*LqSFY>)!A~0srqqvdoU`&WrS&9#tThm$U-mY|jFwF8n_pn3hYpGajru%K ztzma6?%kw+x64&>h<&^=E?NX)im#G%Rxmm=axwDGCPO+udp*4Elpoa>ZD|nuEMFY^qGsrPhB#IpR^wcv~zvn_E6Sypknq+Lnaq-N=eM)&Gr-W`V=i}gAh zj98$+qp;kla-jO$$c=COw+XA9${l_i|F<^@@$xD_s= zm+uS0#Kj-t(`5G5c5BV=w;$|+4qcYry}LRdt(p_P+^g z^c5jO&;M*hgqH^|x-z+2Qx~3%Kg%8c`do+JQX^eqcr5v`@r~KAjy4bGtEDo;oaKAf z1ngVwRo5omlG43;2GP13f{!rIsPNh&Y@k+3bo>UpQy&u9mm`Rj2?CwxZ=3z}m_%!1 zs``3g`iAxf^sFTQh@%0~*An298@_lDv2TYJHLR0pEl%8#2gR;|M{}PtPQtoL6HHon zg-1l>GVR48fJ{t1$3=wMEjLjzs_Kb{5-Y!EB!a(iM&f^9`<4DP=fHPzCjqr$46T#q z$Ra*-CRFX)O%}}AC?*ZzAxk_)nqJ1wyTmM|LSjhV$9LirF%9jC^Z8Xu?*9m2|EpsK zcTqE8;twDA?+vV#34Ukqs-?Xk;~c8bP_Si(;<9c!~4QKLdm@)>O?O@|B*e21?nF|7WXFyNVQITsWMDeg5Swfxor#k&vj71f|mDLMTOSk z7#iHrTZ~=0NNop~yhh9Ea+DtG_J{qpjTGbsY$c{xml6+Bbr`C!30vy{wA z*{P4o9}40ysURx5>P)sJ5;-bWx-Rwq+(^3>$&4IW_(Wr_o0y%mbI1|Ep?-Y3%>rV~ z#pY{=G?(%(g>ff?);Y0TX_zF42!+x_oAF^e#$Ri#pxId+9xE zuB_(t8NeMfQj!WS?UxDqNGLG)-|ct8T|686pG_%OS_?)2naLJRoI;}@RndJQ#*ch^ zHSmXS-ZV)qu=oz#(I2O_GX)4TGYS7`#}%b%noL$r34A;HVBpS{euN1b*9?tuV0a#$ zH#IW95l=W6uZUKz4z^uAhPJAhls>O8Pkej6W=hRJIdY7n#s`eJ5i+JDV*BHUj;m{1 zKy6vZVb zVyd4u8CteK!Z$)6nM!n2XwYFA6O1fYXsUd}aEt|`$OtxjwWVo@P-A#%^M%=N{q3-f z1lsQY244eIip9>{w_5+_Xyk4m;XL^=HGQ^ys`xzi&o}E{OKAza5{sGmW3xyCwqxod zw#=+koNnOUPYXQ~NOs&=OR8-AblLKMnGEh4MQ=(J&;6lxD9b#=`G_eC1ruPu&XTcQ z#94Z6Y4!kBCEIf|T*NL)XnxfU1>2a{+S`&pBPg^-6d&{q}oA3HHRBQ9CJ?Q%H0p z{J9Cy7FO7z-slMTX??$Jh z^)qTcR_xZ`P5o10yDaCpN)Wv)TSVDefx1;Aw-JQ(1Bv}0G&WbSibDY_mzjq zj$GgeKx}A2S`?*$A)@K_BS{j3$9vt`#3w_Oaq)o%tX=K?t^GWMH4;o8Sk) zo^1Bmx>TG|S|3UnQ>F%^vzHZ3`hPC~`=9*zVi~3xhD=z~=y7E6`$>&hx#3OO2KL*h z%q@D$uqCIzI3U~U@c7q5-+O*8d;-`3{?g-8q6``8r049?v^0fbD?qYhO(QxhaBWzy z1b*O+1t)BnU7?KhSa}HgI^Ma9t5zT0IdPic!!V5~XSuV`Oe+>XsTaQ;eprRu{VU@^jz9im``#I8WF6wnK@8t$ zy7YwlXgS0`yY4J~NkaM`W_lc0^iJ`;i#F)KsbyOpS&D@;pJ!cV$nP=t*Mu>jfL%2^ z12WjYdCwb38R1N?DsJ?}vDh0^xwJO%Nwq@VB&l1X`OsD5vLB&<-FJ9(I}M?YTDM?D z5QO6q&eQ6XKWPK6^0%!(ecR!}hHl-^&B%Lx@9|Tt9IY+cTQ{%n41KVdW#e@h4k~$vY zD?7|XBp%WqbRwSR^+;B6ocKu8UH6@Z#ZdDd=|lS~Fn=(+g8Ckc0mH>|6Hzl~l@w2I z9#_F}6+jTk(I zN4RXl)%@aY&&$X#l=@}8#)HTJD;_mZ0Prx3<|@q9}g%&5_Aw7QAW8iJQFCNf24ef`45tj zO3Wx2?0_(ty?NmB_r(p-Dfyx(hCH2+oB(p!AB~F-IRxOMaxG~eE*SMn(>=o|7$S~u z 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 z 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 MJk(SyQLqgBKdwp}1poj5 literal 27406 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%0A_%<0lk=iZY?B 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⋙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 Date: Thu, 4 May 2017 16:07:53 -0700 Subject: [PATCH 052/352] Update flightpacks.dm --- code/controllers/subsystem/processing/flightpacks.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem/processing/flightpacks.dm b/code/controllers/subsystem/processing/flightpacks.dm index 1d85811878..0639f64810 100644 --- a/code/controllers/subsystem/processing/flightpacks.dm +++ b/code/controllers/subsystem/processing/flightpacks.dm @@ -5,7 +5,7 @@ PROCESSING_SUBSYSTEM_DEF(flightpacks) stat_tag = "FM" flags = SS_NO_INIT|SS_TICKER|SS_KEEP_TIMING - var/flightsuit_processing = FLIGHTSUIT_PROCESSING_FULL + var/flightsuit_processing = FLIGHTSUIT_PROCESSING_NONE /datum/controller/subsystem/processing/flightpacks/Initialize() sync_flightsuit_processing() From 4140cffc984a4a5a927b338a632e95ccdd4febf4 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 18:08:14 -0500 Subject: [PATCH 053/352] Nuke op TC consoles can donate all TCs at once, and other small changes. --- .../machinery/computer/telecrystalconsoles.dm | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm index 4bb872b347..fd026e4686 100644 --- a/code/game/machinery/computer/telecrystalconsoles.dm +++ b/code/game/machinery/computer/telecrystalconsoles.dm @@ -58,7 +58,12 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E /obj/machinery/computer/telecrystals/uplinker/proc/donateTC(amt, addLog = 1) if(uplinkholder && linkedboss) - if(amt <= uplinkholder.hidden_uplink.telecrystals) + if(amt < 0) + linkedboss.storedcrystals += uplinkholder.hidden_uplink.telecrystals + if(addLog) + linkedboss.logTransfer("[src] donated [uplinkholder.hidden_uplink.telecrystals] telecrystals to [linkedboss].") + uplinkholder.hidden_uplink.telecrystals = 0 + else if(amt <= uplinkholder.hidden_uplink.telecrystals) uplinkholder.hidden_uplink.telecrystals -= amt linkedboss.storedcrystals += amt if(addLog) @@ -66,7 +71,12 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E /obj/machinery/computer/telecrystals/uplinker/proc/giveTC(amt, addLog = 1) if(uplinkholder && linkedboss) - if(amt <= linkedboss.storedcrystals) + if(amt < 0) + uplinkholder.hidden_uplink.telecrystals += linkedboss.storedcrystals + if(addLog) + linkedboss.logTransfer("[src] received [linkedboss.storedcrystals] telecrystals from [linkedboss].") + linkedboss.storedcrystals = 0 + else if(amt <= linkedboss.storedcrystals) uplinkholder.hidden_uplink.telecrystals += amt linkedboss.storedcrystals -= amt if(addLog) @@ -89,7 +99,7 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E if(uplinkholder) dat += "[uplinkholder.hidden_uplink.telecrystals] telecrystals remain in this uplink.
" if(linkedboss) - dat += "Donate TC:
1 | 5" + dat += "Donate TC: 1 | 5 | All" dat += "
Eject Uplink" @@ -103,11 +113,9 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E if(..()) return - if(href_list["donate1"]) - donateTC(1) - - if(href_list["donate5"]) - donateTC(5) + if(href_list["donate"]) + var/tcamt = text2num(href_list["donate"]) + donateTC(tcamt) if(href_list["eject"]) ejectuplink() @@ -162,7 +170,7 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E var/dat = "" dat += "Scan for TC stations.
" - dat += "This [src] has [storedcrystals] telecrystals available for distribution.
" + dat += "[storedcrystals] telecrystals are available for distribution.
" dat += "

" @@ -171,10 +179,10 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E if(A.uplinkholder) dat += "[A.uplinkholder.hidden_uplink.telecrystals] telecrystals." if(storedcrystals) - dat+= "
Add TC: 1 | 5" + dat+= "
Add TC: 1 | 5 | 10 | All" dat += "
" - if(TCstations.len) + if(TCstations.len && storedcrystals) dat += "

Evenly distribute remaining TC.

" @@ -195,13 +203,11 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E if(href_list["scan"]) scanUplinkers() - if(href_list["give1"]) - var/obj/machinery/computer/telecrystals/uplinker/A = locate(href_list["give1"]) - A.giveTC(1) - - if(href_list["give5"]) - var/obj/machinery/computer/telecrystals/uplinker/A = locate(href_list["give5"]) - A.giveTC(5) + if(href_list["give"]) + var/tcamt = text2num(href_list["give"]) + if(TCstations.len) // sanity + var/obj/machinery/computer/telecrystals/uplinker/A = locate(href_list["target"]) in TCstations + A.giveTC(tcamt) if(href_list["distrib"]) var/sanity = 0 From 3b84fcb9c2b37435e7104922caa874f14f51a9c4 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 18:14:23 -0500 Subject: [PATCH 054/352] Playar byound accunt age storid in db --- SQL/database_changelog.txt | 10 +++ SQL/tgstation_schema.sql | 5 +- SQL/tgstation_schema_prefixed.sql | 5 +- code/__HELPERS/bandetect.dm | 37 --------- code/controllers/configuration.dm | 3 + code/modules/client/client_defines.dm | 10 ++- code/modules/client/client_procs.dm | 104 ++++++++++++++---------- code/modules/client/client_procs.dm.rej | 46 +++++++++++ config/config.txt | 4 + tgstation.dme | 1 - 10 files changed, 132 insertions(+), 93 deletions(-) delete mode 100644 code/__HELPERS/bandetect.dm create mode 100644 code/modules/client/client_procs.dm.rej diff --git a/SQL/database_changelog.txt b/SQL/database_changelog.txt index c34c6b694b..d0546da131 100644 --- a/SQL/database_changelog.txt +++ b/SQL/database_changelog.txt @@ -1,3 +1,13 @@ +21 April 2017, by Jordie0608 + +Modified table 'player', adding the column 'accountjoindate', removing the column 'id' and making the column 'ckey' the primary key. + +ALTER TABLE `feedback`.`player` DROP COLUMN `id`, ADD COLUMN `accountjoindate` DATE NULL AFTER `lastadminrank`, DROP PRIMARY KEY, ADD PRIMARY KEY (`ckey`), DROP INDEX `ckey`; + +Remember to add a prefix to the table name if you use them. + +---------------------------------------------------- + 10 March 2017, by Jordie0608 Modified table 'death', adding the columns 'toxloss', 'cloneloss', and 'staminaloss' and table 'legacy_population', adding the columns 'server_ip' and 'server_port'. diff --git a/SQL/tgstation_schema.sql b/SQL/tgstation_schema.sql index 77e9b9429e..0d0817bf1f 100644 --- a/SQL/tgstation_schema.sql +++ b/SQL/tgstation_schema.sql @@ -261,15 +261,14 @@ DROP TABLE IF EXISTS `player`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `player` ( - `id` int(11) NOT NULL AUTO_INCREMENT, `ckey` varchar(32) NOT NULL, `firstseen` datetime NOT NULL, `lastseen` datetime NOT NULL, `ip` int(10) unsigned NOT NULL, `computerid` varchar(32) NOT NULL, `lastadminrank` varchar(32) NOT NULL DEFAULT 'Player', - PRIMARY KEY (`id`), - UNIQUE KEY `ckey` (`ckey`), + `accountjoindate` DATE DEFAULT NULL, + PRIMARY KEY (`ckey`), KEY `idx_player_cid_ckey` (`computerid`,`ckey`), KEY `idx_player_ip_ckey` (`ip`,`ckey`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; diff --git a/SQL/tgstation_schema_prefixed.sql b/SQL/tgstation_schema_prefixed.sql index be27384ea5..4d74b9deaa 100644 --- a/SQL/tgstation_schema_prefixed.sql +++ b/SQL/tgstation_schema_prefixed.sql @@ -261,15 +261,14 @@ DROP TABLE IF EXISTS `SS13_player`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `SS13_player` ( - `id` int(11) NOT NULL AUTO_INCREMENT, `ckey` varchar(32) NOT NULL, `firstseen` datetime NOT NULL, `lastseen` datetime NOT NULL, `ip` int(10) unsigned NOT NULL, `computerid` varchar(32) NOT NULL, `lastadminrank` varchar(32) NOT NULL DEFAULT 'Player', - PRIMARY KEY (`id`), - UNIQUE KEY `ckey` (`ckey`), + `accountjoindate` DATE DEFAULT NULL, + PRIMARY KEY (`ckey`), KEY `idx_player_cid_ckey` (`computerid`,`ckey`), KEY `idx_player_ip_ckey` (`ip`,`ckey`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; diff --git a/code/__HELPERS/bandetect.dm b/code/__HELPERS/bandetect.dm deleted file mode 100644 index 19c0d37838..0000000000 --- a/code/__HELPERS/bandetect.dm +++ /dev/null @@ -1,37 +0,0 @@ -#define YOUNG 4 - - -/client/proc/join_date_check(y,m,d) - var/datum/DBQuery/query_datediff = SSdbcore.NewQuery("SELECT DATEDIFF(Now(),'[y]-[m]-[d]')") - - if(!query_datediff.Execute()) - return FALSE - - if(query_datediff.NextRow()) - var/diff = text2num(query_datediff.item[1]) - if(config.use_account_age_for_jobs) - player_age = max(0,diff) //So job code soesn't freak out if they are time traveling. - if(diff < YOUNG) - var/msg = "(IP: [address], ID: [computer_id]) is a new BYOND account made on [y]-[m]-[d]." - if(diff < 0) - msg += " They are also apparently from the future." - message_admins("[key_name_admin(src)] [msg]") - return TRUE -#undef YOUNG - - -/client/proc/findJoinDate() - var/http[] = world.Export("http://byond.com/members/[src.ckey]?format=text") - if(!http) - log_world("Failed to connect to byond age check for [src.ckey]") - return FALSE - - var/F = file2text(http["CONTENT"]) - if(F) - var/regex/R = regex("joined = \"(\\d{4})-(\\d{2})-(\\d{2})\"") - if(!R.Find(F)) - CRASH("Age check regex failed") - var/y = R.group[1] - var/m = R.group[2] - var/d = R.group[3] - return join_date_check(y,m,d) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index fd3fe6d685..c866d022b3 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -129,6 +129,7 @@ var/forbid_peaceborg = 0 var/panic_bunker = 0 // prevents new people it hasn't seen before from connecting var/notify_new_player_age = 0 // how long do we notify admins of a new player + var/notify_new_player_account_age = 0 // how long do we notify admins of a new byond account var/irc_first_connection_alert = 0 // do we notify the irc channel when somebody is connecting for the first time? var/traitor_scaling_coeff = 6 //how much does the amount of players get divided by to determine traitors @@ -476,6 +477,8 @@ panic_bunker = 1 if("notify_new_player_age") notify_new_player_age = text2num(value) + if("notify_new_player_account_age") + notify_new_player_account_age = text2num(value) if("irc_first_connection_alert") irc_first_connection_alert = 1 if("check_randomizer") diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index 739e0231ca..f4500a700a 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -39,9 +39,11 @@ //////////////////////////////////// //things that require the database// //////////////////////////////////// - var/player_age = "Requires database" //So admins know why it isn't working - Used to determine how old the account is - in days. - var/related_accounts_ip = "Requires database" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this ip - var/related_accounts_cid = "Requires database" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this computer id + var/player_age = -1 //Used to determine how old the account is - in days. + var/related_accounts_ip = "Requires database" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this ip + var/related_accounts_cid = "Requires database" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this computer id + var/account_join_date = null //Date of byond account creation in ISO 8601 format + var/account_age = -1 //Age of byond account in days preload_rsc = PRELOAD_RSC @@ -62,4 +64,4 @@ var/connection_timeofday //world.timeofday they connected var/inprefs = FALSE - var/list/topiclimiter \ No newline at end of file + var/list/topiclimiter diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 4f6642f051..842815e73a 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -410,70 +410,84 @@ GLOBAL_LIST(external_rsc_urls) /client/Destroy() return QDEL_HINT_HARDDEL_NOW -/client/proc/set_client_age_from_db() +/client/proc/set_client_age_from_db(connectiontopic) if (IsGuestKey(src.key)) return - if(!SSdbcore.Connect()) return - var/sql_ckey = sanitizeSQL(src.ckey) - - var/datum/DBQuery/query_get_client_age = SSdbcore.NewQuery("SELECT id, datediff(Now(),firstseen) as age FROM [format_table_name("player")] WHERE ckey = '[sql_ckey]'") - if(!query_get_client_age.Execute()) - return - - while(query_get_client_age.NextRow()) - player_age = text2num(query_get_client_age.item[2]) - return - - //no match mark it as a first connection for use in client/New() - player_age = -1 - - -/client/proc/sync_client_with_db(connectiontopic) - if (IsGuestKey(src.key)) - return - - if (!SSdbcore.Connect()) - return - - var/sql_ckey = sanitizeSQL(ckey) - - var/datum/DBQuery/query_get_ip = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE ip = INET_ATON('[address]') AND ckey != '[sql_ckey]'") - query_get_ip.Execute() + var/datum/DBQuery/query_get_related_ip = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE ip = INET_ATON('[address]') AND ckey != '[sql_ckey]'") + query_get_related_ip.Execute() related_accounts_ip = "" - while(query_get_ip.NextRow()) - related_accounts_ip += "[query_get_ip.item[1]], " - - var/datum/DBQuery/query_get_cid = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE computerid = '[computer_id]' AND ckey != '[sql_ckey]'") - if(!query_get_cid.Execute()) + while(query_get_related_ip.NextRow()) + related_accounts_ip += "[query_get_related_ip.item[1]], " + var/datum/DBQuery/query_get_related_cid = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE computerid = '[computer_id]' AND ckey != '[sql_ckey]'") + if(!query_get_related_cid.Execute()) return related_accounts_cid = "" - while (query_get_cid.NextRow()) - related_accounts_cid += "[query_get_cid.item[1]], " - + while (query_get_related_cid.NextRow()) + related_accounts_cid += "[query_get_related_cid.item[1]], " var/admin_rank = "Player" if (src.holder && src.holder.rank) admin_rank = src.holder.rank.name else if (check_randomizer(connectiontopic)) return - - var/sql_ip = sanitizeSQL(src.address) - var/sql_computerid = sanitizeSQL(src.computer_id) + var/sql_ip = sanitizeSQL(address) + var/sql_computerid = sanitizeSQL(computer_id) var/sql_admin_rank = sanitizeSQL(admin_rank) - - - var/datum/DBQuery/query_log_player = SSdbcore.NewQuery("INSERT INTO [format_table_name("player")] (id, ckey, firstseen, lastseen, ip, computerid, lastadminrank) VALUES (null, '[sql_ckey]', Now(), Now(), INET_ATON('[sql_ip]'), '[sql_computerid]', '[sql_admin_rank]') ON DUPLICATE KEY UPDATE lastseen = VALUES(lastseen), ip = VALUES(ip), computerid = VALUES(computerid), lastadminrank = VALUES(lastadminrank)") - if(!query_log_player.Execute()) + var/new_player + var/datum/DBQuery/query_client_in_db = SSdbcore.NewQuery("SELECT 1 FROM [format_table_name("player")] WHERE ckey = '[sql_ckey]'") + if(!query_client_in_db.Execute()) return - - //Logging player access - + if(!query_client_in_db.NextRow()) + new_player = 1 + account_join_date = sanitizeSQL(findJoinDate()) + var/datum/DBQuery/query_add_player = SSdbcore.NewQuery("INSERT INTO [format_table_name("player")] VALUES ('[sql_ckey]', Now(), Now(), INET_ATON('[sql_ip]'), '[sql_computerid]', '[sql_admin_rank]', [account_join_date ? "'[account_join_date]'" : "NULL"])") + if(!query_add_player.Execute()) + return + if(!account_join_date) + account_join_date = "Error" + account_age = -1 + var/datum/DBQuery/query_get_client_age = SSdbcore.NewQuery("SELECT DATEDIFF(Now(),firstseen), DATEDIFF(Now(),accountjoindate) FROM [format_table_name("player")] WHERE ckey = '[sql_ckey]'") + if(!query_get_client_age.Execute()) + return + if(query_get_client_age.NextRow()) + player_age = text2num(query_get_client_age.item[1]) + if(!account_join_date) + account_age = query_get_client_age.item[2] + if(!account_age) + account_join_date = sanitizeSQL(findJoinDate()) + if(!account_join_date) + account_age = -1 + else + var/datum/DBQuery/query_datediff = SSdbcore.NewQuery("SELECT DATEDIFF(Now(),accountjoindate)") + if(!query_datediff.Execute()) + return + if(query_datediff.NextRow()) + account_age = text2num(query_datediff.item[1]) + if(!new_player) + var/datum/DBQuery/query_log_player = SSdbcore.NewQuery("UPDATE [format_table_name("player")] SET lastseen = Now(), ip = INET_ATON('[sql_ip]'), computerid = '[sql_computerid]', lastadminrank = '[sql_admin_rank]', accountjoindate = [account_join_date ? "'[account_join_date]'" : "NULL"] WHERE ckey = '[sql_ckey]'") + if(!query_log_player.Execute()) + return + if(!account_join_date) + account_join_date = "Error" var/datum/DBQuery/query_log_connection = SSdbcore.NewQuery("INSERT INTO `[format_table_name("connection_log")]` (`id`,`datetime`,`server_ip`,`server_port`,`ckey`,`ip`,`computerid`) VALUES(null,Now(),INET_ATON('[world.internet_address]'),'[world.port]','[sql_ckey]',INET_ATON('[sql_ip]'),'[sql_computerid]')") query_log_connection.Execute() +/client/proc/findJoinDate() + var/list/http = world.Export("http://byond.com/members/[ckey]?format=text") + if(!http) + log_world("Failed to connect to byond age check for [ckey]") + return + var/F = file2text(http["CONTENT"]) + if(F) + var/regex/R = regex("joined = \"(\\d{4}-\\d{2}-\\d{2})\"") + if(R.Find(F)) + . = R.group[1] + else + CRASH("Age check regex failed for [src.ckey]") + /client/proc/check_randomizer(topic) . = FALSE if (connection != "seeker") diff --git a/code/modules/client/client_procs.dm.rej b/code/modules/client/client_procs.dm.rej new file mode 100644 index 0000000000..7c12c8bc58 --- /dev/null +++ b/code/modules/client/client_procs.dm.rej @@ -0,0 +1,46 @@ +diff a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm (rejected hunks) +@@ -266,17 +266,11 @@ GLOBAL_LIST(external_rsc_urls) + if((global.comms_key == "default_pwd" || length(global.comms_key) <= 6) && global.comms_allowed) //It's the default value or less than 6 characters long, but it somehow didn't disable comms. + to_chat(src, "The server's API key is either too short or is the default value! Consider changing it immediately!") + +- add_verbs_from_config() ++ add_verbs_from_config(tdata) + set_client_age_from_db() + var/cached_player_age = player_age //we have to cache this because other shit may change it and we need it's current value now down below. + if (isnum(cached_player_age) && cached_player_age == -1) //first connection +- player_age = 0 +- if(!IsGuestKey(key) && SSdbcore.IsConnected()) +- findJoinDate() +- +- sync_client_with_db(tdata) +- +- ++ player_age = 0 + if (isnum(cached_player_age) && cached_player_age == -1) //first connection + if (config.panic_bunker && !holder && !(ckey in GLOB.deadmins)) + log_access("Failed Login: [key] - New account attempting to connect during panic bunker") +@@ -295,7 +289,14 @@ GLOBAL_LIST(external_rsc_urls) + send2irc_adminless_only("New-user", "[key_name(src)] is connecting for the first time!") + else if (isnum(cached_player_age) && cached_player_age < config.notify_new_player_age) + message_admins("New user: [key_name_admin(src)] just connected with an age of [cached_player_age] day[(player_age==1?"":"s")]") +- ++ if(config.use_account_age_for_jobs && account_age >= 0) ++ player_age = account_age ++ if(account_age >= 0 && account_age < config.notify_new_player_account_age) ++ message_admins("[key_name_admin(src)] (IP: [address], ID: [computer_id]) is a new BYOND account day[(account_age==1?"":"s")] old, created on [account_join_date].") ++ if (config.irc_first_connection_alert) ++ send2irc_adminless_only("new_byond_user", "[key_name(src)] (IP: [address], ID: [computer_id]) is a new BYOND account day[(account_age==1?"":"s")] old, created on [account_join_date].") ++ else //We failed to get an age for this user, let admins know they need to keep an eye on them ++ message_admins("Failed to get BYOND account age for [key_name_admin(src)]") + get_message_output("watchlist entry", ckey) + check_ip_intel() + +@@ -340,7 +341,7 @@ GLOBAL_LIST(external_rsc_urls) + adminGreet(1) + holder.owner = null + GLOB.admins -= src +- ++ + GLOB.ahelp_tickets.ClientLogout(src) + GLOB.directory -= ckey + GLOB.clients -= src diff --git a/config/config.txt b/config/config.txt index 524802219d..945a88c640 100644 --- a/config/config.txt +++ b/config/config.txt @@ -263,6 +263,10 @@ EXTREME_POPCAP_MESSAGE The server is currently serving a high number of users, f ## Requres database NOTIFY_NEW_PLAYER_AGE 0 +## Notify admins when a player connects if their byond account was created in the last X days +## Requires database +NOTIFY_NEW_PLAYER_ACCOUNT_AGE 1 + ## Notify the irc channel when a new player makes their first connection ## Requres database #IRC_FIRST_CONNECTION_ALERT diff --git a/tgstation.dme b/tgstation.dme index 1f3ef27802..654df0635f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -75,7 +75,6 @@ #include "code\__HELPERS\_logging.dm" #include "code\__HELPERS\_string_lists.dm" #include "code\__HELPERS\AStar.dm" -#include "code\__HELPERS\bandetect.dm" #include "code\__HELPERS\cmp.dm" #include "code\__HELPERS\files.dm" #include "code\__HELPERS\flags.dm" From 95495ffbcb97b92a343a541bc40f97b8ead3a86a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 18:21:36 -0500 Subject: [PATCH 055/352] Makes dental implants move through dismemberment --- code/modules/surgery/bodyparts/dismemberment.dm | 16 ++++++++++++++++ code/modules/surgery/bodyparts/head.dm | 5 ++++- code/modules/surgery/dental_implant.dm | 5 ++--- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index de8c2b79ac..60edac1977 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -218,6 +218,14 @@ for(var/X in list(owner.glasses, owner.ears, owner.wear_mask, owner.head)) var/obj/item/I = X owner.dropItemToGround(I, TRUE) + + //Handle dental implants + for(var/datum/action/item_action/hands_free/activate_pill/AP in owner.actions) + AP.Remove(owner) + var/obj/pill = AP.target + if(pill) + pill.forceMove(src) + name = "[owner.real_name]'s head" ..() @@ -300,6 +308,14 @@ C.real_name = real_name real_name = "" name = initial(name) + + //Handle dental implants + for(var/obj/item/weapon/reagent_containers/pill/P in src) + for(var/datum/action/item_action/hands_free/activate_pill/AP in P.actions) + P.forceMove(C) + AP.Grant(C) + break + ..() diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 909f83e4d7..dd63506086 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -48,7 +48,10 @@ brain = null update_icon_dropped() else - I.loc = T + if(istype(I, /obj/item/weapon/reagent_containers/pill)) + for(var/datum/action/item_action/hands_free/activate_pill/AP in I.actions) + qdel(AP) + I.forceMove(T) /obj/item/bodypart/head/update_limb(dropping_limb, mob/living/carbon/source) var/mob/living/carbon/C diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm index eef88e4a5f..c51a49081c 100644 --- a/code/modules/surgery/dental_implant.dm +++ b/code/modules/surgery/dental_implant.dm @@ -18,10 +18,10 @@ user.drop_item() tool.loc = target - var/datum/action/item_action/hands_free/activate_pill/P = new + var/datum/action/item_action/hands_free/activate_pill/P = new(tool) P.button.name = "Activate [tool.name]" P.target = tool - P.Grant(target) + P.Grant(target) //The pill never actually goes in an inventory slot, so the owner doesn't inherit actions from it user.visible_message("[user] wedges \the [tool] into [target]'s [parse_zone(target_zone)]!", "You wedge [tool] into [target]'s [parse_zone(target_zone)].") return 1 @@ -37,6 +37,5 @@ if(target.reagents.total_volume) target.reagents.reaction(owner, INGEST) target.reagents.trans_to(owner, target.reagents.total_volume) - Remove(owner) qdel(target) return 1 \ No newline at end of file From b5a14bb6ab1f35ad03dacf2c249a83bf22236c46 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 18:38:58 -0500 Subject: [PATCH 056/352] New dirt sprites and jungle chasms --- code/game/turfs/simulated/chasm.dm | 18 ++++++++++++++++-- .../turfs/simulated/floor/plating/dirt.dm | 14 ++------------ icons/turf/floors.dmi | Bin 439536 -> 441455 bytes icons/turf/floors/junglechasm.dmi | Bin 0 -> 2461 bytes 4 files changed, 18 insertions(+), 14 deletions(-) create mode 100644 icons/turf/floors/junglechasm.dmi diff --git a/code/game/turfs/simulated/chasm.dm b/code/game/turfs/simulated/chasm.dm index 8890c50129..8b24a4c816 100644 --- a/code/game/turfs/simulated/chasm.dm +++ b/code/game/turfs/simulated/chasm.dm @@ -143,14 +143,14 @@ qdel(S.mmi) qdel(AM) - + if(AM && !QDELETED(AM)) //It's indestructible visible_message("[src] spits out the [AM]!") AM.alpha = oldalpha AM.color = oldcolor AM.transform = oldtransform AM.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1, 10),rand(1, 10)) - + /turf/open/chasm/straight_down/lava_land_surface/normal_air initial_gas_mix = "o2=22;n2=82;TEMP=293.15" @@ -158,3 +158,17 @@ /turf/open/chasm/CanPass(atom/movable/mover, turf/target, height=0) return 1 + + + +//Jungle + +/turf/open/chasm/jungle + icon = 'icons/turf/floors/junglechasm.dmi' + planetary_atmos = TRUE + initial_gas_mix = "o2=14;n2=23;TEMP=300" + +/turf/open/chasm/straight_down/jungle + icon = 'icons/turf/floors/junglechasm.dmi' + planetary_atmos = TRUE + initial_gas_mix = "o2=14;n2=23;TEMP=300" \ No newline at end of file diff --git a/code/game/turfs/simulated/floor/plating/dirt.dm b/code/game/turfs/simulated/floor/plating/dirt.dm index 580aadc85f..0d13b93432 100644 --- a/code/game/turfs/simulated/floor/plating/dirt.dm +++ b/code/game/turfs/simulated/floor/plating/dirt.dm @@ -3,19 +3,9 @@ desc = "Upon closer examination, it's still dirt." icon = 'icons/turf/floors.dmi' icon_state = "dirt" - var/smooth_icon = 'icons/turf/floors/dirt.dmi' - canSmoothWith = list(/turf/closed, /turf/open/floor/plating/dirt) - smooth = SMOOTH_MORE|SMOOTH_BORDER - baseturf = /turf/open/chasm/straight_down/lava_land_surface + baseturf = /turf/open/chasm/straight_down/jungle initial_gas_mix = "o2=14;n2=23;TEMP=300" planetary_atmos = TRUE -/turf/open/floor/plating/dirt/Initialize() - pixel_y = -2 - pixel_x = -2 - icon = smooth_icon - ..() - /turf/open/floor/plating/dirt/dark - icon_state = "darkdirt" - smooth_icon = 'icons/turf/floors/darkdirt.dmi' + icon_state = "greenerdirt" diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index a1cd8fb2f980a81ea68f596698beb96aac6a162e..28bc9e28d372f5b9d4e6bfb19608765fe1ef8add 100644 GIT binary patch delta 21149 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 diff --git a/icons/turf/floors/junglechasm.dmi b/icons/turf/floors/junglechasm.dmi new file mode 100644 index 0000000000000000000000000000000000000000..699a3b667cd9046522b9d291b823e059564e7b07 GIT binary patch literal 2461 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 Date: Thu, 4 May 2017 18:41:04 -0500 Subject: [PATCH 057/352] Fixes say verbs not working --- code/game/gamemodes/clock_cult/clock_mobs.dm | 1 + code/game/machinery/hologram.dm.rej | 44 +++++++++++++++++++ code/game/say.dm | 6 +-- code/modules/mob/dead/observer/say.dm | 2 +- .../mob/living/silicon/ai/freelook/eye.dm | 2 +- .../friendly/drone/extra_drone_types.dm | 1 + .../hostile/megafauna/colossus.dm | 2 +- .../mob/living/simple_animal/slime/say.dm | 2 +- 8 files changed, 53 insertions(+), 7 deletions(-) create mode 100644 code/game/machinery/hologram.dm.rej diff --git a/code/game/gamemodes/clock_cult/clock_mobs.dm b/code/game/gamemodes/clock_cult/clock_mobs.dm index a5e7dee4cb..a86c00e4f6 100644 --- a/code/game/gamemodes/clock_cult/clock_mobs.dm +++ b/code/game/gamemodes/clock_cult/clock_mobs.dm @@ -13,6 +13,7 @@ speak_emote = list("clanks", "clinks", "clunks", "clangs") verb_ask = "requests" verb_exclaim = "proclaims" + verb_whisper = "imparts" verb_yell = "harangues" initial_languages = list(/datum/language/common, /datum/language/ratvar) only_speaks_language = /datum/language/ratvar diff --git a/code/game/machinery/hologram.dm.rej b/code/game/machinery/hologram.dm.rej new file mode 100644 index 0000000000..c1334f9646 --- /dev/null +++ b/code/game/machinery/hologram.dm.rej @@ -0,0 +1,44 @@ +diff a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm (rejected hunks) +@@ -152,7 +152,7 @@ GLOBAL_LIST_EMPTY(holopads) + var/datum/holocall/HC = I + if(HC.connected_holopad == src) + dat += "Disconnect call from [HC.user].
" +- ++ + + var/datum/browser/popup = new(user, "holopad", name, 300, 130) + popup.set_content(dat) +@@ -192,7 +192,7 @@ GLOBAL_LIST_EMPTY(holopads) + if(A) + LAZYADD(callnames[A], I) + callnames -= get_area(src) +- ++ + var/result = input(usr, "Choose an area to call", "Holocall") as null|anything in callnames + if(QDELETED(usr) || !result || outgoing_call) + return +@@ -201,7 +201,7 @@ GLOBAL_LIST_EMPTY(holopads) + temp = "Dialing...
" + temp += "Main Menu" + new /datum/holocall(usr, src, callnames[result]) +- ++ + else if(href_list["connectcall"]) + var/datum/holocall/call_to_connect = locate(href_list["connectcall"]) + if(!QDELETED(call_to_connect)) +@@ -315,12 +315,12 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ + for(var/mob/living/silicon/ai/master in masters) + if(masters[master] && speaker != master) + master.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) +- ++ + for(var/I in holo_calls) + var/datum/holocall/HC = I + if(HC.connected_holopad == src && speaker != HC.hologram) +- HC.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans) +- ++ HC.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) ++ + if(outgoing_call && speaker == outgoing_call.user) + outgoing_call.hologram.say(raw_message) + diff --git a/code/game/say.dm b/code/game/say.dm index deab83ad10..4bcc289be1 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -35,10 +35,10 @@ GLOBAL_LIST_INIT(freqtospan, list( return 1 /atom/movable/proc/send_speech(message, range = 7, obj/source = src, bubble_type, list/spans, datum/language/message_language = null, message_mode) - var/rendered = compose_message(src, message_language, message, , spans) + var/rendered = compose_message(src, message_language, message, , spans, message_mode) for(var/_AM in get_hearers_in_view(range, source)) var/atom/movable/AM = _AM - AM.Hear(rendered, src, message_language, message, , spans) + AM.Hear(rendered, src, message_language, message, , spans, message_mode) //To get robot span classes, stuff like that. /atom/movable/proc/get_spans() @@ -58,7 +58,7 @@ GLOBAL_LIST_INIT(freqtospan, list( var/endspanpart = "" //Message - var/messagepart = " [lang_treat(speaker, message_language, raw_message, spans)]" + var/messagepart = " [lang_treat(speaker, message_language, raw_message, spans, message_mode)]" var/languageicon = "" var/datum/language/D = get_language_instance(message_language) diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm index 8675049cee..0e7f5fcc1e 100644 --- a/code/modules/mob/dead/observer/say.dm +++ b/code/modules/mob/dead/observer/say.dm @@ -20,6 +20,6 @@ to_follow = V.source var/link = FOLLOW_LINK(src, to_follow) // Recompose the message, because it's scrambled by default - message = compose_message(speaker, message_language, raw_message, radio_freq, spans) + message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode) to_chat(src, "[link] [message]") diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index dce38bd664..2d9cf4ec6f 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -106,4 +106,4 @@ /mob/camera/aiEye/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) if(relay_speech && speaker && ai && !radio_freq && speaker != ai && near_camera(speaker)) - ai.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans) + ai.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm index 7cd6567ecb..1507c43912 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm @@ -108,6 +108,7 @@ speak_emote = list("clanks", "clinks", "clunks", "clangs") verb_ask = "requests" verb_exclaim = "proclaims" + verb_whisper = "imparts" verb_yell = "harangues" bubble_icon = "clock" initial_languages = list(/datum/language/common, /datum/language/ratvar) 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 d822a05886..ec76c2176f 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -401,7 +401,7 @@ Difficulty: Very Hard to_chat(user, observer_desc) to_chat(user, "It is activated by [activation_method].") -/obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans) +/obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode) ..() if(isliving(speaker)) ActivationReaction(speaker, ACTIVATE_SPEECH) diff --git a/code/modules/mob/living/simple_animal/slime/say.dm b/code/modules/mob/living/simple_animal/slime/say.dm index ae7c14068f..60a25f90b7 100644 --- a/code/modules/mob/living/simple_animal/slime/say.dm +++ b/code/modules/mob/living/simple_animal/slime/say.dm @@ -1,4 +1,4 @@ -/mob/living/simple_animal/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans) +/mob/living/simple_animal/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode) if(speaker != src && !radio_freq && !stat) if (speaker in Friends) speech_buffer = list() From 067e0b46edadc59a733dcc46bd815231a7ab6688 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 19:45:08 -0500 Subject: [PATCH 058/352] Removes changeling genetic damage --- .../gamemodes/changeling/changeling_power.dm | 11 +---------- .../gamemodes/changeling/powers/absorb.dm | 1 - .../gamemodes/changeling/powers/biodegrade.dm | 3 --- .../changeling/powers/chameleon_skin.dm | 3 --- .../gamemodes/changeling/powers/fakedeath.dm | 2 -- .../gamemodes/changeling/powers/humanform.dm | 3 --- .../gamemodes/changeling/powers/lesserform.dm | 1 - .../gamemodes/changeling/powers/linglink.dm | 1 - .../gamemodes/changeling/powers/mutations.dm | 19 +++---------------- .../gamemodes/changeling/powers/tiny_prick.dm | 10 +++------- .../gamemodes/changeling/powers/transform.dm | 1 - 11 files changed, 7 insertions(+), 48 deletions(-) diff --git a/code/game/gamemodes/changeling/changeling_power.dm b/code/game/gamemodes/changeling/changeling_power.dm index 67eb216d58..489228a30c 100644 --- a/code/game/gamemodes/changeling/changeling_power.dm +++ b/code/game/gamemodes/changeling/changeling_power.dm @@ -13,8 +13,6 @@ var/req_dna = 0 //amount of dna needed to use this ability. Changelings always have atleast 1 var/req_human = 0 //if you need to be human to use this ability var/req_stat = CONSCIOUS // CONSCIOUS, UNCONSCIOUS or DEAD - var/genetic_damage = 0 // genetic damage caused by using the sting. Nothing to do with cloneloss. - var/max_genetic_damage = 100 // hard counter for spamming abilities. Not used/balanced much yet. var/always_keep = 0 // important for abilities like revive that screw you if you lose them. var/ignores_fakedeath = FALSE // usable with the FAKEDEATH flag @@ -39,7 +37,7 @@ if(sting_action(user, target)) SSblackbox.add_details("changeling_powers",name) sting_feedback(user, target) - take_chemical_cost(c) + c.chem_charges -= chemical_cost /obj/effect/proc_holder/changeling/proc/sting_action(mob/user, mob/target) return 0 @@ -47,10 +45,6 @@ /obj/effect/proc_holder/changeling/proc/sting_feedback(mob/user, mob/target) return 0 -/obj/effect/proc_holder/changeling/proc/take_chemical_cost(datum/changeling/changeling) - changeling.chem_charges -= chemical_cost - changeling.geneticdamage += genetic_damage - //Fairly important to remember to return 1 on success >.< /obj/effect/proc_holder/changeling/proc/can_sting(mob/user, mob/target) if(!ishuman(user) && !ismonkey(user)) //typecast everything from mob to carbon from this point onwards @@ -71,9 +65,6 @@ if((user.status_flags & FAKEDEATH) && (!ignores_fakedeath)) to_chat(user, "We are incapacitated.") return 0 - if(c.geneticdamage > max_genetic_damage) - to_chat(user, "Our genomes are still reassembling. We need time to recover first.") - return 0 return 1 //used in /mob/Stat() diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm index 6a52ab9312..b6b3372ae3 100644 --- a/code/game/gamemodes/changeling/powers/absorb.dm +++ b/code/game/gamemodes/changeling/powers/absorb.dm @@ -4,7 +4,6 @@ chemical_cost = 0 dna_cost = 0 req_human = 1 - max_genetic_damage = 100 /obj/effect/proc_holder/changeling/absorbDNA/can_sting(mob/living/carbon/user) if(!..()) diff --git a/code/game/gamemodes/changeling/powers/biodegrade.dm b/code/game/gamemodes/changeling/powers/biodegrade.dm index 453dec9375..6e2d6b0ddd 100644 --- a/code/game/gamemodes/changeling/powers/biodegrade.dm +++ b/code/game/gamemodes/changeling/powers/biodegrade.dm @@ -5,9 +5,6 @@ chemical_cost = 30 //High cost to prevent spam dna_cost = 2 req_human = 1 - genetic_damage = 10 - max_genetic_damage = 0 - /obj/effect/proc_holder/changeling/biodegrade/sting_action(mob/living/carbon/human/user) var/used = FALSE // only one form of shackles removed per use diff --git a/code/game/gamemodes/changeling/powers/chameleon_skin.dm b/code/game/gamemodes/changeling/powers/chameleon_skin.dm index 1f18f628a8..3be5103105 100644 --- a/code/game/gamemodes/changeling/powers/chameleon_skin.dm +++ b/code/game/gamemodes/changeling/powers/chameleon_skin.dm @@ -5,9 +5,6 @@ dna_cost = 2 chemical_cost = 25 req_human = 1 - genetic_damage = 10 - max_genetic_damage = 50 - /obj/effect/proc_holder/changeling/chameleon_skin/sting_action(mob/user) var/mob/living/carbon/human/H = user //SHOULD always be human, because req_human = 1 diff --git a/code/game/gamemodes/changeling/powers/fakedeath.dm b/code/game/gamemodes/changeling/powers/fakedeath.dm index 798f8030e0..e35f04d9e7 100644 --- a/code/game/gamemodes/changeling/powers/fakedeath.dm +++ b/code/game/gamemodes/changeling/powers/fakedeath.dm @@ -5,8 +5,6 @@ dna_cost = 0 req_dna = 1 req_stat = DEAD - max_genetic_damage = 100 - //Fake our own death and fully heal. You will appear to be dead but regenerate fully after a short delay. /obj/effect/proc_holder/changeling/fakedeath/sting_action(mob/living/user) diff --git a/code/game/gamemodes/changeling/powers/humanform.dm b/code/game/gamemodes/changeling/powers/humanform.dm index 743dbc91e9..d92e622c2d 100644 --- a/code/game/gamemodes/changeling/powers/humanform.dm +++ b/code/game/gamemodes/changeling/powers/humanform.dm @@ -2,10 +2,7 @@ name = "Human Form" desc = "We change into a human." chemical_cost = 5 - genetic_damage = 3 req_dna = 1 - max_genetic_damage = 3 - //Transform into a human. /obj/effect/proc_holder/changeling/humanform/sting_action(mob/living/carbon/user) diff --git a/code/game/gamemodes/changeling/powers/lesserform.dm b/code/game/gamemodes/changeling/powers/lesserform.dm index 538803de00..06824f9bed 100644 --- a/code/game/gamemodes/changeling/powers/lesserform.dm +++ b/code/game/gamemodes/changeling/powers/lesserform.dm @@ -3,7 +3,6 @@ desc = "We debase ourselves and become lesser. We become a monkey." chemical_cost = 5 dna_cost = 1 - genetic_damage = 3 req_human = 1 //Transform into a monkey. diff --git a/code/game/gamemodes/changeling/powers/linglink.dm b/code/game/gamemodes/changeling/powers/linglink.dm index fc4b91b650..232774c937 100644 --- a/code/game/gamemodes/changeling/powers/linglink.dm +++ b/code/game/gamemodes/changeling/powers/linglink.dm @@ -4,7 +4,6 @@ chemical_cost = 0 dna_cost = 0 req_human = 1 - max_genetic_damage = 100 /obj/effect/proc_holder/changeling/linglink/can_sting(mob/living/carbon/user) if(!..()) diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm index 54e8ea1e38..aef9b6f1d2 100644 --- a/code/game/gamemodes/changeling/powers/mutations.dm +++ b/code/game/gamemodes/changeling/powers/mutations.dm @@ -16,7 +16,6 @@ helptext = "Yell at Miauw and/or Perakp" chemical_cost = 1000 dna_cost = -1 - genetic_damage = 1000 var/silent = FALSE var/weapon_type @@ -67,7 +66,6 @@ helptext = "Yell at Miauw and/or Perakp" chemical_cost = 1000 dna_cost = -1 - genetic_damage = 1000 var/helmet_type = /obj/item var/suit_type = /obj/item @@ -89,7 +87,7 @@ return 1 var/mob/living/carbon/human/H = user if(istype(H.wear_suit, suit_type) || istype(H.head, helmet_type)) - H.visible_message("[H] casts off their [suit_name_simple]!", "We cast off our [suit_name_simple][genetic_damage > 0 ? ", temporarily weakening our genomes." : "."]", "You hear the organic matter ripping and tearing!") + H.visible_message("[H] casts off their [suit_name_simple]!", "We cast off our [suit_name_simple].", "You hear the organic matter ripping and tearing!") H.temporarilyRemoveItemFromInventory(H.head, TRUE) //The qdel on dropped() takes care of it H.temporarilyRemoveItemFromInventory(H.wear_suit, TRUE) H.update_inv_wear_suit() @@ -100,7 +98,6 @@ H.add_splatter_floor() playsound(H.loc, 'sound/effects/splat.ogg', 50, 1) //So real sounds - changeling.geneticdamage += genetic_damage //Casting off a space suit leaves you weak for a few seconds. changeling.chem_recharge_slowdown -= recharge_slowdown return 1 @@ -139,9 +136,7 @@ helptext = "We may retract our armblade in the same manner as we form it. Cannot be used while in lesser form." chemical_cost = 20 dna_cost = 2 - genetic_damage = 10 req_human = 1 - max_genetic_damage = 20 weapon_type = /obj/item/weapon/melee/arm_blade weapon_name_simple = "blade" @@ -217,9 +212,7 @@ and Harm will stun it, and stab it if we're also holding a sharp weapon. Cannot be used while in lesser form." chemical_cost = 10 dna_cost = 2 - genetic_damage = 5 req_human = 1 - max_genetic_damage = 10 weapon_type = /obj/item/weapon/gun/magic/tentacle weapon_name_simple = "tentacle" silent = TRUE @@ -381,9 +374,7 @@ helptext = "Organic tissue cannot resist damage forever; the shield will break after it is hit too much. The more genomes we absorb, the stronger it is. Cannot be used while in lesser form." chemical_cost = 20 dna_cost = 1 - genetic_damage = 12 req_human = 1 - max_genetic_damage = 20 weapon_type = /obj/item/weapon/shield/changeling weapon_name_simple = "shield" @@ -430,12 +421,10 @@ /obj/effect/proc_holder/changeling/suit/organic_space_suit name = "Organic Space Suit" desc = "We grow an organic suit to protect ourselves from space exposure." - helptext = "We must constantly repair our form to make it space-proof, reducing chemical production while we are protected. Retreating the suit damages our genomes. Cannot be used in lesser form." + helptext = "We must constantly repair our form to make it space-proof, reducing chemical production while we are protected. Cannot be used in lesser form." chemical_cost = 20 dna_cost = 2 - genetic_damage = 8 req_human = 1 - max_genetic_damage = 20 suit_type = /obj/item/clothing/suit/space/changeling helmet_type = /obj/item/clothing/head/helmet/space/changeling @@ -477,12 +466,10 @@ /obj/effect/proc_holder/changeling/suit/armor name = "Chitinous Armor" desc = "We turn our skin into tough chitin to protect us from damage." - helptext = "Upkeep of the armor requires a low expenditure of chemicals. The armor is strong against brute force, but does not provide much protection from lasers. Retreating the armor damages our genomes. Cannot be used in lesser form." + helptext = "Upkeep of the armor requires a low expenditure of chemicals. The armor is strong against brute force, but does not provide much protection from lasers. Cannot be used in lesser form." chemical_cost = 20 dna_cost = 1 - genetic_damage = 11 req_human = 1 - max_genetic_damage = 20 recharge_slowdown = 0.25 suit_type = /obj/item/clothing/suit/armor/changeling diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm index c44a32c24d..ad6bf81e7c 100644 --- a/code/game/gamemodes/changeling/powers/tiny_prick.dm +++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm @@ -40,10 +40,9 @@ return if(!AStar(user, target.loc, /turf/proc/Distance, user.mind.changeling.sting_range, simulated_only = 0)) return - if(target.mind && target.mind.changeling) - sting_feedback(user,target) - take_chemical_cost(user.mind.changeling) - return + if(target.mind && target.mind.changeling) + sting_feedback(user, target) + user.mind.changeling.chem_charges -= chemical_cost return 1 /obj/effect/proc_holder/changeling/sting/sting_feedback(mob/user, mob/target) @@ -62,7 +61,6 @@ sting_icon = "sting_transform" chemical_cost = 40 dna_cost = 3 - genetic_damage = 100 var/datum/changelingprofile/selected_dna = null /obj/effect/proc_holder/changeling/sting/transformation/Click() @@ -117,8 +115,6 @@ sting_icon = "sting_armblade" chemical_cost = 20 dna_cost = 1 - genetic_damage = 20 - max_genetic_damage = 10 /obj/item/weapon/melee/arm_blade/false desc = "A grotesque mass of flesh that used to be your arm. Although it looks dangerous at first, you can tell it's actually quite dull and useless." diff --git a/code/game/gamemodes/changeling/powers/transform.dm b/code/game/gamemodes/changeling/powers/transform.dm index f9aca83d04..9d0b095cc2 100644 --- a/code/game/gamemodes/changeling/powers/transform.dm +++ b/code/game/gamemodes/changeling/powers/transform.dm @@ -5,7 +5,6 @@ dna_cost = 0 req_dna = 1 req_human = 1 - max_genetic_damage = 3 /obj/item/clothing/glasses/changeling name = "flesh" From 5de94c22e7c8dae66d7a3ea3b1a37e179d796a09 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 20:25:46 -0500 Subject: [PATCH 059/352] Fixes grammar error on spawner grenades --- code/game/objects/items/weapons/grenades/spawnergrenade.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade.dm b/code/game/objects/items/weapons/grenades/spawnergrenade.dm index 2d5c4707a6..86c01d745e 100644 --- a/code/game/objects/items/weapons/grenades/spawnergrenade.dm +++ b/code/game/objects/items/weapons/grenades/spawnergrenade.dm @@ -1,5 +1,5 @@ /obj/item/weapon/grenade/spawnergrenade - desc = "It will unleash unleash an unspecified anomaly into the vicinity." + desc = "It will unleash an unspecified anomaly into the vicinity." name = "delivery grenade" icon = 'icons/obj/grenade.dmi' icon_state = "delivery" From 01d80a0cc073bfd5dbc709256e8a7fd37319bfc9 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 20:40:05 -0500 Subject: [PATCH 060/352] Takes out an airlock in xenobiology's kill room [Pubby] --- _maps/map_files/PubbyStation/PubbyStation.dmm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index e0e721840d..8310ff2f50 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -32850,10 +32850,6 @@ /turf/open/floor/plasteel/white, /area/toxins/xenobiology) "bnU" = ( -/obj/machinery/door/airlock/research{ - name = "Kill Room Access"; - req_access_txt = "55" - }, /obj/structure/disposalpipe/segment{ dir = 4 }, From 73bef0b6c8fa966ba294ff52e0a5b474d121724e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 20:40:09 -0500 Subject: [PATCH 061/352] Fixes the most annoying thing about admin helping. --- code/modules/admin/verbs/adminpm.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index df59c1a7bb..eb3e24265c 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -103,6 +103,7 @@ if(!recipient) if(holder) to_chat(src, "Error: Admin-PM: Client not found.") + to_chat(src, msg) else current_ticket.MessageNoRecipient(msg) return From d67618815c77a0f90fb3efefb4b72399a72266a8 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 20:59:29 -0500 Subject: [PATCH 062/352] Mobs that are faking death won't bleed. --- code/modules/mob/living/blood.dm | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index ca380170f7..ca8b8f2d9d 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -35,22 +35,21 @@ blood_volume += 0.1 // regenerate blood VERY slowly //Effects of bloodloss + var/word = pick("dizzy","woozy","faint") switch(blood_volume) if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE) if(prob(5)) - to_chat(src, "You feel [pick("dizzy","woozy","faint")].") + to_chat(src, "You feel [word].") adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.01, 1)) if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY) adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1)) if(prob(5)) blur_eyes(6) - var/word = pick("dizzy","woozy","faint") to_chat(src, "You feel very [word].") if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD) adjustOxyLoss(5) if(prob(15)) Paralyse(rand(1,3)) - var/word = pick("dizzy","woozy","faint") to_chat(src, "You feel extremely [word].") if(0 to BLOOD_VOLUME_SURVIVE) death() @@ -70,7 +69,7 @@ bleed_rate = max(bleed_rate - 0.5, temp_bleed)//if no wounds, other bleed effects (heparin) naturally decreases - if(bleed_rate && !bleedsuppress) + if(bleed_rate && !bleedsuppress && !(status_flags & FAKEDEATH)) bleed(bleed_rate) //Makes a blood drop, leaking amt units of blood from the mob From 1da6f676f0965c00f9c588bc90e6adf7ffb8552b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 20:59:33 -0500 Subject: [PATCH 063/352] Fixes SM Tesla admin log spam, adds containment field count to investigate logs. --- code/modules/power/tesla/energy_ball.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index fbb82cb36a..df3fcdcfe2 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -54,6 +54,11 @@ GLOBAL_LIST_INIT(blacklisted_tesla_types, typecacheof(list(/obj/machinery/atmosp . = ..() +/obj/singularity/energy_ball/admin_investigate_setup() + if(istype(loc, /obj/singularity/energy_ball)) + return + ..() + /obj/singularity/energy_ball/process() if(!orbiting) handle_energy() From aa13c4f148a50f9bb806b333c93bec00e085d43b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 23:16:48 -0500 Subject: [PATCH 064/352] Corrects docking port name for escape pods --- _maps/map_files/Cerestation/cerestation.dmm | 18 +++++++------- .../map_files/Deltastation/DeltaStation2.dmm | 18 +++++++------- _maps/map_files/MetaStation/MetaStation.dmm | 24 +++++++++---------- _maps/map_files/TgStation/tgstation.2.1.3.dmm | 24 +++++++++---------- 4 files changed, 42 insertions(+), 42 deletions(-) diff --git a/_maps/map_files/Cerestation/cerestation.dmm b/_maps/map_files/Cerestation/cerestation.dmm index f10211f5b1..860ff65d60 100644 --- a/_maps/map_files/Cerestation/cerestation.dmm +++ b/_maps/map_files/Cerestation/cerestation.dmm @@ -7034,8 +7034,8 @@ "anI" = ( /obj/docking_port/stationary/random{ dir = 1; - id = "pod_asteroid1"; - name = "asteroid" + id = "pod_lavaland1"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -8103,7 +8103,7 @@ /obj/machinery/computer/shuttle/pod{ pixel_x = -32; pixel_y = 0; - possible_destinations = "pod_asteroid1"; + possible_destinations = "pod_lavaland1"; shuttleId = "pod1" }, /obj/machinery/light/small{ @@ -40738,7 +40738,7 @@ /obj/machinery/computer/shuttle/pod{ pixel_x = 0; pixel_y = 32; - possible_destinations = "pod_asteroid3"; + possible_destinations = "pod_lavaland3"; shuttleId = "pod3" }, /obj/item/device/radio/intercom{ @@ -40760,8 +40760,8 @@ "btw" = ( /obj/docking_port/stationary/random{ dir = 4; - id = "pod_asteroid3"; - name = "asteroid" + id = "pod_lavaland3"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -68963,8 +68963,8 @@ "crd" = ( /obj/docking_port/stationary/random{ dir = 8; - id = "pod_asteroid2"; - name = "asteroid" + id = "pod_lavaland2"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -68979,7 +68979,7 @@ /obj/machinery/computer/shuttle/pod{ pixel_x = 0; pixel_y = -32; - possible_destinations = "pod_asteroid2"; + possible_destinations = "pod_lavaland2"; shuttleId = "pod2" }, /obj/structure/chair{ diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index c46f6ea830..db3e3e780d 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -142,15 +142,15 @@ /area/solar/auxstarboard) "aap" = ( /obj/docking_port/stationary/random{ - id = "pod_asteroid1"; - name = "asteroid" + id = "pod_lavaland1"; + name = "lavaland" }, /turf/open/space, /area/space) "aaq" = ( /obj/docking_port/stationary/random{ - id = "pod_asteroid2"; - name = "asteroid" + id = "pod_lavaland2"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -203,7 +203,7 @@ }, /obj/machinery/computer/shuttle/pod{ pixel_x = -32; - possible_destinations = "pod_asteroid1"; + possible_destinations = "pod_lavaland1"; shuttleId = "pod1" }, /obj/effect/turf_decal/stripes/line{ @@ -226,7 +226,7 @@ }, /obj/machinery/computer/shuttle/pod{ pixel_x = -32; - possible_destinations = "pod_asteroid2"; + possible_destinations = "pod_lavaland2"; shuttleId = "pod2" }, /obj/effect/turf_decal/stripes/line{ @@ -25977,7 +25977,7 @@ }, /obj/machinery/computer/shuttle/pod{ pixel_y = -32; - possible_destinations = "pod_asteroid3"; + possible_destinations = "pod_lavaland3"; shuttleId = "pod3" }, /obj/effect/turf_decal/stripes/line{ @@ -25996,8 +25996,8 @@ "aXK" = ( /obj/docking_port/stationary/random{ dir = 4; - id = "pod_asteroid4"; - name = "asteroid" + id = "pod_lavaland4"; + name = "lavaland" }, /turf/open/space, /area/space) diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 320823a490..9d5c5ac3f0 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -1910,8 +1910,8 @@ /area/shuttle/pod_3) "adG" = ( /obj/docking_port/stationary/random{ - id = "pod_asteroid2"; - name = "asteroid" + id = "pod_lavaland2"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -1927,7 +1927,7 @@ }, /obj/machinery/computer/shuttle/pod{ pixel_x = -32; - possible_destinations = "pod_asteroid2"; + possible_destinations = "pod_lavaland2"; shuttleId = "pod2" }, /turf/open/floor/mineral/titanium/blue, @@ -23696,7 +23696,7 @@ }, /obj/machinery/computer/shuttle/pod{ pixel_y = -32; - possible_destinations = "pod_asteroid3"; + possible_destinations = "pod_lavaland3"; shuttleId = "pod3" }, /turf/open/floor/mineral/titanium/blue, @@ -34140,8 +34140,8 @@ "bii" = ( /obj/docking_port/stationary/random{ dir = 4; - id = "pod_asteroid3"; - name = "asteroid" + id = "pod_lavaland3"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -86084,8 +86084,8 @@ /area/toxins/xenobiology) "cSP" = ( /obj/docking_port/stationary/random{ - id = "pod_asteroid1"; - name = "asteroid" + id = "pod_lavaland1"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -86175,7 +86175,7 @@ }, /obj/machinery/computer/shuttle/pod{ pixel_x = -32; - possible_destinations = "pod_asteroid1"; + possible_destinations = "pod_lavaland1"; shuttleId = "pod1" }, /turf/open/floor/mineral/titanium/blue, @@ -86368,7 +86368,7 @@ }, /obj/machinery/computer/shuttle/pod{ pixel_y = -32; - possible_destinations = "pod_asteroid4"; + possible_destinations = "pod_lavaland4"; shuttleId = "pod4" }, /turf/open/floor/mineral/titanium/blue, @@ -87162,8 +87162,8 @@ "cUL" = ( /obj/docking_port/stationary/random{ dir = 4; - id = "pod_asteroid4"; - name = "asteroid" + id = "pod_lavaland4"; + name = "lavaland" }, /turf/open/space, /area/space) diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index f2bf5eb504..799d9530cb 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -2501,7 +2501,7 @@ "afq" = ( /obj/machinery/computer/shuttle/pod{ pixel_y = -32; - possible_destinations = "pod_asteroid3"; + possible_destinations = "pod_lavaland3"; shuttleId = "pod3" }, /obj/structure/chair{ @@ -7787,8 +7787,8 @@ "aqG" = ( /obj/docking_port/stationary/random{ dir = 4; - id = "pod_asteroid3"; - name = "asteroid" + id = "pod_lavaland3"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -53823,8 +53823,8 @@ "cpe" = ( /obj/docking_port/stationary/random{ dir = 8; - id = "pod_asteroid2"; - name = "asteroid" + id = "pod_lavaland2"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -54079,7 +54079,7 @@ /obj/machinery/computer/shuttle/pod{ pixel_x = 0; pixel_y = -32; - possible_destinations = "pod_asteroid2"; + possible_destinations = "pod_lavaland2"; shuttleId = "pod2" }, /obj/structure/chair{ @@ -57394,8 +57394,8 @@ "cwV" = ( /obj/docking_port/stationary/random{ dir = 8; - id = "pod_asteroid1"; - name = "asteroid" + id = "pod_lavaland1"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -57508,7 +57508,7 @@ /obj/machinery/computer/shuttle/pod{ pixel_x = 0; pixel_y = -32; - possible_destinations = "pod_asteroid1"; + possible_destinations = "pod_lavaland1"; shuttleId = "pod1" }, /obj/structure/chair{ @@ -58424,7 +58424,7 @@ "czL" = ( /obj/machinery/computer/shuttle/pod{ pixel_y = -32; - possible_destinations = "pod_asteroid4"; + possible_destinations = "pod_lavaland4"; shuttleId = "pod4" }, /obj/structure/chair{ @@ -58455,8 +58455,8 @@ "czN" = ( /obj/docking_port/stationary/random{ dir = 4; - id = "pod_asteroid4"; - name = "asteroid" + id = "pod_lavaland4"; + name = "lavaland" }, /turf/open/space, /area/space) From 745c74c18bf9759e4f53cf86712c87d1a63c20b2 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 00:04:35 -0500 Subject: [PATCH 065/352] Fixes spinning (Woops I used a <= instead of a <) --- code/modules/mob/mob.dm.rej | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 code/modules/mob/mob.dm.rej diff --git a/code/modules/mob/mob.dm.rej b/code/modules/mob/mob.dm.rej new file mode 100644 index 0000000000..6cfe50706e --- /dev/null +++ b/code/modules/mob/mob.dm.rej @@ -0,0 +1,10 @@ +diff a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm (rejected hunks) +@@ -350,7 +350,7 @@ + /mob/proc/spin(spintime, speed) + set waitfor = 0 + var/D = dir +- if((spintime <= 1)||(speed <= 1)||!spintime||!speed) ++ if((spintime < 1)||(speed < 1)||!spintime||!speed) + return + while(spintime >= speed) + sleep(speed) From 933a8646bae7db35d8b3ab5affdcc9942bcf040e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 06:05:05 -0500 Subject: [PATCH 066/352] Only one successful Gang Tool recall per gang --- code/game/gamemodes/gang/gang_datum.dm | 3 ++- code/game/gamemodes/gang/recaller.dm | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/gang/gang_datum.dm b/code/game/gamemodes/gang/gang_datum.dm index 3c54d5436b..805cac552f 100644 --- a/code/game/gamemodes/gang/gang_datum.dm +++ b/code/game/gamemodes/gang/gang_datum.dm @@ -13,6 +13,7 @@ var/list/territory = list() var/list/territory_new = list() var/list/territory_lost = list() + var/recalls = 1 var/dom_attempts = 2 var/points = 15 var/datum/atom_hud/antag/gang/ganghud @@ -262,4 +263,4 @@ ganghud = new() /datum/gang/multiverse/income() - return \ No newline at end of file + return diff --git a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm index 0885b32612..f67bcad50a 100644 --- a/code/game/gamemodes/gang/recaller.dm +++ b/code/game/gamemodes/gang/recaller.dm @@ -168,6 +168,9 @@ if(recalling) to_chat(usr, "Error: Recall already in progress.") return 0 + + if(!gang.recalls) + to_chat(usr, "Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts.") gang.message_gangtools("[usr] is attempting to recall the emergency shuttle.") recalling = 1 @@ -209,6 +212,7 @@ userturf = get_turf(user) if(userturf.z == 1) //Check one more time that they are on station. if(SSshuttle.cancelEvac(user)) + gang.recalls -= 1 return 1 to_chat(loc, "\icon[src]No response recieved. Emergency shuttle cannot be recalled at this time.") From 9b3aaa45261a6a3b90ee30d48dbadd82d382511b Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 5 May 2017 09:36:27 -0500 Subject: [PATCH 067/352] merge --- code/world.dm | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/code/world.dm b/code/world.dm index 7af27a1504..4f89299b6f 100644 --- a/code/world.dm +++ b/code/world.dm @@ -136,11 +136,7 @@ if(!key_valid) return "Bad Key" else -#define CHAT_PULLR 64 //defined in preferences.dm, but not available here at compilation time - for(var/client/C in GLOB.clients) - if(C.prefs && (C.prefs.chat_toggles & CHAT_PULLR)) - to_chat(C, "PR: [input["announce"]]") -#undef CHAT_PULLR + AnnouncePR(input["announce"], json_decode(input["payload"])) else if("crossmessage" in input) if(!key_valid) @@ -176,6 +172,25 @@ else if("server_hop" in input) show_server_hop_transfer_screen(input["server_hop"]) +#define PR_ANNOUNCEMENTS_PER_ROUND 5 //The number of unique PR announcements allowed per round + //This makes sure that a single person can only spam 3 reopens and 3 closes before being ignored + +/world/proc/AnnouncePR(announcement, list/payload) + var/static/list/PRcounts = list() //PR id -> number of times announced this round + var/id = "[payload["pull_request"]["id"]]" + if(!PRcounts[id]) + PRcounts[id] = 1 + else + ++PRcounts[id] + if(PRcounts[id] > PR_ANNOUNCEMENTS_PER_ROUND) + return + +#define CHAT_PULLR 64 //defined in preferences.dm, but not available here at compilation time + for(var/client/C in GLOB.clients) + if(C.prefs && (C.prefs.chat_toggles & CHAT_PULLR)) + C << "PR: [announcement]" +#undef CHAT_PULLR + #define WORLD_REBOOT(X) log_world("World rebooted at [time_stamp()]"); ..(X); return; /world/Reboot(var/reason, var/feedback_c, var/feedback_r, var/time) if (reason == 1) //special reboot, do none of the normal stuff From c3f2e0830480c15245d55b3c402a38329188bbbb Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 09:39:20 -0500 Subject: [PATCH 068/352] Automatic changelog generation for PR #708 [ci skip] --- html/changelogs/AutoChangeLog-pr-708.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-708.yml diff --git a/html/changelogs/AutoChangeLog-pr-708.yml b/html/changelogs/AutoChangeLog-pr-708.yml new file mode 100644 index 0000000000..6cb7c07312 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-708.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "Squishy plants will now affect walls and other turfs they get squished on" From 5d82e4e729fe4ed9c42efca757547748fe55a54a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 09:39:55 -0500 Subject: [PATCH 069/352] Automatic changelog generation for PR #714 [ci skip] --- html/changelogs/AutoChangeLog-pr-714.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-714.yml diff --git a/html/changelogs/AutoChangeLog-pr-714.yml b/html/changelogs/AutoChangeLog-pr-714.yml new file mode 100644 index 0000000000..d5e4582f40 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-714.yml @@ -0,0 +1,4 @@ +author: "XDTM" +delete-after: True +changes: + - tweak: "Blood Cult's talisman of Horrors now works at range. It will still give no warning to the victim." From f902c11f3be28daa0ee88f31dd6948d7214266fe Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 09:40:09 -0500 Subject: [PATCH 070/352] Automatic changelog generation for PR #717 [ci skip] --- html/changelogs/AutoChangeLog-pr-717.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-717.yml diff --git a/html/changelogs/AutoChangeLog-pr-717.yml b/html/changelogs/AutoChangeLog-pr-717.yml new file mode 100644 index 0000000000..fbb98e0039 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-717.yml @@ -0,0 +1,5 @@ +author: "coiax" +delete-after: True +changes: + - rscadd: "When talking on the alien hivemind, a person will be identified by +their real name, rather than who they are disguised as." From fbdbd67f1d7c8de1909f3c78a9ef6407949d7055 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 09:45:32 -0500 Subject: [PATCH 071/352] Automatic changelog generation for PR #771 [ci skip] --- html/changelogs/AutoChangeLog-pr-771.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-771.yml diff --git a/html/changelogs/AutoChangeLog-pr-771.yml b/html/changelogs/AutoChangeLog-pr-771.yml new file mode 100644 index 0000000000..031ec64151 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-771.yml @@ -0,0 +1,4 @@ +author: "BeeSting12" +delete-after: True +changes: + - bugfix: "Pubbystation no longer has two airlocks stacked on top of each other leading into xenobiology's kill room." From 20f3280c96db8a9a263b370d0b8f66edb91105b4 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 5 May 2017 09:52:47 -0500 Subject: [PATCH 072/352] this one time i ate boiled peanuts --- code/game/machinery/hologram.dm | 381 +++++++++++++++++++------------- tgstation.dme | 1 + 2 files changed, 224 insertions(+), 158 deletions(-) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index ca9cc23380..bc73c41f08 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -26,14 +26,13 @@ Possible to do for anyone motivated enough: #define HOLOPAD_PASSIVE_POWER_USAGE 1 #define HOLOGRAM_POWER_USAGE 2 -#define RANGE_BASED 4 -#define AREA_BASED 6 +GLOBAL_LIST_EMPTY(holopads) #define HOLOPAD_MODE RANGE_BASED /obj/machinery/holopad - name = "\improper AI holopad" - desc = "It's a floor-mounted device for projecting holographic images. It is activated remotely." + name = "Holopad" + desc = "It's a floor-mounted device for projecting holographic images." icon_state = "holopad0" layer = LOW_OBJ_LAYER flags = HEAR @@ -44,29 +43,32 @@ Possible to do for anyone motivated enough: obj_integrity = 300 max_integrity = 300 armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 0) - var/list/masters = list()//List of AIs that use the holopad + var/list/masters = list()//List of living mobs that use the holopad var/last_request = 0 //to prevent request spam. ~Carn var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating. var/temp = "" + var/list/holo_calls //array of /datum/holocalls + var/datum/holocall/outgoing_call //do not modify the datums only check and call the public procs + var/static/force_answer_call = FALSE //Calls will be automatically answered after a couple rings, here for debugging var/static/list/holopads = list() -/obj/machinery/holopad/New() +/obj/machinery/holopad/Initialize() ..() var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/holopad(null) B.apply_default_parts(src) holopads += src /obj/machinery/holopad/Destroy() - if(outgoing_call) - LAZYADD(holo_calls, outgoing_call) - - for(var/I in holo_calls) - var/datum/holocall/HC = I - HC.ConnectionFailure(src) - LAZYCLEARLIST(holo_calls) - - for (var/I in masters) - clear_holo(I) + if(outgoing_call) + LAZYADD(holo_calls, outgoing_call) + + for(var/I in holo_calls) + var/datum/holocall/HC = I + HC.ConnectionFailure(src) + LAZYCLEARLIST(holo_calls) + + for (var/I in masters) + clear_holo(I) holopads -= src return ..() @@ -99,20 +101,58 @@ Possible to do for anyone motivated enough: return return ..() +/obj/machinery/holopad/proc/CheckCallClose() + for(var/I in holo_calls) + var/datum/holocall/HC = I + if(usr == HC.eye) + HC.Disconnect(HC.calling_holopad) //disconnect via clicking the called holopad + return TRUE + return FALSE + +/obj/machinery/holopad/Click(location,control,params) + if(!CheckCallClose()) + return ..() + /obj/machinery/holopad/AltClick(mob/living/carbon/human/user) - interact(user) + if(!CheckCallClose()) + interact(user) /obj/machinery/holopad/interact(mob/living/carbon/human/user) //Carn: Hologram requests. if(!istype(user)) return - if(user.stat || !is_operational()) + + if(outgoing_call || user.incapacitated() || !is_operational()) return + user.set_machine(src) var/dat if(temp) dat = temp else - dat = "request an AI's presence." + dat = "Request an AI's presence.
" + dat += "Call another holopad.
" + + if(LAZYLEN(holo_calls)) + dat += "=====================================================
" + + var/one_answered_call = FALSE + var/one_unanswered_call = FALSE + for(var/I in holo_calls) + var/datum/holocall/HC = I + if(HC.connected_holopad != src) + dat += "Answer call from [get_area(HC.calling_holopad)].
" + one_unanswered_call = TRUE + else + one_answered_call = TRUE + + if(one_answered_call && one_unanswered_call) + dat += "=====================================================
" + //we loop twice for formatting + for(var/I in holo_calls) + var/datum/holocall/HC = I + if(HC.connected_holopad == src) + dat += "Disconnect call from [HC.user].
" + var/datum/browser/popup = new(user, "holopad", name, 300, 130) popup.set_content(dat) @@ -120,7 +160,10 @@ Possible to do for anyone motivated enough: popup.open() /obj/machinery/holopad/Topic(href, href_list) - if(..() || !is_operational()) + if(..() || isAI(usr)) + return + add_fingerprint(usr) + if(!is_operational()) return if (href_list["AIrequest"]) if(last_request + 200 < world.time) @@ -128,7 +171,7 @@ Possible to do for anyone motivated enough: temp = "You requested an AI's presence.
" temp += "Main Menu" var/area/area = get_area(src) - for(var/mob/living/silicon/ai/AI in GLOB.living_mob_list) + for(var/mob/living/silicon/ai/AI in GLOB.silicon_mobs) if(!AI.client) continue to_chat(AI, "Your presence is requested at \the [area].") @@ -136,49 +179,49 @@ Possible to do for anyone motivated enough: temp = "A request for AI presence was already sent recently.
" temp += "Main Menu" - else if(href_list["Holocall"]) - if(outgoing_call) - return - - temp = "You must stand on the holopad to make a call!
" - temp += "Main Menu" - if(usr.loc == loc) - var/list/callnames = list() - for(var/I in holopads) - var/area/A = get_area(I) - if(A) - LAZYADD(callnames[A], I) - callnames -= get_area(src) - - var/result = input(usr, "Choose an area to call", "Holocall") as null|anything in callnames - if(QDELETED(usr) || !result || outgoing_call) - return - - if(usr.loc == loc) - temp = "Dialing...
" - temp += "Main Menu" - new /datum/holocall(usr, src, callnames[result]) - - else if(href_list["connectcall"]) - var/datum/holocall/call_to_connect = locate(href_list["connectcall"]) - if(!QDELETED(call_to_connect)) - call_to_connect.Answer(src) - temp = "" - - else if(href_list["disconnectcall"]) - var/datum/holocall/call_to_disconnect = locate(href_list["disconnectcall"]) - if(!QDELETED(call_to_disconnect)) - call_to_disconnect.Disconnect(src) - temp = "" - + else if(href_list["Holocall"]) + if(outgoing_call) + return + + temp = "You must stand on the holopad to make a call!
" + temp += "Main Menu" + if(usr.loc == loc) + var/list/callnames = list() + for(var/I in holopads) + var/area/A = get_area(I) + if(A) + LAZYADD(callnames[A], I) + callnames -= get_area(src) + + var/result = input(usr, "Choose an area to call", "Holocall") as null|anything in callnames + if(QDELETED(usr) || !result || outgoing_call) + return + + if(usr.loc == loc) + temp = "Dialing...
" + temp += "Main Menu" + new /datum/holocall(usr, src, callnames[result]) + + else if(href_list["connectcall"]) + var/datum/holocall/call_to_connect = locate(href_list["connectcall"]) + if(!QDELETED(call_to_connect)) + call_to_connect.Answer(src) + temp = "" + + else if(href_list["disconnectcall"]) + var/datum/holocall/call_to_disconnect = locate(href_list["disconnectcall"]) + if(!QDELETED(call_to_disconnect)) + call_to_disconnect.Disconnect(src) + temp = "" + else if(href_list["mainmenu"]) temp = "" - if(outgoing_call) - outgoing_call.Disconnect() + if(outgoing_call) + outgoing_call.Disconnect() updateDialog() -//do not allow AIs to answer calls or people will use it to meta the AI sattelite +//do not allow AIs to answer calls or people will use it to meta the AI sattelite /obj/machinery/holopad/attack_ai(mob/living/silicon/ai/user) if (!istype(user)) return @@ -193,75 +236,75 @@ Possible to do for anyone motivated enough: clear_holo(user) /obj/machinery/holopad/process() - for(var/I in masters) - var/mob/living/master = I - var/mob/living/silicon/ai/AI = master - if(!istype(AI)) - AI = null - - if(!QDELETED(master) && !master.incapacitated() && master.client && (!AI || AI.eyeobj))//If there is an AI attached, it's not incapacitated, it has a client, and the client eye is centered on the projector. - if(is_operational())//If the machine has power. - if(AI) //ais are range based - if(get_dist(AI.eyeobj, src) <= holo_range) - continue - else - var/obj/machinery/holopad/pad_close = get_closest_atom(/obj/machinery/holopad, holopads, AI.eyeobj) - if(get_dist(pad_close, AI.eyeobj) <= holo_range) - var/obj/effect/overlay/holo_pad_hologram/h = masters[master] - unset_holo(master) - pad_close.set_holo(master, h) - continue - else - continue - clear_holo(master)//If not, we want to get rid of the hologram. - - if(outgoing_call) - outgoing_call.Check() - - for(var/I in holo_calls) - var/datum/holocall/HC = I - if(HC.connected_holopad != src) - if(force_answer_call && world.time > (HC.call_start_time + (HOLOPAD_MAX_DIAL_TIME / 2))) - HC.Answer(src) - break - if(outgoing_call) - HC.Disconnect(src)//can't answer calls while calling - else - playsound(src, 'sound/machines/twobeep.ogg', 100) //bring, bring! - -/obj/machinery/holopad/proc/activate_holo(mob/living/user) - var/mob/living/silicon/ai/AI = user - if(!istype(AI)) - AI = null - - if(is_operational() && (!AI || AI.eyeobj.loc == loc))//If the projector has power and client eye is on it - if (AI && istype(AI.current, /obj/machinery/holopad)) + for(var/I in masters) + var/mob/living/master = I + var/mob/living/silicon/ai/AI = master + if(!istype(AI)) + AI = null + + if(!QDELETED(master) && !master.incapacitated() && master.client && (!AI || AI.eyeobj))//If there is an AI attached, it's not incapacitated, it has a client, and the client eye is centered on the projector. + if(is_operational())//If the machine has power. + if(AI) //ais are range based + if(get_dist(AI.eyeobj, src) <= holo_range) + continue + else + var/obj/machinery/holopad/pad_close = get_closest_atom(/obj/machinery/holopad, holopads, AI.eyeobj) + if(get_dist(pad_close, AI.eyeobj) <= holo_range) + var/obj/effect/overlay/holo_pad_hologram/h = masters[master] + unset_holo(master) + pad_close.set_holo(master, h) + continue + else + continue + clear_holo(master)//If not, we want to get rid of the hologram. + + if(outgoing_call) + outgoing_call.Check() + + for(var/I in holo_calls) + var/datum/holocall/HC = I + if(HC.connected_holopad != src) + if(force_answer_call && world.time > (HC.call_start_time + (HOLOPAD_MAX_DIAL_TIME / 2))) + HC.Answer(src) + break + if(outgoing_call) + HC.Disconnect(src)//can't answer calls while calling + else + playsound(src, 'sound/machines/twobeep.ogg', 100) //bring, bring! + +/obj/machinery/holopad/proc/activate_holo(mob/living/user) + var/mob/living/silicon/ai/AI = user + if(!istype(AI)) + AI = null + + if(is_operational() && (!AI || AI.eyeobj.loc == loc))//If the projector has power and client eye is on it + if (AI && istype(AI.current, /obj/machinery/holopad)) to_chat(user, "ERROR: \black Image feed in progress.") return - - var/obj/effect/overlay/holo_pad_hologram/Hologram = new(loc)//Spawn a blank effect at the location. - if(AI) - Hologram.icon = AI.holo_icon - else //make it like real life - Hologram.icon = user.icon - Hologram.icon_state = user.icon_state - Hologram.copy_overlays(user, TRUE) - //codersprite some holo effects here - Hologram.alpha = 100 - Hologram.add_atom_colour("#77abff", FIXED_COLOUR_PRIORITY) - Hologram.Impersonation = user - - Hologram.languages_spoken = user.languages_spoken - Hologram.mouse_opacity = 0//So you can't click on it. - Hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. - Hologram.anchored = 1//So space wind cannot drag it. - Hologram.name = "[user.name] (Hologram)"//If someone decides to right click. - Hologram.set_light(2) //hologram lighting - - set_holo(user, Hologram) - visible_message("A holographic image of [user] flicks to life right before your eyes!") - - return Hologram + + var/obj/effect/overlay/holo_pad_hologram/Hologram = new(loc)//Spawn a blank effect at the location. + if(AI) + Hologram.icon = AI.holo_icon + else //make it like real life + Hologram.icon = user.icon + Hologram.icon_state = user.icon_state + Hologram.copy_overlays(user, TRUE) + //codersprite some holo effects here + Hologram.alpha = 100 + Hologram.add_atom_colour("#77abff", FIXED_COLOUR_PRIORITY) + Hologram.Impersonation = user + + Hologram.languages = user.languages + Hologram.mouse_opacity = 0//So you can't click on it. + Hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. + Hologram.anchored = 1//So space wind cannot drag it. + Hologram.name = "[user.name] (Hologram)"//If someone decides to right click. + Hologram.set_light(2) //hologram lighting + + set_holo(user, Hologram) + visible_message("A holographic image of [user] flicks to life right before your eyes!") + + return Hologram else to_chat(user, "ERROR: \black Unable to project hologram.") @@ -273,58 +316,80 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ if(masters[master] && speaker != master) master.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) -/obj/machinery/holopad/proc/create_holo(mob/living/silicon/ai/A, turf/T = loc) - var/obj/effect/overlay/holo_pad_hologram/h = new(T)//Spawn a blank effect at the location. - h.icon = A.holo_icon - h.mouse_opacity = 0//So you can't click on it. - h.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. - h.anchored = 1//So space wind cannot drag it. - h.name = "[A.name] (Hologram)"//If someone decides to right click. - h.set_light(2) //hologram lighting - set_holo(A, h) + for(var/I in holo_calls) + var/datum/holocall/HC = I + if(HC.connected_holopad == src && speaker != HC.hologram) + HC.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans) + + if(outgoing_call && speaker == outgoing_call.user) + outgoing_call.hologram.say(raw_message) + +/obj/machinery/holopad/proc/SetLightsAndPower() + var/total_users = masters.len + LAZYLEN(holo_calls) + use_power = HOLOPAD_PASSIVE_POWER_USAGE + HOLOGRAM_POWER_USAGE * total_users + if(total_users) + set_light(2) + icon_state = "holopad1" + else + set_light(0) + icon_state = "holopad0" + +/obj/machinery/holopad/proc/set_holo(mob/living/user, var/obj/effect/overlay/holo_pad_hologram/h) + masters[user] = h + var/mob/living/silicon/ai/AI = user + if(istype(AI)) + AI.current = src + SetLightsAndPower() return TRUE -/obj/machinery/holopad/proc/set_holo(mob/living/silicon/ai/A, var/obj/effect/overlay/holo_pad_hologram/h) - masters[A] = h - set_light(2) // pad lighting - icon_state = "holopad1" - A.current = src - use_power += HOLOGRAM_POWER_USAGE - return TRUE - -/obj/machinery/holopad/proc/clear_holo(mob/living/silicon/ai/user) +/obj/machinery/holopad/proc/clear_holo(mob/living/user) qdel(masters[user]) // Get rid of user's hologram unset_holo(user) return TRUE -/obj/machinery/holopad/proc/unset_holo(mob/living/silicon/ai/user) - if(user.current == src) - user.current = null +/obj/machinery/holopad/proc/unset_holo(mob/living/user) + var/mob/living/silicon/ai/AI = user + if(istype(AI) && AI.current == src) + AI.current = null masters -= user // Discard AI from the list of those who use holopad - use_power = max(HOLOPAD_PASSIVE_POWER_USAGE, use_power - HOLOGRAM_POWER_USAGE)//Reduce power usage - if (!masters.len) // If no users left - set_light(0) // pad lighting (hologram lighting will be handled automatically since its owner was deleted) - icon_state = "holopad0" - use_power = HOLOPAD_PASSIVE_POWER_USAGE + SetLightsAndPower() return TRUE -/obj/machinery/holopad/proc/move_hologram(mob/living/silicon/ai/user) +/obj/machinery/holopad/proc/move_hologram(mob/living/user, turf/new_turf) if(masters[user]) - step_to(masters[user], user.eyeobj) var/obj/effect/overlay/holo_pad_hologram/H = masters[user] - H.loc = get_turf(user.eyeobj) + step_to(H, new_turf) + H.loc = new_turf + var/area/holo_area = get_area(src) + var/area/eye_area = new_turf.loc + + if(!(eye_area in holo_area.related)) + clear_holo(user) return TRUE +/obj/effect/overlay/holo_pad_hologram + var/mob/living/Impersonation + var/datum/holocall/HC + +/obj/effect/overlay/holo_pad_hologram/Destroy() + Impersonation = null + if(HC) + HC.Disconnect(HC.calling_holopad) + return ..() + /obj/effect/overlay/holo_pad_hologram/Process_Spacemove(movement_dir = 0) return 1 +/obj/effect/overlay/holo_pad_hologram/examine(mob/user) + if(Impersonation) + return Impersonation.examine(user) + return ..() + /obj/item/weapon/circuitboard/machine/holopad name = "AI Holopad (Machine Board)" build_path = /obj/machinery/holopad origin_tech = "programming=1" req_components = list(/obj/item/weapon/stock_parts/capacitor = 1) -#undef RANGE_BASED -#undef AREA_BASED #undef HOLOPAD_PASSIVE_POWER_USAGE -#undef HOLOGRAM_POWER_USAGE +#undef HOLOGRAM_POWER_USAGE \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index 8f80e4e005..6c0ff5f987 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -243,6 +243,7 @@ #include "code\datums\dog_fashion.dm" #include "code\datums\emotes.dm" #include "code\datums\forced_movement.dm" +#include "code\datums\holocall.dm" #include "code\datums\hud.dm" #include "code\datums\map_config.dm" #include "code\datums\martial.dm" From bbf43a464a26591ac39b49f72b59eb2ce4a5ac71 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 5 May 2017 10:00:17 -0500 Subject: [PATCH 073/352] yey --- code/modules/power/generator.dm | 67 ++++++++++++++++----------------- 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index 70d4ea27a2..9fe043a4a0 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -28,12 +28,12 @@ /obj/machinery/power/generator/Initialize(mapload) - . = ..() + . = ..() var/obj/machinery/atmospherics/components/binary/circulator/circpath = /obj/machinery/atmospherics/components/binary/circulator cold_circ = locate(circpath) in get_step(src, cold_dir) hot_circ = locate(circpath) in get_step(src, hot_dir) connect_to_network() - SSair.atmos_machinery += src + SSair.atmos_machinery += src if(cold_circ) switch(cold_dir) @@ -55,10 +55,10 @@ stat |= BROKEN update_icon() - -/obj/machinery/power/generator/Destroy() - SSair.atmos_machinery -= src - return ..() + +/obj/machinery/power/generator/Destroy() + SSair.atmos_machinery -= src + return ..() /obj/machinery/power/generator/update_icon() @@ -67,21 +67,20 @@ else cut_overlays() - if(lastgenlev != 0) - add_overlay("teg-op[lastgenlev]") + var/L = min(round(lastgenlev/100000),11) + if(L != 0) + add_overlay(image('icons/obj/power.dmi', "teg-op[L]")) - add_overlay("teg-oc[lastcirc]") + add_overlay("teg-oc[lastcirc]") #define GENRATE 800 // generator output coefficient from Q -/obj/machinery/power/generator/process() +/obj/machinery/power/generator/process_atmos() if(!cold_circ || !hot_circ) return - lastgen = 0 - if(powernet) //to_chat(world, "cold_circ and hot_circ pass") @@ -108,7 +107,7 @@ var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity) var/heat = energy_transfer*(1-efficiency) - lastgen += energy_transfer*efficiency + lastgen += energy_transfer*efficiency //to_chat(world, "lastgen = [lastgen]; heat = [heat]; delta_temperature = [delta_temperature]; hot_air_heat_capacity = [hot_air_heat_capacity]; cold_air_heat_capacity = [cold_air_heat_capacity];") @@ -117,7 +116,7 @@ //to_chat(world, "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]") - //add_avail(lastgen) This is done in process now + //add_avail(lastgen) This is done in process now // update icon overlays only if displayed level has changed if(hot_air) @@ -127,23 +126,23 @@ if(cold_air) var/datum/gas_mixture/cold_circ_air1 = cold_circ.AIR1 cold_circ_air1.merge(cold_air) - - update_icon() + + update_icon() var/circ = "[cold_circ && cold_circ.last_pressure_delta > 0 ? "1" : "0"][hot_circ && hot_circ.last_pressure_delta > 0 ? "1" : "0"]" - if(circ != lastcirc) + if(circ != lastcirc) lastcirc = circ update_icon() src.updateDialog() - -/obj/machinery/power/generator/process() - //Setting this number higher just makes the change in power output slower, it doesnt actualy reduce power output cause **math** - var/power_output = round(lastgen / 10) - add_avail(power_output) - lastgenlev = power_output - lastgen -= power_output - ..() + +/obj/machinery/power/generator/process() + //Setting this number higher just makes the change in power output slower, it doesnt actualy reduce power output cause **math** + var/power_output = round(lastgen / 10) + add_avail(power_output) + lastgenlev = power_output + lastgen -= power_output + ..() /obj/machinery/power/generator/attack_hand(mob/user) if(..()) @@ -162,15 +161,15 @@ var/datum/gas_mixture/hot_circ_air2 = hot_circ.AIR2 t += "

" - - var/displaygen = lastgenlev - if(displaygen < 1000000) //less than a MW - displaygen /= 1000 - t += "Output: [round(displaygen,0.01)] kW" - else - displaygen /= 1000000 - t += "Output: [round(displaygen,0.01)] MW" - + + var/displaygen = lastgenlev + if(displaygen < 1000000) //less than a MW + displaygen /= 1000 + t += "Output: [round(displaygen,0.01)] kW" + else + displaygen /= 1000000 + t += "Output: [round(displaygen,0.01)] MW" + t += "
" t += "Cold loop
" From a873459fa4b06730f4fa4286dc3cd7104c448fc7 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 10:19:29 -0500 Subject: [PATCH 074/352] Automatic changelog generation for PR #698 [ci skip] --- html/changelogs/AutoChangeLog-pr-698.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-698.yml diff --git a/html/changelogs/AutoChangeLog-pr-698.yml b/html/changelogs/AutoChangeLog-pr-698.yml new file mode 100644 index 0000000000..40e55644b5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-698.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "You can now make holocalls! Simply stand on a pad, bring up the menu, and select the holopad you wish to call. Remain still until someone answers. When they do, you'll be able to act just like an AI hologram until the call ends" From d2612eaaafca74cf6de4a3b5e338fe13dd99caa5 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 10:20:13 -0500 Subject: [PATCH 075/352] Automatic changelog generation for PR #701 [ci skip] --- html/changelogs/AutoChangeLog-pr-701.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-701.yml diff --git a/html/changelogs/AutoChangeLog-pr-701.yml b/html/changelogs/AutoChangeLog-pr-701.yml new file mode 100644 index 0000000000..8848bcb450 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-701.yml @@ -0,0 +1,7 @@ +author: "ninjanomnom" +delete-after: True +changes: + - tweak: "TEG displays power in kw or MW now" + - tweak: "TEG power bar only maxes over 1MW now" + - experiment: "Moves TEG to SSair" + - experiment: "Moves SM to SSair" From 1bb43eb7aea5a4b7991f527e454f79b948a55c33 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 5 May 2017 10:21:53 -0500 Subject: [PATCH 076/352] woo --- code/controllers/subsystem/garbage.dm.rej | 9 - code/datums/antagonists/datum_cult.dm.rej | 25 -- code/game/machinery/hologram.dm.rej | 226 ------------------ code/modules/admin/topic.dm.rej | 10 - code/modules/admin/verbs/deadsay.dm.rej | 10 - .../mob/living/carbon/human/death.dm.rej | 10 - code/modules/power/generator.dm.rej | 13 - tgstation.dme.rej | 9 - 8 files changed, 312 deletions(-) delete mode 100644 code/controllers/subsystem/garbage.dm.rej delete mode 100644 code/datums/antagonists/datum_cult.dm.rej delete mode 100644 code/game/machinery/hologram.dm.rej delete mode 100644 code/modules/admin/topic.dm.rej delete mode 100644 code/modules/admin/verbs/deadsay.dm.rej delete mode 100644 code/modules/mob/living/carbon/human/death.dm.rej delete mode 100644 code/modules/power/generator.dm.rej delete mode 100644 tgstation.dme.rej diff --git a/code/controllers/subsystem/garbage.dm.rej b/code/controllers/subsystem/garbage.dm.rej deleted file mode 100644 index 2075155c49..0000000000 --- a/code/controllers/subsystem/garbage.dm.rej +++ /dev/null @@ -1,9 +0,0 @@ -diff a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm (rejected hunks) -@@ -725,7 +725,6 @@ var/datum/controller/subsystem/garbage_collector/SSgarbage - SearchVar(multiverse) - SearchVar(announcement_systems) - SearchVar(doppler_arrays) -- SearchVar(HOLOPAD_MODE) - SearchVar(holopads) - SearchVar(news_network) - SearchVar(allCasters) diff --git a/code/datums/antagonists/datum_cult.dm.rej b/code/datums/antagonists/datum_cult.dm.rej deleted file mode 100644 index 0fc846a73c..0000000000 --- a/code/datums/antagonists/datum_cult.dm.rej +++ /dev/null @@ -1,25 +0,0 @@ -diff a/code/datums/antagonists/datum_cult.dm b/code/datums/antagonists/datum_cult.dm (rejected hunks) -@@ -5,13 +5,20 @@ - qdel(communion) - return ..() - -+/datum/antagonist/cult/can_be_owned(datum/mind/new_owner) -+ . = ..() -+ if(.) -+ . = is_convertable_to_cult(new_owner.current) -+ - /datum/antagonist/cult/on_gain() - . = ..() -- if(!owner) -- return -+ SSticker.mode.cult += owner -+ SSticker.mode.update_cult_icons_added(owner) -+ if(istype(SSticker.mode, /datum/game_mode/cult)) -+ var/datum/game_mode/cult/C = SSticker.mode -+ C.memorize_cult_objectives(owner) - if(jobban_isbanned(owner.current, ROLE_CULTIST)) - addtimer(CALLBACK(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, owner.current, ROLE_CULTIST, ROLE_CULTIST), 0) -- SSticker.mode.update_cult_icons_added(owner) - owner.current.log_message("Has been converted to the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG) - - /datum/antagonist/cult/apply_innate_effects(mob/living/mob_override) diff --git a/code/game/machinery/hologram.dm.rej b/code/game/machinery/hologram.dm.rej deleted file mode 100644 index 5dcbcc9d54..0000000000 --- a/code/game/machinery/hologram.dm.rej +++ /dev/null @@ -1,226 +0,0 @@ -diff a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm (rejected hunks) -@@ -26,16 +26,12 @@ Possible to do for anyone motivated enough: - - #define HOLOPAD_PASSIVE_POWER_USAGE 1 - #define HOLOGRAM_POWER_USAGE 2 --#define RANGE_BASED 4 --#define AREA_BASED 6 -- --var/const/HOLOPAD_MODE = RANGE_BASED - - var/list/holopads = list() - - /obj/machinery/holopad -- name = "\improper AI holopad" -- desc = "It's a floor-mounted device for projecting holographic images. It is activated remotely." -+ name = "Holopad" -+ desc = "It's a floor-mounted device for projecting holographic images." - icon_state = "holopad0" - layer = LOW_OBJ_LAYER - flags = HEAR -@@ -48,10 +44,13 @@ var/list/holopads = list() - obj_integrity = 300 - max_integrity = 300 - armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 0) -- var/list/masters = list()//List of AIs that use the holopad -+ var/list/masters = list()//List of living mobs that use the holopad - var/last_request = 0 //to prevent request spam. ~Carn - var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating. - var/temp = "" -+ var/list/holo_calls //array of /datum/holocalls -+ var/datum/holocall/outgoing_call //do not modify the datums only check and call the public procs -+ var/static/force_answer_call = FALSE //Calls will be automatically answered after a couple rings, here for debugging - - /obj/machinery/holopad/Initialize() - ..() -@@ -94,20 +101,60 @@ var/list/holopads = list() - return - return ..() - -+/obj/machinery/holopad/proc/CheckCallClose() -+ for(var/I in holo_calls) -+ var/datum/holocall/HC = I -+ if(usr == HC.eye) -+ HC.Disconnect(HC.calling_holopad) //disconnect via clicking the called holopad -+ return TRUE -+ return FALSE -+ -+/obj/machinery/holopad/Click(location,control,params) -+ if(!CheckCallClose()) -+ return ..() -+ - /obj/machinery/holopad/AltClick(mob/living/carbon/human/user) -- interact(user) -+ if(!CheckCallClose()) -+ interact(user) - - /obj/machinery/holopad/interact(mob/living/carbon/human/user) //Carn: Hologram requests. - if(!istype(user)) - return -- if(user.stat || stat & (NOPOWER|BROKEN)) -+ if(user.incapacitated() || !is_operational()) -+ return -+ -+ if(outgoing_call) //someone is making a call, leave them be - return -+ - user.set_machine(src) - var/dat - if(temp) - dat = temp - else -- dat = "request an AI's presence." -+ dat = "Request an AI's presence.
" -+ dat += "Call another holopad.
" -+ -+ if(LAZYLEN(holo_calls)) -+ dat += "=====================================================
" -+ -+ var/one_answered_call = FALSE -+ var/one_unanswered_call = FALSE -+ for(var/I in holo_calls) -+ var/datum/holocall/HC = I -+ if(HC.connected_holopad != src) -+ dat += "Answer call from [get_area(HC.calling_holopad)].
" -+ one_unanswered_call = TRUE -+ else -+ one_answered_call = TRUE -+ -+ if(one_answered_call && one_unanswered_call) -+ dat += "=====================================================
" -+ //we loop twice for formatting -+ for(var/I in holo_calls) -+ var/datum/holocall/HC = I -+ if(HC.connected_holopad == src) -+ dat += "Disconnect call from [HC.user].
" -+ - - var/datum/browser/popup = new(user, "holopad", name, 300, 130) - popup.set_content(dat) -@@ -115,7 +162,10 @@ var/list/holopads = list() - popup.open() - - /obj/machinery/holopad/Topic(href, href_list) -- if(..()) -+ if(..() || isAI(usr)) -+ return -+ add_fingerprint(usr) -+ if(!is_operational()) - return - if (href_list["AIrequest"]) - if(last_request + 200 < world.time) -@@ -194,59 +317,81 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ - for(var/mob/living/silicon/ai/master in masters) - if(masters[master] && speaker != master) - master.relay_speech(message, speaker, message_langs, raw_message, radio_freq, spans) -+ -+ for(var/I in holo_calls) -+ var/datum/holocall/HC = I -+ if(HC.connected_holopad == src && speaker != HC.hologram) -+ HC.user.Hear(message, speaker, message_langs, raw_message, radio_freq, spans) -+ -+ if(outgoing_call && speaker == outgoing_call.user) -+ outgoing_call.hologram.say(raw_message) -+ -+/obj/machinery/holopad/proc/SetLightsAndPower() -+ var/total_users = masters.len + LAZYLEN(holo_calls) -+ use_power = HOLOPAD_PASSIVE_POWER_USAGE + HOLOGRAM_POWER_USAGE * total_users -+ if(total_users) -+ set_light(2) -+ icon_state = "holopad1" -+ else -+ set_light(0) -+ icon_state = "holopad0" - --/obj/machinery/holopad/proc/create_holo(mob/living/silicon/ai/A, turf/T = loc) -- var/obj/effect/overlay/holo_pad_hologram/h = new(T)//Spawn a blank effect at the location. -- h.icon = A.holo_icon -- h.mouse_opacity = 0//So you can't click on it. -- h.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. -- h.anchored = 1//So space wind cannot drag it. -- h.name = "[A.name] (Hologram)"//If someone decides to right click. -- h.set_light(2) //hologram lighting -- set_holo(A, h) -- return TRUE -- --/obj/machinery/holopad/proc/set_holo(mob/living/silicon/ai/A, var/obj/effect/overlay/holo_pad_hologram/h) -- masters[A] = h -- set_light(2) // pad lighting -- icon_state = "holopad1" -- A.current = src -- use_power += HOLOGRAM_POWER_USAGE -+/obj/machinery/holopad/proc/set_holo(mob/living/user, var/obj/effect/overlay/holo_pad_hologram/h) -+ masters[user] = h -+ var/mob/living/silicon/ai/AI = user -+ if(istype(AI)) -+ AI.current = src -+ SetLightsAndPower() - return TRUE - --/obj/machinery/holopad/proc/clear_holo(mob/living/silicon/ai/user) -+/obj/machinery/holopad/proc/clear_holo(mob/living/user) - qdel(masters[user]) // Get rid of user's hologram - unset_holo(user) - return TRUE - --/obj/machinery/holopad/proc/unset_holo(mob/living/silicon/ai/user) -- if(user.current == src) -- user.current = null -+/obj/machinery/holopad/proc/unset_holo(mob/living/user) -+ var/mob/living/silicon/ai/AI = user -+ if(istype(AI) && AI.current == src) -+ AI.current = null - masters -= user // Discard AI from the list of those who use holopad -- use_power = max(HOLOPAD_PASSIVE_POWER_USAGE, use_power - HOLOGRAM_POWER_USAGE)//Reduce power usage -- if (!masters.len) // If no users left -- set_light(0) // pad lighting (hologram lighting will be handled automatically since its owner was deleted) -- icon_state = "holopad0" -- use_power = HOLOPAD_PASSIVE_POWER_USAGE -+ SetLightsAndPower() - return TRUE - --/obj/machinery/holopad/proc/move_hologram(mob/living/silicon/ai/user) -+/obj/machinery/holopad/proc/move_hologram(mob/living/user, turf/new_turf) - if(masters[user]) -- step_to(masters[user], user.eyeobj) - var/obj/effect/overlay/holo_pad_hologram/H = masters[user] -- H.loc = get_turf(user.eyeobj) -+ step_to(H, new_turf) -+ H.loc = new_turf -+ var/area/holo_area = get_area(src) -+ var/area/eye_area = new_turf.loc -+ -+ if(!(eye_area in holo_area.related)) -+ clear_holo(user) - return TRUE - -+/obj/effect/overlay/holo_pad_hologram -+ var/mob/living/Impersonation -+ var/datum/holocall/HC -+ -+/obj/effect/overlay/holo_pad_hologram/Destroy() -+ Impersonation = null -+ if(HC) -+ HC.Disconnect(HC.calling_holopad) -+ return ..() -+ - /obj/effect/overlay/holo_pad_hologram/Process_Spacemove(movement_dir = 0) - return 1 - -+/obj/effect/overlay/holo_pad_hologram/examine(mob/user) -+ if(Impersonation) -+ return Impersonation.examine(user) -+ return ..() -+ - /obj/item/weapon/circuitboard/machine/holopad - name = "AI Holopad (Machine Board)" - build_path = /obj/machinery/holopad - origin_tech = "programming=1" - req_components = list(/obj/item/weapon/stock_parts/capacitor = 1) - --#undef RANGE_BASED --#undef AREA_BASED - #undef HOLOPAD_PASSIVE_POWER_USAGE --#undef HOLOGRAM_POWER_USAGE -+#undef HOLOGRAM_POWER_USAGE -\ No newline at end of file diff --git a/code/modules/admin/topic.dm.rej b/code/modules/admin/topic.dm.rej deleted file mode 100644 index 041ae92107..0000000000 --- a/code/modules/admin/topic.dm.rej +++ /dev/null @@ -1,10 +0,0 @@ -diff a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm (rejected hunks) -@@ -8,7 +8,7 @@ - if(href_list["ahelp"]) - if(!check_rights(R_ADMIN)) - return -- -+ - var/ahelp_ref = href_list["ahelp"] - var/datum/admin_help/AH = locate(ahelp_ref) - if(AH) diff --git a/code/modules/admin/verbs/deadsay.dm.rej b/code/modules/admin/verbs/deadsay.dm.rej deleted file mode 100644 index 7d0347427b..0000000000 --- a/code/modules/admin/verbs/deadsay.dm.rej +++ /dev/null @@ -1,10 +0,0 @@ -diff a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm (rejected hunks) -@@ -19,7 +19,7 @@ - - if (!msg) - return -- var/static/nicknames = world.file2list("strings/admin_nicknames.txt") -+ var/static/nicknames = world.file2list("config/admin_nicknames.txt") - - var/rendered = "DEAD: ADMIN([src.holder.fakekey ? pick(nicknames) : src.key]) says, \"[msg]\"" - diff --git a/code/modules/mob/living/carbon/human/death.dm.rej b/code/modules/mob/living/carbon/human/death.dm.rej deleted file mode 100644 index a4a1fc5a7c..0000000000 --- a/code/modules/mob/living/carbon/human/death.dm.rej +++ /dev/null @@ -1,10 +0,0 @@ -diff a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm (rejected hunks) -@@ -32,7 +32,7 @@ - - dna.species.spec_death(gibbed, src) - -- if(SSticker && SSticker.mode) -+ if(SSticker.HasRoundStarted()) - SSblackbox.ReportDeath(src) - if(mind && mind.devilinfo) - INVOKE_ASYNC(mind.devilinfo, /datum/devilinfo.proc/beginResurrectionCheck, src) diff --git a/code/modules/power/generator.dm.rej b/code/modules/power/generator.dm.rej deleted file mode 100644 index 9de6ba6b3a..0000000000 --- a/code/modules/power/generator.dm.rej +++ /dev/null @@ -1,13 +0,0 @@ -diff a/code/modules/power/generator.dm b/code/modules/power/generator.dm (rejected hunks) -@@ -64,9 +64,8 @@ - else - cut_overlays() - -- var/L = min(round(lastgenlev/100000),11) -- -- if(L != 0) -+ var/L = min(round(lastgenlev/100000),11) -+ if(L != 0) - add_overlay(image('icons/obj/power.dmi', "teg-op[L]")) - - add_overlay("teg-oc[lastcirc]") diff --git a/tgstation.dme.rej b/tgstation.dme.rej deleted file mode 100644 index 0f29d8f023..0000000000 --- a/tgstation.dme.rej +++ /dev/null @@ -1,9 +0,0 @@ -diff a/tgstation.dme b/tgstation.dme (rejected hunks) -@@ -206,6 +206,7 @@ - #include "code\datums\emotes.dm" - #include "code\datums\forced_movement.dm" - #include "code\datums\gas_overrides.dm" -+#include "code\datums\holocall.dm" - #include "code\datums\hud.dm" - #include "code\datums\map_config.dm" - #include "code\datums\martial.dm" From 55c71ff5a93fbb1b258ee9beed4e066cade9fd4d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 10:27:18 -0500 Subject: [PATCH 077/352] Tesla light --- code/modules/power/singularity/narsie.dm | 4 ++-- code/modules/power/singularity/singularity.dm | 4 ++-- code/modules/power/tesla/energy_ball.dm | 7 ++++++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 9deebdfe10..7d0d4fdbb5 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -26,8 +26,8 @@ grav_pull = 10 consume_range = 12 //How many tiles out do we eat -/obj/singularity/narsie/large/New() - ..() +/obj/singularity/narsie/large/Initialize() + . = ..() send_to_playing_players("NAR-SIE HAS RISEN") send_to_playing_players(pick('sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg')) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 3b0bc3087b..1a308ed471 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -29,12 +29,12 @@ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF dangerous_possession = TRUE -/obj/singularity/New(loc, var/starting_energy = 50, var/temp = 0) +/obj/singularity/Initialize(mapload, starting_energy = 50) //CARN: admin-alert for chuckle-fuckery. admin_investigate_setup() src.energy = starting_energy - ..() + . = ..() START_PROCESSING(SSobj, src) GLOB.poi_list |= src GLOB.singularities |= src diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index fbb82cb36a..f23b58b1ab 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -40,6 +40,11 @@ GLOBAL_LIST_INIT(blacklisted_tesla_types, typecacheof(list(/obj/machinery/atmosp var/energy_to_raise = 32 var/energy_to_lower = -20 +/obj/singularity/energy_ball/Initialize(mapload, starting_energy = 50, is_miniball = FALSE) + . = ..() + if(!is_miniball) + set_light(10, 7, "#EEEEFF") + /obj/singularity/energy_ball/ex_act(severity, target) return @@ -117,7 +122,7 @@ GLOBAL_LIST_INIT(blacklisted_tesla_types, typecacheof(list(/obj/machinery/atmosp /obj/singularity/energy_ball/proc/new_mini_ball() if(!loc) return - var/obj/singularity/energy_ball/EB = new(loc) + var/obj/singularity/energy_ball/EB = new(loc, 0, TRUE) EB.transform *= pick(0.3, 0.4, 0.5, 0.6, 0.7) var/icon/I = icon(icon,icon_state,dir) From 426430369ef1777766f0cfbadc7d4f5164f0b5c9 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 10:28:22 -0500 Subject: [PATCH 078/352] Sigils of Transgression are slightly more visible and glow very faintly --- code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm index 6c56295c05..3c9a0d5d99 100644 --- a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm +++ b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm @@ -54,8 +54,11 @@ clockwork_desc = "A sigil that will stun the next non-Servant to cross it." icon_state = "sigildull" layer = HIGH_SIGIL_LAYER - alpha = 60 + alpha = 75 color = "#FAE48C" + light_range = 1.4 + light_power = 0.4 + light_color = "#FAE48C" sigil_name = "Sigil of Transgression" /obj/effect/clockwork/sigil/transgression/sigil_effects(mob/living/L) From 684c4a52449f94e8a1c17a2b5aebfc0a4a049dd0 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 10:28:26 -0500 Subject: [PATCH 079/352] Fixes answering a holocall not disconnecting other calls --- code/datums/holocall.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm index 0153e41414..6d6b1104dc 100644 --- a/code/datums/holocall.dm +++ b/code/datums/holocall.dm @@ -111,6 +111,11 @@ var/obj/machinery/holopad/Holo = I LAZYREMOVE(Holo.holo_calls, src) dialed_holopads -= Holo + + for(var/I in H.holo_calls) + var/datum/holocall/HC = I + if(HC != src) + HC.Disconnect(H) if(!Check()) return From c489186c3f2228c175dfd7abddcdadd55d24397b Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 5 May 2017 10:38:03 -0500 Subject: [PATCH 080/352] message code --- code/game/machinery/hologram.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index bc73c41f08..30ff4c23a0 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -319,7 +319,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ for(var/I in holo_calls) var/datum/holocall/HC = I if(HC.connected_holopad == src && speaker != HC.hologram) - HC.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans) + HC.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) if(outgoing_call && speaker == outgoing_call.user) outgoing_call.hologram.say(raw_message) From 39876074ca95af22949cc0ac72754dbb241f1419 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 15:37:22 -0500 Subject: [PATCH 081/352] Automatic changelog generation for PR #781 [ci skip] --- html/changelogs/AutoChangeLog-pr-781.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-781.yml diff --git a/html/changelogs/AutoChangeLog-pr-781.yml b/html/changelogs/AutoChangeLog-pr-781.yml new file mode 100644 index 0000000000..08a5c148ff --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-781.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - tweak: "Teslas now give off light" From 1fe053064f864dffedb85844f5d09cfde712c55f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 16:46:37 -0500 Subject: [PATCH 082/352] Fixes log files not generating with default config --- code/world.dm.rej | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 code/world.dm.rej diff --git a/code/world.dm.rej b/code/world.dm.rej new file mode 100644 index 0000000000..0ef6272088 --- /dev/null +++ b/code/world.dm.rej @@ -0,0 +1,10 @@ +diff a/code/world.dm b/code/world.dm (rejected hunks) +@@ -42,7 +42,7 @@ + else + log_world("Your server failed to establish a connection with the database.") + if(!GLOB.round_id) +- GLOB.log_directory += "[time_stamp()]" ++ GLOB.log_directory += "[replacetext(time_stamp(), ":", ".")]" + GLOB.world_game_log = file("[GLOB.log_directory]/game.log") + GLOB.world_attack_log = file("[GLOB.log_directory]/attack.log") + GLOB.world_runtime_log = file("[GLOB.log_directory]/runtime.log") From 7288549decf377cd6e0fe34454677666ec5e0c10 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 18:08:56 -0500 Subject: [PATCH 083/352] Players may no longer commite suicide --- code/modules/client/verbs/suicide.dm.rej | 10 ++++++++++ code/modules/mob/living/carbon/human/examine.dm | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 code/modules/client/verbs/suicide.dm.rej diff --git a/code/modules/client/verbs/suicide.dm.rej b/code/modules/client/verbs/suicide.dm.rej new file mode 100644 index 0000000000..a2e5063fd6 --- /dev/null +++ b/code/modules/client/verbs/suicide.dm.rej @@ -0,0 +1,10 @@ +diff a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm (rejected hunks) +@@ -12,7 +12,7 @@ + return + if(confirm == "Yes") + suiciding = 1 +- log_game("[key_name(src)] (job: [job ? "[job]" : "None"]) commited suicide at [get_area(src)].") ++ log_game("[key_name(src)] (job: [job ? "[job]" : "None"]) committed suicide at [get_area(src)].") + var/obj/item/held_item = get_active_held_item() + if(held_item) + var/damagetype = held_item.suicide_act(src) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 9081591395..a3bb2fefde 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -134,7 +134,7 @@ if(stat == DEAD || (status_flags & FAKEDEATH)) appears_dead = 1 if(suiciding) - msg += "[t_He] appear[p_s()] to have commited suicide... there is no hope of recovery.\n" + msg += "[t_He] appear[p_s()] to have committed suicide... there is no hope of recovery.\n" if(hellbound) msg += "[t_His] soul seems to have been ripped out of [t_his] body. Revival is impossible.\n" msg += "[t_He] [t_is] limp and unresponsive; there are no signs of life" From 0fb29b2650f77cd8001b426472f85c4a63b7b98e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 18:10:01 -0500 Subject: [PATCH 084/352] Improves vending machine user feedback --- code/game/machinery/vending.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 7d02e70671..e7a90ce9c2 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -307,7 +307,10 @@ if(panel_open) attack_hand(user) return - else if(istype(W, /obj/item/weapon/coin) && premium.len > 0) + else if(istype(W, /obj/item/weapon/coin)) + if(!premium.len) + to_chat(user, "[src] doesn't have a coin slot.") + return if(!user.drop_item()) return W.loc = src From 877acc972a8e1929cf6e69e904d0e3d414d6d995 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 18:12:07 -0500 Subject: [PATCH 085/352] Fixes dead mobs being initialized twice --- code/modules/mob/dead/dead.dm.rej | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 code/modules/mob/dead/dead.dm.rej diff --git a/code/modules/mob/dead/dead.dm.rej b/code/modules/mob/dead/dead.dm.rej new file mode 100644 index 0000000000..4a71374804 --- /dev/null +++ b/code/modules/mob/dead/dead.dm.rej @@ -0,0 +1,9 @@ +diff a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm (rejected hunks) +@@ -5,6 +5,7 @@ INITIALIZE_IMMEDIATE(/mob/dead) + /mob/dead/Initialize() + if(initialized) + stack_trace("Warning: [src]([type]) initialized multiple times!") ++ initialized = TRUE + tag = "mob_[next_mob_id++]" + GLOB.mob_list += src + From 122c791138496cb5d6b6cf05ede0c6d6cb1efd1f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 18:14:13 -0500 Subject: [PATCH 086/352] Patches the new cleanbot bug --- code/controllers/globals.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/controllers/globals.dm b/code/controllers/globals.dm index cd86e0d97c..89f8a81f20 100644 --- a/code/controllers/globals.dm +++ b/code/controllers/globals.dm @@ -52,6 +52,12 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) /datum/controller/global_vars/Initialize() gvars_datum_init_order = list() gvars_datum_protected_varlist = list("gvars_datum_protected_varlist") + + //See https://github.com/tgstation/tgstation/issues/26954 + for(var/I in typesof(/datum/controller/global_vars/proc)) + var/CLEANBOT_RETURNS = "[I]" + pass(CLEANBOT_RETURNS) + for(var/I in vars - gvars_datum_in_built_vars) var/start_tick = world.time call(src, "InitGlobal[I]")() From b993d9ad2304e89915b91c5105bc23bb84de44ce Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 18:33:34 -0500 Subject: [PATCH 087/352] Holy water will now properly make you jittery --- code/modules/reagents/chemistry/reagents/other_reagents.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index c25a1d050d..53c2d1b0ec 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -189,7 +189,7 @@ /datum/reagent/water/holywater/on_mob_life(mob/living/M) if(!data) data = 1 data++ - M.jitteriness = max(M.jitteriness-5,0) + M.jitteriness = min(M.jitteriness+4,10) if(data >= 30) // 12 units, 54 seconds @ metabolism 0.4 units & tick rate 1.8 sec if(!M.stuttering) M.stuttering = 1 @@ -212,9 +212,9 @@ SSticker.mode.remove_cultist(M.mind, 1, 1) else if(is_servant_of_ratvar(M)) remove_servant_of_ratvar(M) - holder.remove_reagent(id, volume) // maybe this is a little too perfect and a max() cap on the statuses would be better?? M.jitteriness = 0 M.stuttering = 0 + holder.remove_reagent(id, volume) // maybe this is a little too perfect and a max() cap on the statuses would be better?? return holder.remove_reagent(id, 0.4) //fixed consumption to prevent balancing going out of whack From 358046709f72047a4224c834f9cdf6b211dd8cf7 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 20:08:03 -0500 Subject: [PATCH 088/352] Various Deltastation Map Fixes/Edits --- .../map_files/Deltastation/DeltaStation2.dmm | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index c46f6ea830..a7df9a5154 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -79512,8 +79512,13 @@ name = "Medbay Central" }) "cUf" = ( -/obj/machinery/smartfridge/chemistry, -/turf/closed/wall, +/obj/structure/grille, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "chemisttop"; + name = "Chemisty Lobby Shutters" + }, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/plating, /area/medical/medbay{ name = "Medbay Central" }) @@ -79536,14 +79541,9 @@ name = "Medbay Central" }) "cUh" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/fulltile, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "chemisttop"; - name = "Chemisty Lobby Shutters" - }, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating, +/obj/machinery/smartfridge/chemistry, +/turf/closed/wall, /area/medical/medbay{ name = "Medbay Central" }) @@ -82189,6 +82189,7 @@ /obj/item/weapon/grenade/chem_grenade, /obj/item/weapon/grenade/chem_grenade, /obj/item/weapon/grenade/chem_grenade, +/obj/item/weapon/screwdriver, /turf/open/floor/plasteel/whiteyellow/corner{ icon_state = "whiteyellowcorner"; dir = 8 @@ -96353,7 +96354,6 @@ }, /area/medical/morgue) "dAn" = ( -/turf/open/floor/plating, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ icon_state = "manifold"; From 09655ed5e8cf99e3b25c8c45a8533378303cc50f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 20:08:07 -0500 Subject: [PATCH 089/352] Adds player age and byond account age to player panel --- code/modules/admin/admin.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 0e7986ec18..1059dda3f3 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -37,6 +37,10 @@ else body += " \[Heal\] " + if(M.client) + body += "
\[Player Age: [M.client.player_age]\]\[Byond Age: [M.client.account_age]\]" + + body += "

\[ " body += "VV - " body += "TP - " From a084031dc4ddf4d8b5d8586b3350439737a0c6c1 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 05:12:36 -0500 Subject: [PATCH 090/352] hm --- code/modules/power/singularity/narsie.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 7d0d4fdbb5..fb2df4deeb 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -14,6 +14,7 @@ light_power = 0.7 light_range = 15 light_color = rgb(255, 0, 0) + gender = FEMALE var/clashing = FALSE //If Nar-Sie is fighting Ratvar /obj/singularity/narsie/large From d0335b6d07c5b04e480e811060396c4a610b6fac Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 05:12:39 -0500 Subject: [PATCH 091/352] Blorble --- code/modules/mob/living/simple_animal/slime/slime.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 8971d33b28..f9bcfe1b6f 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -16,7 +16,7 @@ response_disarm = "shoos" response_harm = "stomps on" emote_see = list("jiggles", "bounces in place") - speak_emote = list("telepathically chirps") + speak_emote = list("blorbles") bubble_icon = "slime" initial_languages = list(/datum/language/common, /datum/language/slime) @@ -31,10 +31,10 @@ see_in_dark = 8 - verb_say = "telepathically chirps" - verb_ask = "telepathically asks" - verb_exclaim = "telepathically cries" - verb_yell = "telephatically cries" + verb_say = "blorbles" + verb_ask = "inquisitively blorbles" + verb_exclaim = "loudly blorbles" + verb_yell = "loudly blorbles" // canstun and canweaken don't affect slimes because they ignore stun and weakened variables // for the sake of cleanliness, though, here they are. From 2922a9fee8f554e50471bbf94be6af01b46da4fa Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 08:09:25 -0500 Subject: [PATCH 092/352] Seed vault lavaland ruin can only spawn once --- code/datums/ruins/lavaland.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index 3a54db4e0a..011363f001 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -42,6 +42,7 @@ However, all the inhabitants seem to do is grow drugs and guns." suffix = "lavaland_surface_seed_vault.dmm" cost = 10 + allow_duplicates = FALSE /datum/map_template/ruin/lavaland/ash_walker name = "Ash Walker Nest" From b72f4102a1463377b75e03cc7fec64b8720dd578 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 10:16:24 -0500 Subject: [PATCH 093/352] Internal affairs upgrades [READY] --- code/datums/status_effects/status_effect.dm | 2 + code/game/gamemodes/nuclear/pinpointer.dm | 8 +- code/game/gamemodes/objective.dm | 31 ++- code/game/gamemodes/traitor/double_agents.dm | 207 ++++++++++++++++++- 4 files changed, 225 insertions(+), 23 deletions(-) diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index 51b4f8fc5f..ec725885a9 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -10,6 +10,7 @@ var/status_type = STATUS_EFFECT_UNIQUE //How many of the effect can be on one mob, and what happens when you try to add another var/on_remove_on_mob_delete = FALSE //if we call on_remove() when the mob is deleted var/alert_type = /obj/screen/alert/status_effect //the alert thrown by the status effect, contains name and description + var/obj/screen/alert/status_effect/linked_alert = null //the alert itself, if it exists /datum/status_effect/New(mob/living/new_owner) if(new_owner) @@ -40,6 +41,7 @@ if(alert_type) var/obj/screen/alert/status_effect/A = owner.throw_alert(id, alert_type) A.attached_effect = src //so the alert can reference us, if it needs to + linked_alert = A //so we can reference the alert, if we need to START_PROCESSING(SSfastprocess, src) /datum/status_effect/process() diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index c66b48a6c8..f3ddb6d4be 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -17,6 +17,7 @@ var/atom/movable/constant_target = null //The thing we're always focused on, if we're in the right mode var/target_x = 0 //The target coordinates if we're tracking those var/target_y = 0 + var/minimum_range = 0 //at what range the pinpointer declares you to be at your destination var/nuke_warning = FALSE // If we've set off a miniature alarm about an armed nuke var/mode = TRACK_NUKE_DISK //What are we looking for? @@ -111,7 +112,7 @@ var/mob/living/closest_operative = get_closest_atom(/mob/living/carbon/human, possible_targets, here) if(closest_operative) target = closest_operative - if(TRACK_ATOM) + if(TRACK_ATOM) if(constant_target) target = constant_target if(TRACK_COORDINATES) @@ -129,7 +130,7 @@ if(here.z != there.z) icon_state = "pinon[nuke_warning ? "alert" : ""]null" return - if(here == there) + if(get_dist_euclidian(here,there)<=minimum_range) icon_state = "pinon[nuke_warning ? "alert" : ""]direct" else setDir(get_dir(here, there)) @@ -171,3 +172,6 @@ desc = "An integrated tracking device, jury-rigged to search for living Syndicate operatives." mode = TRACK_OPERATIVES flags = NODROP + + + diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 6ac0ab8c7c..039b4cc3a4 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -67,7 +67,14 @@ /datum/objective/proc/update_explanation_text() //Default does nothing, override where needed -/datum/objective/proc/give_special_equipment() +/datum/objective/proc/give_special_equipment(special_equipment) + if(owner && owner.current) + if(ishuman(owner.current)) + var/mob/living/carbon/human/H = owner.current + var/list/slots = list ("backpack" = slot_in_backpack) + for(var/eq_path in special_equipment) + var/obj/O = new eq_path + H.equip_in_one_of_slots(O, slots) /datum/objective/assassinate var/target_role_type=0 @@ -94,6 +101,14 @@ else explanation_text = "Free Objective" +/datum/objective/assassinate/internal + var/stolen = 0 //Have we already eliminated this target? + +/datum/objective/assassinate/internal/update_explanation_text() + ..() + if(target && !target.current) + explanation_text = "Assassinate [target.name], who was obliterated" + /datum/objective/mutiny var/target_role_type=0 @@ -468,7 +483,7 @@ GLOBAL_LIST_EMPTY(possible_items) steal_target = targetinfo.targetitem explanation_text = "Steal [targetinfo.name]." dangerrating = targetinfo.difficulty - give_special_equipment() + give_special_equipment(targetinfo.special_equipment) return steal_target else explanation_text = "Free objective" @@ -511,15 +526,6 @@ GLOBAL_LIST_EMPTY(possible_items) return 1 return 0 -/datum/objective/steal/give_special_equipment() - if(owner && owner.current && targetinfo) - if(ishuman(owner.current)) - var/mob/living/carbon/human/H = owner.current - var/list/slots = list ("backpack" = slot_in_backpack) - for(var/eq_path in targetinfo.special_equipment) - var/obj/O = new eq_path - H.equip_in_one_of_slots(O, slots) - GLOBAL_LIST_EMPTY(possible_items_special) /datum/objective/steal/special //ninjas are so special they get their own subtype good for them @@ -695,6 +701,9 @@ GLOBAL_LIST_EMPTY(possible_items_special) explanation_text = "Destroy [target.name], the experimental AI." else explanation_text = "Free Objective" + +/datum/objective/destroy/internal + var/stolen = FALSE //Have we already eliminated this target? /datum/objective/steal_five_of_type explanation_text = "Steal at least five items!" diff --git a/code/game/gamemodes/traitor/double_agents.dm b/code/game/gamemodes/traitor/double_agents.dm index cb6609ebe6..2ee546c7aa 100644 --- a/code/game/gamemodes/traitor/double_agents.dm +++ b/code/game/gamemodes/traitor/double_agents.dm @@ -1,9 +1,13 @@ +#define PINPOINTER_MINIMUM_RANGE 15 +#define PINPOINTER_EXTRA_RANDOM_RANGE 10 +#define PINPOINTER_PING_TIME 40 + /datum/game_mode/traitor/internal_affairs name = "Internal Affairs" config_tag = "internal_affairs" employer = "Internal Affairs" - required_players = 25 - required_enemies = 5 + required_players = 25 + required_enemies = 5 recommended_enemies = 8 reroll_friendly = 0 traitor_name = "Nanotrasen Internal Affairs Agent" @@ -18,15 +22,189 @@ var/list/target_list = list() var/list/late_joining_list = list() + /datum/game_mode/traitor/internal_affairs/post_setup() var/i = 0 for(var/datum/mind/traitor in traitors) i++ if(i + 1 > traitors.len) i = 0 - target_list[traitor] = traitors[i + 1] + target_list[traitor] = traitors[i+1] ..() + +/datum/status_effect/agent_pinpointer + id = "agent_pinpointer" + duration = -1 + tick_interval = PINPOINTER_PING_TIME + alert_type = /obj/screen/alert/status_effect/agent_pinpointer + var/minimum_range = PINPOINTER_MINIMUM_RANGE + var/mob/scan_target = null + +/obj/screen/alert/status_effect/agent_pinpointer + name = "Internal Affairs Integrated Pinpointer" + desc = "Even stealthier than a normal implant." + icon = 'icons/obj/device.dmi' + icon_state = "pinon" + +/datum/status_effect/agent_pinpointer/proc/point_to_target() //If we found what we're looking for, show the distance and direction + if(!scan_target) + linked_alert.icon_state = "pinonnull" + return + var/turf/here = get_turf(owner) + var/turf/there = get_turf(scan_target) + if(here.z != there.z) + linked_alert.icon_state = "pinonnull" + return + if(get_dist_euclidian(here,there)<=minimum_range + rand(0, PINPOINTER_EXTRA_RANDOM_RANGE)) + linked_alert.icon_state = "pinondirect" + else + linked_alert.setDir(get_dir(here, there)) + switch(get_dist(here, there)) + if(1 to 8) + linked_alert.icon_state = "pinonclose" + if(9 to 16) + linked_alert.icon_state = "pinonmedium" + if(16 to INFINITY) + linked_alert.icon_state = "pinonfar" + + +/datum/status_effect/agent_pinpointer/proc/scan_for_target() + scan_target = null + if(owner) + if(owner.mind) + if(owner.mind.objectives) + for(var/datum/objective/objective_ in owner.mind.objectives) + if(!is_internal_objective(objective_)) + continue + var/datum/objective/assassinate/internal/objective = objective_ + var/mob/current = objective.target.current + if(current&¤t.stat!=DEAD) + scan_target = current + break + + +/datum/status_effect/agent_pinpointer/tick() + if(!owner) + qdel(src) + return + scan_for_target() + point_to_target() + +/proc/give_pinpointer(datum/mind/owner) + if(owner && owner.current) + owner.current.apply_status_effect(/datum/status_effect/agent_pinpointer) + + +/datum/internal_agent_state + var/traitored = FALSE + var/datum/mind/owner = null + var/list/datum/mind/targets_stolen = list() + +/proc/is_internal_objective(datum/objective/O) + return (istype(O, /datum/objective/assassinate/internal)||istype(O, /datum/objective/destroy/internal)) + +/proc/replace_escape_objective(datum/mind/owner) + if(!owner||!owner.objectives) + return + for (var/objective_ in owner.objectives) + if(!(istype(objective_, /datum/objective/escape)||istype(objective_,/datum/objective/survive))) + continue + owner.objectives -= objective_ + var/datum/objective/martyr/martyr_objective = new + martyr_objective.owner = owner + owner.objectives += martyr_objective + +/proc/reinstate_escape_objective(datum/mind/owner) + if(!owner||!owner.objectives) + return + for (var/objective_ in owner.objectives) + if(!istype(objective_, /datum/objective/martyr)) + continue + owner.objectives -= objective_ + if(issilicon(owner)) + var/datum/objective/survive/survive_objective = new + survive_objective.owner = owner + owner.objectives += survive_objective + else + var/datum/objective/escape/escape_objective = new + escape_objective.owner = owner + owner.objectives += escape_objective + +/datum/internal_agent_state/proc/steal_targets(datum/mind/victim) + if(!owner.current||owner.current.stat==DEAD) //Should already be guaranteed if this is only called from steal_targets_timer_func, but better to be safe code than sorry code + return + var/already_traitored = traitored + to_chat(owner.current, " Target eliminated: [victim.name]") + for(var/objective_ in victim.objectives) + if(istype(objective_, /datum/objective/assassinate/internal)) + var/datum/objective/assassinate/internal/objective = objective_ + if(objective.target==owner) + traitored = TRUE + else if(targets_stolen.Find(objective.target) == 0) + var/datum/objective/assassinate/internal/new_objective = new + new_objective.owner = owner + new_objective.target = objective.target + new_objective.update_explanation_text() + owner.objectives += new_objective + targets_stolen += objective.target + var/status_text = objective.check_completion() ? "neutralised" : "active" + to_chat(owner.current, " New target added to database: [objective.target.name] ([status_text]) ") + else if(istype(objective_, /datum/objective/destroy/internal)) + var/datum/objective/destroy/internal/objective = objective_ + var/datum/objective/destroy/internal/new_objective = new + if(objective.target==owner) + traitored = TRUE + else if(targets_stolen.Find(objective.target) == 0) + new_objective.owner = owner + new_objective.target = objective.target + new_objective.update_explanation_text() + owner.objectives += new_objective + targets_stolen += objective.target + var/status_text = objective.check_completion() ? "neutralised" : "active" + to_chat(owner.current, " New target added to database: [objective.target.name] ([status_text]) ") + if(traitored&&!already_traitored) + for(var/objective_ in owner.objectives) + if(!is_internal_objective(objective_)) + continue + var/datum/objective/assassinate/internal/objective = objective_ + if(!objective.check_completion()) + traitored = FALSE + return + to_chat(owner.current," All the other agents are dead, and you're the last loose end. Stage a Syndicate terrorist attack to cover up for today's events. You no longer have any limits on collateral damage.") + replace_escape_objective(owner) + + + +/datum/internal_agent_state/proc/steal_targets_timer_func() + if(owner&&owner.current&&owner.current.stat!=DEAD) + for(var/objective_ in owner.objectives) + if(!is_internal_objective(objective_)) + continue + var/datum/objective/assassinate/internal/objective = objective_ + if(!objective.target) + continue + if(objective.check_completion()) + if(objective.stolen) + continue + else + steal_targets(objective.target) + objective.stolen = TRUE + else + if(objective.stolen) + var/fail_msg = "Your sensors tell you that [objective.target.current.real_name], one of the targets you were meant to have killed, pulled one over on you, and is still alive - do the job properly this time! " + if(traitored) + fail_msg += " The truth could still slip out!
Cease any terrorist actions as soon as possible, unneeded property damage or loss of employee life will lead to your contract being terminated." + reinstate_escape_objective(owner) + traitored = FALSE + to_chat(owner.current, fail_msg) + objective.stolen = FALSE + add_steal_targets_timer(owner) + +/datum/internal_agent_state/proc/add_steal_targets_timer() + var/datum/callback/C = new(src, .steal_targets_timer_func) + addtimer(C, 30) + /datum/game_mode/traitor/internal_affairs/forge_traitor_objectives(datum/mind/traitor) if(target_list.len && target_list[traitor]) // Is a double agent @@ -34,13 +212,13 @@ // Assassinate var/datum/mind/target_mind = target_list[traitor] if(issilicon(target_mind.current)) - var/datum/objective/destroy/destroy_objective = new + var/datum/objective/destroy/internal/destroy_objective = new destroy_objective.owner = traitor destroy_objective.target = target_mind destroy_objective.update_explanation_text() traitor.objectives += destroy_objective else - var/datum/objective/assassinate/kill_objective = new + var/datum/objective/assassinate/internal/kill_objective = new kill_objective.owner = traitor kill_objective.target = target_mind kill_objective.update_explanation_text() @@ -55,6 +233,11 @@ var/datum/objective/escape/escape_objective = new escape_objective.owner = traitor traitor.objectives += escape_objective + var/datum/internal_agent_state/state = new + state.owner=traitor + state.add_steal_targets_timer() + if(!issilicon(traitor.current)) + give_pinpointer(traitor) else ..() // Give them standard objectives. @@ -106,14 +289,18 @@ /datum/game_mode/traitor/internal_affairs/greet_traitor(datum/mind/traitor) var/crime = pick("distribution of contraband" , "unauthorized erotic action on duty", "embezzlement", "piloting under the influence", "dereliction of duty", "syndicate collaboration", "mutiny", "multiple homicides", "corporate espionage", "recieving bribes", "malpractice", "worship of prohbited life forms", "possession of profane texts", "murder", "arson", "insulting their manager", "grand theft", "conspiracy", "attempting to unionize", "vandalism", "gross incompetence") - to_chat(traitor.current, "You are the [traitor_name].") - to_chat(traitor.current, "Your target is suspected of [crime], and you have been tasked with eliminating them by any means necessary to avoid a costly and embarrassing public trial.") + to_chat(traitor.current, "You are the [traitor_name].") + to_chat(traitor.current, "Your target is suspected of [crime], and you have been tasked with eliminating them by any means necessary to avoid a costly and embarrassing public trial.") to_chat(traitor.current, "While you have a license to kill, unneeded property damage or loss of employee life will lead to your contract being terminated.") - to_chat(traitor.current, "For the sake of plausible deniability, you have been equipped with an array of captured Syndicate weaponry available via uplink.") - to_chat(traitor.current, "Finally, watch your back. Your target has friends in high places, and intel suggests someone may have taken out a contract of their own to protect them.") + to_chat(traitor.current, "For the sake of plausible deniability, you have been equipped with an array of captured Syndicate weaponry available via uplink.") + to_chat(traitor.current, "Finally, watch your back. Your target has friends in high places, and intel suggests someone may have taken out a contract of their own to protect them.") traitor.announce_objectives() /datum/game_mode/traitor/internal_affairs/give_codewords(mob/living/traitor_mob) - return \ No newline at end of file + return + +#undef PINPOINTER_EXTRA_RANDOM_RANGE +#undef PINPOINTER_MINIMUM_RANGE +#undef PINPOINTER_PING_TIME From 8a3b280ede7a62e4c841b53931df184c16cdedb8 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 10:42:51 -0500 Subject: [PATCH 094/352] Preliminary tesla projectile refactor (also insults vcordie because I'm mean.) --- code/game/mecha/equipment/weapons/weapons.dm | 2 +- code/modules/projectiles/ammunition/energy.dm | 2 +- code/modules/projectiles/projectile/energy.dm | 38 +++++++------------ 3 files changed, 16 insertions(+), 26 deletions(-) diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 7a9d01bb7f..658a6a7692 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -107,7 +107,7 @@ icon_state = "mecha_ion" origin_tech = "materials=4;engineering=4;combat=6;magnets=6" energy_drain = 500 - projectile = /obj/item/projectile/energy/tesla_cannon + projectile = /obj/item/projectile/energy/tesla/cannon fire_sound = 'sound/magic/lightningbolt.ogg' diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm index a6440e32ed..b1fd49779f 100644 --- a/code/modules/projectiles/ammunition/energy.dm +++ b/code/modules/projectiles/ammunition/energy.dm @@ -191,7 +191,7 @@ fire_sound = 'sound/magic/lightningbolt.ogg' e_cost = 200 select_name = "stun" - projectile_type = /obj/item/projectile/energy/tesla_revolver + projectile_type = /obj/item/projectile/energy/tesla/revolver /obj/item/ammo_casing/energy/gravityrepulse projectile_type = /obj/item/projectile/gravityrepulse diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index c1a67f4c81..974ea935f2 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -159,44 +159,34 @@ /obj/item/projectile/energy/bolt/large damage = 20 -/obj/item/projectile/energy/tesla_revolver +/obj/item/projectile/energy/tesla name = "tesla bolt" icon_state = "tesla_projectile" impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser var/chain -/obj/item/projectile/energy/tesla_revolver/fire(setAngle) +/obj/item/projectile/energy/tesla/fire(setAngle) if(firer) chain = firer.Beam(src, icon_state = "lightning[rand(1, 12)]", time = INFINITY, maxdistance = INFINITY) ..() -/obj/item/projectile/energy/tesla_revolver/on_hit(atom/target) - . = ..() - if(isliving(target)) - tesla_zap(src, 3, 10000) - qdel(src) - -/obj/item/projectile/energy/tesla_revolver/Destroy() +/obj/item/projectile/energy/tesla/Destroy() qdel(chain) return ..() +/obj/item/projectile/energy/tesla/revolver + name = "energy orb" -/obj/item/projectile/energy/tesla_cannon - name = "tesla bolt" - icon_state = "tesla_projectile" - impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser - var/chain +/obj/item/projectile/energy/tesla/revolver/on_hit(atom/target) + . = ..() + if(isliving(target)) + tesla_zap(target, 3, 10000) + qdel(src) -/obj/item/projectile/energy/tesla_cannon/fire(setAngle) - if(firer) - chain = firer.Beam(src, icon_state = "lightning[rand(1, 12)]", time = INFINITY, maxdistance = INFINITY) - ..() +/obj/item/projectile/energy/tesla/cannon + name = "tesla orb" -/obj/item/projectile/energy/tesla_cannon/on_hit(atom/target) +/obj/item/projectile/energy/tesla/cannon/on_hit(atom/target) . = ..() - tesla_zap(src, 3, 10000, explosive = FALSE, stun_mobs = FALSE) + tesla_zap(target, 3, 10000, explosive = FALSE, stun_mobs = FALSE) qdel(src) - -/obj/item/projectile/energy/tesla_cannon/Destroy() - qdel(chain) - return ..() From 0972689cfce7ad73734efd43c98ac0d148406005 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 10:44:56 -0500 Subject: [PATCH 095/352] Updated: Reduces dominator timer ceiling, changes territory scaling --- code/game/gamemodes/gang/gang.dm.rej | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 code/game/gamemodes/gang/gang.dm.rej diff --git a/code/game/gamemodes/gang/gang.dm.rej b/code/game/gamemodes/gang/gang.dm.rej new file mode 100644 index 0000000000..02c5581f3c --- /dev/null +++ b/code/game/gamemodes/gang/gang.dm.rej @@ -0,0 +1,10 @@ +diff a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm (rejected hunks) +@@ -249,7 +249,7 @@ GLOBAL_LIST_INIT(gang_colors_pool, list("red","orange","yellow","green","blue"," + return gang_bosses + + /proc/determine_domination_time(var/datum/gang/G) +- return max(180,600 - (round((G.territory.len/GLOB.start_state.num_territories)*100, 1) * 9)) ++ return max(180,480 - (round((G.territory.len/GLOB.start_state.num_territories)*100, 1) * 9)) + + + ////////////////////////////////////////////////////////////////////// From 310f23db5c3fcdb61f8068fd9b7a07e8684d2573 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 10:46:00 -0500 Subject: [PATCH 096/352] Fixes HTTPSGet being unprotected --- code/__HELPERS/unsorted.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 1da1b50aa3..d0fcb3bcbe 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1342,6 +1342,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) //This prevents RCEs from badmins //kevinz000 if you touch this I will hunt you down GLOBAL_VAR_INIT(valid_HTTPSGet, FALSE) +GLOBAL_PROTECT(valid_HTTPSGet) /proc/HTTPSGet(url) if(findtext(url, "\"")) GLOB.valid_HTTPSGet = FALSE From 10846d5d37d84546c54f583ad54555474757cd40 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 10:48:07 -0500 Subject: [PATCH 097/352] Replaces stun/weaken from Miner's salve --- .../modules/reagents/chemistry/reagents/medicine_reagents.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 500147d233..e91c35b974 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -347,10 +347,9 @@ /datum/reagent/medicine/mine_salve/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) if(iscarbon(M) && M.stat != DEAD) if(method in list(INGEST, VAPOR, INJECT)) - M.Stun(4) - M.Weaken(4) + M.nutrition -= 5 if(show_message) - to_chat(M, "Your stomach agonizingly cramps!") + to_chat(M, "Your stomach feels empty and cramps!") else var/mob/living/carbon/C = M for(var/s in C.surgeries) From f85a44ed527854e4d2362f8586354b3ebcb48e80 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 11:56:16 -0500 Subject: [PATCH 098/352] 2017 Cult Overhaul P1: Cult Master and Datum Cult --- code/__HELPERS/game.dm | 64 ++++++++ code/__HELPERS/game.dm.rej | 66 ++++++++ code/__HELPERS/matrices.dm | 1 - code/_globalvars/game_modes.dm | 7 + code/_onclick/hud/alert.dm | 99 +++++++++++ code/datums/antagonists/datum_cult.dm.rej | 9 + code/datums/mind.dm | 9 +- code/datums/status_effects/buffs.dm | 29 ++++ code/game/gamemodes/cult/cult.dm | 85 +++++++--- code/game/gamemodes/cult/cult.dm.rej | 33 ++++ code/game/gamemodes/cult/cult_comms.dm | 154 +++++++++++++++++- code/game/gamemodes/cult/cult_items.dm | 2 +- code/game/gamemodes/cult/ritual.dm | 49 +++--- code/game/gamemodes/cult/runes.dm | 12 +- code/game/gamemodes/game_mode.dm.rej | 10 ++ code/game/gamemodes/wizard/soulstone.dm | 17 +- code/game/objects/effects/overlays.dm | 10 +- code/game/objects/effects/overlays.dm.rej | 10 ++ code/modules/mob/living/death.dm | 2 +- .../mob/living/simple_animal/constructs.dm | 8 + .../living/simple_animal/constructs.dm.rej | 40 +++++ config/game_options.txt | 2 +- icons/effects/64x64.dmi | Bin 9011 -> 10479 bytes icons/effects/cult_target.dmi | Bin 0 -> 1654 bytes icons/effects/effects.dmi | Bin 533901 -> 538830 bytes icons/mob/hud.dmi | Bin 12486 -> 12764 bytes icons/mob/screen_alert.dmi | Bin 83184 -> 98842 bytes 27 files changed, 644 insertions(+), 74 deletions(-) create mode 100644 code/__HELPERS/game.dm.rej create mode 100644 code/datums/antagonists/datum_cult.dm.rej create mode 100644 code/game/gamemodes/cult/cult.dm.rej create mode 100644 code/game/gamemodes/game_mode.dm.rej create mode 100644 code/game/objects/effects/overlays.dm.rej create mode 100644 code/modules/mob/living/simple_animal/constructs.dm.rej create mode 100644 icons/effects/cult_target.dmi diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 6bc79fb7d5..2df42fbb51 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -6,6 +6,7 @@ ) #define Z_TURFS(ZLEVEL) block(locate(1,1,ZLEVEL), locate(world.maxx, world.maxy, ZLEVEL)) +#define CULT_POLL_WAIT 2400 /proc/get_area(atom/A) if (!istype(A)) @@ -485,6 +486,69 @@ ++i return L +/proc/pollCultists(var/mob/living/Nominee) // Cult Master Poll + var/time_passed = world.time + var/list/yes_voters = new + var/list/cult_total = new + if(world.time<1) + Nominee << "It would be premature to select a leader while everyone is still settling in, try again in [round((1800-world.time)/10)] seconds" + return + for(var/datum/mind/B in SSticker.mode.cult) + if(!isliving(B.current)) + continue + var/mob/living/M = B.current + if(isliving(M)) + M << 'sound/hallucinations/im_here1.ogg' + M.verbs -= /mob/living/proc/cult_master + to_chat(M, "Acolyte [Nominee] has asserted that they are worthy of leading the cult. A vote will be called shortly.") + sleep(250) + for(var/datum/mind/B in SSticker.mode.cult) + if(!isliving(B.current)) + continue + var/mob/living/M = B.current + M << 'sound/magic/exit_blood.ogg' + switch(askuser(M,"[Nominee] seeks to lead your cult, do you support them?","Please answer in 20 seconds!","Yes","No","Abstain", StealFocus=0, Timeout=200)) + if(1) + if((world.time-time_passed)>500) + M << "Sorry, your vote came too late!" + M << 'sound/machines/buzz-sigh.ogg' + else + M << "Choice registered: Yes." + yes_voters += M + cult_total += M + if(2) + if((world.time-time_passed)>500) + M << "Sorry, your vote came too late!" + M << 'sound/machines/buzz-sigh.ogg' + else + M << "Choice registered: No." + cult_total += M + if(3) + M << "Choice registered: Abstain." + sleep(300) + if(yes_voters.len > (cult_total.len/2)) + var/datum/action/innate/cultmast/finalreck/FinalReckoning = new() + var/datum/action/innate/cultmast/cultmark/Mark = new() + FinalReckoning.Grant(Nominee) + Mark.Grant(Nominee) + Nominee.mind.special_role = "Cult Master" + Nominee.update_action_buttons_icon() + Nominee.apply_status_effect(/datum/status_effect/cult_master) + SSticker.mode.set_antag_hud(Nominee,"cultmaster") + GLOB.cult_mastered = TRUE + for(var/datum/mind/B in SSticker.mode.cult) + if(!B.current.incapacitated()) + to_chat(B.current,"[Nominee] has the cult's support and is now their master. Follow their orders to the best of your ability!") + return TRUE + else + for(var/datum/mind/B in SSticker.mode.cult) + if(!B.current.incapacitated()) + to_chat(B.current, "[Nominee] could not win the cult's support and shall continue to serve as an acolyte.") + B.current.verbs += /mob/living/proc/cult_master + return FALSE + +/proc/poll_helper(var/mob/living/M) + /proc/makeBody(mob/dead/observer/G_found) // Uses stripped down and bastardized code from respawn character if(!G_found || !G_found.key) return diff --git a/code/__HELPERS/game.dm.rej b/code/__HELPERS/game.dm.rej new file mode 100644 index 0000000000..d64ec0418b --- /dev/null +++ b/code/__HELPERS/game.dm.rej @@ -0,0 +1,66 @@ +diff a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm (rejected hunks) +@@ -489,41 +490,38 @@ + var/time_passed = world.time + var/list/yes_voters = new + var/list/cult_total = new +- if(world.time<1800) +- Nominee << "It would be premature to select a leader while everyone is still settling in, try again in [round((1800-world.time)/10)] seconds" ++ if(world.time < CULT_POLL_WAIT) ++ Nominee << "It would be premature to select a leader while everyone is still settling in, try again in [round((CULT_POLL_WAIT-world.time)/10)] seconds" + return + for(var/datum/mind/B in SSticker.mode.cult) +- if(!isliving(B.current)) +- continue + var/mob/living/M = B.current +- if(isliving(M)) ++ if(!M.incapacitated()) + M << 'sound/hallucinations/im_here1.ogg' + M.verbs -= /mob/living/proc/cult_master + to_chat(M, "Acolyte [Nominee] has asserted that they are worthy of leading the cult. A vote will be called shortly.") + sleep(250) + for(var/datum/mind/B in SSticker.mode.cult) +- if(!isliving(B.current)) +- continue + var/mob/living/M = B.current +- M << 'sound/magic/exit_blood.ogg' +- switch(askuser(M,"[Nominee] seeks to lead your cult, do you support them?","Please answer in 20 seconds!","Yes","No","Abstain", StealFocus=0, Timeout=200)) +- if(1) +- if((world.time-time_passed)>500) +- M << "Sorry, your vote came too late!" +- M << 'sound/machines/buzz-sigh.ogg' +- else +- M << "Choice registered: Yes." +- yes_voters += M +- cult_total += M +- if(2) +- if((world.time-time_passed)>500) +- M << "Sorry, your vote came too late!" +- M << 'sound/machines/buzz-sigh.ogg' +- else +- M << "Choice registered: No." +- cult_total += M +- if(3) +- M << "Choice registered: Abstain." ++ if(!M.incapacitated()) ++ M << 'sound/magic/exit_blood.ogg' ++ switch(askuser(M,"[Nominee] seeks to lead your cult, do you support them?","Please answer in 20 seconds!","Yes","No","Abstain", StealFocus=0, Timeout=200)) ++ if(1) ++ if((world.time-time_passed)>500) ++ to_chat(M, "Sorry, your vote came too late!") ++ M << 'sound/machines/buzz-sigh.ogg' ++ else ++ M << "Choice registered: Yes." ++ yes_voters += M ++ cult_total += M ++ if(2) ++ if((world.time-time_passed)>500) ++ to_chat(M, "Sorry, your vote came too late!") ++ M << 'sound/machines/buzz-sigh.ogg' ++ else ++ to_chat(M, "Choice registered: No.") ++ cult_total += M ++ if(3) ++ to_chat(M, "Choice registered: Abstain.") + sleep(300) + if(yes_voters.len > (cult_total.len/2)) + var/datum/action/innate/cultmast/finalreck/FinalReckoning = new() diff --git a/code/__HELPERS/matrices.dm b/code/__HELPERS/matrices.dm index 2e34624df5..8b77b170e0 100644 --- a/code/__HELPERS/matrices.dm +++ b/code/__HELPERS/matrices.dm @@ -24,7 +24,6 @@ //doesn't have an object argument because this is "Stacking" with the animate call above //3 billion% intentional - //Dumps the matrix data in format a-f /matrix/proc/tolist() . = list() diff --git a/code/_globalvars/game_modes.dm b/code/_globalvars/game_modes.dm index 153ebbf089..912ae78a04 100644 --- a/code/_globalvars/game_modes.dm +++ b/code/_globalvars/game_modes.dm @@ -3,3 +3,10 @@ GLOBAL_VAR_INIT(secret_force_mode, "secret") // if this is anything but "secret" GLOBAL_VAR_INIT(wavesecret, 0) // meteor mode, delays wave progression, terrible name GLOBAL_DATUM(start_state, /datum/station_state) // Used in round-end report + +// Cult, needs to be global so admin cultists are functional +GLOBAL_VAR_INIT(blood_target, null) // Cult Master's target or Construct's Master +GLOBAL_DATUM(sac_mind, /datum/mind) +GLOBAL_VAR_INIT(sac_image, null) +GLOBAL_VAR_INIT(cult_mastered, FALSE) +GLOBAL_VAR_INIT(sac_complete, FALSE) \ No newline at end of file diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 9c8fe9750a..8e3de4c374 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -42,6 +42,7 @@ thealert.override_alerts = override if(override) thealert.timeout = null + thealert.mob_viewer = src if(new_master) var/old_layer = new_master.layer @@ -96,6 +97,7 @@ var/severity = 0 var/alerttooltipstyle = "" var/override_alerts = FALSE //If it is overriding other alerts of the same type + var/mob/mob_viewer //the mob viewing this alert /obj/screen/alert/MouseEntered(location,control,params) @@ -256,6 +258,103 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." icon_state = "blobbernaut_nofactory" alerttooltipstyle = "blob" +// BLOODCULT + +/obj/screen/alert/bloodsense + name = "Blood Sense" + desc = "Allows you to sense blood that is manipulated by dark magicks." + icon_state = "cult_sense" + alerttooltipstyle = "cult" + var/image/sacimage + var/angle = 0 + var/mob/living/simple_animal/hostile/construct/Cviewer = null + +/obj/screen/alert/bloodsense/Initialize() + ..() + sacimage = GLOB.sac_image + START_PROCESSING(SSprocessing, src) + +/obj/screen/alert/bloodsense/Destroy() + sacimage = null + Cviewer = null + STOP_PROCESSING(SSprocessing, src) + return ..() + +/obj/screen/alert/bloodsense/process() + var/atom/blood_target + if(GLOB.blood_target) + if(!get_turf(GLOB.blood_target)) + GLOB.blood_target = null + else + blood_target = GLOB.blood_target + if(Cviewer) + if(Cviewer.seeking && Cviewer.master) + blood_target = Cviewer.master + if(!blood_target && !GLOB.sac_complete) + if(icon_state == "runed_sense0") + return + animate(src, transform = null, time = 1, loop = 0) + angle = 0 + cut_overlays() + icon_state = "runed_sense0" + desc = "Nar-Sie demands that [GLOB.sac_mind] be sacrificed before the summoning ritual can begin." + add_overlay(sacimage) + return + if(!blood_target && GLOB.sac_complete) + if(icon_state == "runed_sense1") + return + animate(src, transform = null, time = 1, loop = 0) + angle = 0 + cut_overlays() + icon_state = "runed_sense1" + var/image/narnar = new('icons/mob/screen_alert.dmi', "mini_nar") + desc = "The sacrifice is complete, prepare to summon Nar-Sie!" + add_overlay(narnar) + return + if(!blood_target) + return + var/turf/P = get_turf(blood_target) + var/turf/Q = get_turf(mob_viewer) + var/area/A = get_area(P) + if(P.z != Q.z) //The target is on a different Z level, we cannot sense that far. + return + desc = "You are currently tracking [blood_target] in [A.name]" + var/target_angle = Get_Angle(mob_viewer, blood_target) + var/target_dist = get_dist(P, Q) + cut_overlays() + switch(target_dist) + if(0 to 1) + icon_state = "runed_sense2" + if(2 to 8) + icon_state = "arrow8" + if(9 to 15) + icon_state = "arrow7" + if(16 to 22) + icon_state = "arrow6" + if(23 to 29) + icon_state = "arrow5" + if(30 to 36) + icon_state = "arrow4" + if(37 to 43) + icon_state = "arrow3" + if(44 to 50) + icon_state = "arrow2" + if(51 to 57) + icon_state = "arrow1" + if(58 to 64) + icon_state = "arrow0" + if(65 to 400) + icon_state = "arrow" + var/difference = target_angle - angle + angle = target_angle + if(!difference) + return + var/matrix/final = matrix(transform) + final.Turn(difference) + animate(src, transform = final, time = 5, loop = 0) + + + // CLOCKCULT /obj/screen/alert/clockwork alerttooltipstyle = "clockcult" diff --git a/code/datums/antagonists/datum_cult.dm.rej b/code/datums/antagonists/datum_cult.dm.rej new file mode 100644 index 0000000000..137565bd5f --- /dev/null +++ b/code/datums/antagonists/datum_cult.dm.rej @@ -0,0 +1,9 @@ +diff a/code/datums/antagonists/datum_cult.dm b/code/datums/antagonists/datum_cult.dm (rejected hunks) +@@ -65,6 +65,7 @@ + cult_memorization(owner) + if(jobban_isbanned(current, ROLE_CULTIST)) + addtimer(CALLBACK(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, current, ROLE_CULTIST, ROLE_CULTIST), 0) ++ SSticker.mode.update_cult_icons_added(owner) + current.throw_alert("bloodsense", /obj/screen/alert/bloodsense) + current.log_message("Has been converted to the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG) + diff --git a/code/datums/mind.dm b/code/datums/mind.dm index e99d5bb59a..f4a535e4c4 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1438,14 +1438,7 @@ to_chat(current, "You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of Nar-Sie.") to_chat(current, "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.") var/datum/game_mode/cult/cult = SSticker.mode - - if (istype(cult)) - cult.memorize_cult_objectives(src) - else - var/explanation = "Summon Nar-Sie via the use of the appropriate rune (Hell join self). It will only work if nine cultists stand on and around it." - to_chat(current, "Objective #1: [explanation]") - memory += "Objective #1: [explanation]
" - + cult.memorize_cult_objectives(src) var/mob/living/carbon/human/H = current if (!SSticker.mode.equip_cultist(current)) to_chat(H, "Spawning an amulet from your Master failed.") diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 3f261c7991..043b1c3df6 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -223,3 +223,32 @@ name = "Wish Granter's Immortality" desc = "You are being resurrected!" icon_state = "wish_granter" + +/datum/status_effect/cult_master + id = "The Cult Master" + duration = -1 + tick_interval = 100 + alert_type = null + var/alive = TRUE + +/datum/status_effect/cult_master/proc/deathrattle() + var/area/A = get_area(owner) + for(var/datum/mind/B in SSticker.mode.cult) + if(isliving(B.current)) + var/mob/living/M = B.current + M << 'sound/hallucinations/veryfar_noise.ogg' + to_chat(M, "The Cult's Master, [owner], has fallen in the [A]!") + + +/datum/status_effect/cult_master/tick() + if(owner.stat != DEAD && !alive) + alive = TRUE + return + if(owner.stat == DEAD && alive) + alive = FALSE + deathrattle() + +/datum/status_effect/cult_master/on_remove() + deathrattle() + . = ..() + diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 7780ae5db9..b67ad1f74b 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -1,5 +1,3 @@ - - /datum/game_mode var/list/datum/mind/cult = list() var/list/cult_objectives = list() @@ -36,10 +34,10 @@ antag_flag = ROLE_CULTIST restricted_jobs = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel") protected_jobs = list() - required_players = 24 - required_enemies = 4 - recommended_enemies = 4 - enemy_minimum_age = 14 + required_players = 1 + required_enemies = 1 + recommended_enemies = 1 + enemy_minimum_age = 0 announce_span = "cult" announce_text = "Some crew members are trying to start a cult to Nar-Sie!\n\ @@ -47,14 +45,13 @@ Crew: Prevent the cult from expanding and drive it out." var/finished = 0 - var/eldergod = 1 //for the summon god objective var/acolytes_needed = 10 //for the survive objective var/acolytes_survived = 0 - var/datum/mind/sacrifice_target = null//The target to be sacrificed var/list/cultists_to_cult = list() //the cultists we'll convert + /datum/game_mode/cult/pre_setup() cult_objectives += "sacrifice" cult_objectives += "eldergod" @@ -89,10 +86,11 @@ if("survive") explanation = "Our knowledge must live on. Make sure at least [acolytes_needed] acolytes escape on the shuttle to spread their work on an another station." if("sacrifice") - if(sacrifice_target) - explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role] via invoking a Sacrifice rune with them on it and three acolytes around it." + if(GLOB.sac_mind) + explanation = "Sacrifice [GLOB.sac_mind], the [GLOB.sac_mind.assigned_role] via invoking a Sacrifice rune with them on it and three acolytes around it." else - explanation = "Free objective." + explanation = "The veil has already been weakened here, proceed to the next objective." + GLOB.sac_complete = TRUE if("eldergod") explanation = "Summon Nar-Sie by invoking the rune 'Summon Nar-Sie' with nine acolytes on it. You must do this after sacrificing your target." to_chat(cult_mind.current, "Objective #[obj_count]: [explanation]") @@ -108,9 +106,17 @@ if(player.mind && !(player.mind in cultists_to_cult)) possible_targets += player.mind if(possible_targets.len > 0) - sacrifice_target = pick(possible_targets) - if(!sacrifice_target) + GLOB.sac_mind = pick(possible_targets) + if(!GLOB.sac_mind) message_admins("Cult Sacrifice: ERROR - Null target chosen!") + else + var/datum/job/sacjob = SSjob.GetJob(GLOB.sac_mind.assigned_role) + var/icon/reshape = get_flat_human_icon(null, sacjob, GLOB.sac_mind.current.client.prefs) + reshape.Shift(SOUTH, 4) + reshape.Shift(EAST, 1) + reshape.Crop(7,4,26,31) + reshape.Crop(-5,-3,26,30) + GLOB.sac_image = reshape else message_admins("Cult Sacrifice: Could not find unconvertable or convertable target. WELP!") for(var/datum/mind/cult_mind in cultists_to_cult) @@ -198,7 +204,7 @@ if(cult_objectives.Find("eldergod")) cult_fail += eldergod //1 by default, 0 if the elder god has been summoned at least once if(cult_objectives.Find("sacrifice")) - if(sacrifice_target && !GLOB.sacrificed.Find(sacrifice_target)) //if the target has been GLOB.sacrificed, ignore this step. otherwise, add 1 to cult_fail + if(GLOB.sac_mind && GLOB.sac_complete) //if the target has been GLOB.sacrificed, ignore this step. otherwise, add 1 to cult_fail cult_fail++ return cult_fail //if any objectives aren't met, failure @@ -269,12 +275,45 @@ return 1 -/datum/game_mode/proc/auto_declare_completion_cult() - if( cult.len || (SSticker && istype(SSticker.mode,/datum/game_mode/cult)) ) - var/text = "
The cultists were:" - for(var/datum/mind/cultist in cult) - text += printplayer(cultist) - - text += "
" - - to_chat(world, text) +/datum/game_mode/proc/datum_cult_completion() + var/text = "" + var/acolytes_survived = 0 + for(var/datum/mind/cult_mind in cult) + if (cult_mind.current && cult_mind.current.stat != DEAD) + if(cult_mind.current.onCentcom() || cult_mind.current.onSyndieBase()) + acolytes_survived++ + var/cult_fail = 0 + cult_fail += eldergod + if(!GLOB.sac_complete) + cult_fail++ + if(!cult_fail) + SSblackbox.set_details("round_end_result","win - cult win") + SSblackbox.set_val("round_end_result",acolytes_survived) + to_chat(world, "The cult has succeeded! Nar-sie has snuffed out another torch in the void!") + else + SSblackbox.set_details("round_end_result","loss - staff stopped the cult") + SSblackbox.set_val("round_end_result",acolytes_survived) + to_chat(world, "The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!") + if(cult_objectives.len) + text += "
The cultists' objectives were:" + for(var/obj_count in 1 to 2) + var/explanation + switch(cult_objectives[obj_count]) + if("sacrifice") + if(GLOB.sac_complete) + explanation = "Sacrifice [GLOB.sac_mind], the [GLOB.sac_mind.assigned_role]. Success!" + SSblackbox.add_details("cult_objective","cult_sacrifice|SUCCESS") + else + explanation = "Sacrifice [GLOB.sac_mind], the [GLOB.sac_mind.assigned_role]. Fail." + SSblackbox.add_details("cult_objective","cult_sacrifice|FAIL") + if("eldergod") + if(!eldergod) + explanation = "Summon Nar-Sie. Success!" + SSblackbox.add_details("cult_objective","cult_narsie|SUCCESS") + SSticker.news_report = CULT_SUMMON + else + explanation = "Summon Nar-Sie. Fail." + SSblackbox.add_details("cult_objective","cult_narsie|FAIL") + SSticker.news_report = CULT_FAILURE + text += "
Objective #[obj_count]: [explanation]" + to_chat(world, text) diff --git a/code/game/gamemodes/cult/cult.dm.rej b/code/game/gamemodes/cult/cult.dm.rej new file mode 100644 index 0000000000..fb9b30c910 --- /dev/null +++ b/code/game/gamemodes/cult/cult.dm.rej @@ -0,0 +1,33 @@ +diff a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm (rejected hunks) +@@ -4,7 +4,7 @@ + var/eldergod = 1 //for the summon god objective + + /proc/iscultist(mob/living/M) +- return istype(M) && M.has_antag_datum(/datum/antagonist/cultist, TRUE) ++ return istype(M) && M.mind && M.mind.has_antag_datum(ANTAG_DATUM_CULT) + + /proc/is_sacrifice_target(datum/mind/mind) + if(mind == GLOB.sac_mind) +@@ -163,18 +163,18 @@ + /datum/game_mode/proc/add_cultist(datum/mind/cult_mind, stun) //BASE + if (!istype(cult_mind)) + return 0 +- if(cult_mind.current.gain_antag_datum(/datum/antagonist/cultist)) ++ if(cult_mind.add_antag_datum(ANTAG_DATUM_CULT)) + if(stun) + cult_mind.current.Paralyse(5) + return 1 + + /datum/game_mode/proc/remove_cultist(datum/mind/cult_mind, show_message = 1, stun) + if(cult_mind.current) +- var/datum/antagonist/cultist/cult_datum = cult_mind.current.has_antag_datum(/datum/antagonist/cultist, TRUE) ++ var/datum/antagonist/cult/cult_datum = cult_mind.has_antag_datum(ANTAG_DATUM_CULT) + if(!cult_datum) + return FALSE +- cult_datum.silent_update = show_message +- cult_datum.on_remove() ++ cult_datum.silent = show_message ++ cult_datum.on_removal() + if(stun) + cult_mind.current.Paralyse(5) + return TRUE diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm index 40c7bbece8..ff8ee97de7 100644 --- a/code/game/gamemodes/cult/cult_comms.dm +++ b/code/game/gamemodes/cult/cult_comms.dm @@ -1,3 +1,5 @@ +// Contains cult communion, guide, and cult master abilities +#define MARK_COOLDOWN /datum/action/innate/cultcomm name = "Communion" @@ -19,11 +21,15 @@ cultist_commune(usr, input) /proc/cultist_commune(mob/living/user, message) + var/my_message if(!message) return user.whisper("O bidai nabora se[pick("'","`")]sma!") user.whisper(html_decode(message)) - var/my_message = "[(ishuman(user) ? "Acolyte" : "Construct")] [findtextEx(user.name, user.real_name) ? user.name : "[user.real_name] (as [user.name])"]: [message]" + if (user.mind.special_role == "Cult Master") + my_message = "[(ishuman(user) ? "Master" : "Lord")] [findtextEx(user.name, user.real_name) ? user.name : "[user.real_name] (as [user.name])"]: [message]" + else + my_message = "[(ishuman(user) ? "Acolyte" : "Construct")] [findtextEx(user.name, user.real_name) ? user.name : "[user.real_name] (as [user.name])"]: [message]" for(var/mob/M in GLOB.mob_list) if(iscultist(M)) to_chat(M, my_message) @@ -65,3 +71,149 @@ popup.set_content(text) popup.open() return 1 + +/mob/living/proc/cult_master() + set category = "Cultist" + set name = "Assert Leadership" + pollCultists(src) // This proc handles the distribution of cult master actions + +/datum/action/innate/cultmast + background_icon_state = "bg_demon" + buttontooltipstyle = "cult" + check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_CONSCIOUS + +/datum/action/innate/cultmast/IsAvailable() + if(owner.mind.special_role != "Cult Master") + return 0 + return ..() + +/datum/action/innate/cultmast/finalreck + name = "Final Reckoning" + desc = "A single-use spell that brings the entire cult to the master's location" + button_icon_state = "sintouch" + +/datum/action/innate/cultmast/finalreck/Activate() + var/list/destinations = list() + for(var/turf/T in orange(1,owner)) + if(istype(T, /turf/open)) + destinations += T + for(var/i in 1 to 4) + owner.chant(i) + if(do_after(owner, 30, target = owner)) + for(var/datum/mind/B in SSticker.mode.cult) + var/mob/living/M = B.current + if(isliving(M) && M.stat != DEAD) + var/turf/mobloc = get_turf(M) + switch(i) + if (1) + new /obj/effect/overlay/temp/cult/sparks(mobloc, M.dir) + playsound(mobloc, "sparks", 50, 1) + if (2) + new /obj/effect/overlay/temp/dir_setting/cult/phase/out(mobloc, M.dir) + playsound(mobloc, "sparks", 75, 1) + if (3) + new /obj/effect/overlay/temp/dir_setting/cult/phase(mobloc, M.dir) + playsound(mobloc, "sparks", 100, 1) + if (4) + playsound(mobloc, 'sound/magic/exit_blood.ogg', 100, 1) + if(M != owner) + var/turf/final = pick(destinations) + new /obj/effect/overlay/temp/cult/blood(final) + addtimer(CALLBACK(M, /mob/.proc/reckon, final), 10) + else + for(var/datum/action/innate/cultmast/finalreck/H in owner.actions) + qdel(H) + else + return + +/mob/proc/reckon(var/turf/final) + new /obj/effect/overlay/temp/cult/blood/out(get_turf(src)) + forceMove(final) + +/mob/proc/chant(var/i) + switch(i) + if (1) + say("C'arta Forbici!") + if (2) + say("Pleggh E'ntrath!") + playsound(get_turf(src),'sound/magic/clockwork/narsie_attack.ogg', 50, 1) + if (3) + say("Barhah hra Zar'garis!") + playsound(get_turf(src),'sound/magic/clockwork/narsie_attack.ogg', 75, 1) + if (4) + say("N'ath reth Sh'yro eth D'rekkathnor!!!") + playsound(get_turf(src),'sound/magic/clockwork/narsie_attack.ogg', 100, 1) + +/datum/action/innate/cultmast/cultmark + name = "Mark Target" + desc = "Marks a target for the cult" + button_icon_state = "cult_mark" + var/obj/effect/proc_holder/cultmark/CM + var/time = 0 + +/datum/action/innate/cultmast/cultmark/New() + CM = new() + ..() + +/datum/action/innate/cultmast/cultmark/IsAvailable() + if(owner.mind.special_role != "Cult Master") + return 0 + if((world.time - time)<1200 && !CM.active) + owner << "You need to wait [round((1200-(world.time-time))/10)] seconds before you can mark another target!" + return 0 + return ..() + +/datum/action/innate/cultmast/cultmark/Destroy() + QDEL_NULL(CM) + return ..() + +/datum/action/innate/cultmast/cultmark/Activate() + CM.toggle(owner) //the important bit + if(!active) + time = world.time + else + time = 0 + return TRUE + +/obj/effect/proc_holder/cultmark + active = FALSE + ranged_mousepointer = 'icons/effects/cult_target.dmi' + + +/obj/effect/proc_holder/cultmark/proc/toggle(mob/user) + if(active) + remove_ranged_ability("You cease the marking ritual...") + else + add_ranged_ability(user, "You prepare to mark a target for your cult...") + +/obj/effect/proc_holder/cultmark/InterceptClickOn(mob/living/caller, params, atom/target) + if(..()) + return + if(ranged_ability_user.incapacitated()) + remove_ranged_ability() + return + var/turf/T = get_turf(ranged_ability_user) + if(!isturf(T)) + return FALSE + if(target in view(7, get_turf(ranged_ability_user))) + remove_ranged_ability(caller, "The marking rite is complete! It will last for 90 seconds.") + GLOB.blood_target = target + var/area/A = get_area(target) + for(var/datum/mind/B in SSticker.mode.cult) + var/mob/living/M = B.current + if(M.stat != DEAD) + to_chat(M, "Master [ranged_ability_user] has marked [GLOB.blood_target] in the [A.name] as the cult's top priority, get there immediately!") + M << pick(sound('sound/hallucinations/over_here2.ogg',0,1,75), sound('sound/hallucinations/over_here3.ogg',0,1,75)) + var/image/cult_marker = image('icons/effects/cult_target.dmi', target, "glow", ABOVE_MOB_LAYER) + M.client.images |= cult_marker + addtimer(CALLBACK(M, /mob/living/proc/reset_blood_image, cult_marker), 900, TIMER_OVERRIDE) + return TRUE + return FALSE + +/mob/living/proc/reset_blood_image(var/image/cult_marker) + if(GLOB.blood_target && src.stat!=DEAD) + to_chat(src,"The blood mark has expired!") + if(client) + client.images.Remove(cult_marker) + QDEL_NULL(cult_marker) + GLOB.blood_target = null \ No newline at end of file diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index a90aeb78bc..6058e8f605 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -213,7 +213,7 @@ flags_inv = HIDEJUMPSUIT allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade) body_parts_covered = CHEST|GROIN|LEGS|ARMS - armor = list(melee = -50, bullet = -50, laser = -100,energy = -50, bomb = -50, bio = -50, rad = -50, fire = 0, acid = 0) + armor = list(melee = -50, bullet = -50, laser = -50,energy = -50, bomb = -50, bio = -50, rad = -50, fire = 0, acid = 0) slowdown = -1 hoodtype = /obj/item/clothing/head/hooded/berserkerhood diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index ce4abced72..f393929463 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -197,35 +197,30 @@ This file contains the arcane tome files. if(!src || QDELETED(src) || !Adjacent(user) || user.incapacitated() || !check_rune_turf(Turf, user)) return if(ispath(rune_to_scribe, /obj/effect/rune/narsie)) - if(SSticker.mode.name == "cult") - var/datum/game_mode/cult/cult_mode = SSticker.mode - if(!("eldergod" in cult_mode.cult_objectives)) - to_chat(user, "Nar-Sie does not wish to be summoned!") - return - if(cult_mode.sacrifice_target && !(cult_mode.sacrifice_target in GLOB.sacrificed)) - to_chat(user, "The sacrifice is not complete. The portal would lack the power to open if you tried!") - return - if(!cult_mode.eldergod) - to_chat(user, "\"I am already here. There is no need to try to summon me now.\"") - return - if((loc.z && loc.z != ZLEVEL_STATION) || !A.blob_allowed) - to_chat(user, "The Geometer is not interested in lesser locations; the station is the prize!") - return - var/confirm_final = alert(user, "This is the FINAL step to summon Nar-Sie, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for Nar-Sie!", "No") - if(confirm_final == "No") - to_chat(user, "You decide to prepare further before scribing the rune.") - return - Turf = get_turf(user) - A = get_area(src) - if(!check_rune_turf(Turf, user) || (loc.z && loc.z != ZLEVEL_STATION)|| !A.blob_allowed) - return - priority_announce("Figments from an eldritch god are being summoned by [user] into [A.map_name] from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensionsal Affairs", 'sound/AI/spanomalies.ogg') - for(var/B in spiral_range_turfs(1, user, 1)) - var/obj/structure/emergency_shield/sanguine/N = new(B) - shields += N - else + if(!("eldergod" in SSticker.mode.cult_objectives)) to_chat(user, "Nar-Sie does not wish to be summoned!") return + if(GLOB.sac_complete) + to_chat(user, "The sacrifice is not complete. The portal would lack the power to open if you tried!") + return + if(!SSticker.mode.eldergod) + to_chat(user, "\"I am already here. There is no need to try to summon me now.\"") + return + if((loc.z && loc.z != ZLEVEL_STATION) || !A.blob_allowed) + to_chat(user, "The Geometer is not interested in lesser locations; the station is the prize!") + return + var/confirm_final = alert(user, "This is the FINAL step to summon Nar-Sie, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for Nar-Sie!", "No") + if(confirm_final == "No") + to_chat(user, "You decide to prepare further before scribing the rune.") + return + Turf = get_turf(user) + A = get_area(src) + if(!check_rune_turf(Turf, user) || (loc.z && loc.z != ZLEVEL_STATION)|| !A.blob_allowed) + return + priority_announce("Figments from an eldritch god are being summoned by [user] into [A.map_name] from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensional Affairs", 'sound/AI/spanomalies.ogg') + for(var/B in spiral_range_turfs(1, user, 1)) + var/obj/structure/emergency_shield/sanguine/N = new(B) + shields += N user.visible_message("[user] [user.blood_volume ? "cuts open their arm and begins writing in their own blood":"begins sketching out a strange design"]!", \ "You [user.blood_volume ? "slice open your arm and ":""]begin drawing a sigil of the Geometer.") if(user.blood_volume) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 3a80ed54b3..4b9dd1a6c7 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -398,23 +398,23 @@ structure_check() searches for nearby cultist structures required for the invoca return 1 /obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers) + var/big_sac = FALSE if((((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || is_sacrifice_target(sacrificial.mind)) && invokers.len < 3) for(var/M in invokers) to_chat(M, "[sacrificial] is too greatly linked to the world! You need three acolytes!") log_game("Offer rune failed - not enough acolytes and target is living or sac target") return FALSE - var/sacrifice_fulfilled = FALSE - if(sacrificial.mind) GLOB.sacrificed += sacrificial.mind if(is_sacrifice_target(sacrificial.mind)) - sacrifice_fulfilled = TRUE + GLOB.sac_complete = TRUE + big_sac = TRUE else GLOB.sacrificed += sacrificial new /obj/effect/overlay/temp/cult/sac(get_turf(src)) for(var/M in invokers) - if(sacrifice_fulfilled) + if(big_sac) to_chat(M, "\"Yes! This is the one I desire! You have done well.\"") else if(ishuman(sacrificial) || iscyborg(sacrificial)) @@ -451,7 +451,7 @@ structure_check() searches for nearby cultist structures required for the invoca scribe_delay = 450 //how long the rune takes to create scribe_damage = 40.1 //how much damage you take doing it var/used - var/ignore_gamemode = FALSE + var/ignore_gamemode = TRUE /obj/effect/rune/narsie/Initialize(mapload, set_keyword) . = ..() @@ -490,7 +490,7 @@ structure_check() searches for nearby cultist structures required for the invoca //BEGIN THE SUMMONING used = 1 ..() - send_to_playing_players('sound/effects/dimensional_rend.ogg') //There used to be a message for this but every time it was changed it got edgier so I removed it + send_to_playing_players('sound/effects/dimensional_rend.ogg') var/turf/T = get_turf(src) sleep(40) if(src) diff --git a/code/game/gamemodes/game_mode.dm.rej b/code/game/gamemodes/game_mode.dm.rej new file mode 100644 index 0000000000..a8a4a7ca6c --- /dev/null +++ b/code/game/gamemodes/game_mode.dm.rej @@ -0,0 +1,10 @@ +diff a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm (rejected hunks) +@@ -258,6 +258,8 @@ + if(escaped_total > 0) + feedback_set("escaped_total",escaped_total) + send2irc("Server", "Round just ended.") ++ if(cult.len && !istype(SSticker.mode,/datum/game_mode/cult)) ++ datum_cult_completion() + return 0 + + diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 7ccf7a6b7e..b840b64c93 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -54,7 +54,7 @@ if(!ishuman(M))//If target is not a human. return ..() if(iscultist(M)) - to_chat(user, "\"Come now, do not capture your fellow's soul.\"") + to_chat(user, "\"Come now, do not capture your bretheren's soul.\"") return add_logs(user, M, "captured [M.name]'s soul", src) @@ -132,11 +132,11 @@ if("VICTIM") var/mob/living/carbon/human/T = target - if(SSticker.mode.name == "cult" && T.mind == SSticker.mode:sacrifice_target) + if(is_sacrifice_target(T.mind)) if(iscultist(user)) to_chat(user, "\"This soul is mine. SACRIFICE THEM!\"") else - to_chat(user, "The soulstone doesn't work for no apparent reason.") + to_chat(user, "The soulstone seems to reject this soul.") return 0 if(contents.len) to_chat(user, "Capture failed!: The soulstone is full! Free an existing soul to make room.") @@ -188,7 +188,10 @@ else makeNewConstruct(/mob/living/simple_animal/hostile/construct/builder/noncult, A, user, 0, T.loc) - + for(var/datum/mind/B in SSticker.mode.cult) + if(B == A.mind) + SSticker.mode.cult -= A.mind + SSticker.mode.update_cult_icons_removed(A.mind) qdel(T) user.drop_item() qdel(src) @@ -200,6 +203,9 @@ var/mob/living/simple_animal/hostile/construct/newstruct = new ctype((loc_override) ? (loc_override) : (get_turf(target))) if(stoner) newstruct.faction |= "\ref[stoner]" + newstruct.master = stoner + var/datum/action/innate/seek_master/SM = new() + SM.Grant(newstruct) newstruct.key = target.key if(newstruct.mind && ((stoner && iscultist(stoner)) || cultoverride) && SSticker && SSticker.mode) SSticker.mode.add_cultist(newstruct.mind, 0) @@ -207,6 +213,9 @@ to_chat(newstruct, "You are still bound to serve the cult[stoner ? " and [stoner]":""], follow their orders and help them complete their goals at all costs.") else if(stoner) to_chat(newstruct, "You are still bound to serve your creator, [stoner], follow their orders and help them complete their goals at all costs.") + newstruct.throw_alert("bloodsense", /obj/screen/alert/bloodsense) + var/obj/screen/alert/bloodsense/BS = newstruct.alerts["bloodsense"] + BS.Cviewer = newstruct newstruct.cancel_camera() diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 3935b86c92..2a5dff0fd6 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -230,7 +230,15 @@ name = "blood sparks" icon_state = "bloodsparkles" -/obj/effect/overlay/temp/dir_setting/cult/phase +/obj/effect/overlay/temp/cult/blood // The traditional teleport + name = "blood jaunt" + duration = 12 + icon_state = "bloodin" + +/obj/effect/overlay/temp/cult/blood/out + icon_state = "bloodout" + +/obj/effect/overlay/temp/dir_setting/cult/phase // The veil shifter teleport name = "phase glow" duration = 7 icon_state = "cultin" diff --git a/code/game/objects/effects/overlays.dm.rej b/code/game/objects/effects/overlays.dm.rej new file mode 100644 index 0000000000..7bfce2cb62 --- /dev/null +++ b/code/game/objects/effects/overlays.dm.rej @@ -0,0 +1,10 @@ +diff a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm (rejected hunks) +@@ -214,7 +214,7 @@ + icon = 'icons/effects/fire.dmi' + icon_state = "3" + duration = 20 +- ++ + /obj/effect/overlay/temp/cult + randomdir = 0 + duration = 10 diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 0734670468..d908ed547d 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -49,8 +49,8 @@ timeofdeath = world.time tod = worldtime2text() var/turf/T = get_turf(src) + var/area/A = get_area(T) if(mind && mind.name && mind.active && (!(T.flags & NO_DEATHRATTLE))) - var/area/A = get_area(T) var/rendered = "[mind.name] has died at [A.name]." deadchat_broadcast(rendered, follow_target = src, turf_target = T, message_type=DEADCHAT_DEATHRATTLE) if(mind) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index b879f1baf6..37ef42291d 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -31,12 +31,20 @@ deathmessage = "collapses in a shattered heap." var/list/construct_spells = list() var/playstyle_string = "You are a generic construct! Your job is to not exist, and you should probably adminhelp this." + var/master = null + var/seeking = FALSE /mob/living/simple_animal/hostile/construct/Initialize() . = ..() for(var/spell in construct_spells) AddSpell(new spell(null)) +/mob/living/simple_animal/hostile/construct/Destroy() + for(var/X in actions) + var/datum/action/A = X + qdel(A) + ..() + /mob/living/simple_animal/hostile/construct/Login() ..() to_chat(src, playstyle_string) diff --git a/code/modules/mob/living/simple_animal/constructs.dm.rej b/code/modules/mob/living/simple_animal/constructs.dm.rej new file mode 100644 index 0000000000..b730acfbe9 --- /dev/null +++ b/code/modules/mob/living/simple_animal/constructs.dm.rej @@ -0,0 +1,40 @@ +diff a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm (rejected hunks) +@@ -41,14 +41,11 @@ + for(var/spell in construct_spells) + AddSpell(new spell(null)) + +-<<<<<<< HEAD + /mob/living/simple_animal/hostile/construct/Destroy() + for(var/X in actions) + var/datum/action/A = X + qdel(A) + ..() +-======= +->>>>>>> a7603e4aba50d410795d5207e6d5e929b2401cb9 + + /mob/living/simple_animal/hostile/construct/Login() + ..() +@@ -288,8 +285,6 @@ + environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP + + +- +-<<<<<<< HEAD + ///////////////////////Master-Tracker/////////////////////// + + /datum/action/innate/seek_master +@@ -320,7 +315,7 @@ + the_construct.seeking = TRUE + to_chat(the_construct, "You are now tracking your master.") + +-======= ++ + /////////////////////////////ui stuff///////////////////////////// + + /mob/living/simple_animal/hostile/construct/update_health_hud() +@@ -337,4 +332,4 @@ + hud_used.healths.icon_state = "[icon_state]_health5" + else + hud_used.healths.icon_state = "[icon_state]_health6" +->>>>>>> a7603e4aba50d410795d5207e6d5e929b2401cb9 ++ diff --git a/config/game_options.txt b/config/game_options.txt index 356dc1acab..dce0b57d42 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -166,7 +166,7 @@ MIDROUND_ANTAG ABDUCTION #MIN_POP GANG 20 #MAX_POP GANG -1 -#MIN_POP CULT 24 +#MIN_POP CULT 0 #MAX_POP CULT -1 #MIN_POP CLOCKWORK_CULT 24 diff --git a/icons/effects/64x64.dmi b/icons/effects/64x64.dmi index 347bccc9425bf2f0d8e07ddfdd6f97b7f26a8654..361cfff40c0f47430c4d7bf7d8767324405e36a3 100644 GIT binary patch literal 10479 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 XHM6K~t{(?}!3cS-peA1-YwZ6&ra&UA literal 9011 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 iV`JkbaS5jLyPSd(V?@c#f4!$al( diff --git a/icons/effects/cult_target.dmi b/icons/effects/cult_target.dmi new file mode 100644 index 0000000000000000000000000000000000000000..650feb3361343ddb2454414ef5228706046efde3 GIT binary patch literal 1654 zcmV-+28sEJP)V=-0C=38%&`i?AQXk++4~fSbd^$VGP;z6k|B8qK^p~IgGxf*zC#OLGP#|9 z_|6Hp;Xcmjr;#?BvX3t)wC4-4-J9Z|aFxWI^@}Ut$VC?mg+_Hxim zcXuIDm?0&Qmc&%}zxTQ%5`Q-MC6NHh&U;V5F5g;r0JH@LFb)i092mej-)nAi&RtVK z_uhB+bqD%u>v!5&z-vY{$IqGn7|>rvUuA$(B!0*=uDz}l=r5-~X@EbW(I18XncDlH zzpno1Adnr^iw3pgebhz`&|h9ZYk*hbprN1>EI!ab_mzIXpue8JY8t5RL`r-Ppue2H zIu9T_@sQ}m!$SXg=r60EGyu;t<546x9Cw1nZ=T(%`law zEww;@IsMUU;3)`~W|(A$2dXcNLVtOEl!J}yV?l^H);9nnitpXg28qv`{SK??TH9d?=1+s!6meKvs%KGALP&)%PS#?UD~0~}1A=ksVkv^Vf8U7CPI@Pq!%_nzD6GM|Cs zT7cY!^x)i8Zd6=te|#hTv-hVyya|Hl`w+|$p3b?S{2Of|8v5`i2%0a!2&}J~`%7>> zKp|{`SbxdjOKl1!Naz;_p9s}J^Wc1dLin2>>&FAbrL-x0^Aq~nsooekAE1DEz}FK! z_KAVvQrZ*^_yIOh&X$Hx`v=Wi-5|supIEk1H)r<57!5-iZKFzL2{akQ3T~1-a=;hQ4rH=O(=g5lP!MPM zQcrT6EIJmJk4H#m_+kT6CSy3&IEq0TtQ3P#4j#dLIhetM5W@>X7%T}hyd*3Ji$XJt zLKUBhJG6@yg_1HYjPn61_^QjoNsJM+eSrb~L*_If3}75o1C0X%7{~nHKqt0ySp;tY z8Nxj&w1eLlgKC^A6H{qaoe^9i=b zCj+$HAJ4QtpTH8TH^3LzAK(0Zf~}%5K;!-K&CdteGTCZi%l+}p8s`I`8kj+5@nmj) zsu)D{uXaFm-@{owQc})F-QjV zn)#!xRSUqJem<)91z`REc0e)6I52>5U;yL%1y0FBp;K4IWdHyG07*qoM6N<$f&`fq AMgRZ+ literal 0 HcmV?d00001 diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index d684794ee851c607626eb48a9b5229bf94828a33..fe537a8e73949cf70e8b8a0f5185b68563cfca2e 100644 GIT binary patch delta 19016 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 HFJAv2bw9v) literal 12486 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 RGl75~R73xM>D^}${|h~|FeU&1 diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi index 5858925d86cd131511a027fcfa768fe8b3c89a8b..162f5308e8a788af7b295fa2527299e23a53cffb 100644 GIT binary patch literal 98842 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 z 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

5l2(Di*FxjxIEVd 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⋘9& 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

{aY^Q`vMbp0uhdwF^AFSKW&|K?5-wHs_>nqi=D& zNBiTEIFB1!F=Mf>ep{~~rjDch-z6*h8TQK25;s-5MVQnED@PU&XTk*Bj)y_?+u8T0 z4c(-~lI~;&?3Qr)XJQki*y|MtE|lxLr`MEx>@Tt--MEqp``n8Qqk6j7RyNr(cvLBN zdRMIhlQn~qbJQ1uEfiE&Cu&Y&G*1y;<6Pwi#u&t9-)1^V2M{dX8QEMaaE=0=mOcL< zv}R+mN7DEf=Z7IjR!;oGV4uFPt--2F}?=&NMeF0>IJ# zW#Kp6!=<7jKdRwdV0=@OIM~ z%<#+*@TmCMRxup2#3WI|!xSUC^F=8VX+}(CgnMo>-#A)j&Tfh|u9;5}i9Q3`-E$k4 zBv<;GsHha@F_5$iV^gD9uCB}e)S}X8af%6O`QHUg*r&M&FATp=NHf&vwIGkF2d0KNDcFD z=QLxknK$_{`_2am%dC?@G7p-AE1xInIzR*Z&4DQD0#)!NA7ZAOex|eNCvA zLvmtmm4KOU^_Xq1*FK_$it>@YKY#wXy1N%RLF=6kPqx|Cj&&fGS5WV%s_tD&U}WF% zHO8l0GG;i%l2&lwya+U9=ud=wZk5Q<4I_;1Ot6@CsqkICQVb@#1HHJhOMqHKvJ|Vc zYtoljED01TxF9NZraf3lMwz5Vd{P*|cIyC{xa(c#={%qc>$?o4fjrf?^&ikcVn*MS z=7|C6F@4&TF`oi%_}_i*H#YcRQDf(?ua6a7NU-@f4oAtG1{h$=Ql**Dr4`qx?ea_( zCwI;0(Bf^hF{3c3h}B0(88C0Qx>&@8GH?KPs=g95p@hab#Y3hHSy(7lXT6S~-Xt_t zv~!t*k+wmRB&thTf_J*06>;-H4qF8`C*wyXzWaqy8VY1qcBo;sZB{c_S8PfzkVR7& zZUxK%9}<3cNS@a9nhwEB+IP&dAV%fKjwJrJ4wG~7DT7<>$K4ck*nniPw5+@^&KF&#}DHZkFc07uLXy=PJ|H)#Bx2=sVX5W3iz{N+k`Yd7$ zn&HPy#tx$v%na!BzR>~HphA_REyCh}U7EV;UMohS5IDxHN*O#Y5)^C)h$S@#!3YNi z?0dzxw$87o8QBz+ds^m8B8CglBD7GIVCl+ImZzG?H;g@`aH6=F(vrLiPE?{&{Rz=pS*;+R;L$N482z_5x(O5@ds00#7x9oZfAgyIav*{qqe+60VAt zAA8FeBoy% zBDOvZKcTf5&U_?nN;bMc1CfxlU=t2KF@OAwaZ1i@WcbPVWZ97BJU{}KFc@Xi?zM8{ zxs`HR`>gk+l_D$W4sXpR=evCuHbjepvzG5V2bIdTi4j*32vgq|_r8xs1jF4{VkC!W zszTA@E8eR7_5(@lgEQ{mAZWwdBvsuueNeDXb00zPUCWjSy-dW%MhwnlVXE=F8P0Y6 z@AEDGz;6!5$Kw{y35GA%(E?S~?{xnyz$^vYBAgINw|G8sI=2w~n`7J3m_5T&`xJ~D z8~<6o*8B@GU$V4lX>j#Nz69C&`n=duMe}@1-l$i1m8Gjoy^s$hBV!-iO_hku_|%lz zIe3r$@5hEv5=u(Z)_19tBmEY7_)O@rqm$J+$=@M+eYh5WQ&d*4nT-j4W?Z+5Q!Eu& zq>0~xBlh;#UpaMbI{6b0S;T0?ryDKj@h5TF+$JhMH+|qFAJ1jmDl3~6J~uqjQ2mZY zPbNbGrAdv9gE%tmDRemr{I+3qF;Qtjqgc?ne(!Rhp24(b@PS^m&%!q_c4iSuHZPNA z>x1Z%jat9#)(6miU~htkha5E`iG%okaQ)6W@-^Y;)8Xo`P-r${&iA=FA21?fXl>K> zMh?xLhZAF2O?Op?-YLkaX_{A?QS`$8c$Y^IZ(n&vZS~%(hC*6yOg-4ybvs`v``>vO zQmKwLk+$Z$RgYctCbqR1%5pyY3#`5hEZgftD@x$7WrZYVAWoh4Y@oF1%kr#A*0NwH z$%n;4sQE*s6+n<^KkFy_vbX(4>A`pnyfj80*%J~mkTaHcy{{M_}>kBlsr zVNoah`JRc-3R{N!oe4Bdyb=AnMvyaH9iE9!_ zk%0OhTvrt-^mt*5=gV_eNn3OFeI*ZBs#jDf$WpHR~>c+x#hExz)%+c zd90Vg6-8xHF$p7W%3@nfq76ky#u2S;{}cS>^8{8##YEasM6?hqIT1ri4e=Yy)QHKG z5GJ^LUB>RUlC#&Iz0{7I< zZGLu1VHsOkdn0%TBrB+Bk;FCzhAj)Wq(WO{yOC{t(UqP@RE2X;hCr&+Rd3gYj+mH5 zO`wFu_iQ?KGT2wp%2!@kd`K3K)RBv88%K#Vk%kLqQy7$REy6%x zAi+R`rOhYAfl5%={LGU_z?C*sN@=S(Z-$8myvQEtHq8|+U^CM;^aU&-t| zK2gAqq=&~3&UM%|@0a3E)ug`i&K_*~*d&Ke2(DK|p*UCUWwAd()&DA@g~ZDyauoSd z1KqnIX((T#zKsaM5A`!$5I>jlD!;rX2L@H+^Qb~;q&a@v$UZVFqZ_`gUv|Zf;vbz7 zI%0=;afR!zq$u*^^(2m~pd!^KNHRY%YvtnOnH>oUI`@Pu6P0H|YL)u8wz4lB*3lH) z?z<3uGB`0|p$DoWuqz1%vW3^OmIgMaT9VQv$QAvYM(a)#f**)3{?*ctlT`bomkJw3 ziuO89MBUw<4^TaDSzT+_)H?0YL9=~~!d1!$$m9ygE~KC=LdP;Bs#()i+0B6VC4~=x z7{$$1+D3pJG4cg-{7EXi+SoES$V%0#0pOsAeKHX(w+zaefT{Os_xQSL24XRv_@^s8 z-{q9c;%|%|M4kGBONo#C%RjL!II@m&BKaPej@$(YLIR_e(It_arL890wgb$)(M%{i zx=x7N1rJmiRXeaBy9o}G2j!O16f`&-mo#{sZ5IHCiGw`Ncg5MZtSDP44;#FJVW*pO za10{|_HCLdXA)f-rH#z0G7l-a-r*uEAb7RlL)CSlIk;E6mnHB`vM>&%NB1Skb_@( zB)&jMD(8YI<9SndKFv9fc9ftz}JCxY02!$0iyA)x8J z;0Nr!R|~8_4VHZ1(W_J$jr90Bi)m}4_#r^)3(FT+%VH@mdgM8k;N|_W{%=qysbT%F zG9pUs;TO(XdX%MI(IqQ}1tYkzsZ+YxKw+Wr+e8^9bX@(M-No-;Fp?^9g!eoUqmYDiUKnMb5=bDR=89OiZD`&DCIoQ z;#l_WYE-r`f?gb!w}IQYyZo-PX~kKyvN0@|yAIS#g}cTMH{K9J+QfIIa0N}00n@t- zoBsYF=0nN$KOAYmX1XMbihNR6AM1T`mN8$oG_|e`T$mzINRA(DT7i~pe7{jRTEj)g zC+$o=C7IdRbXB1?|C^d;Z{k_!e-%!DWdsTjoMY)A;bf6D-`VetmlYEtPX5sSpuu2_ zO^|CeU+|V=9h@|ljPni5zNxbBBGet5;Yywvf9=J&@*##R9zH_**hbTMQk#yQo10tb zTM|G14M(i!^ag$uAAu7Lb5Mj!O`ysF+g{WVIis+nIs{fK*_B_ijQBnPIondVwpKJ1 zU5Zp`q%ih(21ZS_GhK(UhMCRGkMKqnTX?AQGKvGQ_URKhqtOI^_R5C~`3N)t?x(3Z zu5xIS3as9vq{iAv-+yNru94~u4&po{sbxc)RMt+6FnEAp^beCGN{tMyu#kH)%Iy#9 zcdy`FqYTl~{h>M7DHp$J+v}^9T3v^X$mhS^t%FO?RtbR?uWFb*?iS9|`_X^KVH?=h zS_5t}cd{{>HPaQB5UpQ!uiJZ-y+%zMx2H`6Z%9EtX=2=;8 z&Q1d80)zAeg}OFE?Pth#tL;bg;_$VtrushjK9fIh`(8vJZ4dFhZ?t<~{=nTjl(vmD zg!%Te_F0H>bFNmKXXcIpTn~^4zC?;4<;4650Tz)h_j2e57`TDX8^|RyLM;ornekQi zeTf3zu2=ke)P3(ti1nM{^H8QipALUNv<=2PRD>XkQk!9at4};yX+#I3!s9kwCDk&Wi1ud8=r$IxE;c_|JyM(NhFGP$4N^^4$F_hI5R2u zfg|T@l)qeSWHVMunb&4dSx&$^FV`GJId0y3GfH=etiuyc#)JJfbDt+YX1SFA6O+m~ zZEZ-s1hK43U{V3aEKruo(tbW7NT!iC$)Q3*phMO1hKEE&=KcsJCz4>lpUKr4r3j>Y zi=@03k(YBfqjg}!L9C=S!GPbCy{>JQzjU@D*|h|C*@w?~sQzuc$-;3?nkqjNE}+vz zXRWlRw5EP>E%C()Pio}|Q$1~FZM#1RnxJav*kk433*Sr6CMRc9`8UO{guq}au2r7akL@_bJpG* zbZ~$NbUz52@DuIvcbZT7g^7P&P>lakZ_*JbEF@?!@o3NKMgxe)A!*-E%5S562kFnJ zuK&b=*Ah-X@`h^k({%cYaD{>eqZ*ZXOt(U*= zUYwPg_T)=YptyC#13|wNEh#h;*qlF25I|q)n&y%I^!0LZ($An_6i7T*-A* zMJ&aJLFons!G!BusX0kppX|U3N*wmaBhHMV4UPbX+p5tydyhC@YcBzmf5pILdRK6u zpJpRmu{`Vh?|Pj8`OHM@@8QLEO-(p)0Z^toAy$`Z_q?UDz}ndg?2-gq6AjfgDqPMX za+aoyIJa7k31|ti%?~Y41m5xL6e)u!_@9%6S0B!@d<7QlwFd_{L(=#4UV% z2}VY302kX1$LGLw#VG$Rr%}ScUPpNr@A)$zL5IGtM>3E+@gaL&$k;J&6j>Bz$c9^O z7i4}`NO7$D2}J069ivx$e!JVrUJoDllr1Z#Ma*_PpFuGK_k%@83}ucCHc3$HUR!=4 zl6757es&FGZ8_PNtY2i|843$Iig$HI;6sx_sn&y$=tfP=e5F!LYv>>m;Dxo}O>`DW zVMJTwfLO#&ACDQ7`PnyCB+=gDO~!*?!o$M@7bgC5PezuO$IWP#c(7{3v~6Q>cN-Pv zCj7XKLn95cz?jN^1?820@Yw!DqWK5Ei$an<6C68xWd zGI1dfW3R~g4_NJA&8?c6t*slwsf|@zsA`jFv-6Rp*m-3UD$>!9!KP#Xk@hASwR}8z zl!4gdQsZAJ*ms7uagaI(_E}-ivF}Q)+6_A=lcy3q1MqqVOxoOT~%10{CHZ^|w$e=AiZ!8f_&{+-u5kwcdW zhU6gs1IM612IH_Ih{CeK0Ccr#3Yo{uaP!PgSGXi|6T7l;z6riX2(*f}xBt81K5w@L zpS~?^Pua7UpMn9~5IzF<{DO`U+>iyGx4@Uq8X4oFs(+NX{A~(CLw@tBYkF17h7B? zoHTyfGd&DaEG)8_6_*5S&dv+|X=EEhW0;Ggg$jm&lqJowL#=Aa8^En3$ue`Xkz>An z_fzS9p|;c+zX5#jFm;`=^}e4wF#8u_^eZJ;vxt0VbHqqVRf{2at;Rp(%#9SwkE{lZ z7q~_OX47G)W+-QQ&5X0s{0N z*W{=dVimk?vkco4XvxAId?X86C8_T}H*tX=X zSTYF3eZ)vlB)|A#L31az9AkUeNZZX{9u~6l)|!*Iiy3=XLwgB=3T#=WZEYUo8|N~W z@f)pn->D5O)Hi;t)hDC%=kp6~#69R57l4cui*B0WDqY-i+ddE19IULoWc~kr9WrrE zpM(d_(c<7ph0-s7^B2W!wPSK3NIgor;RAaueQ@;F?sK{6`uA~;@eez+J?<`2P?eh2 ztk_51EG`rPJqo7NSr1S2K7EZGv0O<69WiJ&TS$iD>viuww;o=?^;^qIc~@Oe>+)t% z^wLcrQ{S8Of5(6K(Y{&&b-rgX_$cN?H8L_fk-xxzZ3a^B_c_>?o9!c_PV))V@+9o> zPOXO*qp@ZU$Un?2@=7srMYXXAJJbvx*HW!nH~8(@#}nl24lweL5d=Vb+*sv$B3PKB zbiIBi-yK65bdpRqJS5yI)JLItiW69Uof)R-8L16vy03|a7Z%g63EN`$T+g!Y&R>~% z=sb-Hhe}n9C(}>J-_$Tb<(>b}*T{NsiL5oddT9CzR9rtjaf?-(QH2%osmEuAoQ zoj+*cQ1~rek1Tg^#Y_74oYiByUd@bublgD7gE-xBosFx8zJerpE1+SB_^%HAJUJ8Z z{b10!DscKP+gj(b!)>#euS)j{0i5wzrZNK8EMiE)Brq~ExnjY#0tuBc1WNLOY02&A z$1K%DiK!Thku-u*v=gjI)GSk80`X>Zx=cTo9R2Q-tU;}Ix)1z|B2Ai}!04c$p!Emc z_iG7Q(-xfNTctx#Y`O%Ej)3SoKn90fnPuO~-01cjRxnJveDe^}zFJn)vv%qNxJy2c zlZhwB$_+dlc`n}zlBrw+s5eL!^x(8tm!r)Lq9wMepq*22s>>@#h$RC#zqxx54`H}v zI9RKrX}PKuZVJ_nm{rc%E%Svn=4G|x5<(J?7@p89rn%toh zWlT%U8*N^e$&?yJ8>WxI)Q`&txN=s8-BXgm+7`MCvevH|Nu)sR;9Rogp+!jThtEXd zpbmyuU-#U7IbB!;(yDLCch7???d`!rZ!6^`fCob-%D1{wz_2*5_eXD#BKw*aOtbW0 zgL5ov4JM<7ROyRSltK2n`7csl6r5_d#(fy9|ln1+j8d@mR} zWpWhdD3h9c_Z|XNG~e~IIvsaLtna_f4TTlE8!;XsCTr3HK1V+((UJs@UD^zeKF+xU z(&1>PB@NZ+H&u8a{}bLeQX(R%UcgiUlal&7xMmea#1Z1$Woa$zRFy#-8tGZulj*B~ ztq?#VPmPAQ+g_`^rI=YzU6mK$wE$0b%7?K0DR(EcIaEYyj>~z7b@U+MFRfc z?yWWe>QDUY!X;h{tgnJDrF&Z*I#Mj>fVMS-z)C@KB)@w7iHX5x$GKy}6Uu`NW@|SJZBV$~AK~ zqw$2g%8*NY0Yo1}KD}I1ZCmcyuGM|#ojM*VDJcZJ?zI{y#z|0!Ky>lw(x{!U#co2% zPq@Cw7?@Jt-aeMr4(9SMnBTeTj*eXvzhWKzO5NF)RaDmFj@O+2Ro;ZTrK)9;zxJ%G zkOtK_tevf!Y-{CUE^0#9`d#GL7g9EO!i{GT+Z2*qH@I$VTRhWt6_mQ%*0-ajlo!qNMSk`fN@bT(cha!XI986U_M$ZYEDJC=bT` zqlPjdtf7s>q<|t3v5CDeJ_i?K{A9NL>70Mi@`e2&y^Dk08l>1)53nqnW>`n`7wloC zAI?EIj6yvkWRh56aBOU2TP9>7+osx@GP7UFRIfQ z<$$Ac^-&u2$Io*K7h7CWVJxbSP3OIAp(y}YvR~|Uy1tQZP7F*D$k!E?xgnt+Fs4qL zQE_y0^T()0*=Du9uCCKtBUG2OE0WLEiV3Ly*NgBkIC<$m;oTVt3=M%pV`Kda8?JWg z+jkFi=qVSQIv~jU9~DPXQ=pJ<+mlF!_K-hrW(}6~SQb1E%pot!w|dNaT;lwP74mSW zfEe1@R>7tY6F?h#p$r`@4jTi6VaY6p8v+|Cqoymg{~J5aC?t^ve;ON#8J_N|3khr} zZnGU^HjiPWyiFbK#YaEf{3WnCqlsBibT=vbmv7l^wP$GbN=eFN*;75YLC zH{0EzDt2b8K_^()D(M#{_Z9O2F}TaEwgN3O;Yi8nB@55{r>58fK8dbV6&mxXVfOs3 z*xv&%MDH)G`6!@5uAr=7*&ZStH;g>UGF_)Lf138=A&GR5H8{Ed3SGe!1^g8`p@`ne z{|zHKQ2XyAT%~=N`nco)^{;=$C)F-}n= zI54@hX1=ns|6CWk&d={0HWljjckslka>==VObi`Q1}0z&wAvNDlS$y(QbWj?4ojr| zD;=~dp;tAPFa8cn!8+ogl`U378d1S*LETr;04@hZr!Ttds>QnMDgtq>0R6%M*7=u? znb03`+5v0gz84zS{)OHQ89!WGD`(cK5>&pc_*n%4`#aT=IcuhrAmbJDYB$nMvDwa6 z=jAgKdbJuJfG7D6z$xasP<}x_XH)H6ucw^|aRBRtwbS^=$A=kledwkCV^@6#*-gOd zgQjz5L0cd0kq9J^F>O|e4OtrsYFei-2_(S=H->C(J`*M=j7x-Yq{3q8_ibw=lj1{EfWb&$Ji`0R0}x^{99nkxEJl4V77Fc&1Y@+tc&Ii41jia$Wq|$Gouu3Q6>X#@uM!<8snccoh2o#hPuFH zn3SfA`!Z(>OC9WBy};;QL&;paZh_F9*eejYv2nN9Vx(1v;r`7bV9STwYwP62U`gC^ zn9D7_($F`(#y0Vj=Oi``yKccsdU1CtkwB{wsSJX=h{M5fbF*Ay}<~0w}4F zK_HEV83TKD)Z@k`TvW}p0g+iW0c_4YV!hcy@Kh$O*v;iIo-$7JtvoM-#HiJ1z9fFi zRYRiV6r{fr?;GgT>f+3dV@a7{kkS&*xRnD)t&kgJ#)-O21Z$iBF1HRXgbT^+jwCK& z2ohN+*tiPJ{J8d9jHqOSH%=1KE+-2XMSeq@<{&ULy;;uuVL#VFctR4 zr-Rao%ZAt6swnmb%DkJvPU^1$4iAL$?_zdcp+65r!9&F{Szv<1-VaN!_XJ91Eo07} zYrLv*akv`gB%7&{qZDa_$Rv!_Sw6?9sb0*#Flghi;F~l~I%jFkuC1Ev=LMvI$Elk= zz+-WR*YI1Mbg?>FP^H=9xNSH&rk75aH@DjvO^FNA3D8fu(F&Y_{1j|C&aJ+A9=-hA zREa;(X_u4!6uupI@9gyhoNha`zPo6k@FHg=B?qhMDKTN9L7Cg-WG*WkD+1ufO4-E1 zN(qWTXp=+(!Mh0DHNO3{jxZ_}GOHAP*;2+ysx4bkqMQOwTfw$eUhz?QcB zQ@WQpo87o91-SZtHX2#HPqBEW5r6~nRYFXwWoyq1mzGv)Jfvt#bRZw0eFQH-y>#BYroOI{MiKMO?wOfxuW(XAvy(qlvM9{@CnfD;o5{g1DN4~ zpCPX)XSsHxm>i|WM-t?k>C7}Iado`y`TOe?sn*Wg9Qf+cfGI#n1IYhgPJLw3O3|<` z?s~c>Wtutg4`B=uGU0#f%1HDmCzZ|n?oIWJ$g8L^(Fi4b9A>_I zWd76F@o>Txp)iTX2%VLb8PL{a{!(1Qs8=p|E)uM%57C+@0b#hOv6L`8Um1&zYMof> zx2SbO7>NZknEd3z5=0mgc)7CE%3Aia1r-T8F?hayHs#IfVDu>@;dxy1w1Ee{_`i;# z>z8Lk4}LPjLJBey-(JPb&~;LvQ@?Cku7?%sHCzf|p;T~m{_eFwE<#U*1cCJw7ZDal znA3s8g3-Oq@Ags)Zk=P-&WM%%-|O(t7AxJs3r)gBEzCE~f&2Q{(HR9ueoSvZ@*0ESaUfVWd5 zArOIc)Nc8qrI@o7kQ`n}D<&HkyT<(vC4((Z->FJWe0{7STs>_5A6+xJJwk_a0xsuE zpceG*cG9$2kLO#jsHPP}I!9GIx3h6-fJZw1Cd|9TX&JI_?$Z%0Tu*UedU#YDKXT}M zZsOZ|)3#f6b|K^kcaizr_uE3Mdz$*R1Zw0J>MVIT1*=j^oUF}i+Vr6$IUILjmaumO zZ{ch0F-=*VNfgXvAtvR64Pyf~%swwF=j`FDEBgIh!vH$Me#;1Sb22=%yohls2_**- zJ_Dq_P73Mzi!~~g0uO2wNq0Y9Asx*?@zy3 zx03mv#*t9ibVt^*q{z)0XKgfpYQN|T8RD`b!RRbpydsa9vYD!Q-)6z#HIL(V{{-SOF%q7{ z-$c$0ks@?zVw;kHjWE+mN)!KB5x$56Zr5D=eyRvFyk@K+{*W3D1%&7_>BDH3Smsay zX6$3vy;>VtW1vIDF98ZXDN_*`$rv3~%go0#XXj@mw7bA9cV zFAKify8yxZ?m5n4vRuu1J01^#8$Zx!^{uF8Ss$4^0+0J@_>JHfAOYzFcD>V%3azpB zeI=%8oYcBm(Yk7@!WfCs(2i;aJdkOFi7I^L_#*1*G7MbZYywVE<}jCPdhZ9ZS}|G+ zd4S1^(?ILIR>N-y>f;t2e1*X(LjYD8N_kDi?+YJLCUlZA@UK>6RExn{K%W+|m1d>y)xFXWj2A|j6&Y%kl$F{em(u=`Bex$d*7l{iEYCC5FBJc3$S zSR7hq-yi0zC1xFTK9WTvjtH~;A9gtN_pc5<@%8F&&D+NW-}xQ|UpwXR=Y+l-0iQ$E z`s>VEcM?-qr0MbRIv*c9mhsp2Ih&9XeVs0Rs9&{RE4J584$cc`^K~CJ7gy3<()dGd2PwsAT4;q^RLzc&JX@ zY%hP($=syK?vZcGOCby_+pkkv*ifs-uVB9gN6P$_wh^_kUhl9BN4AzDoU`nhVep4a z;~uqOlyl%eEOdsgKh0{<9~6_~{pxLd_}`THpBb{-8n9+$gCuzojdyFeTzLLm`cea_ z#t~Etr90%J$PmTZK+&9}h+)Xc&=b4G<=n&xXg4w@L`n2bWj}tee^As<#U-P-pevHf z!e+)a7$G*>N{gVaB8aa7mB){Xi#+;wdNf^Adp#fJ-dqf$u#fY(D|9)dEKODbEC_**ecVO^OZLtWVoXa-Bb0 z1xDeEqd^Yptn)bzz1k3mm!BV(ID~!ws%xIW?X*7W4RQYC6&tpemUOeT@e^jIckQp){9$I7@PgJ{# zW*&%5h*otPoGgMnMaE!&nMVi3ZDZ8Gokr1itu2WCkKb?Pu@u zUKY8eCulk^2EMrA)r$Npj~iW8l4CVDc->4UD72s>^nk2I%Ep*FsK_!#;dh72a7O{d z&sNz^T9)~g9kVi3$G1)Q9+(Aa*ZgqjsaB(ADHoKM<7`O{iO%WN72%Pf4O_j1-`NIm zUq~!7W{st&U~QqY`_b6(obMhej-w?18QIStwW4{X9#Z+Ocb==aHPQXq*Yb5R)2ixL z__pL#(?{*n&GcH2Gr9J8@xIlKxLxx4IZWQRd3LVol=xH zipDD+L~muED=zVNoH*ZIj8b+lcMg$su5wj>U({S95^&E2Tl#ta((ldL|8mda#m836 z?Q8JD+NHzruE*v_eZf2B&=ocrag4Id=&L_t=N}ciY8!KqWk2lCIAb07T<0t;N(A=r z37F7`#(!8p>L4H>lcmLk)gr%zH$x+(Swkh$#Dbub^CkVW&@C>DBEER26QO|_v*}RM z5hwKi_}7c??EMYzuM0Mpoi>i6@?2$T0Y|(cE-MB(7jT?U0;=Gx)40&{#LrTlO?rpm z#H$02m>?I*zX8mHpVW1Ip`2}WFkJ6?+%)4YUd9yV|Mv==$M|rzHW&mA=Xsd5^!*+I zN3M`zA_{5M2|TsqeS?^SNEMzwDhEqWQ9gOnwBs>Cko@}QGe)Gb(07wr*Hf}O$Ag;l z<|&iva8t(SmFf$IUALbi8lhkRG=_79$TXxprz-^1;g5w>=;O7&<1+~#dcJR+H7*-z z6Ei71#|l8_VF!qN7sbPE-ABP(DDIU9QnJFd=`PnEmjma~0)ZX=&UKp_{Yj6@=*UaH z={>zY0P(BXh2HA>L))hf;&#yctIhO$=%uP{CC0B-y+bVJOOi^pS%dQAew*Rfi%uJ9 z)7j%*zmtzI!K*!BhW@)yOTY{!7+~sslN8iR7c-#$Xf{T&=b372Tj-Qg8u-q0^a;mW W8+F{pXx{_@en^Weh}DT01^*wd4KGIk From 5af090a9d0ab5a0d05bed68b58b6355104f96f7f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 13:35:30 -0500 Subject: [PATCH 099/352] Automatic changelog generation for PR #745 [ci skip] --- html/changelogs/AutoChangeLog-pr-745.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-745.yml diff --git a/html/changelogs/AutoChangeLog-pr-745.yml b/html/changelogs/AutoChangeLog-pr-745.yml new file mode 100644 index 0000000000..b9aa3fddd2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-745.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "revenants now properly resurrect from ectoplasm, as opposed to ectoplasm merely spawning a new grief ghost" From 6b0daad4ebbf6b034e3ad824ff9338533a76d6bc Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 13:39:02 -0500 Subject: [PATCH 100/352] Automatic changelog generation for PR #746 [ci skip] --- html/changelogs/AutoChangeLog-pr-746.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-746.yml diff --git a/html/changelogs/AutoChangeLog-pr-746.yml b/html/changelogs/AutoChangeLog-pr-746.yml new file mode 100644 index 0000000000..ddeea1d732 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-746.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "Turrets can no longer see invisible things, such as unrevealed revenants" From 231e87ee2e3f6e32851ce17bd1720359ead1d383 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 13:41:37 -0500 Subject: [PATCH 101/352] Automatic changelog generation for PR #747 [ci skip] --- html/changelogs/AutoChangeLog-pr-747.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-747.yml diff --git a/html/changelogs/AutoChangeLog-pr-747.yml b/html/changelogs/AutoChangeLog-pr-747.yml new file mode 100644 index 0000000000..583f6b5e56 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-747.yml @@ -0,0 +1,4 @@ +author: "QualityVan" +delete-after: True +changes: + - rscadd: "Point flashlights at mouths to see what's inside them" From c5f764445241153050e6e90e6f2844799f461982 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sat, 6 May 2017 11:48:24 -0700 Subject: [PATCH 102/352] Update suicide.dm --- code/modules/client/verbs/suicide.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm index 6847a7c1f4..1f50a697c2 100644 --- a/code/modules/client/verbs/suicide.dm +++ b/code/modules/client/verbs/suicide.dm @@ -13,8 +13,8 @@ return if(confirm == "Yes") suiciding = 1 - log_game("[key_name(src)] (job: [job ? "[job]" : "None"]) commited suicide at [get_area(src)].") - message_admins("[key_name(src)] (job: [job ? "[job]" : "None"]) commited suicide at [get_area(src)].") + log_game("[key_name(src)] (job: [job ? "[job]" : "None"]) committed suicide at [get_area(src)].") + message_admins("[key_name(src)] (job: [job ? "[job]" : "None"]) committed suicide at [get_area(src)].") var/obj/item/held_item = get_active_held_item() if(held_item) var/damagetype = held_item.suicide_act(src) From b440ba70b074c53fbc44bdc2bdc31139ab474773 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sat, 6 May 2017 11:49:26 -0700 Subject: [PATCH 103/352] Delete suicide.dm.rej --- code/modules/client/verbs/suicide.dm.rej | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 code/modules/client/verbs/suicide.dm.rej diff --git a/code/modules/client/verbs/suicide.dm.rej b/code/modules/client/verbs/suicide.dm.rej deleted file mode 100644 index a2e5063fd6..0000000000 --- a/code/modules/client/verbs/suicide.dm.rej +++ /dev/null @@ -1,10 +0,0 @@ -diff a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm (rejected hunks) -@@ -12,7 +12,7 @@ - return - if(confirm == "Yes") - suiciding = 1 -- log_game("[key_name(src)] (job: [job ? "[job]" : "None"]) commited suicide at [get_area(src)].") -+ log_game("[key_name(src)] (job: [job ? "[job]" : "None"]) committed suicide at [get_area(src)].") - var/obj/item/held_item = get_active_held_item() - if(held_item) - var/damagetype = held_item.suicide_act(src) From 30f7e170a387b53313bfd2cddfb3ab98a1e88f04 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 13:52:12 -0500 Subject: [PATCH 104/352] Makes medbay vending machines buildable --- code/game/machinery/vending.dm | 11 ++++++++--- .../objects/items/weapons/vending_items.dm | 6 ++++++ code/modules/cargo/packs.dm | 8 ++++++++ icons/obj/vending_restock.dmi | Bin 1224 -> 1343 bytes 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 7d02e70671..28b5a56af0 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -56,6 +56,7 @@ var/dish_quants = list() //used by the snack machine's custom compartment to count dishes. var/obj/item/weapon/vending_refill/refill_canister = null //The type of refill canisters used by this machine. + var/refill_count = 3 //The number of canisters the vending machine uses /obj/machinery/vending/Initialize() ..() @@ -88,7 +89,9 @@ /obj/machinery/vending/cola = "Robust Softdrinks", /obj/machinery/vending/cigarette = "ShadyCigs Deluxe", /obj/machinery/vending/autodrobe = "AutoDrobe", - /obj/machinery/vending/clothing = "ClothesMate") + /obj/machinery/vending/clothing = "ClothesMate", + /obj/machinery/vending/medical = "NanoMed Plus", + /obj/machinery/vending/wallmed = "NanoMed") /obj/item/weapon/circuitboard/machine/vendor/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/screwdriver)) @@ -104,7 +107,7 @@ /obj/item/weapon/circuitboard/machine/vendor/proc/set_type(var/obj/machinery/vending/typepath) build_path = typepath name = "[names_paths[build_path]] Vendor (Machine Board)" - req_components = list(initial(typepath.refill_canister) = 3) + req_components = list(initial(typepath.refill_canister) = initial(typepath.refill_count)) /obj/item/weapon/circuitboard/machine/vendor/apply_default_parts(obj/machinery/M) for(var/typepath in names_paths) @@ -113,7 +116,6 @@ break ..() - /obj/machinery/vending/Destroy() qdel(wires) wires = null @@ -874,6 +876,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C premium = list(/obj/item/weapon/storage/box/hug/medical = 1,/obj/item/weapon/reagent_containers/hypospray/medipen = 3, /obj/item/weapon/storage/belt/medical = 3, /obj/item/weapon/wrench/medical = 1) armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50) resistance_flags = FIRE_PROOF + refill_canister = /obj/item/weapon/vending_refill/medical //This one's from bay12 /obj/machinery/vending/plasmaresearch @@ -896,6 +899,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 2,/obj/item/weapon/reagent_containers/pill/morphine = 2) armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50) resistance_flags = FIRE_PROOF + refill_canister = /obj/item/weapon/vending_refill/medical + refill_count = 1 /obj/machinery/vending/security name = "\improper SecTech" diff --git a/code/game/objects/items/weapons/vending_items.dm b/code/game/objects/items/weapons/vending_items.dm index 74ab7be4b6..c93dcaca3b 100644 --- a/code/game/objects/items/weapons/vending_items.dm +++ b/code/game/objects/items/weapons/vending_items.dm @@ -71,3 +71,9 @@ icon_state = "refill_clothes" charges = list(31, 4, 4)// of 101 standard, 12 contraband, 10 premium(?) init_charges = list(31, 4, 4) + +/obj/item/weapon/vending_refill/medical + machine_name = "NanoMed" + icon_state = "refill_medical" + charges = list(26, 5, 3)// of 76 standard, 13 contraband, 8 premium + init_charges = list(26, 5, 3) \ No newline at end of file diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index b7c7a7e377..5d9f29a374 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -828,6 +828,14 @@ /obj/item/weapon/defibrillator/loaded) crate_name = "defibrillator crate" +/datum/supply_pack/medical/vending + name = "Medical Vending Crate" + cost = 2000 + contains = list(/obj/item/weapon/vending_refill/medical, + /obj/item/weapon/vending_refill/medical, + /obj/item/weapon/vending_refill/medical) + crate_name = "medical vending crate" + ////////////////////////////////////////////////////////////////////////////// //////////////////////////// Science ///////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// diff --git a/icons/obj/vending_restock.dmi b/icons/obj/vending_restock.dmi index aa9f2873f02222c6b42c0e2b6865252e4d146553..eac7b8a266846d2499b22b5b6e97f7af561cf82d 100644 GIT binary patch delta 1163 zcmV;61a$kz3BL-EBmv%$C8K}Dm0+@qQtVzh|7QQl4L8HTui_3W+1c5vtE)afKCKHe zDJdyhT3TJ1z8pAjy}i9BKaUnHR>na97Z(>WFfighTFU?c00DGTPE!Ct=GbNc005wR zR9JLGWpiV4X>fFDZ*Bkpc$}5dO$x#=5C!0Ma*ELI#lNi^X(?UUD@cD#re1stCYQ@@D}@8Ry0jEdIzf(Agb}?z z^Q_HONntT^K5wKLqYkj-FC1usQhXtL6=OqQm)aZsG0W*5%DJcHfJ=D*i$?ojyjJbd ze17u=$c=q5u@Yk`004gjV@X6oRA_Bsx|ko|v+Xt=u*_#`KQe+t*U zoB+;|jdKDxcXvPlsb<8MKy(~oq~*R_1p)QVFHk3Ri-?Y68)>;8xGjyE zAO*X-f=e@i2JkN8{5#buK*bxrE3T(As7L``jo+Z`1Mn^q0gkf@z(~RUoxtVXhtB~F zfOio$p!dHcw$Ohr2!PK43{YKP@Rx1IrN8*I=p^szWvL-fEyVZ85#XE+V+)i0ZG@d zi>1dD=J)%kiKAu&xV7f3_QAnH)yloTlPV1Jc(;eUy>5Rq8vy;=?Q8((_tgLJP{W&1 zFUoXJE6b^WOMgD_!t547-t6L>0M6SjtUn)k;i0zwM>x{*7CzFS4=|X4#Jf%X`QhkT zS>MA@)NeQgSnuHsAU`@jQ3X)fa1{{B<@WUK?Cg|tIs--d?NbZRk591Nu4%vScpm=% zoq=pHI6r?szYr_Hk<9!3ewgk-ot)sIGGOG5ME{p&zydC)1P9LnOa=?e~TuNJgRqC7BpbN1MtI>9FU|+Ie84q2e3U#cZeE1JUwdz9)p*%0haZ;A78}# zuW7%3dRFy+D@nxpAb2S`1J>`C@!Rq(UZ(y2S>6AWMD+i%{=DBWnLgP63j?<8|Ahgj d{~P_!`U6O3qMDlEUw{Ar002ovPDHLkV1nmrKHC5Q delta 1044 zcmV+v1nc|13djkNBmu^eC8K}H4L9NrD%siDtE;O%K0d7rF)1l2T3T8hIBzFEj}|Oe z7Z(>WFfimCL+1bh00DGTPE!Ct=GbNc005YJR9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9` z^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*x*Fl2jm5sVFrq zGbbm$I4?0dTZxM^C9|j)C~U~ZnO2mTn+joLD9+8#P9;`xQht6F(TbDva}tSFo0U(3 zvBf2&xx_2a$uG%BEykr>S;5uM1svD_%9w8F=VtAf0009FNkl({_yuFblzFMW+^*lmIIrq5?<3EEs0d19W;(4y?l2RUaxqQUGY~*l3{o+4B zoDlabGjM;u8?q7u@f7U@B?f{MmzEd^?(ZW5)-H%oftfg=#K?a`zl{ufyMLg^V2PNC zQ#3C zTUl9IS^YDr`^tBal=0hO8E{4A`94l)oWzJbTizd>oSd|s((%JwQB=l9V>%j-lA-~w zKNu7ZP`-!yr>6#<#N)V-J)I(l`hD~LAc%@fgn2TeB?f|7h)qe#YY+yfl%aSt#*JHOBwK-Fkt5UJtzax$4*3JyKcgx?fO z2!4J+)pQN{dKd)a0qB8RU^<)4uH+18tnxHXqkIi|?1Elv4d%gI=6|IJ+~5i%IXVZN zr|HH4`1OB{&R{;A2ZkQ(&S0#cK`Li(eRHe3AMhm-`Cjb-{~abE?+?jHcR%0;g5TWg z^ZhW8`5t|>11l>lE33bzs(fF&{x(=HmUnk|i-sL= z{pGS*1C;Nf{(@DH`Yi+DvRu$+4RF3+(EElBaK3-Pe`wkOA|-qL@wgJ%^Zwzfd4qMf zdR%4e+~DDfHk)m@!79u6CpUPa&ws#R1qLf&K%ZZlH{ffOuMikKzq~eW;5cu`*;RJ@ zmgoDIS2e%Z63_SR?0x;7t@C`}bbXQU*IXs}zP3SCzOQXy^S#yote*%ThjW>s+o%8l O000O{MNUMnLSTZRdHLr6 From e9ff2203cf8fd4834203322900bcbcd0cc3db18f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 15:13:33 -0500 Subject: [PATCH 105/352] Fixes really long Ratvar shuttle calls --- .../clock_structures/ratvar_the_clockwork_justicar.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm index 614a22a6f5..4beaf226d6 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm @@ -28,7 +28,7 @@ var/mutable_appearance/alert_overlay = mutable_appearance('icons/effects/clockwork_effects.dmi', "ratvar_alert") var/area/A = get_area(src) notify_ghosts("The Justiciar's light calls to you! Reach out to Ratvar in [A.name] to be granted a shell to spread his glory!", null, source = src, alert_overlay = alert_overlay) - INVOKE_ASYNC(SSshuttle.emergency, /obj/docking_port/mobile/emergency..proc/request, null, 0) + INVOKE_ASYNC(SSshuttle.emergency, /obj/docking_port/mobile/emergency..proc/request, null, 0, 0) /obj/structure/destructible/clockwork/massive/ratvar/Destroy() GLOB.ratvar_awakens-- From 8af1d05cc43341d3368fc7444775787c50eb426e Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sat, 6 May 2017 14:02:42 -0700 Subject: [PATCH 106/352] Delete mob.dm.rej --- code/modules/mob/mob.dm.rej | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 code/modules/mob/mob.dm.rej diff --git a/code/modules/mob/mob.dm.rej b/code/modules/mob/mob.dm.rej deleted file mode 100644 index 6cfe50706e..0000000000 --- a/code/modules/mob/mob.dm.rej +++ /dev/null @@ -1,10 +0,0 @@ -diff a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm (rejected hunks) -@@ -350,7 +350,7 @@ - /mob/proc/spin(spintime, speed) - set waitfor = 0 - var/D = dir -- if((spintime <= 1)||(speed <= 1)||!spintime||!speed) -+ if((spintime < 1)||(speed < 1)||!spintime||!speed) - return - while(spintime >= speed) - sleep(speed) From d3d335d83581217f83cc05415e1d5da713324cdb Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sat, 6 May 2017 14:03:52 -0700 Subject: [PATCH 107/352] Update mob.dm --- code/modules/mob/mob.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 24b4d228cc..39d0f1b222 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -351,6 +351,8 @@ /mob/proc/spin(spintime, speed) set waitfor = 0 var/D = dir + if((spintime <= 1)||(speed <= 1)||!spintime||!speed) + return while(spintime >= speed) sleep(speed) switch(D) From bf5a9a5037cd3bdba07fee9c7205ba081631b9dc Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sat, 6 May 2017 14:04:17 -0700 Subject: [PATCH 108/352] Update mob.dm --- code/modules/mob/mob.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 39d0f1b222..819f7f3db2 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -351,7 +351,7 @@ /mob/proc/spin(spintime, speed) set waitfor = 0 var/D = dir - if((spintime <= 1)||(speed <= 1)||!spintime||!speed) + if((spintime < 1)||(speed < 1)||!spintime||!speed) return while(spintime >= speed) sleep(speed) From abb5e2d016534ea9bda822707ba1b4ff2e4e091c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 16:04:57 -0500 Subject: [PATCH 109/352] Automatic changelog generation for PR #805 [ci skip] --- html/changelogs/AutoChangeLog-pr-805.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-805.yml diff --git a/html/changelogs/AutoChangeLog-pr-805.yml b/html/changelogs/AutoChangeLog-pr-805.yml new file mode 100644 index 0000000000..be4a17ddf7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-805.yml @@ -0,0 +1,5 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "Reduction to nutrition when consuming Miner's salve." + - rscdel: "Stun/weaken that bypasses bugged chemical protection when consuming Miner's salve." From 8fd36540efa56c2262922f3d0bfe9d69b39afa76 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 16:08:52 -0500 Subject: [PATCH 110/352] Automatic changelog generation for PR #682 [ci skip] --- html/changelogs/AutoChangeLog-pr-682.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-682.yml diff --git a/html/changelogs/AutoChangeLog-pr-682.yml b/html/changelogs/AutoChangeLog-pr-682.yml new file mode 100644 index 0000000000..c55c645e6e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-682.yml @@ -0,0 +1,4 @@ +author: "Swindly" +delete-after: True +changes: + - tweak: "Mercury and Lithium make people move when not in space instead of when in space." From f605aae61eccd7a19b9c4e89fea933463108546f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 16:12:59 -0500 Subject: [PATCH 111/352] Automatic changelog generation for PR #733 [ci skip] --- html/changelogs/AutoChangeLog-pr-733.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-733.yml diff --git a/html/changelogs/AutoChangeLog-pr-733.yml b/html/changelogs/AutoChangeLog-pr-733.yml new file mode 100644 index 0000000000..ef779f70a1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-733.yml @@ -0,0 +1,4 @@ +author: "BeeSting12" +delete-after: True +changes: + - bugfix: "Omega shuttle now has lighting." From d7bdb492839e46016254d89cfd2b2fe822568e82 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 16:20:39 -0500 Subject: [PATCH 112/352] ORM fixes --- code/modules/mining/machine_redemption.dm | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index d93bcb5028..f3b66d9172 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -84,7 +84,7 @@ if(D.make_reagents.len) return 0 - var/build_amount = 1 + var/build_amount = 0 for(var/mat_id in D.materials) var/M = D.materials[mat_id] @@ -93,7 +93,15 @@ if(!M || !redemption_mat) return 0 - build_amount = min(build_amount, round(redemption_mat.amount / M)) + var/smeltable_sheets = round(redemption_mat.amount / M) + + if(!smeltable_sheets) + return 0 + + if(!build_amount) + build_amount = smeltable_sheets + + build_amount = min(build_amount, smeltable_sheets) return build_amount @@ -152,6 +160,7 @@ if(exchange_parts(user, W)) return if(default_pry_open(W)) + materials.retrieve_all() return if(default_unfasten_wrench(user, W)) return From 9035100cf4925b1481a843091dce520b647432f9 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 16:22:09 -0500 Subject: [PATCH 113/352] Automatic changelog generation for PR #809 [ci skip] --- html/changelogs/AutoChangeLog-pr-809.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-809.yml diff --git a/html/changelogs/AutoChangeLog-pr-809.yml b/html/changelogs/AutoChangeLog-pr-809.yml new file mode 100644 index 0000000000..06fb6139cc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-809.yml @@ -0,0 +1,5 @@ +author: "QualityVan" +delete-after: True +changes: + - rscadd: "Cargo can order restocking units for NanoMed vending machines" + - rscadd: "NanoMed vending machines can be build and unbuilt" From 8e3b375bae1c1d023d648d1e9913b9b06d4ed0b2 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 16:23:04 -0500 Subject: [PATCH 114/352] Automatic changelog generation for PR #764 [ci skip] --- html/changelogs/AutoChangeLog-pr-764.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-764.yml diff --git a/html/changelogs/AutoChangeLog-pr-764.yml b/html/changelogs/AutoChangeLog-pr-764.yml new file mode 100644 index 0000000000..87210fcb7a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-764.yml @@ -0,0 +1,4 @@ +author: "QualityVan" +delete-after: True +changes: + - bugfix: "Dental implants stay with the head they're in" From df204497cd529bc36162a33070c718e8e01a957e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 16:29:50 -0500 Subject: [PATCH 115/352] Elevators --- code/modules/shuttle/elevator.dm | 10 ++++++++++ code/modules/shuttle/on_move.dm | 6 +++--- code/modules/shuttle/shuttle.dm | 9 ++++----- tgstation.dme | 1 + 4 files changed, 18 insertions(+), 8 deletions(-) create mode 100644 code/modules/shuttle/elevator.dm diff --git a/code/modules/shuttle/elevator.dm b/code/modules/shuttle/elevator.dm new file mode 100644 index 0000000000..12f9c24f9a --- /dev/null +++ b/code/modules/shuttle/elevator.dm @@ -0,0 +1,10 @@ +/obj/docking_port/mobile/elevator + name = "elevator" + id = "elevator" + dwidth = 3 + width = 7 + height = 7 + knockdown = FALSE + +/obj/docking_port/mobile/elevator/request(obj/docking_port/stationary/S) //No transit, no ignition, just a simple up/down platform + dock(S, TRUE) \ No newline at end of file diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 756fad25b3..b5571164ff 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -3,7 +3,7 @@ return // Called when shuttle attempts to move an atom. -/atom/movable/proc/onShuttleMove(turf/T1, rotation) +/atom/movable/proc/onShuttleMove(turf/T1, rotation, knockdown = TRUE) if(rotation) shuttleRotate(rotation) loc = T1 @@ -47,11 +47,11 @@ else shake_camera(src, 7, 1) -/mob/living/carbon/onShuttleMove() +/mob/living/carbon/onShuttleMove(turf/T1, rotation, knockdown = TRUE) . = ..() if(!.) return - if(!buckled) + if(!buckled && knockdown) Weaken(3) /obj/effect/abstract/proximity_checker/onShuttleMove() diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 00ddecb7f8..656ba24da6 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -217,6 +217,8 @@ var/launch_status = NOLAUNCH + var/knockdown = TRUE //Will it knock down mobs when it docks? + // A timid shuttle will not register itself with the shuttle subsystem // All shuttle templates are timid var/timid = FALSE @@ -517,7 +519,7 @@ //move mobile to new location for(var/atom/movable/AM in T0) - if(AM.onShuttleMove(T1, rotation)) + if(AM.onShuttleMove(T1, rotation, knockdown)) moved_atoms += AM if(rotation) @@ -578,10 +580,7 @@ if(M.pulledby) M.pulledby.stop_pulling() M.stop_pulling() - M.visible_message("[M] is hit by \ - a hyperspace ripple!", - "You feel an immense \ - crushing pressure as the space around you ripples.") + M.visible_message("[src] slams into [M]!") if(M.key || M.get_ghost(TRUE)) SSblackbox.add_details("shuttle_gib", "[type]") else diff --git a/tgstation.dme b/tgstation.dme index bff0d9a902..e10d48ca49 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2013,6 +2013,7 @@ #include "code\modules\shuttle\arrivals.dm" #include "code\modules\shuttle\assault_pod.dm" #include "code\modules\shuttle\computer.dm" +#include "code\modules\shuttle\elevator.dm" #include "code\modules\shuttle\emergency.dm" #include "code\modules\shuttle\ferry.dm" #include "code\modules\shuttle\manipulator.dm" From fc7be7e32b72cf2bdb0083e8b3b6eb2ea4fca618 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 20:48:44 -0500 Subject: [PATCH 116/352] Remove empty description tag from right-most tiles of Space Station 13 sign --- _maps/map_files/Deltastation/DeltaStation2.dmm | 2 -- _maps/map_files/MetaStation/MetaStation.dmm | 2 -- _maps/map_files/OmegaStation/OmegaStation.dmm | 2 -- _maps/map_files/TgStation/tgstation.2.1.3.dmm | 2 -- 4 files changed, 8 deletions(-) diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index db3e3e780d..85ed049c0c 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -34793,7 +34793,6 @@ dir = 4 }, /turf/open/floor/plasteel{ - desc = ""; icon_state = "L14" }, /area/hallway/primary/central) @@ -70986,7 +70985,6 @@ "cDW" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel{ - desc = ""; icon_state = "L13"; name = "floor" }, diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 9d5c5ac3f0..a26ea928ec 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -27963,7 +27963,6 @@ dir = 4 }, /turf/open/floor/plasteel{ - desc = ""; icon_state = "L13"; name = "floor" }, @@ -28813,7 +28812,6 @@ icon_state = "4-8" }, /turf/open/floor/plasteel{ - desc = ""; icon_state = "L14" }, /area/hallway/primary/central) diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 06533475dd..dae6f8e837 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -7303,7 +7303,6 @@ icon_state = "1-2" }, /turf/open/floor/plasteel{ - desc = ""; icon_state = "L14" }, /area/hallway/primary/central{ @@ -25976,7 +25975,6 @@ icon_state = "4-8" }, /turf/open/floor/plasteel{ - desc = ""; icon_state = "L13"; name = "floor" }, diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index 799d9530cb..da42611e13 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -17330,7 +17330,6 @@ /area/hallway/primary/central) "aMf" = ( /turf/open/floor/plasteel{ - desc = ""; icon_state = "L13"; name = "floor" }, @@ -17836,7 +17835,6 @@ /area/hallway/primary/central) "aNB" = ( /turf/open/floor/plasteel{ - desc = ""; icon_state = "L14" }, /area/hallway/primary/central) From 6880e7c3735912d6fa7078a8a1f37e9bc4da8ed4 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sat, 6 May 2017 21:03:17 -0700 Subject: [PATCH 117/352] Update Sleeper.dm --- code/game/machinery/Sleeper.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 5dc8ea3f20..4a7c2bfb0e 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -158,7 +158,7 @@ . = TRUE if("inject") var/chem = params["chem"] - if(!is_operational() || !occupant) + if(!is_operational() || !mob_occupant) return if(occupant.health < min_health && chem != "epinephrine") return From 91955ccb059fdb9b4dae7c23ee911abdfdd78515 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sat, 6 May 2017 21:04:22 -0700 Subject: [PATCH 118/352] Delete Sleeper.dm.rej --- code/game/machinery/Sleeper.dm.rej | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 code/game/machinery/Sleeper.dm.rej diff --git a/code/game/machinery/Sleeper.dm.rej b/code/game/machinery/Sleeper.dm.rej deleted file mode 100644 index 079bec3efb..0000000000 --- a/code/game/machinery/Sleeper.dm.rej +++ /dev/null @@ -1,10 +0,0 @@ -diff a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm (rejected hunks) -@@ -162,7 +162,7 @@ - . = TRUE - if("inject") - var/chem = params["chem"] -- if(!is_operational() || mob_occupant) -+ if(!is_operational() || !mob_occupant) - return - if(mob_occupant.health < min_health && chem != "epinephrine") - return From d31caa18706eaa0a5e28613c35959871833038fc Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 23:19:34 -0500 Subject: [PATCH 119/352] Automatic changelog generation for PR #815 [ci skip] --- html/changelogs/AutoChangeLog-pr-815.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-815.yml diff --git a/html/changelogs/AutoChangeLog-pr-815.yml b/html/changelogs/AutoChangeLog-pr-815.yml new file mode 100644 index 0000000000..6472c7a13d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-815.yml @@ -0,0 +1,4 @@ +author: "Penguaro" +delete-after: True +changes: + - bugfix: "Adjusted the Examine description of the right-most tiles of the Space Station 13 sign to be consistent with the rest of the tiles." From f5aab140bf04458e1bda9d0a0e81baf136338630 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 23:23:47 -0500 Subject: [PATCH 120/352] Automatic changelog generation for PR #760 [ci skip] --- html/changelogs/AutoChangeLog-pr-760.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-760.yml diff --git a/html/changelogs/AutoChangeLog-pr-760.yml b/html/changelogs/AutoChangeLog-pr-760.yml new file mode 100644 index 0000000000..b0296b2330 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-760.yml @@ -0,0 +1,4 @@ +author: "bgobandit" +delete-after: True +changes: + - tweak: "The Syndicate has added basic functionality to their state-of-the-art equipment. Nuke ops can now donate all TCs at once." From fb0aa3597f51a2bf1d1e2fa7f86bb09e979e494c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 23:24:47 -0500 Subject: [PATCH 121/352] Automatic changelog generation for PR #800 [ci skip] --- html/changelogs/AutoChangeLog-pr-800.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-800.yml diff --git a/html/changelogs/AutoChangeLog-pr-800.yml b/html/changelogs/AutoChangeLog-pr-800.yml new file mode 100644 index 0000000000..798c98c64b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-800.yml @@ -0,0 +1,4 @@ +author: "coiax" +delete-after: True +changes: + - tweak: "The lavaland Seed Vault ruin can spawn only once." From 102b28b1c122f199f531101f0788fcb729a37e5a Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sat, 6 May 2017 21:28:23 -0700 Subject: [PATCH 122/352] Delete deadsay.dm.rej --- code/modules/admin/verbs/deadsay.dm.rej | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 code/modules/admin/verbs/deadsay.dm.rej diff --git a/code/modules/admin/verbs/deadsay.dm.rej b/code/modules/admin/verbs/deadsay.dm.rej deleted file mode 100644 index 7320e8d285..0000000000 --- a/code/modules/admin/verbs/deadsay.dm.rej +++ /dev/null @@ -1,8 +0,0 @@ -diff a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm (rejected hunks) -@@ -29,4 +29,4 @@ - if (M.stat == DEAD || (M.client && M.client.holder && (M.client.prefs.chat_toggles & CHAT_DEAD))) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above - M.show_message(rendered, 2) - -- SSblackbox.add_details("admin_verb","Dsay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -\ No newline at end of file -+ SSblackbox.add_details("admin_verb","Dsay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! From 48f9fa62c98c7187d9fa528897e49065f3ede290 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 23:35:16 -0500 Subject: [PATCH 123/352] Automatic changelog generation for PR #792 [ci skip] --- html/changelogs/AutoChangeLog-pr-792.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-792.yml diff --git a/html/changelogs/AutoChangeLog-pr-792.yml b/html/changelogs/AutoChangeLog-pr-792.yml new file mode 100644 index 0000000000..9d2ccfebde --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-792.yml @@ -0,0 +1,6 @@ +author: "BeeSting12" +delete-after: True +changes: + - rscadd: "Deltastation's chemistry now has a screwdriver." + - bugfix: "Deltastation's morgue no longer has a blue tile." + - bugfix: "Deltastation's chemistry smart fridge is no longer blocked by a disposal unit." From 7fa53c5ce44451fcdacd79632c2416e9dddbaf7c Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sat, 6 May 2017 21:36:15 -0700 Subject: [PATCH 124/352] Delete world.dm.rej --- code/world.dm.rej | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 code/world.dm.rej diff --git a/code/world.dm.rej b/code/world.dm.rej deleted file mode 100644 index 70f208ed4d..0000000000 --- a/code/world.dm.rej +++ /dev/null @@ -1,10 +0,0 @@ -diff a/code/world.dm b/code/world.dm (rejected hunks) -@@ -184,7 +184,7 @@ - return - - #define CHAT_PULLR 64 //defined in preferences.dm, but not available here at compilation time -- for(var/client/C in clients) -+ for(var/client/C in GLOB.clients) - if(C.prefs && (C.prefs.chat_toggles & CHAT_PULLR)) - C << "PR: [announcement]" - #undef CHAT_PULLR From f7937b2f7e74772c9020261fffc36e2bf916cd11 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 23:43:09 -0500 Subject: [PATCH 125/352] Automatic changelog generation for PR #756 [ci skip] --- html/changelogs/AutoChangeLog-pr-756.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-756.yml diff --git a/html/changelogs/AutoChangeLog-pr-756.yml b/html/changelogs/AutoChangeLog-pr-756.yml new file mode 100644 index 0000000000..7ef015b31c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-756.yml @@ -0,0 +1,6 @@ +author: "lordpidey" +delete-after: True +changes: + - rscadd: "There is a new traitor poison, spewium. It will cause uncontrollable vomiting, which gets worse the longer it's in your system. An overdose can cause vomiting of organs." + - tweak: "Committing suicide with a gas pump can now shoot out random organs." + - bugfix: "Toxic vomit now shows up as intended." From c1a9bb586489801ab7e895eae67ffc8e12af5865 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sat, 6 May 2017 22:08:00 -0700 Subject: [PATCH 126/352] Update scripture_applications.dm --- .../clock_scriptures/scripture_applications.dm | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm index 25576f5710..c1b5c0cfff 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm @@ -10,7 +10,7 @@ It will penetrate mindshield implants once before disappearing." invocations = list("Divinity, enslave...", "...all who trespass here!") channel_time = 70 - consumed_components = list(BELLIGERENT_EYE = 2, GEIS_CAPACITOR = 1, HIEROPHANT_ANSIBLE = 1) + consumed_components = list(BELLIGERENT_EYE = 4, GEIS_CAPACITOR = 2, HIEROPHANT_ANSIBLE = 2) whispered = TRUE object_path = /obj/effect/clockwork/sigil/submission/accession prevent_path = /obj/effect/clockwork/sigil/submission @@ -32,7 +32,7 @@ It grows faster to invoke with more adjacent Servants." invocations = list("Shield us...", "...with the...", "... fragments of Engine!") channel_time = 100 - consumed_components = list(VANGUARD_COGWHEEL = 2, REPLICANT_ALLOY = 1, HIEROPHANT_ANSIBLE = 1) + consumed_components = list(VANGUARD_COGWHEEL = 4, REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 2) usage_tip = "This scripture will replace all weaker armor worn by affected Servants." tier = SCRIPTURE_APPLICATION multiple_invokers_used = TRUE @@ -99,7 +99,7 @@ If it remains close to you, you will gradually regain health up to a low amount, but it will die if it goes too far from you." invocations = list("Fright's will...", "...call forth...") channel_time = 100 - consumed_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 1, GEIS_CAPACITOR = 2) + consumed_components = list(BELLIGERENT_EYE = 2, VANGUARD_COGWHEEL = 2, GEIS_CAPACITOR = 4) usage_tip = "Marauders are useful as personal bodyguards and frontline warriors." tier = SCRIPTURE_APPLICATION primary_component = GEIS_CAPACITOR @@ -160,7 +160,7 @@ and exceptional speed, though taking damage will temporarily slow it down." invocations = list("Call forth...", "...the soldiers of Armorer.") channel_time = 80 - consumed_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 1, REPLICANT_ALLOY = 2) + consumed_components = list(BELLIGERENT_EYE = 2, VANGUARD_COGWHEEL = 2, REPLICANT_ALLOY = 4) object_path = /obj/structure/destructible/clockwork/shell/fragment creator_message = "You form an anima fragment, a powerful soul vessel receptacle." observer_message = "The slab disgorges a puddle of black metal that expands and forms into a strange shell!" @@ -179,7 +179,7 @@ desc = "Places a sigil that stores energy to power clockwork structures." invocations = list("Divinity...", "...power our creations!") channel_time = 70 - consumed_components = list(VANGUARD_COGWHEEL = 1, GEIS_CAPACITOR = 1, HIEROPHANT_ANSIBLE = 2) + consumed_components = list(VANGUARD_COGWHEEL = 2, GEIS_CAPACITOR = 2, HIEROPHANT_ANSIBLE = 4) whispered = TRUE object_path = /obj/effect/clockwork/sigil/transmission creator_message = "A sigil silently appears below you. It will automatically power clockwork structures near it." @@ -199,7 +199,7 @@ desc = "Creates a clockwork totem that sabotages nearby machinery and funnels drained power into nearby Sigils of Transmission or the area's APC." invocations = list("May this totem...", "...shroud the false suns!") channel_time = 80 - consumed_components = list(BELLIGERENT_EYE = 3, REPLICANT_ALLOY = 1, HIEROPHANT_ANSIBLE = 1) + consumed_components = list(BELLIGERENT_EYE = 5, REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 2) object_path = /obj/structure/destructible/clockwork/powered/interdiction_lens creator_message = "You form an interdiction lens, which disrupts cameras and radios and drains power." observer_message = "A brass totem rises from the ground, a purple gem appearing in its center!" @@ -221,7 +221,7 @@ desc = "Creates a mania motor which will cause brain damage and hallucinations in nearby non-Servant humans. It will also try to convert humans directly adjecent to the motor." invocations = list("May this transmitter...", "...break the will of all who oppose us!") channel_time = 80 - consumed_components = list(GEIS_CAPACITOR = 3, REPLICANT_ALLOY = 1, HIEROPHANT_ANSIBLE = 1) + consumed_components = list(GEIS_CAPACITOR = 5, REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 2) object_path = /obj/structure/destructible/clockwork/powered/mania_motor creator_message = "You form a mania motor which will cause brain damage and hallucinations in nearby humans while active." observer_message = "A two-pronged machine rises from the ground!" @@ -244,7 +244,7 @@ and there is at least one existing cache." invocations = list("May this generator...", "...collect Engine parts that yet hold greatness!") channel_time = 80 - consumed_components = list(BELLIGERENT_EYE = 1, GEIS_CAPACITOR = 1, REPLICANT_ALLOY = 3) + consumed_components = list(BELLIGERENT_EYE = 2, GEIS_CAPACITOR = 2, REPLICANT_ALLOY = 5) object_path = /obj/structure/destructible/clockwork/powered/tinkerers_daemon creator_message = "You form a tinkerer's daemon which can rapidly collect components at a power cost." invokers_required = 2 @@ -278,7 +278,7 @@ desc = "Creates a clockwork obelisk that can broadcast messages over the Hierophant Network or open a Spatial Gateway to any living Servant or clockwork obelisk." invocations = list("May this obelisk...", "...take us to all places!") channel_time = 80 - consumed_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 1, HIEROPHANT_ANSIBLE = 3) + consumed_components = list(BELLIGERENT_EYE = 2, VANGUARD_COGWHEEL = 2, HIEROPHANT_ANSIBLE = 5) object_path = /obj/structure/destructible/clockwork/powered/clockwork_obelisk creator_message = "You form a clockwork obelisk which can broadcast messages or produce Spatial Gateways." observer_message = "A brass obelisk appears hanging in midair!" From 2f2c8509376af49d4d1d73fe04161f4f597a7f68 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sat, 6 May 2017 22:09:58 -0700 Subject: [PATCH 127/352] Delete scripture_applications.dm.rej --- .../scripture_applications.dm.rej | 46 ------------------- 1 file changed, 46 deletions(-) delete mode 100644 code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm.rej diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm.rej b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm.rej deleted file mode 100644 index 06673bf754..0000000000 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm.rej +++ /dev/null @@ -1,46 +0,0 @@ -diff a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm (rejected hunks) -@@ -10,7 +10,7 @@ - It will penetrate mindshield implants once before disappearing." - invocations = list("Divinity, enslave...", "...all who trespass here!") - channel_time = 70 -- consumed_components = list(BELLIGERENT_EYE = 3, GEIS_CAPACITOR = 2, HIEROPHANT_ANSIBLE = 2) -+ consumed_components = list(BELLIGERENT_EYE = 4, GEIS_CAPACITOR = 2, HIEROPHANT_ANSIBLE = 2) - whispered = TRUE - object_path = /obj/effect/clockwork/sigil/submission/accession - prevent_path = /obj/effect/clockwork/sigil/submission -@@ -32,7 +32,7 @@ - It grows faster to invoke with more adjacent Servants." - invocations = list("Shield us...", "...with the...", "... fragments of Engine!") - channel_time = 100 -- consumed_components = list(VANGUARD_COGWHEEL = 3, REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 2) -+ consumed_components = list(VANGUARD_COGWHEEL = 4, REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 2) - usage_tip = "This scripture will replace all weaker armor worn by affected Servants." - tier = SCRIPTURE_APPLICATION - multiple_invokers_used = TRUE -@@ -99,7 +99,7 @@ - If it remains close to you, you will gradually regain health up to a low amount, but it will die if it goes too far from you." - invocations = list("Fright's will...", "...call forth...") - channel_time = 100 -- consumed_components = list(BELLIGERENT_EYE = 2, VANGUARD_COGWHEEL = 2, GEIS_CAPACITOR = 3) -+ consumed_components = list(BELLIGERENT_EYE = 2, VANGUARD_COGWHEEL = 2, GEIS_CAPACITOR = 4) - usage_tip = "Marauders are useful as personal bodyguards and frontline warriors." - tier = SCRIPTURE_APPLICATION - primary_component = GEIS_CAPACITOR -@@ -160,7 +160,7 @@ - and exceptional speed, though taking damage will temporarily slow it down." - invocations = list("Call forth...", "...the soldiers of Armorer.") - channel_time = 80 -- consumed_components = list(BELLIGERENT_EYE = 2, VANGUARD_COGWHEEL = 2, REPLICANT_ALLOY = 3) -+ consumed_components = list(BELLIGERENT_EYE = 2, VANGUARD_COGWHEEL = 2, REPLICANT_ALLOY = 4) - object_path = /obj/structure/destructible/clockwork/shell/fragment - creator_message = "You form an anima fragment, a powerful soul vessel receptacle." - observer_message = "The slab disgorges a puddle of black metal that expands and forms into a strange shell!" -@@ -179,7 +179,7 @@ - desc = "Places a sigil that stores energy to power clockwork structures." - invocations = list("Divinity...", "...power our creations!") - channel_time = 70 -- consumed_components = list(VANGUARD_COGWHEEL = 2, GEIS_CAPACITOR = 2, HIEROPHANT_ANSIBLE = 3) -+ consumed_components = list(VANGUARD_COGWHEEL = 2, GEIS_CAPACITOR = 2, HIEROPHANT_ANSIBLE = 4) - whispered = TRUE - object_path = /obj/effect/clockwork/sigil/transmission - creator_message = "A sigil silently appears below you. It will automatically power clockwork structures near it." From ab8dfe3b6d2515bd01338bfccee40b5c3d05339e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 7 May 2017 08:24:00 -0500 Subject: [PATCH 128/352] Automatic changelog generation for PR #801 [ci skip] --- html/changelogs/AutoChangeLog-pr-801.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-801.yml diff --git a/html/changelogs/AutoChangeLog-pr-801.yml b/html/changelogs/AutoChangeLog-pr-801.yml new file mode 100644 index 0000000000..756cf33927 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-801.yml @@ -0,0 +1,6 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "Internal Affairs Agents now obtain the kill objectives of their targets when they die." + - rscadd: "Internal Affairs Agents now have an integrated nanotrasen pinpointer that tracks their target at distances further than ten squares." + - rscadd: "Internal Affairs Agents will now lose any restrictions on collateral damage and gain a \"Die a glorious death\" objective upon becoming the last man standing, and revert if any of their targets are cloned." From 086ea817851845fc7cf7dad4ad21af0284cc168f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 7 May 2017 08:24:51 -0500 Subject: [PATCH 129/352] Automatic changelog generation for PR #748 [ci skip] --- html/changelogs/AutoChangeLog-pr-748.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-748.yml diff --git a/html/changelogs/AutoChangeLog-pr-748.yml b/html/changelogs/AutoChangeLog-pr-748.yml new file mode 100644 index 0000000000..7ad62adec8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-748.yml @@ -0,0 +1,5 @@ +author: "Moonlighting Mac says" +delete-after: True +changes: + - rscadd: "Courtesy of the art & crafts division, imitation basalt tiles themed on the rough volcanic terrain of lavaland are now available to be made out of sandstone." + - experiment: "The manufacturer even managed to replicate the way that it lights up with volcanic energy, it is the perfect accompaniment to other fake (or real) lava-land tiles or a independent piece." From 164b830f23abb954b29519c8a3cfa3593dc7a232 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 7 May 2017 08:52:57 -0500 Subject: [PATCH 130/352] Fixes away gateway --- code/modules/awaymissions/gateway.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index 80d6d84a68..c46399fa29 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -227,7 +227,7 @@ GLOBAL_DATUM(the_gateway, /obj/machinery/gateway/centerstation) if(check_exile_implant(C)) say("Rejecting [AM]: Exile implant detected in contained lifeform.") return - if(AM.buckled_mobs.len) + if(AM.has_buckled_mobs()) for(var/mob/living/carbon/C in AM.buckled_mobs) if(check_exile_implant(C)) say("Rejecting [AM]: Exile implant detected in close proximity lifeform.") From 27e7434320140ed17684990ea014f1695f69de32 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 7 May 2017 08:54:02 -0500 Subject: [PATCH 131/352] Fixes an inconsistency with the Banana Honk drink --- code/modules/reagents/chemistry/reagents/alcohol_reagents.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 23836e866d..31ec27fb79 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -966,7 +966,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Only for the experienced. You think you see sand floating in the glass." /datum/reagent/consumable/ethanol/bananahonk - name = "Banana Mama" + name = "Banana Honk" id = "bananahonk" description = "A drink from Clown Heaven." nutriment_factor = 1 * REAGENTS_METABOLISM From 281f3826056ed7d9f05fc345099b75e3f41951e1 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 7 May 2017 08:54:06 -0500 Subject: [PATCH 132/352] Sigils of Transgression are brighter --- .../gamemodes/clock_cult/clock_effects/clock_sigils.dm | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm index 3c9a0d5d99..f2ea87a7b2 100644 --- a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm +++ b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm @@ -57,7 +57,7 @@ alpha = 75 color = "#FAE48C" light_range = 1.4 - light_power = 0.4 + light_power = 1 light_color = "#FAE48C" sigil_name = "Sigil of Transgression" @@ -96,10 +96,6 @@ sigil_name = "Sigil of Submission" var/glow_type -/obj/effect/clockwork/sigil/submission/New() - ..() - update_light() - /obj/effect/clockwork/sigil/submission/proc/post_channel(mob/living/L) /obj/effect/clockwork/sigil/submission/sigil_effects(mob/living/L) @@ -268,7 +264,7 @@ if(!power_charge) set_light(0) else - set_light(round(alpha*0.02, 1), round(alpha*0.005, 1)) + set_light(max(alpha*0.02, 1.4), max(alpha*0.01, 0.1)) //Vitality Matrix: Drains health from non-servants to heal or even revive servants. /obj/effect/clockwork/sigil/vitality From 617bb4ed3822945f9dbc7ceb10d3cdd851ed83c3 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 7 May 2017 08:55:11 -0500 Subject: [PATCH 133/352] Mega arachnid --- .../simple_animal/hostile/jungle_mobs.dm | 85 ++++++++++++++++++ icons/mob/jungle/arachnid.dmi | Bin 0 -> 22213 bytes tgstation.dme | 1 + 3 files changed, 86 insertions(+) create mode 100644 code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm create mode 100644 icons/mob/jungle/arachnid.dmi diff --git a/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm b/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm new file mode 100644 index 0000000000..de1bf0b308 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm @@ -0,0 +1,85 @@ +/mob/living/simple_animal/hostile/jungle + vision_range = 5 + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + faction = list("jungle") + weather_immunities = list("acid") + obj_damage = 30 + environment_smash = 2 + minbodytemp = 0 + maxbodytemp = 450 + response_help = "pokes" + response_disarm = "shoves" + response_harm = "strikes" + status_flags = 0 + a_intent = INTENT_HARM + see_in_dark = 4 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + mob_size = MOB_SIZE_LARGE + + + +//Mega arachnid + +/mob/living/simple_animal/hostile/jungle/mega_arachnid + name = "mega arachnid" + desc = "Though physically imposing, it prefers to ambush its prey, and it will only engage with an already crippled opponent." + melee_damage_lower = 30 + melee_damage_upper = 30 + maxHealth = 300 + health = 300 + speed = 1 + ranged = 1 + pixel_x = -16 + move_to_delay = 10 + aggro_vision_range = 9 + speak_emote = list("chitters") + attack_sound = 'sound/weapons/bladeslice.ogg' + ranged_cooldown_time = 60 + projectiletype = /obj/item/projectile/mega_arachnid + projectilesound = 'sound/weapons/pierce.ogg' + icon = 'icons/mob/jungle/arachnid.dmi' + icon_state = "arachnid" + icon_living = "arachnid" + icon_dead = "dead_purple" + alpha = 50 + +/mob/living/simple_animal/hostile/jungle/mega_arachnid/Life() + ..() + if(target && ranged_cooldown > world.time && iscarbon(target)) + var/mob/living/carbon/C = target + if(!C.legcuffed && C.health < 50) + retreat_distance = 9 + minimum_distance = 9 + alpha = 125 + return + retreat_distance = 0 + minimum_distance = 0 + alpha = 255 + + +/mob/living/simple_animal/hostile/jungle/mega_arachnid/Aggro() + ..() + alpha = 255 + +/mob/living/simple_animal/hostile/jungle/mega_arachnid/LoseAggro() + ..() + alpha = 50 + +/obj/item/projectile/mega_arachnid + name = "flesh snare" + nodamage = 1 + damage = 0 + icon_state = "tentacle_end" + +/obj/item/projectile/mega_arachnid/on_hit(atom/target, blocked = 0) + if(iscarbon(target) && blocked < 100) + var/obj/item/weapon/restraints/legcuffs/beartrap/mega_arachnid/B = new /obj/item/weapon/restraints/legcuffs/beartrap/mega_arachnid(get_turf(target)) + B.Crossed(target) + ..() + +/obj/item/weapon/restraints/legcuffs/beartrap/mega_arachnid + name = "fleshy restraints" + desc = "Used by mega arachnids to immobilize their prey." + flags = DROPDEL + icon_state = "tentacle_end" + icon = 'icons/obj/projectiles.dmi' \ No newline at end of file diff --git a/icons/mob/jungle/arachnid.dmi b/icons/mob/jungle/arachnid.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a1db8e351f0cd4da5462267ccaaa7fdaa9fc8fc1 GIT binary patch literal 22213 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 Date: Sun, 7 May 2017 08:59:19 -0500 Subject: [PATCH 134/352] Add watertank, shower, sink to mining station and gulag --- _maps/map_files/Mining/Lavaland.dmm | 88 +++++++++++++++++++++++------ config/admins.txt.rej | 9 +++ 2 files changed, 80 insertions(+), 17 deletions(-) create mode 100644 config/admins.txt.rej diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index 778fb50c88..c37c4ca3a3 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -513,7 +513,7 @@ /obj/structure/cable{ d1 = 1; d2 = 4; - icon_state = "1-4"; + icon_state = "1-4" }, /obj/structure/cable{ d1 = 1; @@ -1040,7 +1040,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/brown{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; - dir = 1; + dir = 1 }, /area/mine/living_quarters) "cg" = ( @@ -1074,7 +1074,7 @@ /obj/structure/cable{ d1 = 1; d2 = 4; - icon_state = "1-4"; + icon_state = "1-4" }, /turf/open/floor/plasteel{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface @@ -1497,10 +1497,21 @@ /area/mine/living_quarters) "dd" = ( /obj/structure/table, -/obj/item/weapon/reagent_containers/food/drinks/beer, +/obj/item/weapon/reagent_containers/food/drinks/beer{ + pixel_x = 7; + pixel_y = 5 + }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, +/obj/item/weapon/reagent_containers/food/drinks/beer{ + pixel_x = -1; + pixel_y = 9 + }, +/obj/item/weapon/reagent_containers/food/drinks/beer{ + pixel_x = -8; + pixel_y = 0 + }, /turf/open/floor/plasteel/bar{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface }, @@ -1772,6 +1783,9 @@ pixel_x = -5; pixel_y = 30 }, +/obj/machinery/shower{ + dir = 8 + }, /turf/open/floor/plasteel/purple/corner{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface }, @@ -2192,7 +2206,7 @@ }, /turf/open/floor/plasteel/vault{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; - dir = 8; + dir = 8 }, /area/mine/maintenance) "ez" = ( @@ -2214,13 +2228,13 @@ /obj/machinery/iv_drip, /turf/open/floor/plasteel/whiteblue/side{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; - dir = 1; + dir = 1 }, /area/mine/living_quarters) "eB" = ( /turf/open/floor/plasteel/whiteblue/side{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; - dir = 1; + dir = 1 }, /area/mine/living_quarters) "eC" = ( @@ -2231,7 +2245,7 @@ }, /turf/open/floor/plasteel/whiteblue/side{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; - dir = 5; + dir = 5 }, /area/mine/living_quarters) "eD" = ( @@ -2398,7 +2412,7 @@ /obj/item/weapon/storage/firstaid/regular, /turf/open/floor/plasteel/whiteblue/side{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; - dir = 4; + dir = 4 }, /area/mine/living_quarters) "eU" = ( @@ -2512,6 +2526,7 @@ dir = 2; network = list("MINE") }, +/obj/structure/reagent_dispensers/watertank, /turf/open/floor/plasteel/brown{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; dir = 5 @@ -2520,7 +2535,7 @@ "fe" = ( /turf/open/floor/plasteel/brown/corner{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; - dir = 1; + dir = 1 }, /area/mine/production) "ff" = ( @@ -2578,7 +2593,7 @@ }, /turf/open/floor/plasteel/brown{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; - dir = 1; + dir = 1 }, /area/mine/living_quarters) "fm" = ( @@ -2600,7 +2615,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/brown{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; - dir = 1; + dir = 1 }, /area/mine/living_quarters) "fp" = ( @@ -2674,7 +2689,7 @@ /obj/structure/cable{ d1 = 1; d2 = 4; - icon_state = "1-4"; + icon_state = "1-4" }, /turf/open/floor/plasteel{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface @@ -2712,6 +2727,10 @@ /obj/machinery/light/small{ dir = 1 }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -5; + pixel_y = 30 + }, /turf/open/floor/plasteel/purple/corner{ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; dir = 4 @@ -2794,6 +2813,41 @@ /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /turf/closed/indestructible/riveted, /area/space) +"fQ" = ( +/obj/machinery/shower{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/white, +/area/mine/laborcamp) +"fR" = ( +/obj/structure/sink/kitchen{ + dir = 4; + icon_state = "sink_alt"; + pixel_x = -13; + tag = "icon-sink_alt (EAST)" + }, +/turf/open/floor/plasteel{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/mine/laborcamp) +"fS" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plasteel/purple/corner{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/mine/production) +"fT" = ( +/obj/structure/sink{ + dir = 4; + icon_state = "sink"; + pixel_x = 11; + tag = "icon-sink (EAST)" + }, +/turf/open/floor/plasteel/bar{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/mine/living_quarters) (1,1,1) = {" aa @@ -8919,7 +8973,7 @@ aA at at at -at +fR at au fH @@ -9175,7 +9229,7 @@ an an at at -at +fQ at dr an @@ -14594,8 +14648,8 @@ fj ee cT cZ -dg dk +fT ee al al @@ -18433,7 +18487,7 @@ af ab ab dx -dC +fS dK bI bS diff --git a/config/admins.txt.rej b/config/admins.txt.rej new file mode 100644 index 0000000000..76cdce088c --- /dev/null +++ b/config/admins.txt.rej @@ -0,0 +1,9 @@ +diff a/config/admins.txt b/config/admins.txt (rejected hunks) +@@ -127,4 +127,5 @@ Sweaterkittens = Game Master + Feemjmeem = Game Master + JStheguy = Game Master + excessiveuseofcobby = Game Master +-Plizzard = Game Master +\ No newline at end of file ++Plizzard = Game Master ++octareenroon91 = Game Master From b0cceb8766bef7078d54247b415f7cd167754656 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 7 May 2017 09:31:51 -0500 Subject: [PATCH 135/352] C4 planting takes 3 seconds, down from 5 --- code/game/objects/items/weapons/explosives.dm | 2 +- code/game/objects/items/weapons/grenades/plastic.dm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 756512dff1..2ae93fa774 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -81,7 +81,7 @@ to_chat(user, "You start planting the bomb...") - if(do_after(user, 50, target = AM)) + if(do_after(user, 50, target = AM)) if(!user.temporarilyRemoveItemFromInventory(src)) return src.target = AM diff --git a/code/game/objects/items/weapons/grenades/plastic.dm b/code/game/objects/items/weapons/grenades/plastic.dm index aedf0954c2..023635c977 100644 --- a/code/game/objects/items/weapons/grenades/plastic.dm +++ b/code/game/objects/items/weapons/grenades/plastic.dm @@ -96,7 +96,7 @@ to_chat(user, "You start planting the [src]. The timer is set to [det_time]...") - if(do_after(user, 50, target = AM)) + if(do_after(user, 30, target = AM)) if(!user.temporarilyRemoveItemFromInventory(src)) return src.target = AM @@ -165,4 +165,4 @@ icon_state = "plasticx40" item_state = "plasticx4" directional = TRUE - boom_sizes = list(0, 2, 5) \ No newline at end of file + boom_sizes = list(0, 2, 5) From 1a5050692b3b36bdf0f14308720421b1fd28fb45 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 7 May 2017 11:33:55 -0500 Subject: [PATCH 136/352] Fixes his grace CtrlClick --- code/game/objects/items/weapons/his_grace.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/his_grace.dm b/code/game/objects/items/weapons/his_grace.dm index be269d583d..d8e7dabdf9 100644 --- a/code/game/objects/items/weapons/his_grace.dm +++ b/code/game/objects/items/weapons/his_grace.dm @@ -41,7 +41,7 @@ ..() /obj/item/weapon/his_grace/CtrlClick(mob/user) //you can't pull his grace - attack_hand(user) + return /obj/item/weapon/his_grace/examine(mob/user) ..() From 659139ca1c86e5625f3bf99559bf4b2920d61163 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 7 May 2017 12:41:45 -0500 Subject: [PATCH 137/352] finger snap emote --- code/modules/mob/living/carbon/emote.dm | 11 +++++++++++ sound/effects/snap01.ogg | Bin 0 -> 7666 bytes 2 files changed, 11 insertions(+) create mode 100644 sound/effects/snap01.ogg diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm index 30fa676500..48ebd53435 100644 --- a/code/modules/mob/living/carbon/emote.dm +++ b/code/modules/mob/living/carbon/emote.dm @@ -68,6 +68,17 @@ if(!isnum(text2num(params))) return message +/datum/emote/sound/carbon/snap + key = "snap" + key_third_person = "snaps" + message = "snaps their fingers." + muzzle_ignore = TRUE + restraint_check = TRUE + emote_type = EMOTE_AUDIBLE + sound = 'sound/effects/snap01.ogg' + mob_type_allowed_typecache = list(/mob/living/carbon/) + + /datum/emote/living/carbon/sign/signal key = "signal" key_third_person = "signals" diff --git a/sound/effects/snap01.ogg b/sound/effects/snap01.ogg new file mode 100644 index 0000000000000000000000000000000000000000..aa7ab9f5bf9d10934e782bcbbdac716b84ea6b34 GIT binary patch literal 7666 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 Ujv0g#x5cu4=QM&yPXosP0wesaeE Date: Sun, 7 May 2017 14:59:11 -0500 Subject: [PATCH 138/352] Automatic changelog generation for PR #825 [ci skip] --- html/changelogs/AutoChangeLog-pr-825.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-825.yml diff --git a/html/changelogs/AutoChangeLog-pr-825.yml b/html/changelogs/AutoChangeLog-pr-825.yml new file mode 100644 index 0000000000..ee3a963c30 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-825.yml @@ -0,0 +1,4 @@ +author: "Robustin" +delete-after: True +changes: + - tweak: "c4 planting is now 40% faster" From dc7dbc5ec98f61dfdb972f0af389cbf6bdc1b916 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 7 May 2017 15:41:33 -0500 Subject: [PATCH 139/352] Automatic changelog generation for PR #827 [ci skip] --- html/changelogs/AutoChangeLog-pr-827.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-827.yml diff --git a/html/changelogs/AutoChangeLog-pr-827.yml b/html/changelogs/AutoChangeLog-pr-827.yml new file mode 100644 index 0000000000..e16167448d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-827.yml @@ -0,0 +1,4 @@ +author: "Jay" +delete-after: True +changes: + - rscadd: "Adds finger snapping emote. Use say *snap" From a69b9c1b182ff72f22150e16ba96daa9f34d7c8a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 7 May 2017 17:01:36 -0500 Subject: [PATCH 140/352] Corrects Baseturfs from Lava to Space --- _maps/map_files/Deltastation/DeltaStation2.dmm | 10 +++++----- _maps/map_files/OmegaStation/OmegaStation.dmm | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index d9122fa8b1..4f5712e3a4 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -10753,7 +10753,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/loadingarea{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; + baseturf = /turf/open/space; dir = 8 }, /area/quartermaster/storage) @@ -11240,7 +11240,7 @@ /area/quartermaster/storage) "awJ" = ( /turf/open/floor/plasteel/loadingarea{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; + baseturf = /turf/open/space; dir = 8 }, /area/quartermaster/storage) @@ -31236,7 +31236,7 @@ icon_state = "1-4" }, /turf/open/floor/plasteel/loadingarea{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; + baseturf = /turf/open/space; dir = 8 }, /area/quartermaster/miningdock{ @@ -52475,7 +52475,7 @@ name = "Queue Shutters" }, /turf/open/floor/plasteel/loadingarea{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; + baseturf = /turf/open/space; dir = 8 }, /area/hallway/primary/central) @@ -104158,7 +104158,7 @@ name = "emergency shower" }, /turf/open/floor/plasteel/whiteblue/side{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; + baseturf = /turf/open/space; dir = 4 }, /area/shuttle/escape) diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index dae6f8e837..9ea8f8e2c7 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -9154,7 +9154,7 @@ }, /obj/effect/landmark/start/shaft_miner, /turf/open/floor/plasteel/loadingarea{ - baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; + baseturf = /turf/open/space; dir = 8 }, /area/quartermaster/miningdock) From 53d43227ab378f0f1e934948ed51c888badeddf7 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 7 May 2017 17:05:44 -0500 Subject: [PATCH 141/352] Fixes this annoying ass thing in the bandb I should have fixed before. --- code/modules/admin/DB_ban/functions.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/admin/DB_ban/functions.dm b/code/modules/admin/DB_ban/functions.dm index 12517eb385..9b9c09754c 100644 --- a/code/modules/admin/DB_ban/functions.dm +++ b/code/modules/admin/DB_ban/functions.dm @@ -79,8 +79,8 @@ validckey = 1 if(!validckey) if(!banned_mob || (banned_mob && !IsGuestKey(banned_mob.key))) - message_admins("[key_name_admin(usr)] attempted to ban [ckey], but [ckey] has not been seen yet. Please only ban actual players.",1) - return + if(alert(usr, "[ckey] has not been seen before, are you sure you want to create a ban for them?", "Unknown ckey", "Yes", "No", "Cancel") != "Yes") + return var/a_ckey var/a_computerid From 181eee013e8c221e0abf166d61e9554dc4ae968d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 7 May 2017 17:07:59 -0500 Subject: [PATCH 142/352] [READY]DATUM VERBS AND TOP MENUS! --- code/__DEFINES/menu.dm | 3 + code/__HELPERS/_lists.dm | 1 + code/modules/admin/admin_verbs.dm | 11 - code/modules/admin/admin_verbs.dm.rej | 20 + code/modules/admin/adminmenu.dm | 11 + code/modules/client/client_procs.dm.rej | 28 ++ code/modules/client/preferences.dm.rej | 18 + code/modules/client/preferences_savefile.dm | 28 +- .../client/preferences_savefile.dm.rej | 38 ++ code/modules/client/preferences_toggles.dm | 372 ++++++++++-------- code/world.dm | 6 +- code/world.dm.rej | 9 + interface/menu.dm | 203 ++++++++++ interface/skin.dmf | 55 +-- tgstation.dme | 3 + 15 files changed, 563 insertions(+), 243 deletions(-) create mode 100644 code/__DEFINES/menu.dm create mode 100644 code/modules/admin/admin_verbs.dm.rej create mode 100644 code/modules/admin/adminmenu.dm create mode 100644 code/modules/client/client_procs.dm.rej create mode 100644 code/modules/client/preferences.dm.rej create mode 100644 code/modules/client/preferences_savefile.dm.rej create mode 100644 code/world.dm.rej create mode 100644 interface/menu.dm diff --git a/code/__DEFINES/menu.dm b/code/__DEFINES/menu.dm new file mode 100644 index 0000000000..2730adf87c --- /dev/null +++ b/code/__DEFINES/menu.dm @@ -0,0 +1,3 @@ +#define CHECKBOX_NONE 0 +#define CHECKBOX_GROUP 1 +#define CHECKBOX_TOGGLE 2 \ No newline at end of file diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index c0797819bc..8f340bff46 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -457,6 +457,7 @@ #define LAZYACCESS(L, I) (L ? (isnum(I) ? (I > 0 && I <= L.len ? L[I] : null) : L[I]) : null) #define LAZYLEN(L) length(L) #define LAZYCLEARLIST(L) if(L) L.Cut() +#define SANITIZE_LIST(L) ( islist(L) ? L : list() ) /* Definining a counter as a series of key -> numeric value entries diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index d4ba53c6af..9618942e2a 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -32,7 +32,6 @@ GLOBAL_PROTECT(admin_verbs_admin) GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin()) /world/proc/AVerbsAdmin() return list( - /client/proc/player_panel_new, /*shows an interface for all players, with links to various panels*/ /client/proc/invisimin, /*allows our mob to go invisible/visible*/ // /datum/admins/proc/show_traitor_panel, /*interface which shows a mob's mind*/ -Removed due to rare practical use. Moved to debug verbs ~Errorage /datum/admins/proc/show_player_panel, /*shows an interface for individual players, with various links (links require additional flags*/ @@ -182,9 +181,6 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list( /client/proc/set_ooc, /client/proc/reset_ooc, /client/proc/deadmin, - /client/proc/deadchat, - /client/proc/toggleprayers, - /client/proc/toggle_hear_radio, /datum/admins/proc/show_traitor_panel, /datum/admins/proc/toggleenter, /datum/admins/proc/toggleguests, @@ -398,13 +394,6 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list( mob.invisibility = INVISIBILITY_OBSERVER to_chat(mob, "Invisimin on. You are now as invisible as a ghost.") -/client/proc/player_panel_new() - set name = "Player Panel" - set category = "Admin" - if(holder) - holder.player_panel_new() - SSblackbox.add_details("admin_verb","Player Panel New") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - /client/proc/check_antagonists() set name = "Check Antagonists" set category = "Admin" diff --git a/code/modules/admin/admin_verbs.dm.rej b/code/modules/admin/admin_verbs.dm.rej new file mode 100644 index 0000000000..ab3cd09eac --- /dev/null +++ b/code/modules/admin/admin_verbs.dm.rej @@ -0,0 +1,20 @@ +diff a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm (rejected hunks) +@@ -4,18 +4,12 @@ GLOBAL_PROTECT(admin_verbs_default) + GLOBAL_LIST_INIT(admin_verbs_default, world.AVerbsDefault()) + /world/proc/AVerbsDefault() + return list( +- /client/proc/toggleadminhelpsound, /*toggles whether we hear a sound when adminhelps/PMs are used*/ +- /client/proc/toggleannouncelogin, /*toggles if an admin's login is announced during a round*/ + /client/proc/deadmin, /*destroys our own admin datum so we can play as a regular player*/ + /client/proc/cmd_admin_say, /*admin-only ooc chat*/ + /client/proc/hide_verbs, /*hides all our adminverbs*/ + /client/proc/hide_most_verbs, /*hides all our hideable adminverbs*/ + /client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify*/ +- /client/proc/deadchat, /*toggles deadchat on/off*/ + /client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/ +- /client/proc/toggleprayers, /*toggles prayers on/off*/ +- /client/verb/toggleprayersounds, /*Toggles prayer sounds (HALLELUJAH!)*/ +- /client/proc/toggle_hear_radio, /*toggles whether we hear the radio*/ + /client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/ + /client/proc/secrets, + /client/proc/reload_admins, diff --git a/code/modules/admin/adminmenu.dm b/code/modules/admin/adminmenu.dm new file mode 100644 index 0000000000..fc7a57e212 --- /dev/null +++ b/code/modules/admin/adminmenu.dm @@ -0,0 +1,11 @@ +/datum/menu/Admin/Generate_list(client/C) + if (C.holder) + . = ..() + +/datum/menu/Admin/verb/playerpanel() + set name = "Player Panel" + set desc = "Player Panel" + set category = "Admin" + usr.client.holder.player_panel_new() + SSblackbox.add_details("admin_verb","Player Panel New") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + return \ No newline at end of file diff --git a/code/modules/client/client_procs.dm.rej b/code/modules/client/client_procs.dm.rej new file mode 100644 index 0000000000..337999747e --- /dev/null +++ b/code/modules/client/client_procs.dm.rej @@ -0,0 +1,28 @@ +diff a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm (rejected hunks) +@@ -328,6 +328,26 @@ GLOBAL_LIST(external_rsc_urls) + if(!tooltips) + tooltips = new /datum/tooltip(src) + ++ var/list/topmenus = GLOB.menulist[/datum/menu] ++ for (var/thing in topmenus) ++ var/datum/menu/topmenu = thing ++ var/topmenuname = "[topmenu]" ++ if (topmenuname == "[topmenu.type]") ++ var/list/tree = splittext(topmenuname, "/") ++ topmenuname = tree[tree.len] ++ winset(src, "[topmenu.type]", "parent=menu;name=[url_encode(topmenuname)]") ++ var/list/entries = topmenu.Generate_list(src) ++ for (var/child in entries) ++ winset(src, "[url_encode(child)]", "[entries[child]]") ++ if (!ispath(child, /datum/menu)) ++ var/atom/verb/verbpath = child ++ if (copytext(verbpath.name,1,2) != "@") ++ new child(src) ++ ++ for (var/thing in prefs.menuoptions) ++ var/datum/menu/menuitem = GLOB.menulist[thing] ++ if (menuitem) ++ menuitem.Load_checked(src) + + ////////////// + //DISCONNECT// diff --git a/code/modules/client/preferences.dm.rej b/code/modules/client/preferences.dm.rej new file mode 100644 index 0000000000..5dadf89bdd --- /dev/null +++ b/code/modules/client/preferences.dm.rej @@ -0,0 +1,18 @@ +diff a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm (rejected hunks) +@@ -102,6 +102,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) + + var/uplink_spawn_loc = UPLINK_PDA + ++ var/list/menuoptions ++ + /datum/preferences/New(client/C) + parent = C + custom_names["ai"] = pick(GLOB.ai_names) +@@ -124,6 +126,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) + if(!loaded_preferences_successfully) + save_preferences() + save_character() //let's save this new random character so it doesn't keep generating new ones. ++ menuoptions = list() + return + + diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 128a07ebd1..317935d87e 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -88,15 +88,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car /datum/preferences/proc/update_preferences(current_version, savefile/S) - if(current_version < 10) - toggles |= MEMBER_PUBLIC - if(current_version < 11) - chat_toggles = TOGGLES_DEFAULT_CHAT - toggles = TOGGLES_DEFAULT - if(current_version < 12) - ignoring = list() - if(current_version < 15) - toggles |= SOUND_ANNOUNCEMENTS //should this proc get fairly long (say 3 versions long), @@ -106,16 +97,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //It's only really meant to avoid annoying frequent players //if your savefile is 3 months out of date, then 'tough shit'. /datum/preferences/proc/update_character(current_version, savefile/S) - if(pref_species && !(pref_species.id in GLOB.roundstart_species)) - var/rando_race = pick(config.roundstart_races) - pref_species = new rando_race() - - if(current_version < 13 || !istext(backbag)) - switch(backbag) - if(2) - backbag = DSATCHEL - else - backbag = DBACKPACK if(current_version < 16) var/berandom S["userandomjob"] >> berandom @@ -231,6 +212,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car ghost_orbit = sanitize_inlist(ghost_orbit, GLOB.ghost_orbits, initial(ghost_orbit)) ghost_accs = sanitize_inlist(ghost_accs, GLOB.ghost_accs_options, GHOST_ACCS_DEFAULT_OPTION) ghost_others = sanitize_inlist(ghost_others, GLOB.ghost_others_options, GHOST_OTHERS_DEFAULT_OPTION) + menuoptions = SANITIZE_LIST(menuoptions) + be_special = SANITIZE_LIST(be_special) + return 1 @@ -565,7 +549,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car #undef SAVEFILE_VERSION_MAX #undef SAVEFILE_VERSION_MIN -/* + +#ifdef TESTING //DEBUG //Some crude tools for testing savefiles //path is the savefile path @@ -576,4 +561,5 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car /client/verb/savefile_import(path as text) var/savefile/S = new /savefile(path) S.ImportText("/",file("[path].txt")) -*/ + +#endif \ No newline at end of file diff --git a/code/modules/client/preferences_savefile.dm.rej b/code/modules/client/preferences_savefile.dm.rej new file mode 100644 index 0000000000..aa5ee0c518 --- /dev/null +++ b/code/modules/client/preferences_savefile.dm.rej @@ -0,0 +1,38 @@ +diff a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm (rejected hunks) +@@ -1,5 +1,5 @@ + //This is the lowest supported version, anything below this is completely obsolete and the entire savefile will be wiped. +-#define SAVEFILE_VERSION_MIN 10 ++#define SAVEFILE_VERSION_MIN 15 + + //This is the current version, anything below this will attempt to update (if it's not obsolete) + #define SAVEFILE_VERSION_MAX 17 +@@ -156,12 +137,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car + S["tgui_fancy"] >> tgui_fancy + S["tgui_lock"] >> tgui_lock + S["windowflash"] >> windowflashing ++ S["be_special"] >> be_special + +- if(islist(S["be_special"])) +- S["be_special"] >> be_special +- else //force update and store the old bitflag version of be_special +- needs_update = 11 +- S["be_special"] >> old_be_special + + S["default_slot"] >> default_slot + S["chat_toggles"] >> chat_toggles +@@ -177,6 +154,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car + S["uses_glasses_colour"]>> uses_glasses_colour + S["clientfps"] >> clientfps + S["parallax"] >> parallax ++ S["menuoptions"] >> menuoptions + + //try to fix any outdated data if necessary + if(needs_update >= 0) +@@ -235,6 +216,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car + S["uses_glasses_colour"]<< uses_glasses_colour + S["clientfps"] << clientfps + S["parallax"] << parallax ++ S["menuoptions"] << menuoptions + + return 1 + diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index 74cbc70b87..eb244937e6 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -1,162 +1,249 @@ -//toggles -/client/verb/toggle_ghost_ears() - set name = "Show/Hide GhostEars" - set category = "Preferences" - set desc = ".Toggle Between seeing all mob speech, and only speech of nearby mobs" - prefs.chat_toggles ^= CHAT_GHOSTEARS - to_chat(src, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTEARS) ? "see all speech in the world" : "only see speech from nearby mobs"].") - prefs.save_preferences() - SSblackbox.add_details("preferences_verb","Toggle Ghost Ears|[prefs.chat_toggles & CHAT_GHOSTEARS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +//this works as is to create a single checked item, but has no back end code for toggleing the check yet +#define TOGGLE_CHECKBOX(PARENT, CHILD) PARENT/CHILD/abstract = TRUE;PARENT/CHILD/checkbox = CHECKBOX_TOGGLE;PARENT/CHILD/verb/CHILD -/client/verb/toggle_ghost_sight() - set name = "Show/Hide GhostSight" - set category = "Preferences" - set desc = ".Toggle Between seeing all mob emotes, and only emotes of nearby mobs" - prefs.chat_toggles ^= CHAT_GHOSTSIGHT - to_chat(src, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTSIGHT) ? "see all emotes in the world" : "only see emotes from nearby mobs"].") - prefs.save_preferences() - SSblackbox.add_details("preferences_verb","Toggle Ghost Sight|[prefs.chat_toggles & CHAT_GHOSTSIGHT]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +//Example usage TOGGLE_CHECKBOX(datum/menu/Settings/Ghost/chatterbox, toggle_ghost_ears)() -/client/verb/toggle_ghost_whispers() - set name = "Show/Hide GhostWhispers" - set category = "Preferences" - set desc = ".Toggle between hearing all whispers, and only whispers of nearby mobs" - prefs.chat_toggles ^= CHAT_GHOSTWHISPER - to_chat(src, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTWHISPER) ? "see all whispers in the world" : "only see whispers from nearby mobs"].") - prefs.save_preferences() - SSblackbox.add_details("preferences_verb","Toggle Ghost Whispers|[prefs.chat_toggles & CHAT_GHOSTWHISPER]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +//override because we don't want to save preferences twice. +/datum/menu/Settings/Set_checked(client/C, verbpath) + if (checkbox == CHECKBOX_GROUP) + C.prefs.menuoptions[type] = verbpath + else if (checkbox == CHECKBOX_TOGGLE) + var/checked = Get_checked(C) + C.prefs.menuoptions[type] = !checked + winset(C, "[verbpath]", "is-checked = [!checked]") -/client/verb/toggle_ghost_radio() - set name = "Show/Hide GhostRadio" +/datum/menu/Settings/verb/setup_character() + set name = "Game Preferences" set category = "Preferences" - set desc = ".Enable or disable hearing radio chatter as a ghost" - prefs.chat_toggles ^= CHAT_GHOSTRADIO - to_chat(src, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTRADIO) ? "see radio chatter" : "not see radio chatter"].") - prefs.save_preferences() - SSblackbox.add_details("preferences_verb","Toggle Ghost Radio|[prefs.chat_toggles & CHAT_GHOSTRADIO]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //social experiment, increase the generation whenever you copypaste this shamelessly GENERATION 1 + set desc = "Open Game Preferences Window" + usr.client.prefs.current_tab = 1 + usr.client.prefs.ShowChoices(usr) + +//toggles +/datum/menu/Settings/Ghost/chatterbox + name = "Chat Box Spam" -/client/verb/toggle_ghost_pda() +TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_ears)() + set name = "Show/Hide GhostEars" + set category = "Preferences" + set desc = "See All Speech" + usr.client.prefs.chat_toggles ^= CHAT_GHOSTEARS + to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTEARS) ? "see all speech in the world" : "only see speech from nearby mobs"].") + usr.client.prefs.save_preferences() + SSblackbox.add_details("preferences_verb","Toggle Ghost Ears|[usr.client.prefs.chat_toggles & CHAT_GHOSTEARS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/datum/menu/Settings/Ghost/chatterbox/toggle_ghost_ears/Get_checked(client/C) + return C.prefs.chat_toggles & CHAT_GHOSTEARS + +TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_sight)() + set name = "Show/Hide GhostSight" + set category = "Preferences" + set desc = "See All Emotes" + usr.client.prefs.chat_toggles ^= CHAT_GHOSTSIGHT + to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTSIGHT) ? "see all emotes in the world" : "only see emotes from nearby mobs"].") + usr.client.prefs.save_preferences() + SSblackbox.add_details("preferences_verb","Toggle Ghost Sight|[usr.client.prefs.chat_toggles & CHAT_GHOSTSIGHT]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/datum/menu/Settings/Ghost/chatterbox/toggle_ghost_sight/Get_checked(client/C) + return C.prefs.chat_toggles & CHAT_GHOSTSIGHT + +TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_whispers)() + set name = "Show/Hide GhostWhispers" + set category = "Preferences" + set desc = "See All Whispers" + usr.client.prefs.chat_toggles ^= CHAT_GHOSTWHISPER + to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTWHISPER) ? "see all whispers in the world" : "only see whispers from nearby mobs"].") + usr.client.prefs.save_preferences() + SSblackbox.add_details("preferences_verb","Toggle Ghost Whispers|[usr.client.prefs.chat_toggles & CHAT_GHOSTWHISPER]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/datum/menu/Settings/Ghost/chatterbox/toggle_ghost_whispers/Get_checked(client/C) + return C.prefs.chat_toggles & CHAT_GHOSTWHISPER + +TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_radio)() + set name = "Show/Hide GhostRadio" + set category = "Preferences" + set desc = "See All Radio Chatter" + usr.client.prefs.chat_toggles ^= CHAT_GHOSTRADIO + to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTRADIO) ? "see radio chatter" : "not see radio chatter"].") + usr.client.prefs.save_preferences() + SSblackbox.add_details("preferences_verb","Toggle Ghost Radio|[usr.client.prefs.chat_toggles & CHAT_GHOSTRADIO]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //social experiment, increase the generation whenever you copypaste this shamelessly GENERATION 1 +/datum/menu/Settings/Ghost/chatterbox/toggle_ghost_radio/Get_checked(client/C) + return C.prefs.chat_toggles & CHAT_GHOSTRADIO + +TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_pda)() set name = "Show/Hide GhostPDA" - set category = "Preferences" - set desc = ".Toggle Between seeing all mob pda messages, and only pda messages of nearby mobs" - prefs.chat_toggles ^= CHAT_GHOSTPDA - to_chat(src, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTPDA) ? "see all pda messages in the world" : "only see pda messages from nearby mobs"].") - prefs.save_preferences() - SSblackbox.add_details("preferences_verb","Toggle Ghost PDA|[prefs.chat_toggles & CHAT_GHOSTPDA]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + set category = "Preferences" + set desc = "See All PDA Messages" + usr.client.prefs.chat_toggles ^= CHAT_GHOSTPDA + to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTPDA) ? "see all pda messages in the world" : "only see pda messages from nearby mobs"].") + usr.client.prefs.save_preferences() + SSblackbox.add_details("preferences_verb","Toggle Ghost PDA|[usr.client.prefs.chat_toggles & CHAT_GHOSTPDA]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/datum/menu/Settings/Ghost/chatterbox/toggle_ghost_pda/Get_checked(client/C) + return C.prefs.chat_toggles & CHAT_GHOSTPDA + +/datum/menu/Settings/Ghost/chatterbox/Events + name = "Events" //please be aware that the following two verbs have inverted stat output, so that "Toggle Deathrattle|1" still means you activated it -/client/verb/toggle_deathrattle() +TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox/Events, toggle_deathrattle)() set name = "Toggle Deathrattle" - set category = "Preferences" - set desc = "Toggle recieving a message in deadchat when sentient mobs die." - prefs.toggles ^= DISABLE_DEATHRATTLE - prefs.save_preferences() - to_chat(usr, "You will [(prefs.toggles & DISABLE_DEATHRATTLE) ? "no longer" : "now"] get messages when a sentient mob dies.") - SSblackbox.add_details("preferences_verb", "Toggle Deathrattle|[!(prefs.toggles & DISABLE_DEATHRATTLE)]") //If you are copy-pasting this, maybe you should spend some time reading the comments. - -/client/verb/toggle_arrivalrattle() + set category = "Preferences" + set desc = "Death" + usr.client.prefs.toggles ^= DISABLE_DEATHRATTLE + usr.client.prefs.save_preferences() + to_chat(usr, "You will [(usr.client.prefs.toggles & DISABLE_DEATHRATTLE) ? "no longer" : "now"] get messages when a sentient mob dies.") + SSblackbox.add_details("preferences_verb", "Toggle Deathrattle|[!(usr.client.prefs.toggles & DISABLE_DEATHRATTLE)]") //If you are copy-pasting this, maybe you should spend some time reading the comments. +/datum/menu/Settings/Ghost/chatterbox/Events/toggle_deathrattle/Get_checked(client/C) + return !(C.prefs.toggles & DISABLE_DEATHRATTLE) + +TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox/Events, toggle_arrivalrattle)() set name = "Toggle Arrivalrattle" - set category = "Preferences" - set desc = "Toggle recieving a message in deadchat when someone joins the station." - prefs.toggles ^= DISABLE_ARRIVALRATTLE - to_chat(usr, "You will [(prefs.toggles & DISABLE_ARRIVALRATTLE) ? "no longer" : "now"] get messages when someone joins the station.") - prefs.save_preferences() - SSblackbox.add_details("preferences_verb", "Toggle Arrivalrattle|[!(prefs.toggles & DISABLE_ARRIVALRATTLE)]") //If you are copy-pasting this, maybe you should rethink where your life went so wrong. - -/client/verb/togglemidroundantag() + set category = "Preferences" + set desc = "New Player Arrival" + usr.client.prefs.toggles ^= DISABLE_ARRIVALRATTLE + to_chat(usr, "You will [(usr.client.prefs.toggles & DISABLE_ARRIVALRATTLE) ? "no longer" : "now"] get messages when someone joins the station.") + usr.client.prefs.save_preferences() + SSblackbox.add_details("preferences_verb", "Toggle Arrivalrattle|[!(usr.client.prefs.toggles & DISABLE_ARRIVALRATTLE)]") //If you are copy-pasting this, maybe you should rethink where your life went so wrong. +/datum/menu/Settings/Ghost/chatterbox/Events/toggle_arrivalrattle/Get_checked(client/C) + return !(C.prefs.toggles & DISABLE_ARRIVALRATTLE) + +TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost, togglemidroundantag)() set name = "Toggle Midround Antagonist" - set category = "Preferences" - set desc = "Toggles whether or not you will be considered for antagonist status given during a round." - prefs.toggles ^= MIDROUND_ANTAG - prefs.save_preferences() - to_chat(src, "You will [(prefs.toggles & MIDROUND_ANTAG) ? "now" : "no longer"] be considered for midround antagonist positions.") - SSblackbox.add_details("preferences_verb","Toggle Midround Antag|[prefs.toggles & MIDROUND_ANTAG]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/verb/toggletitlemusic() + set category = "Preferences" + set desc = "Midround Antagonist" + usr.client.prefs.toggles ^= MIDROUND_ANTAG + usr.client.prefs.save_preferences() + to_chat(usr, "You will [(usr.client.prefs.toggles & MIDROUND_ANTAG) ? "now" : "no longer"] be considered for midround antagonist positions.") + SSblackbox.add_details("preferences_verb","Toggle Midround Antag|[usr.client.prefs.toggles & MIDROUND_ANTAG]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/datum/menu/Settings/Ghost/togglemidroundantag/Get_checked(client/C) + return C.prefs.toggles & MIDROUND_ANTAG + +TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggletitlemusic)() set name = "Hear/Silence LobbyMusic" set category = "Preferences" - set desc = "Toggles hearing the GameLobby music" - prefs.toggles ^= SOUND_LOBBY - prefs.save_preferences() - if(prefs.toggles & SOUND_LOBBY) - to_chat(src, "You will now hear music in the game lobby.") - if(isnewplayer(mob)) - playtitlemusic() + set desc = "Hear Music In Lobby" + usr.client.prefs.toggles ^= SOUND_LOBBY + usr.client.prefs.save_preferences() + if(usr.client.prefs.toggles & SOUND_LOBBY) + to_chat(usr, "You will now hear music in the game lobby.") + if(isnewplayer(usr)) + usr.client.playtitlemusic() else - to_chat(src, "You will no longer hear music in the game lobby.") - mob.stop_sound_channel(CHANNEL_LOBBYMUSIC) - SSblackbox.add_details("preferences_verb","Toggle Lobby Music|[prefs.toggles & SOUND_LOBBY]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + to_chat(usr, "You will no longer hear music in the game lobby.") + usr.stop_sound_channel(CHANNEL_LOBBYMUSIC) + SSblackbox.add_details("preferences_verb","Toggle Lobby Music|[usr.client.prefs.toggles & SOUND_LOBBY]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/datum/menu/Settings/Sound/toggletitlemusic/Get_checked(client/C) + return C.prefs.toggles & SOUND_LOBBY + -/client/verb/togglemidis() +TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, togglemidis)() set name = "Hear/Silence Midis" set category = "Preferences" - set desc = "Toggles hearing sounds uploaded by admins" - prefs.toggles ^= SOUND_MIDI - prefs.save_preferences() - if(prefs.toggles & SOUND_MIDI) - to_chat(src, "You will now hear any sounds uploaded by admins.") + set desc = "Hear Admin Triggered Sounds (Midis)" + usr.client.prefs.toggles ^= SOUND_MIDI + usr.client.prefs.save_preferences() + if(usr.client.prefs.toggles & SOUND_MIDI) + to_chat(usr, "You will now hear any sounds uploaded by admins.") else - to_chat(src, "You will no longer hear sounds uploaded by admins") - mob.stop_sound_channel(CHANNEL_ADMIN) - SSblackbox.add_details("preferences_verb","Toggle Hearing Midis|[prefs.toggles & SOUND_MIDI]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + to_chat(usr, "You will no longer hear sounds uploaded by admins") + usr.stop_sound_channel(CHANNEL_ADMIN) + SSblackbox.add_details("preferences_verb","Toggle Hearing Midis|[usr.client.prefs.toggles & SOUND_MIDI]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/datum/menu/Settings/Sound/togglemidis/Get_checked(client/C) + return C.prefs.toggles & SOUND_MIDI -/client/verb/stop_client_sounds() - set name = "Stop Sounds" + +TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggle_instruments)() + set name = "Hear/Silence Instruments" set category = "Preferences" - set desc = "Kills all currently playing sounds, use if admin taste in midis a shite" - src << sound(null) - SSblackbox.add_details("preferences_verb","Stop Self Sounds") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + set desc = "Hear In-game Instruments" + usr.client.prefs.toggles ^= SOUND_INSTRUMENTS + usr.client.prefs.save_preferences() + if(usr.client.prefs.toggles & SOUND_INSTRUMENTS) + to_chat(usr, "You will now hear people playing musical instruments.") + else + to_chat(usr, "You will no longer hear musical instruments.") + SSblackbox.add_details("preferences_verb","Toggle Instruments|[usr.client.prefs.toggles & SOUND_INSTRUMENTS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/datum/menu/Settings/Sound/toggle_instruments/Get_checked(client/C) + return C.prefs.toggles & SOUND_INSTRUMENTS + -/client/verb/listen_ooc() - set name = "Show/Hide OOC" - set category = "Preferences" - set desc = "Toggles seeing OutOfCharacter chat" - prefs.chat_toggles ^= CHAT_OOC - prefs.save_preferences() - to_chat(src, "You will [(prefs.chat_toggles & CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel.") - SSblackbox.add_details("preferences_verb","Toggle Seeing OOC|[prefs.chat_toggles & CHAT_OOC]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/verb/Toggle_Soundscape() //All new ambience should be added here so it works with this verb until someone better at things comes up with a fix that isn't awful +TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, Toggle_Soundscape)() set name = "Hear/Silence Ambience" set category = "Preferences" - set desc = "Toggles hearing ambient sound effects" - prefs.toggles ^= SOUND_AMBIENCE - prefs.save_preferences() - if(prefs.toggles & SOUND_AMBIENCE) - to_chat(src, "You will now hear ambient sounds.") + set desc = "Hear Ambient Sound Effects" + usr.client.prefs.toggles ^= SOUND_AMBIENCE + usr.client.prefs.save_preferences() + if(usr.client.prefs.toggles & SOUND_AMBIENCE) + to_chat(usr, "You will now hear ambient sounds.") else - to_chat(src, "You will no longer hear ambient sounds.") - src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1) - src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2) - SSblackbox.add_details("preferences_verb","Toggle Ambience|[prefs.toggles & SOUND_AMBIENCE]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + to_chat(usr, "You will no longer hear ambient sounds.") + usr << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1) + usr << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2) + SSblackbox.add_details("preferences_verb","Toggle Ambience|[usr.client.prefs.toggles & SOUND_AMBIENCE]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/datum/menu/Settings/Sound/Toggle_Soundscape/Get_checked(client/C) + return C.prefs.toggles & SOUND_AMBIENCE -// This needs a toggle because you people are awful and spammed terrible music -/client/verb/toggle_instruments() - set name = "Hear/Silence Instruments" + +TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggle_ship_ambience)() + set name = "Hear/Silence Ship Ambience" set category = "Preferences" - set desc = "Toggles hearing musical instruments like the violin and piano" - prefs.toggles ^= SOUND_INSTRUMENTS - prefs.save_preferences() - if(prefs.toggles & SOUND_INSTRUMENTS) - to_chat(src, "You will now hear people playing musical instruments.") + set desc = "Hear Ship Ambience Roar" + usr.client.prefs.toggles ^= SOUND_SHIP_AMBIENCE + usr.client.prefs.save_preferences() + if(usr.client.prefs.toggles & SOUND_SHIP_AMBIENCE) + to_chat(usr, "You will now hear ship ambience.") else - to_chat(src, "You will no longer hear musical instruments.") - SSblackbox.add_details("preferences_verb","Toggle Instruments|[prefs.toggles & SOUND_INSTRUMENTS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + to_chat(usr, "You will no longer hear ship ambience.") + usr << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2) + usr.client.ambience_playing = 0 + SSblackbox.add_details("preferences_verb", "Toggle Ship Ambience|[usr.client.prefs.toggles & SOUND_SHIP_AMBIENCE]") //If you are copy-pasting this, I bet you read this comment expecting to see the same thing :^) +/datum/menu/Settings/Sound/toggle_ship_ambience/Get_checked(client/C) + return C.prefs.toggles & SOUND_SHIP_AMBIENCE -//Lots of people get headaches from the normal ship ambience, this is to prevent that -/client/verb/toggle_ship_ambience() - set name = "Hear/Silence Ship Ambience" + +TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggle_announcement_sound)() + set name = "Hear/Silence Announcements" set category = "Preferences" - set desc = "Toggles hearing generalized ship ambience, no matter your area." - prefs.toggles ^= SOUND_SHIP_AMBIENCE - prefs.save_preferences() - if(prefs.toggles & SOUND_SHIP_AMBIENCE) - to_chat(src, "You will now hear ship ambience.") + set desc = "Hear Announcement Sound" + usr.client.prefs.toggles ^= SOUND_ANNOUNCEMENTS + to_chat(usr, "You will now [(usr.client.prefs.toggles & SOUND_ANNOUNCEMENTS) ? "hear announcement sounds" : "no longer hear announcements"].") + usr.client.prefs.save_preferences() + SSblackbox.add_details("preferences_verb","Toggle Announcement Sound|[usr.client.prefs.toggles & SOUND_ANNOUNCEMENTS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/datum/menu/Settings/Sound/toggle_announcement_sound/Get_checked(client/C) + return C.prefs.toggles & SOUND_ANNOUNCEMENTS + + +TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggleprayersounds)() + set name = "Hear/Silence Prayer Sounds" + set category = "Preferences" + set desc = "Hear Prayer Sounds" + usr.client.prefs.toggles ^= SOUND_PRAYERS + usr.client.prefs.save_preferences() + if(usr.client.prefs.toggles & SOUND_PRAYERS) + to_chat(usr, "You will now hear prayer sounds.") else - to_chat(src, "You will no longer hear ship ambience.") - src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2) - src.ambience_playing = 0 - SSblackbox.add_details("preferences_verb", "Toggle Ship Ambience|[prefs.toggles & SOUND_SHIP_AMBIENCE]") //If you are copy-pasting this, I bet you read this comment expecting to see the same thing :^) + to_chat(usr, "You will no longer prayer sounds.") + SSblackbox.add_details("admin_toggle", "Toggle Prayer Sounds|[usr.client.prefs.toggles & SOUND_PRAYERS]") +/datum/menu/Settings/Sound/toggleprayersounds/Get_checked(client/C) + return C.prefs.toggles & SOUND_PRAYERS + + +/datum/menu/Settings/Sound/verb/stop_client_sounds() + set name = "Stop Sounds" + set category = "Preferences" + set desc = "Stop Current Sounds" + usr << sound(null) + SSblackbox.add_details("preferences_verb","Stop Self Sounds") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + +TOGGLE_CHECKBOX(/datum/menu/Settings, listen_ooc)() + set name = "Show/Hide OOC" + set category = "Preferences" + set desc = "Show OOC Chat" + usr.client.prefs.chat_toggles ^= CHAT_OOC + usr.client.prefs.save_preferences() + to_chat(usr, "You will [(usr.client.prefs.chat_toggles & CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel.") + SSblackbox.add_details("preferences_verb","Toggle Seeing OOC|[usr.client.prefs.chat_toggles & CHAT_OOC]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/datum/menu/Settings/listen_ooc/Get_checked(client/C) + return C.prefs.chat_toggles & CHAT_OOC + GLOBAL_LIST_INIT(ghost_forms, list("ghost","ghostking","ghostian2","skeleghost","ghost_red","ghost_black", \ "ghost_blue","ghost_yellow","ghost_green","ghost_pink", \ @@ -246,13 +333,6 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.save_preferences() SSblackbox.add_details("preferences_verb","Toggle Intent Selection|[prefs.toggles & INTENT_STYLE]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/verb/setup_character() - set name = "Game Preferences" - set category = "Preferences" - set desc = "Allows you to access the Setup Character screen. Changes to your character won't take effect until next round, but other changes will." - prefs.current_tab = 1 - prefs.ShowChoices(usr) - /client/verb/toggle_ghost_hud_pref() set name = "Toggle Ghost HUD" set category = "Preferences" @@ -278,15 +358,6 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS to_chat(src, "You will no longer examine things you click on.") SSblackbox.add_details("preferences_verb","Toggle Ghost Inquisitiveness|[prefs.inquisitive_ghost]") -/client/verb/toggle_announcement_sound() - set name = "Hear/Silence Announcements" - set category = "Preferences" - set desc = ".Toggles hearing Central Command, Captain, VOX, and other announcement sounds" - prefs.toggles ^= SOUND_ANNOUNCEMENTS - to_chat(src, "You will now [(prefs.toggles & SOUND_ANNOUNCEMENTS) ? "hear announcement sounds" : "no longer hear announcements"].") - prefs.save_preferences() - SSblackbox.add_details("preferences_verb","Toggle Announcement Sound|[prefs.toggles & SOUND_ANNOUNCEMENTS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - //Admin Preferences /client/proc/toggleadminhelpsound() set name = "Hear/Silence Adminhelps" @@ -338,14 +409,3 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS to_chat(src, "You will [(prefs.chat_toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat.") SSblackbox.add_details("admin_toggle","Toggle Prayer Visibility|[prefs.chat_toggles & CHAT_PRAYER]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/verb/toggleprayersounds() - set name = "Hear/Silence Prayer Sounds" - set category = "Preferences" - set desc = "Toggles hearing pray sounds." - prefs.toggles ^= SOUND_PRAYERS - prefs.save_preferences() - if(prefs.toggles & SOUND_PRAYERS) - to_chat(src, "You will now hear prayer sounds.") - else - to_chat(src, "You will no longer prayer sounds.") - SSblackbox.add_details("admin_toggle", "Toggle Prayer Sounds|[prefs.toggles & SOUND_PRAYERS]") diff --git a/code/world.dm b/code/world.dm index 29c40a5742..064d66f490 100644 --- a/code/world.dm +++ b/code/world.dm @@ -332,5 +332,9 @@ status = s + /world/proc/has_round_started() - return SSticker.HasRoundStarted() \ No newline at end of file + return SSticker.HasRoundStarted() +/world/proc/load_menu() + for (var/typepath in (typesof(/datum/menu)-/datum/menu)) + new typepath() diff --git a/code/world.dm.rej b/code/world.dm.rej new file mode 100644 index 0000000000..3e328a91c8 --- /dev/null +++ b/code/world.dm.rej @@ -0,0 +1,9 @@ +diff a/code/world.dm b/code/world.dm (rejected hunks) +@@ -346,7 +346,3 @@ + + /world/proc/has_round_started() + return SSticker.HasRoundStarted() +- +-/world/proc/load_menu() +- for (var/typepath in (typesof(/datum/menu)-/datum/menu)) +- new typepath() diff --git a/interface/menu.dm b/interface/menu.dm new file mode 100644 index 0000000000..4bebd5b202 --- /dev/null +++ b/interface/menu.dm @@ -0,0 +1,203 @@ +/* +/datum/menu/Example/verb/Example() + set name = "" //if this starts with @ the verb is not created and name becomes the command to invoke. + set desc = "" //desc is the text given to this entry in the menu + //You can not use src in these verbs. It will be the menu at compile time, but the client at runtime. +*/ + +GLOBAL_LIST_EMPTY(menulist) + +/world/proc/load_menu() + for (var/typepath in subtypesof(/datum/menu)) + new typepath() + +/datum/menu + var/name + var/list/children + var/datum/menu/myparent + var/list/verblist + var/checkbox = CHECKBOX_NONE //checkbox type. + var/default //default checked type. + //Set to true to append our children to our parent, + //Rather then add us as a node (used for having more then one checkgroups in the same menu) + var/abstract = FALSE + +/datum/menu/New() + var/ourentry = GLOB.menulist[type] + children = list() + verblist = list() + if (ourentry) + if (islist(ourentry)) //some of our childern already loaded + Add_children(ourentry) + else + stack_trace("Menu item double load: [type]") + qdel(src) + return + + GLOB.menulist[type] = src + + Load_verbs(type, typesof("[type]/verb")) + + var/datum/menu/parent = GLOB.menulist[parent_type] + if (!parent) + GLOB.menulist[parent_type] = list(src) + else if (islist(parent)) + parent += src + else + parent.Add_children(list(src)) + +/datum/menu/proc/Set_parent(datum/menu/parent) + myparent = parent + if (abstract) + myparent.Add_children(children) + var/list/verblistoftypes = list() + for(var/thing in verblist) + LAZYADD(verblistoftypes[verblist[thing]], thing) + + for(var/verbparenttype in verblistoftypes) + myparent.Load_verbs(verbparenttype, verblistoftypes[verbparenttype]) + +/datum/menu/proc/Add_children(list/kids) + if (abstract && myparent) + myparent.Add_children(kids) + return + + for(var/thing in kids) + var/datum/menu/menuitem = thing + menuitem.Set_parent(src) + if (!menuitem.abstract) + children += menuitem + +/datum/menu/proc/Load_verbs(verb_parent_type, list/verbs) + if (abstract && myparent) + myparent.Load_verbs(verb_parent_type, verbs) + return + + for (var/verbpath in verbs) + verblist[verbpath] = verb_parent_type + +/datum/menu/proc/Generate_list(client/C) + . = list() + if (length(children)) + for (var/thing in children) + var/datum/menu/child = thing + var/list/childlist = child.Generate_list(C) + if (childlist) + var/childname = "[child]" + if (childname == "[child.type]") + var/list/tree = splittext(childname, "/") + childname = tree[tree.len] + .[child.type] = "parent=[url_encode(type)];name=[url_encode(childname)]" + . += childlist + + + + for (var/thing in verblist) + var/atom/verb/verbpath = thing + if (!verbpath) + stack_trace("Bad VERB in [type] verblist: [english_list(verblist)]") + var/list/entry = list() + entry["parent"] = "[type]" + entry["name"] = verbpath.desc + if (copytext(verbpath.name,1,2) == "@") + entry["command"] = copytext(verbpath.name,2) + else + entry["command"] = replacetext(verbpath.name, " ", "-") + var/datum/menu/verb_true_parent = GLOB.menulist[verblist[verbpath]] + var/true_checkbox = verb_true_parent.checkbox + if (true_checkbox != CHECKBOX_NONE) + var/checkedverb = verb_true_parent.Get_checked(C) + if (true_checkbox == CHECKBOX_GROUP) + if (verbpath == checkedverb) + entry["is-checked"] = TRUE + else + entry["is-checked"] = FALSE + else if (true_checkbox == CHECKBOX_TOGGLE) + entry["is-checked"] = checkedverb + + entry["command"] = ".updatemenuchecked \"[verb_true_parent.type]\" \"[verbpath]\"\n[entry["command"]]" + entry["can-check"] = TRUE + entry["group"] = "[verb_true_parent.type]" + .[verbpath] = list2params(entry) + +/datum/menu/proc/Get_checked(client/C) + return C.prefs.menuoptions[type] || default || FALSE + +/datum/menu/proc/Load_checked(client/C) //Loads the checked menu item into a new client. Used by icon menus to invoke the checked item. + return + +/datum/menu/proc/Set_checked(client/C, verbpath) + if (checkbox == CHECKBOX_GROUP) + C.prefs.menuoptions[type] = verbpath + C.prefs.save_preferences() + else if (checkbox == CHECKBOX_TOGGLE) + var/checked = Get_checked(C) + C.prefs.menuoptions[type] = !checked + C.prefs.save_preferences() + winset(C, "[verbpath]", "is-checked = [!checked]") + +/client/verb/updatemenuchecked(menutype as text, verbpath as text) + set name = ".updatemenuchecked" + menutype = text2path(menutype) + verbpath = text2path(verbpath) + if (!menutype || !verbpath) + return + var/datum/menu/M = GLOB.menulist[menutype] + if (!M) + return + if (!(verbpath in typesof("[menutype]/verb"))) + return + M.Set_checked(src, verbpath) + + +/datum/menu/Icon/Load_checked(client/C) //So we can be lazy, we invoke the "checked" menu item on menu load. + var/atom/verb/verbpath = Get_checked(C) + if (!verbpath || !(verbpath in typesof("[type]/verb"))) + return + if (copytext(verbpath.name,1,2) == "@") + winset(C, null, "command = [copytext(verbpath.name,2)]") + else + winset(C, null, "command = [replacetext(verbpath.name, " ", "-")]") + +/datum/menu/Icon/Size + checkbox = CHECKBOX_GROUP + default = /datum/menu/Icon/Size/verb/iconstretchtofit + +/datum/menu/Icon/Size/verb/iconstretchtofit() + set name = "@.winset \"mapwindow.map.icon-size=0\"" + set desc = "&Auto (stretch-to-fit)" + +/datum/menu/Icon/Size/verb/icon96() + set name = "@.winset \"mapwindow.map.icon-size=96\"" + set desc = "&96x96 (3x)" + +/datum/menu/Icon/Size/verb/icon64() + set name = "@.winset \"mapwindow.map.icon-size=64\"" + set desc = "&64x64 (2x)" + +/datum/menu/Icon/Size/verb/icon48() + set name = "@.winset \"mapwindow.map.icon-size=48\"" + set desc = "&48x48 (1.5x)" + +/datum/menu/Icon/Size/verb/icon32() + set name = "@.winset \"mapwindow.map.icon-size=32\"" + set desc = "&32x32 (1x)" + + +/datum/menu/Icon/Scaling + checkbox = CHECKBOX_GROUP + name = "Scaling Mode" + default = /datum/menu/Icon/Scaling/verb/NN + +/datum/menu/Icon/Scaling/verb/NN() + set name = "@.winset \"mapwindow.map.zoom-mode=distort\"" + set desc = "Nearest Neighbor" + +/datum/menu/Icon/Scaling/verb/PS() + set name = "@.winset \"mapwindow.map.zoom-mode=normal\"" + set desc = "Point Sampling" + +/datum/menu/Icon/Scaling/verb/BL() + set name = "@.winset \"mapwindow.map.zoom-mode=blur\"" + set desc = "Bilinear" + diff --git a/interface/skin.dmf b/interface/skin.dmf index 788ce65b71..65407cef0e 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -1062,60 +1062,6 @@ menu "menu" group = "" is-disabled = false saved-params = "is-checked" - elem - name = "&Icons" - command = "" - category = "" - is-checked = false - can-check = false - group = "" - is-disabled = false - saved-params = "is-checked" - elem "auto" - name = "&Auto (stretch-to-fit)" - command = ".winset \"mapwindow.map.icon-size=0\"" - category = "&Icons" - is-checked = true - can-check = true - group = "size" - is-disabled = false - saved-params = "is-checked" - elem "icon96" - name = "&96x96 (3x)" - command = ".winset \"mapwindow.map.icon-size=96\"" - category = "&Icons" - is-checked = false - can-check = true - group = "size" - is-disabled = false - saved-params = "is-checked" - elem "icon64" - name = "&64x64 (2x)" - command = ".winset \"mapwindow.map.icon-size=64\"" - category = "&Icons" - is-checked = false - can-check = true - group = "size" - is-disabled = false - saved-params = "is-checked" - elem "icon48" - name = "&48x48 (1.5x)" - command = ".winset \"mapwindow.map.icon-size=48\"" - category = "&Icons" - is-checked = false - can-check = true - group = "size" - is-disabled = false - saved-params = "is-checked" - elem "icon32" - name = "&32x32" - command = ".winset \"mapwindow.map.icon-size=32\"" - category = "&Icons" - is-checked = false - can-check = true - group = "size" - is-disabled = false - saved-params = "is-checked" elem name = "&Help" command = "" @@ -1383,6 +1329,7 @@ window "mapwindow" on-show = "" on-hide = "" style = "" + zoom-mode = "distort" window "infowindow" elem "infowindow" diff --git a/tgstation.dme b/tgstation.dme index e10d48ca49..92fcec7541 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -47,6 +47,7 @@ #include "code\__DEFINES\maps.dm" #include "code\__DEFINES\math.dm" #include "code\__DEFINES\MC.dm" +#include "code\__DEFINES\menu.dm" #include "code\__DEFINES\misc.dm" #include "code\__DEFINES\mobs.dm" #include "code\__DEFINES\monkeys.dm" @@ -1001,6 +1002,7 @@ #include "code\modules\admin\admin_investigate.dm" #include "code\modules\admin\admin_ranks.dm" #include "code\modules\admin\admin_verbs.dm" +#include "code\modules\admin\adminmenu.dm" #include "code\modules\admin\banjob.dm" #include "code\modules\admin\create_mob.dm" #include "code\modules\admin\create_object.dm" @@ -2158,6 +2160,7 @@ #include "code\modules\zombie\items.dm" #include "code\modules\zombie\organs.dm" #include "interface\interface.dm" +#include "interface\menu.dm" #include "interface\stylesheet.dm" #include "interface\skin.dmf" // END_INCLUDE From 6d2b02dabd5d07d7afa9d88ca8e97ce400bd1f4e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 7 May 2017 17:14:17 -0500 Subject: [PATCH 143/352] Allows Mediborg organ storage to hold inorganic bodyparts --- code/modules/surgery/tools.dm | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 90cb344cf5..efd1ec64f2 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -111,17 +111,8 @@ if(contents.len) to_chat(user, "[src] already has something inside it.") return - if(isorgan(I)) - var/obj/item/organ/O = I - if(O.status != ORGAN_ORGANIC) - to_chat(user, "[src] can only hold organic body parts!") - return - else if(isbodypart(I)) - var/obj/item/bodypart/BP = I - if(BP.status != BODYPART_ORGANIC) - to_chat(user, "[src] can only hold organic body parts!") - return - else + if(!isorgan(I) && !isbodypart(I)) + to_chat(user, "[src] can only hold body parts!") return user.visible_message("[user] puts [I] into [src].", "You put [I] inside [src].") @@ -150,4 +141,4 @@ desc = "A container for holding body parts." else to_chat(user, "[src] is empty.") - return \ No newline at end of file + return From e3b3921bf2060228294b040013ad21aadeb6ed73 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 7 May 2017 17:15:22 -0500 Subject: [PATCH 144/352] Fixes clockwork obelisk logic --- .../clock_cult/clock_effects/spatial_gateway.dm | 15 ++++++++++++--- .../clock_structures/clockwork_obelisk.dm | 8 +++++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm b/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm index 1c49d36693..5c1d3fb5fb 100644 --- a/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm +++ b/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm @@ -180,17 +180,26 @@ return procure_gateway(invoker, time_duration, gateway_uses, two_way) var/istargetobelisk = istype(target, /obj/structure/destructible/clockwork/powered/clockwork_obelisk) var/issrcobelisk = istype(src, /obj/structure/destructible/clockwork/powered/clockwork_obelisk) - if(issrcobelisk && !anchored) - to_chat(invoker, "[src] is no longer secured!") - return FALSE + if(issrcobelisk) + if(!anchored) + to_chat(invoker, "[src] is no longer secured!") + return FALSE + var/obj/structure/destructible/clockwork/powered/clockwork_obelisk/CO = src //foolish as I am, how I set this proc up makes substypes unfeasible + if(CO.active) + to_chat(invoker, "[src] is now sustaining a gateway!") + return FALSE if(istargetobelisk) if(!target.anchored) to_chat(invoker, "That [target.name] is no longer secured!") return procure_gateway(invoker, time_duration, gateway_uses, two_way) var/obj/structure/destructible/clockwork/powered/clockwork_obelisk/CO = target + if(CO.active) + to_chat(invoker, "That [target.name] is sustaining a gateway, and cannot recieve another!") + return procure_gateway(invoker, time_duration, gateway_uses, two_way) var/efficiency = CO.get_efficiency_mod() gateway_uses = round(gateway_uses * (2 * efficiency), 1) time_duration = round(time_duration * (2 * efficiency), 1) + CO.active = TRUE //you'd be active in a second but you should update immediately invoker.visible_message("The air in front of [invoker] ripples before suddenly tearing open!", \ "With a word, you rip open a [two_way ? "two-way":"one-way"] rift to [input_target_key]. It will last for [time_duration / 10] seconds and has [gateway_uses] use[gateway_uses > 1 ? "s" : ""].") var/obj/effect/clockwork/spatial_gateway/S1 = new(issrcobelisk ? get_turf(src) : get_step(get_turf(invoker), invoker.dir)) diff --git a/code/game/gamemodes/clock_cult/clock_structures/clockwork_obelisk.dm b/code/game/gamemodes/clock_cult/clock_structures/clockwork_obelisk.dm index 2bebb4c9a5..580f5fbed5 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/clockwork_obelisk.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/clockwork_obelisk.dm @@ -58,7 +58,7 @@ var/input = stripped_input(usr, "Please choose a message to send over the Hierophant Network.", "Hierophant Broadcast", "") if(!is_servant_of_ratvar(user) || !input || !user.canUseTopic(src, !issilicon(user))) return - if(anchored) + if(!anchored) to_chat(user, "[src] is no longer secured!") return FALSE if(active) @@ -84,7 +84,8 @@ return if(procure_gateway(user, round(100 * get_efficiency_mod(), 1), round(5 * get_efficiency_mod(), 1), 1)) process() - if(!active) + if(!active) //we won't be active if nobody has sent a gateway to us + active = TRUE clockwork_say(user, text2ratvar("Spatial Gateway, activate!")) return return_power(gateway_cost) //if we didn't return above, ie, successfully create a gateway, we give the power back @@ -92,7 +93,8 @@ /obj/structure/destructible/clockwork/powered/clockwork_obelisk/process() if(!anchored) return - if(locate(/obj/effect/clockwork/spatial_gateway) in loc) + var/obj/effect/clockwork/spatial_gateway/SG = locate(/obj/effect/clockwork/spatial_gateway) + if(SG && SG.timerid) //it's a valid gateway, we're active icon_state = active_icon density = 0 active = TRUE From db468a1dd68a066eceac411706fe354cee3b2fbe Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 7 May 2017 18:00:26 -0500 Subject: [PATCH 145/352] Adds several weapons and cost adjustments to Gangtool --- code/game/gamemodes/gang/gang_items.dm | 73 +++++++++++++++++--------- 1 file changed, 47 insertions(+), 26 deletions(-) diff --git a/code/game/gamemodes/gang/gang_items.dm b/code/game/gamemodes/gang/gang_items.dm index a8732c1046..c0bb1824b2 100644 --- a/code/game/gamemodes/gang/gang_items.dm +++ b/code/game/gamemodes/gang/gang_items.dm @@ -108,10 +108,16 @@ /datum/gang_item/weapon/ammo/get_cost_display(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) return " ↳" + ..() //this is pretty hacky but it looks nice on the popup +/datum/gang_item/weapon/shuriken + name = "Shuriken" + id = "shuriken" + cost = 3 + item_path = /obj/item/weapon/throwing_star + /datum/gang_item/weapon/switchblade name = "Switchblade" id = "switchblade" - cost = 10 + cost = 5 item_path = /obj/item/weapon/switchblade /datum/gang_item/weapon/pistol @@ -125,6 +131,18 @@ id = "pistol_ammo" cost = 10 item_path = /obj/item/ammo_box/magazine/m10mm + +/datum/gang_item/weapon/sniper + name = ".50cal Sniper Rifle" + id = "sniper" + cost = 40 + item_path = /obj/item/weapon/gun/ballistic/automatic/sniper_rifle + +/datum/gang_item/weapon/ammo/sniper_ammo + name = "Standard .50cal Sniper Rounds" + id = "sniper_ammo" + cost = 15 + item_path = /obj/item/ammo_box/magazine/sniper_rounds /datum/gang_item/weapon/uzi name = "Uzi SMG" @@ -138,30 +156,8 @@ id = "uzi_ammo" cost = 40 item_path = /obj/item/ammo_box/magazine/uzim9mm - -//SLEEPING CARP - -/datum/gang_item/weapon/bostaff - name = "Bo Staff" - id = "bostaff" - cost = 10 - item_path = /obj/item/weapon/twohanded/bostaff - -/datum/gang_item/weapon/sleeping_carp_scroll - name = "Sleeping Carp Scroll (one-use)" - id = "sleeping_carp_scroll" - cost = 30 - item_path = /obj/item/weapon/sleeping_carp_scroll - spawn_msg = "Anyone who reads the sleeping carp scroll will learn secrets of the sleeping carp martial arts style." - -/datum/gang_item/weapon/wrestlingbelt - name = "Wrestling Belt" - id = "wrastling_belt" - cost = 20 - item_path = /obj/item/weapon/storage/belt/champion/wrestling - spawn_msg = "Anyone wearing the wresting belt will know how to be effective with wrestling." - - + + /////////////////// //EQUIPMENT /////////////////// @@ -175,6 +171,12 @@ id = "spraycan" cost = 5 item_path = /obj/item/toy/crayon/spraycan/gang + +/datum/gang_item/equipment/sharpener + name = "Sharpener" + id = "whetstone" + cost = 3 + item_path = /obj/item/weapon/sharpener /datum/gang_item/equipment/necklace name = "Gold Necklace" @@ -182,12 +184,31 @@ cost = 1 item_path = /obj/item/clothing/neck/necklace/dope + +/datum/gang_item/equipment/emp + name = "EMP Grenade" + id = "EMP" + cost = 5 + item_path = /obj/item/weapon/grenade/empgrenade + /datum/gang_item/equipment/c4 name = "C4 Explosive" id = "c4" - cost = 10 + cost = 7 item_path = /obj/item/weapon/grenade/plastic/c4 +/datum/gang_item/equipment/frag + name = "Fragmentation Grenade" + id = "frag nade" + cost = 10 + item_path = /obj/item/weapon/grenade/syndieminibomb/concussion/frag + +/datum/gang_item/equipment/stimpack + name = "Black Market Stimulants" + id = "stimpack" + cost = 15 + item_path = /obj/item/weapon/reagent_containers/syringe/stimulants + /datum/gang_item/equipment/implant_breaker name = "Implant Breaker" id = "implant_breaker" From 884338d048e448172373b5aeff5678aba62b28e9 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 7 May 2017 18:06:44 -0500 Subject: [PATCH 146/352] Fixes being able to stand on chasms --- code/modules/clothing/spacesuits/flightsuit.dm | 3 +++ code/modules/mob/living/carbon/human/emote.dm | 3 +++ 2 files changed, 6 insertions(+) diff --git a/code/modules/clothing/spacesuits/flightsuit.dm b/code/modules/clothing/spacesuits/flightsuit.dm index 479ad77742..b1c0bb325d 100644 --- a/code/modules/clothing/spacesuits/flightsuit.dm +++ b/code/modules/clothing/spacesuits/flightsuit.dm @@ -663,6 +663,9 @@ flight = FALSE if(suit.shoes) suit.shoes.toggle(FALSE) + if(isturf(wearer.loc)) + var/turf/T = wearer.loc + T.Entered(src) else if(override_safe) disable_flight(TRUE) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index de4eecabff..b778279f42 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -171,5 +171,8 @@ dna.species.mutant_bodyparts -= "wingsopen" dna.species.mutant_bodyparts |= "wings" update_body() + if(isturf(loc)) + var/turf/T = loc + T.Entered(src) //Ayy lmao From 61a7897962877c0157b98a381b5ee19a3545b200 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 7 May 2017 18:23:05 -0500 Subject: [PATCH 147/352] Plastic sheet production - Chemistry recipe --- .../reagents/chemistry/reagents/other_reagents.dm | 7 +++++++ code/modules/reagents/chemistry/recipes/others.dm | 11 +++++++++++ 2 files changed, 18 insertions(+) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index dc8457905d..ac259e58c2 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1568,6 +1568,13 @@ M.update_transform() ..() +/datum/reagent/plastic_polymers + name = "plastic polymers" + id = "plastic_polymers" + description = "the petroleum based components of plastic." + color = "#f7eded" + taste_description = "plastic" + /datum/reagent/glitter name = "generic glitter" id = "glitter" diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 19bb28666d..0bc843a605 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -624,3 +624,14 @@ id = "laughter" results = list("laughter" = 10) // Fuck it. I'm not touching this one. required_reagents = list("sugar" = 1, "banana" = 1) + +/datum/chemical_reaction/plastic_polymers + name = "plastic polymers" + id = "plastic_polymers" + required_reagents = list("oil" = 5, "sodiumchloride" = 2, "ash" = 3) + required_temp = 374 //lazily consistent with soap & other crafted objects generically created with heat. + +/datum/chemical_reaction/plastic_polymers/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i in 1 to 10) + new /obj/item/stack/sheet/plastic(location) From 2efe90055facc2dbdf154f6596c9fcf11500d95f Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 7 May 2017 19:41:33 -0400 Subject: [PATCH 148/352] Revert "[MIRROR] Fixes say verbs not working" --- code/game/gamemodes/clock_cult/clock_mobs.dm | 1 - code/game/machinery/hologram.dm | 2 +- code/game/machinery/hologram.dm.rej | 44 ------------------- code/game/say.dm | 6 +-- code/modules/mob/dead/observer/say.dm | 2 +- .../mob/living/silicon/ai/freelook/eye.dm | 2 +- .../friendly/drone/extra_drone_types.dm | 1 - .../hostile/megafauna/colossus.dm | 2 +- .../mob/living/simple_animal/slime/say.dm | 2 +- 9 files changed, 8 insertions(+), 54 deletions(-) delete mode 100644 code/game/machinery/hologram.dm.rej diff --git a/code/game/gamemodes/clock_cult/clock_mobs.dm b/code/game/gamemodes/clock_cult/clock_mobs.dm index a86c00e4f6..a5e7dee4cb 100644 --- a/code/game/gamemodes/clock_cult/clock_mobs.dm +++ b/code/game/gamemodes/clock_cult/clock_mobs.dm @@ -13,7 +13,6 @@ speak_emote = list("clanks", "clinks", "clunks", "clangs") verb_ask = "requests" verb_exclaim = "proclaims" - verb_whisper = "imparts" verb_yell = "harangues" initial_languages = list(/datum/language/common, /datum/language/ratvar) only_speaks_language = /datum/language/ratvar diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 30ff4c23a0..bc73c41f08 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -319,7 +319,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ for(var/I in holo_calls) var/datum/holocall/HC = I if(HC.connected_holopad == src && speaker != HC.hologram) - HC.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) + HC.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans) if(outgoing_call && speaker == outgoing_call.user) outgoing_call.hologram.say(raw_message) diff --git a/code/game/machinery/hologram.dm.rej b/code/game/machinery/hologram.dm.rej deleted file mode 100644 index c1334f9646..0000000000 --- a/code/game/machinery/hologram.dm.rej +++ /dev/null @@ -1,44 +0,0 @@ -diff a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm (rejected hunks) -@@ -152,7 +152,7 @@ GLOBAL_LIST_EMPTY(holopads) - var/datum/holocall/HC = I - if(HC.connected_holopad == src) - dat += "Disconnect call from [HC.user].
" -- -+ - - var/datum/browser/popup = new(user, "holopad", name, 300, 130) - popup.set_content(dat) -@@ -192,7 +192,7 @@ GLOBAL_LIST_EMPTY(holopads) - if(A) - LAZYADD(callnames[A], I) - callnames -= get_area(src) -- -+ - var/result = input(usr, "Choose an area to call", "Holocall") as null|anything in callnames - if(QDELETED(usr) || !result || outgoing_call) - return -@@ -201,7 +201,7 @@ GLOBAL_LIST_EMPTY(holopads) - temp = "Dialing...
" - temp += "Main Menu" - new /datum/holocall(usr, src, callnames[result]) -- -+ - else if(href_list["connectcall"]) - var/datum/holocall/call_to_connect = locate(href_list["connectcall"]) - if(!QDELETED(call_to_connect)) -@@ -315,12 +315,12 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ - for(var/mob/living/silicon/ai/master in masters) - if(masters[master] && speaker != master) - master.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) -- -+ - for(var/I in holo_calls) - var/datum/holocall/HC = I - if(HC.connected_holopad == src && speaker != HC.hologram) -- HC.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans) -- -+ HC.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) -+ - if(outgoing_call && speaker == outgoing_call.user) - outgoing_call.hologram.say(raw_message) - diff --git a/code/game/say.dm b/code/game/say.dm index 4bcc289be1..deab83ad10 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -35,10 +35,10 @@ GLOBAL_LIST_INIT(freqtospan, list( return 1 /atom/movable/proc/send_speech(message, range = 7, obj/source = src, bubble_type, list/spans, datum/language/message_language = null, message_mode) - var/rendered = compose_message(src, message_language, message, , spans, message_mode) + var/rendered = compose_message(src, message_language, message, , spans) for(var/_AM in get_hearers_in_view(range, source)) var/atom/movable/AM = _AM - AM.Hear(rendered, src, message_language, message, , spans, message_mode) + AM.Hear(rendered, src, message_language, message, , spans) //To get robot span classes, stuff like that. /atom/movable/proc/get_spans() @@ -58,7 +58,7 @@ GLOBAL_LIST_INIT(freqtospan, list( var/endspanpart = "" //Message - var/messagepart = " [lang_treat(speaker, message_language, raw_message, spans, message_mode)]" + var/messagepart = " [lang_treat(speaker, message_language, raw_message, spans)]" var/languageicon = "" var/datum/language/D = get_language_instance(message_language) diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm index 0e7f5fcc1e..8675049cee 100644 --- a/code/modules/mob/dead/observer/say.dm +++ b/code/modules/mob/dead/observer/say.dm @@ -20,6 +20,6 @@ to_follow = V.source var/link = FOLLOW_LINK(src, to_follow) // Recompose the message, because it's scrambled by default - message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode) + message = compose_message(speaker, message_language, raw_message, radio_freq, spans) to_chat(src, "[link] [message]") diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index 0e45246a20..56c43211e4 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -106,4 +106,4 @@ /mob/camera/aiEye/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) if(relay_speech && speaker && ai && !radio_freq && speaker != ai && near_camera(speaker)) - ai.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) + ai.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm index 1507c43912..7cd6567ecb 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm @@ -108,7 +108,6 @@ speak_emote = list("clanks", "clinks", "clunks", "clangs") verb_ask = "requests" verb_exclaim = "proclaims" - verb_whisper = "imparts" verb_yell = "harangues" bubble_icon = "clock" initial_languages = list(/datum/language/common, /datum/language/ratvar) 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 ec76c2176f..d822a05886 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -401,7 +401,7 @@ Difficulty: Very Hard to_chat(user, observer_desc) to_chat(user, "It is activated by [activation_method].") -/obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode) +/obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans) ..() if(isliving(speaker)) ActivationReaction(speaker, ACTIVATE_SPEECH) diff --git a/code/modules/mob/living/simple_animal/slime/say.dm b/code/modules/mob/living/simple_animal/slime/say.dm index 60a25f90b7..ae7c14068f 100644 --- a/code/modules/mob/living/simple_animal/slime/say.dm +++ b/code/modules/mob/living/simple_animal/slime/say.dm @@ -1,4 +1,4 @@ -/mob/living/simple_animal/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode) +/mob/living/simple_animal/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans) if(speaker != src && !radio_freq && !stat) if (speaker in Friends) speech_buffer = list() From 47c0304a4b93c12c3bb6c4e8d07c4df167c9fa63 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 7 May 2017 19:40:58 -0500 Subject: [PATCH 149/352] Corrects get id query to ckey --- code/modules/admin/DB_ban/functions.dm | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/code/modules/admin/DB_ban/functions.dm b/code/modules/admin/DB_ban/functions.dm index 12517eb385..6f2ff03ff3 100644 --- a/code/modules/admin/DB_ban/functions.dm +++ b/code/modules/admin/DB_ban/functions.dm @@ -71,13 +71,10 @@ computerid = bancid ip = banip - var/datum/DBQuery/query_add_ban_get_id = SSdbcore.NewQuery("SELECT id FROM [format_table_name("player")] WHERE ckey = '[ckey]'") - if(!query_add_ban_get_id.warn_execute()) + var/datum/DBQuery/query_add_ban_get_ckey = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE ckey = '[ckey]'") + if(!query_add_ban_get_ckey.warn_execute()) return - var/validckey = 0 - if(query_add_ban_get_id.NextRow()) - validckey = 1 - if(!validckey) + if(!query_add_ban_get_ckey.NextRow()) if(!banned_mob || (banned_mob && !IsGuestKey(banned_mob.key))) message_admins("[key_name_admin(usr)] attempted to ban [ckey], but [ckey] has not been seen yet. Please only ban actual players.",1) return From bdbc1ecb5c38385164f8d4856f8bff97814fcbbd Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sun, 7 May 2017 19:05:19 -0700 Subject: [PATCH 150/352] no admins txt changing --- config/admins.txt.rej | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 config/admins.txt.rej diff --git a/config/admins.txt.rej b/config/admins.txt.rej deleted file mode 100644 index 76cdce088c..0000000000 --- a/config/admins.txt.rej +++ /dev/null @@ -1,9 +0,0 @@ -diff a/config/admins.txt b/config/admins.txt (rejected hunks) -@@ -127,4 +127,5 @@ Sweaterkittens = Game Master - Feemjmeem = Game Master - JStheguy = Game Master - excessiveuseofcobby = Game Master --Plizzard = Game Master -\ No newline at end of file -+Plizzard = Game Master -+octareenroon91 = Game Master From 3e593c4f7d96a2f1521f0a095fb5b52701684516 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 7 May 2017 21:05:51 -0500 Subject: [PATCH 151/352] Automatic changelog generation for PR #824 [ci skip] --- html/changelogs/AutoChangeLog-pr-824.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-824.yml diff --git a/html/changelogs/AutoChangeLog-pr-824.yml b/html/changelogs/AutoChangeLog-pr-824.yml new file mode 100644 index 0000000000..625034ab7c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-824.yml @@ -0,0 +1,5 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "Showers and sinks added to gulag and mining station for hygiene and fire safety." + - rscadd: "Watertanks added to mining station for convenient fire extinguisher refill." From c91aa2e66e2ba20f0f53785391c86d34ecb1ba03 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 7 May 2017 21:06:31 -0500 Subject: [PATCH 152/352] Automatic changelog generation for PR #841 [ci skip] --- html/changelogs/AutoChangeLog-pr-841.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-841.yml diff --git a/html/changelogs/AutoChangeLog-pr-841.yml b/html/changelogs/AutoChangeLog-pr-841.yml new file mode 100644 index 0000000000..3c27ac83c8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-841.yml @@ -0,0 +1,5 @@ +author: "Moonlighting Mac" +delete-after: True +changes: + - experiment: "Due to budget cuts and oil synthesis replacing expensive processes of digging up haunted primeval ashwalker burial grounds, Nanotransen has taught chemists how to make plastic from chemicals in the hopes that new plastic products can reduce expenditure on metal and glass." + - rscadd: "you can now make plastic sheets from chemistry out of heated up crude oil, ash & sodium chloride" From 18abfb70c9907ecf07827fe0fb2d2534a9b9d393 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sun, 7 May 2017 19:13:29 -0700 Subject: [PATCH 153/352] Update packs.dm --- code/modules/cargo/packs.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index b7c7a7e377..1a61048f48 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -182,14 +182,14 @@ /datum/supply_pack/emergency/syndicate name = "NULL_ENTRY" hidden = TRUE - cost = 14000 + cost = 20000 contains = list() crate_name = "emergency crate" crate_type = /obj/structure/closet/crate/internals dangerous = TRUE /datum/supply_pack/emergency/syndicate/fill(obj/structure/closet/crate/C) - var/crate_value = 50 + var/crate_value = 30 var/list/uplink_items = get_uplink_items(SSticker.mode) while(crate_value) var/category = pick(uplink_items) From 2f55a67b7a6da16d06550656dde40d63af7b579c Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sun, 7 May 2017 19:13:39 -0700 Subject: [PATCH 154/352] Delete packs.dm.rej --- code/modules/cargo/packs.dm.rej | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 code/modules/cargo/packs.dm.rej diff --git a/code/modules/cargo/packs.dm.rej b/code/modules/cargo/packs.dm.rej deleted file mode 100644 index 68a6ec8e60..0000000000 --- a/code/modules/cargo/packs.dm.rej +++ /dev/null @@ -1,18 +0,0 @@ -diff a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm (rejected hunks) -@@ -169,14 +169,14 @@ - /datum/supply_pack/emergency/syndicate - name = "NULL_ENTRY" - hidden = TRUE -- cost = 14000 -+ cost = 20000 - contains = list() - crate_name = "emergency crate" - crate_type = /obj/structure/closet/crate/internals - dangerous = TRUE - - /datum/supply_pack/emergency/syndicate/fill(obj/structure/closet/crate/C) -- var/crate_value = 50 -+ var/crate_value = 30 - var/list/uplink_items = get_uplink_items(ticker.mode) - while(crate_value) - var/category = pick(uplink_items) From 023ee52e5256af3fe64f37370817571e1044bcf7 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 7 May 2017 21:37:36 -0500 Subject: [PATCH 155/352] Automatic changelog generation for PR #676 [ci skip] --- html/changelogs/AutoChangeLog-pr-676.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-676.yml diff --git a/html/changelogs/AutoChangeLog-pr-676.yml b/html/changelogs/AutoChangeLog-pr-676.yml new file mode 100644 index 0000000000..73c6fac766 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-676.yml @@ -0,0 +1,5 @@ +author: "Joan" +delete-after: True +changes: + - rscadd: "Proselytizers can now charge from Sigils of Transmission at a rate of 1000W per second." + - rscadd: "Sigils of Transmission can be charged with brass at a rate of 250W per sheet." From 67742f6f8d37e3fca9200a7692d3d5464837cddf Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 7 May 2017 21:39:25 -0500 Subject: [PATCH 156/352] Automatic changelog generation for PR #829 [ci skip] --- html/changelogs/AutoChangeLog-pr-829.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-829.yml diff --git a/html/changelogs/AutoChangeLog-pr-829.yml b/html/changelogs/AutoChangeLog-pr-829.yml new file mode 100644 index 0000000000..619bc85876 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-829.yml @@ -0,0 +1,4 @@ +author: "Penguaro" +delete-after: True +changes: + - bugfix: "Anywhere there was lava below a tile on the station is now space." From 48d9e2e34969acc90591e9ce0af273ade344bd82 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sun, 7 May 2017 22:24:26 -0700 Subject: [PATCH 157/352] fixes rejects --- code/controllers/subsystem/persistence.dm | 3 + code/controllers/subsystem/persistence.dm.rej | 11 - code/game/objects/structures/displaycase.dm | 202 +++++++++--------- .../objects/structures/displaycase.dm.rej | 10 - 4 files changed, 104 insertions(+), 122 deletions(-) delete mode 100644 code/controllers/subsystem/persistence.dm.rej delete mode 100644 code/game/objects/structures/displaycase.dm.rej diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index 6b3e47054c..c42dfc38e2 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -114,6 +114,9 @@ SUBSYSTEM_DEF(persistence) var/saved_json trophy_sav >> saved_json + if(!saved_json) + return + var/decoded_json = json_decode(saved_json) if(!islist(decoded_json)) diff --git a/code/controllers/subsystem/persistence.dm.rej b/code/controllers/subsystem/persistence.dm.rej deleted file mode 100644 index 5c575b2068..0000000000 --- a/code/controllers/subsystem/persistence.dm.rej +++ /dev/null @@ -1,11 +0,0 @@ -diff a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm (rejected hunks) -@@ -114,6 +114,9 @@ SUBSYSTEM_DEF(persistence) - var/saved_json - trophy_sav >> saved_json - -+ if(!saved_json) -+ return -+ - var/decoded_json = json_decode(saved_json) - - if(!islist(decoded_json)) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 3817a16685..e25afcce81 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -16,25 +16,25 @@ var/obj/item/weapon/electronics/airlock/electronics var/start_showpiece_type = null //add type for items on display -/obj/structure/displaycase/Initialize() - . = ..() +/obj/structure/displaycase/Initialize() + . = ..() if(start_showpiece_type) showpiece = new start_showpiece_type (src) update_icon() /obj/structure/displaycase/Destroy() if(electronics) - QDEL_NULL(electronics) + QDEL_NULL(electronics) if(showpiece) - QDEL_NULL(showpiece) + QDEL_NULL(showpiece) return ..() /obj/structure/displaycase/examine(mob/user) ..() if(alert) to_chat(user, "Hooked up with an anti-theft system.") - if(showpiece) - to_chat(user, "There's [showpiece] inside.") + if(showpiece) + to_chat(user, "There's [showpiece] inside.") /obj/structure/displaycase/proc/dump() @@ -82,7 +82,7 @@ getFlatIcon(A,defdir=4) catch return 0 - return 1 + return TRUE /obj/structure/displaycase/proc/get_flat_icon_directional(atom/A) //Get flatIcon even if dir is mismatched for directionless icons @@ -175,7 +175,7 @@ user.changeNext_move(CLICK_CD_MELEE) if (showpiece && (broken || open)) to_chat(user, "You deactivate the hover field built into the case.") - dump() + dump() src.add_fingerprint(user) update_icon() return @@ -247,96 +247,96 @@ desc = "A glass lab container for storing interesting creatures." start_showpiece_type = /obj/item/clothing/mask/facehugger/lamarr req_access = list(GLOB.access_rd) - - - -/obj/structure/displaycase/trophy - name = "trophy display case" - desc = "Store your trophies of accomplishment in here, and they will stay forever." - var/trophy_message = "" - var/placer_key = "" - var/added_roundstart = TRUE - alert = TRUE - integrity_failure = 0 - -/obj/structure/displaycase/trophy/Initialize() - . = ..() - GLOB.trophy_cases += src - -/obj/structure/displaycase/trophy/Destroy() - GLOB.trophy_cases -= src - return ..() - -/obj/structure/displaycase/trophy/examine(mob/user) - ..() - if(trophy_message) - to_chat(user, "The plaque reads:") - to_chat(user, trophy_message) - -/obj/structure/displaycase/trophy/attackby(obj/item/weapon/W, mob/user, params) - - if(!user.Adjacent(src)) //no TK museology - return - - if(!added_roundstart) - to_chat(user, "You've already put something new in this case.") - return - - if(is_type_in_typecache(W, GLOB.blacklisted_cargo_types)) - to_chat(user, "The case rejects the [W].") - return - - for(var/a in W.GetAllContents()) - if(is_type_in_typecache(a, GLOB.blacklisted_cargo_types)) - to_chat(user, "The case rejects the [W].") - return - - if(user.drop_item()) - - if(showpiece) - to_chat(user, "You press a button, and [showpiece] descends into the floor of the case.") - QDEL_NULL(showpiece) - - to_chat(user, "You insert [W] into the case.") - W.forceMove(src) - showpiece = W - added_roundstart = FALSE - update_icon() - - placer_key = user.ckey - - trophy_message = W.desc //default value - - var/chosen_plaque = stripped_input(user, "What would you like the plaque to say? Default value is item's description.", "Trophy Plaque") - if(chosen_plaque) - if(user.Adjacent(src)) - trophy_message = chosen_plaque - to_chat(user, "You set the plaque's text.") - else - to_chat(user, "You are too far to set the plaque's text.") - - SSpersistence.SaveTrophy(src) - - else - to_chat(user, "\The [W] is stuck to your hand, you can't put it in the [src.name]!") - - return - -/obj/structure/displaycase/trophy/dump() - if (showpiece) - if(added_roundstart) - visible_message("The [showpiece] crumbles to dust!") - new /obj/effect/decal/cleanable/ash(loc) - QDEL_NULL(showpiece) - else - ..() - -/obj/item/showpiece_dummy - name = "Cheap replica" - -/obj/item/showpiece_dummy/Initialize(mapload, path) - . = ..() - var/obj/item/I = path - name = initial(I.name) - icon = initial(I.icon) - icon_state = initial(I.icon_state) + + + +/obj/structure/displaycase/trophy + name = "trophy display case" + desc = "Store your trophies of accomplishment in here, and they will stay forever." + var/trophy_message = "" + var/placer_key = "" + var/added_roundstart = TRUE + alert = TRUE + integrity_failure = 0 + +/obj/structure/displaycase/trophy/Initialize() + . = ..() + GLOB.trophy_cases += src + +/obj/structure/displaycase/trophy/Destroy() + GLOB.trophy_cases -= src + return ..() + +/obj/structure/displaycase/trophy/examine(mob/user) + ..() + if(trophy_message) + to_chat(user, "The plaque reads:") + to_chat(user, trophy_message) + +/obj/structure/displaycase/trophy/attackby(obj/item/weapon/W, mob/user, params) + + if(!user.Adjacent(src)) //no TK museology + return + + if(!added_roundstart) + to_chat(user, "You've already put something new in this case.") + return + + if(is_type_in_typecache(W, GLOB.blacklisted_cargo_types)) + to_chat(user, "The case rejects the [W].") + return + + for(var/a in W.GetAllContents()) + if(is_type_in_typecache(a, GLOB.blacklisted_cargo_types)) + to_chat(user, "The case rejects the [W].") + return + + if(user.drop_item()) + + if(showpiece) + to_chat(user, "You press a button, and [showpiece] descends into the floor of the case.") + QDEL_NULL(showpiece) + + to_chat(user, "You insert [W] into the case.") + W.forceMove(src) + showpiece = W + added_roundstart = FALSE + update_icon() + + placer_key = user.ckey + + trophy_message = W.desc //default value + + var/chosen_plaque = stripped_input(user, "What would you like the plaque to say? Default value is item's description.", "Trophy Plaque") + if(chosen_plaque) + if(user.Adjacent(src)) + trophy_message = chosen_plaque + to_chat(user, "You set the plaque's text.") + else + to_chat(user, "You are too far to set the plaque's text.") + + SSpersistence.SaveTrophy(src) + + else + to_chat(user, "\The [W] is stuck to your hand, you can't put it in the [src.name]!") + + return + +/obj/structure/displaycase/trophy/dump() + if (showpiece) + if(added_roundstart) + visible_message("The [showpiece] crumbles to dust!") + new /obj/effect/decal/cleanable/ash(loc) + QDEL_NULL(showpiece) + else + ..() + +/obj/item/showpiece_dummy + name = "Cheap replica" + +/obj/item/showpiece_dummy/Initialize(mapload, path) + . = ..() + var/obj/item/I = path + name = initial(I.name) + icon = initial(I.icon) + icon_state = initial(I.icon_state) diff --git a/code/game/objects/structures/displaycase.dm.rej b/code/game/objects/structures/displaycase.dm.rej deleted file mode 100644 index ee677c1b9d..0000000000 --- a/code/game/objects/structures/displaycase.dm.rej +++ /dev/null @@ -1,10 +0,0 @@ -diff a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm (rejected hunks) -@@ -316,7 +316,7 @@ - to_chat(user, "You are too far to set the plaque's text.") - - SSpersistence.SaveTrophy(src) -- return 1 -+ return TRUE - - else - to_chat(user, "\The [W] is stuck to your hand, you can't put it in the [src.name]!") From 68f7ea7fd072308359652dceb85c609c1a11c592 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sun, 7 May 2017 22:30:28 -0700 Subject: [PATCH 158/352] handled rejects --- code/game/objects/structures/displaycase.dm.rej | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 code/game/objects/structures/displaycase.dm.rej diff --git a/code/game/objects/structures/displaycase.dm.rej b/code/game/objects/structures/displaycase.dm.rej deleted file mode 100644 index 5cdbc0ec74..0000000000 --- a/code/game/objects/structures/displaycase.dm.rej +++ /dev/null @@ -1,12 +0,0 @@ -diff a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm (rejected hunks) -@@ -278,8 +278,8 @@ - if(!user.Adjacent(src)) //no TK museology - return - -- if(!(user.mind && user.mind.assigned_role == "Librarian")) -- to_chat(user, "You're not sure how to work this. Maybe you should ask the librarian for help.") -+ if(!(user.mind && user.mind.assigned_role == "Curator")) -+ to_chat(user, "You're not sure how to work this. Maybe you should ask the curator for help.") - return - - if(!added_roundstart) From a87cee8a05394ef2769e767aed45859cde4ffd36 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sun, 7 May 2017 22:30:06 -0700 Subject: [PATCH 159/352] copy-paste-this-from-tg --- code/game/objects/structures/displaycase.dm | 204 ++++++++++---------- 1 file changed, 104 insertions(+), 100 deletions(-) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 3817a16685..768a5ac217 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -16,25 +16,25 @@ var/obj/item/weapon/electronics/airlock/electronics var/start_showpiece_type = null //add type for items on display -/obj/structure/displaycase/Initialize() - . = ..() +/obj/structure/displaycase/Initialize() + . = ..() if(start_showpiece_type) showpiece = new start_showpiece_type (src) update_icon() /obj/structure/displaycase/Destroy() if(electronics) - QDEL_NULL(electronics) + QDEL_NULL(electronics) if(showpiece) - QDEL_NULL(showpiece) + QDEL_NULL(showpiece) return ..() /obj/structure/displaycase/examine(mob/user) ..() if(alert) to_chat(user, "Hooked up with an anti-theft system.") - if(showpiece) - to_chat(user, "There's [showpiece] inside.") + if(showpiece) + to_chat(user, "There's [showpiece] inside.") /obj/structure/displaycase/proc/dump() @@ -175,7 +175,7 @@ user.changeNext_move(CLICK_CD_MELEE) if (showpiece && (broken || open)) to_chat(user, "You deactivate the hover field built into the case.") - dump() + dump() src.add_fingerprint(user) update_icon() return @@ -247,96 +247,100 @@ desc = "A glass lab container for storing interesting creatures." start_showpiece_type = /obj/item/clothing/mask/facehugger/lamarr req_access = list(GLOB.access_rd) - - - -/obj/structure/displaycase/trophy - name = "trophy display case" - desc = "Store your trophies of accomplishment in here, and they will stay forever." - var/trophy_message = "" - var/placer_key = "" - var/added_roundstart = TRUE - alert = TRUE - integrity_failure = 0 - -/obj/structure/displaycase/trophy/Initialize() - . = ..() - GLOB.trophy_cases += src - -/obj/structure/displaycase/trophy/Destroy() - GLOB.trophy_cases -= src - return ..() - -/obj/structure/displaycase/trophy/examine(mob/user) - ..() - if(trophy_message) - to_chat(user, "The plaque reads:") - to_chat(user, trophy_message) - -/obj/structure/displaycase/trophy/attackby(obj/item/weapon/W, mob/user, params) - - if(!user.Adjacent(src)) //no TK museology - return - - if(!added_roundstart) - to_chat(user, "You've already put something new in this case.") - return - - if(is_type_in_typecache(W, GLOB.blacklisted_cargo_types)) - to_chat(user, "The case rejects the [W].") - return - - for(var/a in W.GetAllContents()) - if(is_type_in_typecache(a, GLOB.blacklisted_cargo_types)) - to_chat(user, "The case rejects the [W].") - return - - if(user.drop_item()) - - if(showpiece) - to_chat(user, "You press a button, and [showpiece] descends into the floor of the case.") - QDEL_NULL(showpiece) - - to_chat(user, "You insert [W] into the case.") - W.forceMove(src) - showpiece = W - added_roundstart = FALSE - update_icon() - - placer_key = user.ckey - - trophy_message = W.desc //default value - - var/chosen_plaque = stripped_input(user, "What would you like the plaque to say? Default value is item's description.", "Trophy Plaque") - if(chosen_plaque) - if(user.Adjacent(src)) - trophy_message = chosen_plaque - to_chat(user, "You set the plaque's text.") - else - to_chat(user, "You are too far to set the plaque's text.") - - SSpersistence.SaveTrophy(src) - - else - to_chat(user, "\The [W] is stuck to your hand, you can't put it in the [src.name]!") - - return - -/obj/structure/displaycase/trophy/dump() - if (showpiece) - if(added_roundstart) - visible_message("The [showpiece] crumbles to dust!") - new /obj/effect/decal/cleanable/ash(loc) - QDEL_NULL(showpiece) - else - ..() - -/obj/item/showpiece_dummy - name = "Cheap replica" - -/obj/item/showpiece_dummy/Initialize(mapload, path) - . = ..() - var/obj/item/I = path - name = initial(I.name) - icon = initial(I.icon) - icon_state = initial(I.icon_state) + + + +/obj/structure/displaycase/trophy + name = "trophy display case" + desc = "Store your trophies of accomplishment in here, and they will stay forever." + var/trophy_message = "" + var/placer_key = "" + var/added_roundstart = TRUE + alert = TRUE + integrity_failure = 0 + +/obj/structure/displaycase/trophy/Initialize() + . = ..() + GLOB.trophy_cases += src + +/obj/structure/displaycase/trophy/Destroy() + GLOB.trophy_cases -= src + return ..() + +/obj/structure/displaycase/trophy/examine(mob/user) + ..() + if(trophy_message) + to_chat(user, "The plaque reads:") + to_chat(user, trophy_message) + +/obj/structure/displaycase/trophy/attackby(obj/item/weapon/W, mob/user, params) + + if(!user.Adjacent(src)) //no TK museology + return + + if(!(user.mind && user.mind.assigned_role == "Curator")) + to_chat(user, "You're not sure how to work this. Maybe you should ask the curator for help.") + return + + if(!added_roundstart) + to_chat(user, "You've already put something new in this case.") + return + + if(is_type_in_typecache(W, GLOB.blacklisted_cargo_types)) + to_chat(user, "The case rejects the [W].") + return + + for(var/a in W.GetAllContents()) + if(is_type_in_typecache(a, GLOB.blacklisted_cargo_types)) + to_chat(user, "The case rejects the [W].") + return + + if(user.drop_item()) + + if(showpiece) + to_chat(user, "You press a button, and [showpiece] descends into the floor of the case.") + QDEL_NULL(showpiece) + + to_chat(user, "You insert [W] into the case.") + W.forceMove(src) + showpiece = W + added_roundstart = FALSE + update_icon() + + placer_key = user.ckey + + trophy_message = W.desc //default value + + var/chosen_plaque = stripped_input(user, "What would you like the plaque to say? Default value is item's description.", "Trophy Plaque") + if(chosen_plaque) + if(user.Adjacent(src)) + trophy_message = chosen_plaque + to_chat(user, "You set the plaque's text.") + else + to_chat(user, "You are too far to set the plaque's text.") + + SSpersistence.SaveTrophy(src) + + else + to_chat(user, "\The [W] is stuck to your hand, you can't put it in the [src.name]!") + + return + +/obj/structure/displaycase/trophy/dump() + if (showpiece) + if(added_roundstart) + visible_message("The [showpiece] crumbles to dust!") + new /obj/effect/decal/cleanable/ash(loc) + QDEL_NULL(showpiece) + else + ..() + +/obj/item/showpiece_dummy + name = "Cheap replica" + +/obj/item/showpiece_dummy/Initialize(mapload, path) + . = ..() + var/obj/item/I = path + name = initial(I.name) + icon = initial(I.icon) + icon_state = initial(I.icon_state) From ec752aabb47f8ee151bf921bec447e65476bf263 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sun, 7 May 2017 22:33:30 -0700 Subject: [PATCH 160/352] curator --> librarian --- _maps/map_files/CitadelStation/CitadelStation-1.2.1.dmm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_maps/map_files/CitadelStation/CitadelStation-1.2.1.dmm b/_maps/map_files/CitadelStation/CitadelStation-1.2.1.dmm index 7553242b36..84fb806587 100644 --- a/_maps/map_files/CitadelStation/CitadelStation-1.2.1.dmm +++ b/_maps/map_files/CitadelStation/CitadelStation-1.2.1.dmm @@ -1361,7 +1361,7 @@ "aAi" = (/obj/structure/table/wood,/obj/item/weapon/folder,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/asteroid},/area/library) "aAj" = (/obj/machinery/power/apc{dir = 8;name = "Library APC";pixel_x = -25},/obj/structure/cable{icon_state = "0-4";d2 = 4},/turf/open/floor/wood,/area/library) "aAk" = (/obj/structure/cable{d1 = 2;d2 = 8;icon_state = "2-8"},/turf/open/floor/wood,/area/library) -"aAl" = (/obj/effect/landmark/start{name = "Librarian"},/turf/open/floor/wood,/area/library) +"aAl" = (/obj/effect/landmark/start{name = "Curator"},/turf/open/floor/wood,/area/library) "aAm" = (/obj/machinery/light/small{dir = 4},/turf/open/floor/wood,/area/library) "aAn" = (/obj/machinery/light/small/built{tag = "icon-bulb1 (WEST)";icon_state = "bulb1";dir = 8},/obj/machinery/airalarm{frequency = 1439;locked = 0;pixel_y = 23},/turf/open/floor/wood,/area/crew_quarters/cafeteria{name = "Cafe"}) "aAo" = (/turf/open/floor/wood,/area/crew_quarters/cafeteria{name = "Cafe"}) @@ -1393,7 +1393,7 @@ "aAO" = (/obj/machinery/light/small{dir = 8},/turf/open/floor/wood{baseturf = /turf/open/floor/plating/asteroid},/area/maintenance/fore) "aAP" = (/obj/structure/chair/stool,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/asteroid},/area/maintenance/fore) "aAQ" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/open/floor/noslip,/area/construction/hallway{name = "Secure Workstations Hallway"}) -"aAR" = (/obj/structure/closet/cabinet,/obj/item/toy/figure/assistant,/obj/item/toy/figure/atmos,/obj/item/toy/figure/bartender,/obj/item/toy/figure/borg,/obj/item/toy/figure/botanist,/obj/item/toy/figure/captain,/obj/item/toy/figure/cargotech,/obj/item/toy/figure/ce,/obj/item/toy/figure/chaplain,/obj/item/toy/figure/chef,/obj/item/toy/figure/chemist,/obj/item/toy/figure/clown,/obj/item/toy/figure/cmo,/obj/item/toy/figure/detective,/obj/item/toy/figure/dsquad,/obj/item/toy/figure/engineer,/obj/item/toy/figure/geneticist,/obj/item/toy/figure/hop,/obj/item/toy/figure/hos,/obj/item/toy/figure/ian,/obj/item/toy/figure/janitor,/obj/item/toy/figure/lawyer,/obj/item/toy/figure/librarian,/obj/item/toy/figure/md,/obj/item/toy/figure/mime,/obj/item/toy/figure/miner,/obj/item/toy/figure/ninja,/obj/item/toy/figure/qm,/obj/item/toy/figure/rd,/obj/item/toy/figure/roboticist,/obj/item/toy/figure/scientist,/obj/item/toy/figure/secofficer,/obj/item/toy/figure/syndie,/obj/item/toy/figure/virologist,/obj/item/toy/figure/warden,/obj/item/toy/figure/wizard,/obj/item/toy/minimeteor,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/asteroid},/area/library) +"aAR" = (/obj/structure/closet/cabinet,/obj/item/toy/figure/assistant,/obj/item/toy/figure/atmos,/obj/item/toy/figure/bartender,/obj/item/toy/figure/borg,/obj/item/toy/figure/botanist,/obj/item/toy/figure/captain,/obj/item/toy/figure/cargotech,/obj/item/toy/figure/ce,/obj/item/toy/figure/chaplain,/obj/item/toy/figure/chef,/obj/item/toy/figure/chemist,/obj/item/toy/figure/clown,/obj/item/toy/figure/cmo,/obj/item/toy/figure/detective,/obj/item/toy/figure/dsquad,/obj/item/toy/figure/engineer,/obj/item/toy/figure/geneticist,/obj/item/toy/figure/hop,/obj/item/toy/figure/hos,/obj/item/toy/figure/ian,/obj/item/toy/figure/janitor,/obj/item/toy/figure/lawyer,/obj/item/toy/figure/curator,/obj/item/toy/figure/md,/obj/item/toy/figure/mime,/obj/item/toy/figure/miner,/obj/item/toy/figure/ninja,/obj/item/toy/figure/qm,/obj/item/toy/figure/rd,/obj/item/toy/figure/roboticist,/obj/item/toy/figure/scientist,/obj/item/toy/figure/secofficer,/obj/item/toy/figure/syndie,/obj/item/toy/figure/virologist,/obj/item/toy/figure/warden,/obj/item/toy/figure/wizard,/obj/item/toy/minimeteor,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/asteroid},/area/library) "aAS" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/asteroid},/area/library) "aAT" = (/obj/item/device/radio/intercom{dir = 4;name = "Station Intercom (General)";pixel_x = 0;pixel_y = -27},/turf/open/floor/wood{baseturf = /turf/open/floor/plating/asteroid},/area/library) "aAU" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8;initialize_directions = 11},/turf/open/floor/wood{baseturf = /turf/open/floor/plating/asteroid},/area/library) From 6bf46e1a6da48cbf8f1e73e0da583b547f9788ed Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sun, 7 May 2017 22:35:48 -0700 Subject: [PATCH 161/352] Delete gang.dm.rej --- code/game/gamemodes/gang/gang.dm.rej | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 code/game/gamemodes/gang/gang.dm.rej diff --git a/code/game/gamemodes/gang/gang.dm.rej b/code/game/gamemodes/gang/gang.dm.rej deleted file mode 100644 index 02c5581f3c..0000000000 --- a/code/game/gamemodes/gang/gang.dm.rej +++ /dev/null @@ -1,10 +0,0 @@ -diff a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm (rejected hunks) -@@ -249,7 +249,7 @@ GLOBAL_LIST_INIT(gang_colors_pool, list("red","orange","yellow","green","blue"," - return gang_bosses - - /proc/determine_domination_time(var/datum/gang/G) -- return max(180,600 - (round((G.territory.len/GLOB.start_state.num_territories)*100, 1) * 9)) -+ return max(180,480 - (round((G.territory.len/GLOB.start_state.num_territories)*100, 1) * 9)) - - - ////////////////////////////////////////////////////////////////////// From 4a5968280349538dd77a6e0e730109ea8654b23f Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sun, 7 May 2017 22:35:54 -0700 Subject: [PATCH 162/352] Update gang.dm --- code/game/gamemodes/gang/gang.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm index 9c31edf55f..20cce72b4e 100644 --- a/code/game/gamemodes/gang/gang.dm +++ b/code/game/gamemodes/gang/gang.dm @@ -249,7 +249,7 @@ GLOBAL_LIST_INIT(gang_colors_pool, list("red","orange","yellow","green","blue"," return gang_bosses /proc/determine_domination_time(var/datum/gang/G) - return max(180,900 - (round((G.territory.len/GLOB.start_state.num_territories)*100, 1) * 12)) + return max(180,480 - (round((G.territory.len/GLOB.start_state.num_territories)*100, 1) * 9)) ////////////////////////////////////////////////////////////////////// //Announces the end of the game with all relavent information stated// From 451ca85ca47b3e327247c0463334f22eba516830 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 8 May 2017 00:36:04 -0500 Subject: [PATCH 163/352] Automatic changelog generation for PR #803 [ci skip] --- html/changelogs/AutoChangeLog-pr-803.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-803.yml diff --git a/html/changelogs/AutoChangeLog-pr-803.yml b/html/changelogs/AutoChangeLog-pr-803.yml new file mode 100644 index 0000000000..c3b54164a8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-803.yml @@ -0,0 +1,5 @@ +author: "Robustin" +delete-after: True +changes: + - tweak: "Gang Dominator max time is now 8 minutes down from 15m" + - tweak: "Gang Tagging now reduces the timer by 9 seconds per territory, down from 12 seconds." From e611a7d0950d621f48993bba90f1c7a8ef75df36 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 8 May 2017 00:36:54 -0500 Subject: [PATCH 164/352] Automatic changelog generation for PR #835 [ci skip] --- html/changelogs/AutoChangeLog-pr-835.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-835.yml diff --git a/html/changelogs/AutoChangeLog-pr-835.yml b/html/changelogs/AutoChangeLog-pr-835.yml new file mode 100644 index 0000000000..5392a02984 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-835.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - tweak: "Removes organic check from mediborg storage container" From 14a9bda61e9eeca6928c74a0325e906d2fa5428d Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sun, 7 May 2017 22:44:06 -0700 Subject: [PATCH 165/352] Update status_effect.dm --- code/datums/status_effects/status_effect.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index b0f080a3a0..74e74b5e6d 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -52,6 +52,8 @@ qdel(src) /datum/status_effect/proc/on_apply() //Called whenever the buff is applied. + return TRUE + /datum/status_effect/proc/tick() //Called every tick. /datum/status_effect/proc/on_remove() //Called whenever the buff expires or is removed; do note that at the point this is called, it is out of the owner's status_effects but owner is not yet null /datum/status_effect/proc/be_replaced() //Called instead of on_remove when a status effect is replaced by itself or when a status effect with on_remove_on_mob_delete = FALSE has its mob deleted From bebb9ec5719107f5f5bf942cda767e3e12b40414 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sun, 7 May 2017 22:44:14 -0700 Subject: [PATCH 166/352] Delete status_effect.dm.rej --- code/datums/status_effects/status_effect.dm.rej | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 code/datums/status_effects/status_effect.dm.rej diff --git a/code/datums/status_effects/status_effect.dm.rej b/code/datums/status_effects/status_effect.dm.rej deleted file mode 100644 index a174c87f7b..0000000000 --- a/code/datums/status_effects/status_effect.dm.rej +++ /dev/null @@ -1,11 +0,0 @@ -diff a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm (rejected hunks) -@@ -54,7 +53,8 @@ var/global/list/all_status_effects = list() //a list of all status effects, if f - if(duration != -1 && duration < world.time) - qdel(src) - --/datum/status_effect/proc/on_apply() //Called whenever the buff is applied. -+/datum/status_effect/proc/on_apply() //Called whenever the buff is applied; returning FALSE will cause it to autoremove itself. -+ return TRUE - /datum/status_effect/proc/tick() //Called every tick. - /datum/status_effect/proc/on_remove() //Called whenever the buff expires or is removed. - /datum/status_effect/proc/be_replaced() //Called instead of on_remove when a status effect is replaced by itself From e12fc21d60969430f29bffd2775cbf400bba843d Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sun, 7 May 2017 22:47:58 -0700 Subject: [PATCH 167/352] Update clockwork_slab.dm --- .../clock_cult/clock_items/clockwork_slab.dm | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm index 0ea612ea10..35caabab5a 100644 --- a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm +++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm @@ -21,6 +21,7 @@ var/obj/effect/proc_holder/slab/slab_ability //the slab's current bound ability, for certain scripture var/list/quickbound = list(/datum/clockwork_scripture/ranged_ability/geis_prep, /datum/clockwork_scripture/create_object/replicant, \ /datum/clockwork_scripture/create_object/tinkerers_cache) //quickbound scripture, accessed by index + var/maximum_quickbound = 5 //how many quickbound scriptures we can have actions_types = list(/datum/action/item_action/clock/hierophant) /obj/item/clockwork/slab/starter @@ -51,6 +52,7 @@ nonhuman_usable = TRUE quickbound = list(/datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/ranged_ability/linked_vanguard, \ /datum/clockwork_scripture/create_object/tinkerers_cache) + maximum_quickbound = 6 //we usually have one or two unique scriptures, so if ratvar is up let us bind one more actions_types = list() /obj/item/clockwork/slab/cyborg/engineer //five scriptures, plus a proselytizer @@ -370,11 +372,12 @@ The remaining functions are several buttons in the top left while holding the slab.
From left to right, they are:
\ Hierophant Network, which allows communication to other Servants.
") if(LAZYLEN(quickbound)) - for(var/i in 1 to quickbound.len) - if(!quickbound[i]) - continue - var/datum/clockwork_scripture/quickbind_slot = quickbound[i] - textlist += "A Quickbind slot, currently set to [initial(quickbind_slot.name)].
" + for(var/i in 1 to maximum_quickbound) + if(LAZYLEN(quickbound) < i || !quickbound[i]) + textlist += "A Quickbind slot, currently set to Nothing.
" + else + var/datum/clockwork_scripture/quickbind_slot = quickbound[i] + textlist += "A Quickbind slot, currently set to [initial(quickbind_slot.name)].
" textlist += "
\ Examine the slab or swap to Recital to check the number of components it has available.

\ \ @@ -486,8 +489,8 @@ quickbound[found_index] = null //otherwise, leave it as a null so the scripture maintains position update_quickbind() else - var/target_index = input("Position of [initial(path.name)], 1 to 5?", "Input") as num|null - if(isnum(target_index) && target_index > 0 && target_index < 6 && !..()) + var/target_index = input("Position of [initial(path.name)], 1 to [maximum_quickbound]?", "Input") as num|null + if(isnum(target_index) && target_index > 0 && target_index <= maximum_quickbound && !..()) var/datum/clockwork_scripture/S if(LAZYLEN(quickbound) >= target_index) S = quickbound[target_index] From 106a9d3ad9b9f8d3baae05ee8c8e972a740662cf Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sun, 7 May 2017 22:48:04 -0700 Subject: [PATCH 168/352] Delete clockwork_slab.dm.rej --- .../clock_items/clockwork_slab.dm.rej | 46 ------------------- 1 file changed, 46 deletions(-) delete mode 100644 code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm.rej diff --git a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm.rej b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm.rej deleted file mode 100644 index 06e60a70e4..0000000000 --- a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm.rej +++ /dev/null @@ -1,46 +0,0 @@ -diff a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm (rejected hunks) -@@ -21,6 +21,7 @@ - var/obj/effect/proc_holder/slab/slab_ability //the slab's current bound ability, for certain scripture - var/list/quickbound = list(/datum/clockwork_scripture/ranged_ability/geis_prep, /datum/clockwork_scripture/create_object/replicant, \ - /datum/clockwork_scripture/create_object/tinkerers_cache) //quickbound scripture, accessed by index -+ var/maximum_quickbound = 5 //how many quickbound scriptures we can have - actions_types = list(/datum/action/item_action/clock/hierophant) - - /obj/item/clockwork/slab/starter -@@ -51,6 +52,7 @@ - nonhuman_usable = TRUE - quickbound = list(/datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/ranged_ability/linked_vanguard, \ - /datum/clockwork_scripture/create_object/tinkerers_cache) -+ maximum_quickbound = 6 //we usually have one or two unique scriptures, so if ratvar is up let us bind one more - actions_types = list() - - /obj/item/clockwork/slab/cyborg/engineer //five scriptures, plus a proselytizer -@@ -362,11 +364,12 @@ - The remaining functions are several buttons in the top left while holding the slab.
From left to right, they are:
\ - Hierophant Network, which allows communication to other Servants.
") - if(LAZYLEN(quickbound)) -- for(var/i in 1 to quickbound.len) -- if(!quickbound[i]) -- continue -- var/datum/clockwork_scripture/quickbind_slot = quickbound[i] -- textlist += "A Quickbind slot, currently set to [initial(quickbind_slot.name)].
" -+ for(var/i in 1 to maximum_quickbound) -+ if(LAZYLEN(quickbound) < i || !quickbound[i]) -+ textlist += "A Quickbind slot, currently set to Nothing.
" -+ else -+ var/datum/clockwork_scripture/quickbind_slot = quickbound[i] -+ textlist += "A Quickbind slot, currently set to [initial(quickbind_slot.name)].
" - textlist += "
\ - Examine the slab or swap to Recital to check the number of components it has available.

\ - \ -@@ -478,8 +481,8 @@ - quickbound[found_index] = null //otherwise, leave it as a null so the scripture maintains position - update_quickbind() - else -- var/target_index = input("Position of [initial(path.name)], 1 to 5?", "Input") as num|null -- if(isnum(target_index) && target_index > 0 && target_index < 6 && !..()) -+ var/target_index = input("Position of [initial(path.name)], 1 to [maximum_quickbound]?", "Input") as num|null -+ if(isnum(target_index) && target_index > 0 && target_index <= maximum_quickbound && !..()) - var/datum/clockwork_scripture/S - if(LAZYLEN(quickbound) >= target_index) - S = quickbound[target_index] From 204a3a3938f20625b731bd8c62652e3b00b133cc Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sun, 7 May 2017 22:52:39 -0700 Subject: [PATCH 169/352] Update lavaland_ruin_code.dm --- code/modules/ruins/lavaland_ruin_code.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index d14da81a8c..187b52b89d 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -135,7 +135,7 @@ icon = 'icons/obj/Cryogenic2.dmi' icon_state = "sleeper" has_id = 1 - flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunatley, your hated enemy, Nanotrasen, has begun mining in this sector. Continue your research as best you can, and try to keep a low profile. Do not abandon the base without good cause. The base is rigged with explosives should the worst happen, do not let the base fall into enemy hands!
" + flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Continue your research as best you can, and try to keep a low profile. Do not abandon the base without good cause. The base is rigged with explosives should the worst happen, do not let the base fall into enemy hands!
" id_access_list = list(GLOB.access_syndicate) /obj/effect/mob_spawn/human/lavaland_syndicate/comms @@ -143,5 +143,6 @@ r_hand = /obj/item/weapon/melee/energy/sword/saber mask = /obj/item/clothing/mask/chameleon suit = /obj/item/clothing/suit/armor/vest - flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunatley, your hated enemy, Nanotrasen, has begun mining in this sector. Monitor enemy activity as best you can, and try to keep a low profile. Do not abandon the base without good cause. Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands!
" + flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Monitor enemy activity as best you can, and try to keep a low profile. Do not abandon the base without good cause. Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands!" pocket2 = /obj/item/weapon/card/id/syndicate/anyone + From 52a8aacd00d46b91fba5e61fc5ac2e636c1b3de7 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sun, 7 May 2017 22:52:47 -0700 Subject: [PATCH 170/352] Delete lavaland_ruin_code.dm.rej --- code/modules/ruins/lavaland_ruin_code.dm.rej | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 code/modules/ruins/lavaland_ruin_code.dm.rej diff --git a/code/modules/ruins/lavaland_ruin_code.dm.rej b/code/modules/ruins/lavaland_ruin_code.dm.rej deleted file mode 100644 index 2f25515493..0000000000 --- a/code/modules/ruins/lavaland_ruin_code.dm.rej +++ /dev/null @@ -1,18 +0,0 @@ -diff a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm (rejected hunks) -@@ -136,16 +135,13 @@ - icon = 'icons/obj/Cryogenic2.dmi' - icon_state = "sleeper" - has_id = 1 -- - flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Continue your research as best you can, and try to keep a low profile. Do not abandon the base without good cause. The base is rigged with explosives should the worst happen, do not let the base fall into enemy hands!" - id_access_list = list(GLOB.access_syndicate) - -- - /obj/effect/mob_spawn/human/lavaland_syndicate/comms - name = "Syndicate Comms Agent" - r_hand = /obj/item/weapon/melee/energy/sword/saber - mask = /obj/item/clothing/mask/chameleon - suit = /obj/item/clothing/suit/armor/vest - flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Monitor enemy activity as best you can, and try to keep a low profile. Do not abandon the base without good cause. Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands!" -- - pocket2 = /obj/item/weapon/card/id/syndicate/anyone From 8edb3869064d7ef5c3916e5ecd743b5e0344b45c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 8 May 2017 00:53:25 -0500 Subject: [PATCH 171/352] Automatic changelog generation for PR #735 [ci skip] --- html/changelogs/AutoChangeLog-pr-735.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-735.yml diff --git a/html/changelogs/AutoChangeLog-pr-735.yml b/html/changelogs/AutoChangeLog-pr-735.yml new file mode 100644 index 0000000000..10d910d62b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-735.yml @@ -0,0 +1,7 @@ +author: "Kor, Profakos, Iamgoofball" +delete-after: True +changes: + - rscadd: "The Librarian has been replaced by the Curator." + - rscadd: "Persistent trophy cases have been added to the library on Meta, Delta, and Box. These are only usable by the Curator." + - rscadd: "The Curator now starts with his whip." + - rscadd: "The Curator now has access to his treasure hunter outfit, stashed in his private office." From f59f2ff8eddcee9a33d0fe9cbc3c2828a2728473 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 8 May 2017 01:19:36 -0500 Subject: [PATCH 172/352] Automatic changelog generation for PR #696 [ci skip] --- html/changelogs/AutoChangeLog-pr-696.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-696.yml diff --git a/html/changelogs/AutoChangeLog-pr-696.yml b/html/changelogs/AutoChangeLog-pr-696.yml new file mode 100644 index 0000000000..9f58df768f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-696.yml @@ -0,0 +1,5 @@ +author: "Joan" +delete-after: True +changes: + - rscadd: "Belligerent now prevents you from running for 7 seconds after every chant." + - rscdel: "However, you no longer remain walking after Belligerent's effect fades." From a6cb12b84a857bdbeff12463284b1b6659c42dc8 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 8 May 2017 02:25:20 -0500 Subject: [PATCH 173/352] [MIRROR] Plastic golems (#806) * Plastic golems * Update lavaland_ruin_code.dm * Delete lavaland_ruin_code.dm.rej --- .../living/carbon/human/species_types/golems.dm | 16 +++++++++++++++- code/modules/ruins/lavaland_ruin_code.dm | 3 +++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 4d68188686..42608e1e5d 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -643,4 +643,18 @@ if(P.is_hot()) visible_message("[src] bursts into flames!") - fire_act() \ No newline at end of file + fire_act() +/datum/species/golem/plastic + name = "Plastic" + id = "plastic golem" + prefix = "Plastic" + fixed_mut_color = "fff" + info_text = "As a Plastic Golem, you are capable of ventcrawling, and passing through plastic flaps." + +/datum/species/golem/plastic/on_species_gain(mob/living/carbon/C, datum/species/old_species) + . = ..() + C.ventcrawler = VENTCRAWLER_NUDE + +/datum/species/golem/plastic/on_species_loss(mob/living/carbon/C) + . = ..() + C.ventcrawler = initial(C.ventcrawler) diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index 0fcb638565..1007b32fe2 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -103,6 +103,9 @@ if(istype(O, /obj/item/stack/medical/gauze) || istype(O, /obj/item/stack/sheet/cloth)) species = /datum/species/golem/cloth + + if(istype(O, /obj/item/stack/sheet/plastic)) + species = /datum/species/golem/plastic if(species) if(O.use(10)) From 0eb1b603b2237b30aa4049f6afd2392785fc7931 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 8 May 2017 02:25:22 -0500 Subject: [PATCH 174/352] Automatic changelog generation for PR #806 [ci skip] --- html/changelogs/AutoChangeLog-pr-806.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-806.yml diff --git a/html/changelogs/AutoChangeLog-pr-806.yml b/html/changelogs/AutoChangeLog-pr-806.yml new file mode 100644 index 0000000000..550cb8c880 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-806.yml @@ -0,0 +1,5 @@ +author: "coiax" +delete-after: True +changes: + - rscadd: "It is now possible to make plastic golems, who are made of a material +flexible enough to crawl through vents (while not carrying equipment). They also can pass through plastic flaps." From e89bdb6422ea9ceb4dcba1b3037e7f8823773c0f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 8 May 2017 02:25:40 -0500 Subject: [PATCH 175/352] [MIRROR] Fixes some stuff (#768) * Fixes some stuff * line fucking endings --- code/game/objects/structures/displaycase.dm | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index cffd58482e..c7ac587725 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -145,8 +145,7 @@ to_chat(user, "You [open ? "close":"open"] the [src]") toggle_lock(user) else if(open && !showpiece) - if(user.drop_item()) - W.loc = src + if(user.transferItemToLoc(W, src)) showpiece = W to_chat(user, "You put [W] on display") update_icon() @@ -295,14 +294,13 @@ to_chat(user, "The case rejects the [W].") return - if(user.drop_item()) + if(user.transferItemToLoc(W, src)) if(showpiece) to_chat(user, "You press a button, and [showpiece] descends into the floor of the case.") QDEL_NULL(showpiece) to_chat(user, "You insert [W] into the case.") - W.forceMove(src) showpiece = W added_roundstart = FALSE update_icon() From 9acc4da36511f99089e72180b0c76e8c8fbf9ded Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 8 May 2017 02:25:59 -0500 Subject: [PATCH 176/352] [MIRROR] Curator starts with the key to the display cases instead of being the key (#763) * Curator starts with the key to the display cases instead of being the key * Update displaycase.dm * Delete displaycase.dm.rej * Delete civilian.dm.rej * Update civilian.dm * fuck line endings * define true/false --- code/game/objects/structures/displaycase.dm | 21 +++++++-- code/modules/jobs/job_types/civilian.dm | 47 +++++++++++---------- 2 files changed, 42 insertions(+), 26 deletions(-) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index c7ac587725..3fd6117332 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -81,7 +81,7 @@ try getFlatIcon(A,defdir=4) catch - return 0 + return FALSE return TRUE /obj/structure/displaycase/proc/get_flat_icon_directional(atom/A) @@ -255,6 +255,8 @@ var/trophy_message = "" var/placer_key = "" var/added_roundstart = TRUE + var/is_locked = TRUE + alert = TRUE integrity_failure = 0 @@ -277,8 +279,16 @@ if(!user.Adjacent(src)) //no TK museology return - if(!(user.mind && user.mind.assigned_role == "Curator")) - to_chat(user, "You're not sure how to work this. Maybe you should ask the curator for help.") + if(user.is_holding_item_of_type(/obj/item/key/displaycase)) + if(added_roundstart) + is_locked = !is_locked + to_chat(user, "You [!is_locked ? "un" : ""]lock the case.") + else + to_chat(user, "The lock is stuck shut!") + return + + if(is_locked) + to_chat(user, "The case is shut tight with an old fashioned physical lock. Maybe you should ask the curator for the key?") return if(!added_roundstart) @@ -318,6 +328,7 @@ to_chat(user, "You are too far to set the plaque's text.") SSpersistence.SaveTrophy(src) + return TRUE else to_chat(user, "\The [W] is stuck to your hand, you can't put it in the [src.name]!") @@ -333,6 +344,10 @@ else ..() +/obj/item/key/displaycase + name = "display case key" + desc = "The key to the curator's display cases." + /obj/item/showpiece_dummy name = "Cheap replica" diff --git a/code/modules/jobs/job_types/civilian.dm b/code/modules/jobs/job_types/civilian.dm index 45b8562e8c..467f0194d2 100644 --- a/code/modules/jobs/job_types/civilian.dm +++ b/code/modules/jobs/job_types/civilian.dm @@ -112,11 +112,11 @@ Mime H.mind.miming = 1 /* -Curator +Curator */ -/datum/job/curator - title = "Curator" - flag = CURATOR +/datum/job/curator + title = "Curator" + flag = CURATOR department_head = list("Head of Personnel") department_flag = CIVILIAN faction = "Station" @@ -125,34 +125,35 @@ Curator supervisors = "the head of personnel" selection_color = "#dddddd" - outfit = /datum/outfit/job/curator + outfit = /datum/outfit/job/curator access = list(GLOB.access_library) minimal_access = list(GLOB.access_library) -/datum/outfit/job/curator - name = "Curator" - jobtype = /datum/job/curator +/datum/outfit/job/curator + name = "Curator" + jobtype = /datum/job/curator - belt = /obj/item/device/pda/curator - uniform = /obj/item/clothing/under/rank/curator - l_hand = /obj/item/weapon/storage/bag/books - r_pocket = /obj/item/weapon/barcodescanner + belt = /obj/item/device/pda/curator + uniform = /obj/item/clothing/under/rank/curator + l_hand = /obj/item/weapon/storage/bag/books + r_pocket = /obj/item/key/displaycase l_pocket = /obj/item/device/laser_pointer backpack_contents = list( - /obj/item/weapon/melee/curator_whip = 1, - /obj/item/soapstone = 1 + /obj/item/weapon/melee/curator_whip = 1, + /obj/item/soapstone = 1, + /obj/item/weapon/barcodescanner = 1 ) - -/datum/outfit/job/curator/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - ..() - - if(visualsOnly) - return - - H.grant_all_languages(omnitongue=TRUE) - + +/datum/outfit/job/curator/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + ..() + + if(visualsOnly) + return + + H.grant_all_languages(omnitongue=TRUE) + /* Lawyer */ From e54a6725eaa0fbf6ac6d8039b2cecf0a1c0b637b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 8 May 2017 02:26:00 -0500 Subject: [PATCH 177/352] Automatic changelog generation for PR #763 [ci skip] --- html/changelogs/AutoChangeLog-pr-763.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-763.yml diff --git a/html/changelogs/AutoChangeLog-pr-763.yml b/html/changelogs/AutoChangeLog-pr-763.yml new file mode 100644 index 0000000000..12fa07ea48 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-763.yml @@ -0,0 +1,4 @@ +author: "Incoming" +delete-after: True +changes: + - tweak: "Display cases now require a key to open, which the curator spawns with" From 65729cdd559df021eb40f0a465a33ef92ef3588a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 8 May 2017 02:31:54 -0500 Subject: [PATCH 178/352] [MIRROR] Fixes being unable to hit trophy cases in melee (#844) * Fixes being unable to hit trophy cases in melee * Update displaycase.dm * Delete displaycase.dm.rej * Update displaycase.dm --- code/game/objects/structures/displaycase.dm | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 3fd6117332..43fbdde5ee 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -11,8 +11,9 @@ max_integrity = 200 integrity_failure = 50 var/obj/item/showpiece = null - var/alert = 0 - var/open = 0 + var/alert = TRUE + var/open = FALSE + var/openable = TRUE var/obj/item/weapon/electronics/airlock/electronics var/start_showpiece_type = null //add type for items on display @@ -113,7 +114,7 @@ return /obj/structure/displaycase/attackby(obj/item/weapon/W, mob/user, params) - if(W.GetID() && !broken) + if(W.GetID() && !broken && openable) if(allowed(user)) to_chat(user, "You [open ? "close":"open"] the [src]") toggle_lock(user) @@ -132,7 +133,7 @@ else to_chat(user, "[src] is already in good condition!") return - else if(!alert && istype(W,/obj/item/weapon/crowbar)) //Only applies to the lab cage and player made display cases + else if(!alert && istype(W,/obj/item/weapon/crowbar) && openable) //Only applies to the lab cage and player made display cases if(broken) if(showpiece) to_chat(user, "Remove the displayed object first.") @@ -247,8 +248,6 @@ start_showpiece_type = /obj/item/clothing/mask/facehugger/lamarr req_access = list(GLOB.access_rd) - - /obj/structure/displaycase/trophy name = "trophy display case" desc = "Store your trophies of accomplishment in here, and they will stay forever." @@ -259,6 +258,7 @@ alert = TRUE integrity_failure = 0 + openable = FALSE /obj/structure/displaycase/trophy/Initialize() . = ..() @@ -278,6 +278,8 @@ if(!user.Adjacent(src)) //no TK museology return + if(user.a_intent == INTENT_HARM) + return ..() if(user.is_holding_item_of_type(/obj/item/key/displaycase)) if(added_roundstart) From 3ce2f5c698ee1011b57989c2549ffd5c72ac4fe0 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 8 May 2017 02:31:55 -0500 Subject: [PATCH 179/352] Automatic changelog generation for PR #844 [ci skip] --- html/changelogs/AutoChangeLog-pr-844.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-844.yml diff --git a/html/changelogs/AutoChangeLog-pr-844.yml b/html/changelogs/AutoChangeLog-pr-844.yml new file mode 100644 index 0000000000..1bf63a4cef --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-844.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "Fixed being unable to hit museum cases in melee" From 09eb38714d1011d9cf4ca23b8e63d949157661ff Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 8 May 2017 02:32:40 -0500 Subject: [PATCH 180/352] [MIRROR] Flushes Ling & Alien HUD info with the edge of the screen (#721) * Flushes Ling & Alien HUD info with the edge of the screen * Update _defines.dm * Delete _defines.dm.rej * fucking endlines --- code/_onclick/hud/_defines.dm | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 8c62d68963..ce7014d765 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -21,7 +21,7 @@ #define ui_inventory "WEST:6,SOUTH:5" //Middle left indicators -#define ui_lingchemdisplay "WEST:6,CENTER-1:15" +#define ui_lingchemdisplay "WEST,CENTER-1:15" #define ui_lingstingdisplay "WEST:6,CENTER-3:11" #define ui_crafting "12:-10,1:5" #define ui_building "12:-10,1:21" @@ -104,17 +104,18 @@ #define ui_health "EAST-1:28,CENTER-1:15" #define ui_internal "EAST-1:28,CENTER:17" -//borgs and aliens -#define ui_alien_nightvision "EAST-1:28,CENTER:17" +//borgs #define ui_borg_health "EAST-1:28,CENTER-1:15" //borgs have the health display where humans have the pressure damage indicator. -#define ui_alien_health "EAST-1:28,CENTER-1:15" //aliens have the health display where humans have the pressure damage indicator. -#define ui_alienplasmadisplay "EAST-1:28,CENTER-2:15" -#define ui_alien_queen_finder "EAST-1:28,CENTER-3:15" -//constructs -#define ui_construct_pull "EAST,CENTER-2:15" -#define ui_construct_health "EAST,CENTER:15" //same as borgs and humans - +//aliens +#define ui_alien_health "EAST,CENTER-1:15" //aliens have the health display where humans have the pressure damage indicator. +#define ui_alienplasmadisplay "EAST,CENTER-2:15" +#define ui_alien_queen_finder "EAST,CENTER-3:15" + +//constructs +#define ui_construct_pull "EAST,CENTER-2:15" +#define ui_construct_health "EAST,CENTER:15" //same as borgs and humans + // AI #define ui_ai_core "SOUTH:6,WEST" From 98765ec854adbc0799ed12e7dc59906487074871 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 8 May 2017 03:06:05 -0500 Subject: [PATCH 181/352] Small Click refactor. --- code/_onclick/click.dm | 127 +++++++++++------- .../objects/items/weapons/storage/internal.dm | 4 - .../objects/items/weapons/storage/storage.dm | 2 +- code/modules/mob/living/living.dm | 2 +- 4 files changed, 82 insertions(+), 53 deletions(-) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 0fe37a9286..9272abbdb6 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -107,64 +107,112 @@ var/obj/item/W = get_active_held_item() - if(W == A) W.attack_self(src) update_inv_hands() return - - // operate three levels deep here (item in backpack in src; item in box in backpack in src, not any deeper) - if(A.ClickAccessible(src, depth=INVENTORY_DEPTH)) - // No adjacency needed + + //These are always reachable. + //User itself, current loc, and user inventory + if(DirectAccess(A)) if(W) - melee_item_attack_chain(src, W, A, params) + melee_item_attack_chain(src,W,A,params) else if(ismob(A)) changeNext_move(CLICK_CD_MELEE) UnarmedAttack(A) return - - if(!isturf(loc)) // This is going to stop you from telekinesing from inside a closet, but I don't shed many tears for that + + //Can't reach anything else in lockers or other weirdness + if(!loc.AllowClick()) return - // Allows you to click on a box's contents, if that box is on the ground, but no deeper than that - if(isturf(A) || isturf(A.loc) || (A.loc && isturf(A.loc.loc))) - if(Adjacent(A) || (W && CheckReach(src, A, W.reach))) //Adjacent or reaching attacks - if(W) - melee_item_attack_chain(src, W, A, params) - else - if(ismob(A)) - changeNext_move(CLICK_CD_MELEE) - UnarmedAttack(A, 1) - return - else // non-adjacent click - if(W) - W.afterattack(A,src,0,params) // 0: not Adjacent - else - RangedAttack(A, params) + //Standard reach turf to turf or reaching inside storage + if(CanReach(A,W)) + if(W) + melee_item_attack_chain(src,W,A,params) + else + if(ismob(A)) + changeNext_move(CLICK_CD_MELEE) + UnarmedAttack(A,1) + else + if(W) + W.afterattack(A,src,0,params) + else + RangedAttack(A,params) + +/atom/movable/proc/CanReach(atom/target,obj/item/tool,view_only = FALSE) + if(isturf(target) || isturf(target.loc) || DirectAccess(target)) //Directly accessible atoms + if(Adjacent(target) || (tool && CheckToolReach(src, target, tool.reach))) //Adjacent or reaching attacks + return TRUE + else + //Things inside storage insde another storage + //Eg Contents of a box in a backpack + var/atom/outer_storage = get_atom_on_turf(target) + if(outer_storage == target) //whatever that is we don't want infinite loop. + return FALSE + if(outer_storage && CanReach(outer_storage,tool) && outer_storage.CanReachStorage(target,src,view_only ? STORAGE_VIEW_DEPTH : INVENTORY_DEPTH)) + return TRUE + return FALSE + +//Can [target] in this container be reached by [user], can't be more than [depth] levels deep +/atom/proc/CanReachStorage(atom/target,user,depth) + return FALSE + +/obj/item/weapon/storage/CanReachStorage(atom/target,user,depth) + while(target && depth > 0) + target = target.loc + depth-- + if(target == src) + return TRUE + return FALSE + +/atom/movable/proc/DirectAccess(atom/target) + if(target == src) + return TRUE + if(target == loc) + return TRUE + +/mob/DirectAccess(atom/target) + if(..()) + return TRUE + if(target in contents) //This could probably use moving down and restricting to inventory only + return TRUE + return FALSE + +/mob/living/DirectAccess(atom/target) + if(..()) //Lightweight checks first + return TRUE + if(target in GetAllContents()) + return TRUE + +/atom/proc/AllowClick() + return FALSE + +/turf/AllowClick() + return TRUE -/proc/CheckReach(atom/movable/here, atom/movable/there, reach) +/proc/CheckToolReach(atom/movable/here, atom/movable/there, reach) if(!here || !there) return switch(reach) if(0) - return here.loc == there.loc + return FALSE if(1) - return here.Adjacent(there) + return FALSE //here.Adjacent(there) if(2 to INFINITY) - var/obj/dummy = new(get_turf(here)) //We'll try to move this every tick, failing if we can't + var/obj/dummy = new(get_turf(here)) dummy.pass_flags |= PASSTABLE + dummy.invisibility = INVISIBILITY_ABSTRACT for(var/i in 1 to reach) //Limit it to that many tries var/turf/T = get_step(dummy, get_dir(dummy, there)) - if(dummy.loc == there.loc) + if(dummy.CanReach(there)) qdel(dummy) - return 1 - if(there.density && dummy in range(1, there)) //For windows and suchlike - qdel(dummy) - return 1 + return TRUE if(!dummy.Move(T)) //we're blocked! qdel(dummy) return + qdel(dummy) // Default behavior: ignore double clicks (the second click that makes the doubleclick call already calls for a normal click) /mob/proc/DblClickOn(atom/A, params) @@ -304,21 +352,6 @@ /atom/proc/CtrlShiftClick(mob/user) return -/* - Helper to check can the mob click/access an item. - Used by mob inventory and storage items. -*/ -/atom/proc/ClickAccessible(mob/user, depth=1) - if(src == user.loc || (src in user.contents)) - return TRUE - - if(loc && depth > 1) - return loc.ClickAccessible(user, depth-1) - -/turf/ClickAccessible(mob/user, depth=1) - return - - /* Misc helpers diff --git a/code/game/objects/items/weapons/storage/internal.dm b/code/game/objects/items/weapons/storage/internal.dm index 540ff0f206..cfdc6cc354 100644 --- a/code/game/objects/items/weapons/storage/internal.dm +++ b/code/game/objects/items/weapons/storage/internal.dm @@ -5,10 +5,6 @@ w_class = WEIGHT_CLASS_BULKY rustle_jimmies = FALSE -/obj/item/weapon/storage/internal/ClickAccessible(mob/user, depth=1) - if(loc) - return loc.ClickAccessible(user, depth) - /obj/item/weapon/storage/internal/Adjacent(A) if(loc) return loc.Adjacent(A) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 08e947c45d..b1378617b8 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -38,7 +38,7 @@ return // this must come before the screen objects only block, dunno why it wasn't before - if(over_object == M && (src.ClickAccessible(M, depth=STORAGE_VIEW_DEPTH) || Adjacent(M))) + if(over_object == M && M.CanReach(src,view_only = TRUE)) orient2hud(M) if(M.s_active) M.s_active.close(M) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index fe0f5b3918..75f29408fe 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -450,7 +450,7 @@ if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1)//separated from our puller and not in the middle of a diagonal move. pulledby.stop_pulling() - if (s_active && !(s_active.ClickAccessible(src, depth=STORAGE_VIEW_DEPTH) || s_active.Adjacent(src))) + if (s_active && !(CanReach(s_active,view_only = TRUE))) s_active.close(src) /mob/living/movement_delay(ignorewalk = 0) From 1f349ecc728b3a2aad02de26d9fe7864497c4af1 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 8 May 2017 13:50:07 -0500 Subject: [PATCH 182/352] Add Slime Scanner to Autolathe --- code/modules/research/designs.dm | 2 +- code/modules/research/designs/autolathe_designs.dm | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 15d8e5e80c..218b34517b 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -595,7 +595,7 @@ other types of metals and chemistry for reagents). materials = list(MAT_METAL=200, MAT_GLASS=100) build_path = /obj/item/weapon/disk/plantgene category = list("Electronics") - + ///////////////////////////////////////// ////////////Janitor Designs////////////// ///////////////////////////////////////// diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 9f2fbda1f3..500a83c05f 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -783,3 +783,12 @@ materials = list(MAT_METAL = 2000, MAT_GLASS = 1000) build_path = /obj/item/device/modular_computer/tablet category = list("initial","Misc") + +/datum/design/slime_scanner + name = "Slime Scanner" + id = "slime_scanner" + build_type = AUTOLATHE + materials = list(MAT_METAL = 300, MAT_GLASS = 200) + build_path = /obj/item/device/slime_scanner + category = list("initial", "Misc") + \ No newline at end of file From 92bbdafc9468711a4143901e2d16ce4d88f7a7a8 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 8 May 2017 18:43:37 -0500 Subject: [PATCH 183/352] Adjusts Meteor Shuttle name for grammar (#862) --- code/datums/shuttles.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index 774e0794ff..d3427ac983 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -72,7 +72,7 @@ /datum/map_template/shuttle/emergency/meteor suffix = "meteor" - name = "An Asteroid With Engines Strapped To It" + name = "Asteroid With Engines Strapped To It" description = "A hollowed out asteroid with engines strapped to it. Due to its size and difficulty in steering it, this shuttle may damage the docking area." admin_notes = "This shuttle will likely crush escape, killing anyone there." credit_cost = -5000 From e94e1efb4f6c362be4c68b99fdf24bfbdb7816fc Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 8 May 2017 18:43:38 -0500 Subject: [PATCH 184/352] Automatic changelog generation for PR #862 [ci skip] --- html/changelogs/AutoChangeLog-pr-862.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-862.yml diff --git a/html/changelogs/AutoChangeLog-pr-862.yml b/html/changelogs/AutoChangeLog-pr-862.yml new file mode 100644 index 0000000000..65ab5ed7f9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-862.yml @@ -0,0 +1,4 @@ +author: "Penguaro" +delete-after: True +changes: + - tweak: "Adjusts Meteor Shuttle Name" From c506b6c7ce2342ab772bbf441d555c20eb5a8ea1 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 8 May 2017 18:44:11 -0500 Subject: [PATCH 185/352] Makes initial adamantine golem shells non-anchored and non-dense (#856) --- code/game/objects/structures/ghost_role_spawners.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index d087b14390..bb55084dd9 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -155,8 +155,6 @@ name = "dust-caked golem shell" desc = "A humanoid shape, empty, lifeless, and full of potential." mob_name = "a free golem" - anchored = 1 - density = 1 can_transfer = FALSE mob_species = /datum/species/golem/adamantine From 44c29c6193b8f26a9847e299dd6372fe63808f58 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 8 May 2017 18:44:38 -0500 Subject: [PATCH 186/352] Fixes clothing damage message (#831) --- code/modules/clothing/clothing.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 20f59d0435..80547c4db9 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -161,7 +161,9 @@ /obj/item/clothing/obj_break(damage_flag) if(!damaged_clothes) update_clothes_damaged_state(TRUE) - to_chat(usr, "Your [src] starts to fall apart!") + if(ismob(loc)) //It's not important enough to warrant a message if nobody's wearing it + var/mob/M = loc + M.visible_message("[M]'s [name] starts to fall apart!", "Your [name] starts to fall apart!") /obj/item/clothing/proc/update_clothes_damaged_state(damaging = TRUE) var/index = "\ref[initial(icon)]-[initial(icon_state)]" From 53dba37fca900a9f31ce1bfa377e066a6c1102ff Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 8 May 2017 18:44:59 -0500 Subject: [PATCH 187/352] Fixes decals on shuttles (#855) --- code/game/turfs/turf.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 4c29d87dfa..618894f207 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -455,6 +455,8 @@ O = new() O.underlays.Add(T) T.ChangeTurf(type) + for(var/group in decals) + T.add_decal(decals[group],group) if(underlays.len) T.underlays = O.underlays if(T.icon_state != icon_state) From 8e0e77cd35ad529d7f842fe77284342e11504cf0 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 8 May 2017 18:45:59 -0500 Subject: [PATCH 188/352] Nerfs Chaplain smoke book. (#758) --- _maps/map_files/Deltastation/DeltaStation2.dmm | 2 +- _maps/map_files/MetaStation/MetaStation.dmm | 2 +- code/game/gamemodes/wizard/spellbook.dm | 4 ++++ code/modules/spells/spell_types/wizard.dm | 18 ++++++++++++++++++ 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 974eeba515..267a2a7b50 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -108176,7 +108176,7 @@ /area/maintenance/fpmaint2/aft_port_maintenance) "dXu" = ( /obj/structure/table/wood/fancy, -/obj/item/weapon/spellbook/oneuse/smoke, +/obj/item/weapon/spellbook/oneuse/smoke/lesser, /obj/item/weapon/nullrod, /obj/item/organ/heart, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index c70792e686..4382ec68d4 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -82487,7 +82487,7 @@ /area/chapel/office) "cMa" = ( /obj/structure/table/wood, -/obj/item/weapon/spellbook/oneuse/smoke{ +/obj/item/weapon/spellbook/oneuse/smoke/lesser{ name = "mysterious old book of " }, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater{ diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index b25187195d..06e241896f 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -778,6 +778,9 @@ icon_state ="booksmoke" desc = "This book is overflowing with the dank arts." +/obj/item/weapon/spellbook/oneuse/smoke/lesser //Chaplain smoke book + spell = /obj/effect/proc_holder/spell/targeted/smoke/lesser + /obj/item/weapon/spellbook/oneuse/smoke/recoil(mob/user) ..() to_chat(user,"Your stomach rumbles...") @@ -786,6 +789,7 @@ if(user.nutrition <= 0) user.nutrition = 0 + /obj/item/weapon/spellbook/oneuse/blind spell = /obj/effect/proc_holder/spell/targeted/trigger/blind spellname = "blind" diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm index 66bc198311..76f5b9b307 100644 --- a/code/modules/spells/spell_types/wizard.dm +++ b/code/modules/spells/spell_types/wizard.dm @@ -69,6 +69,24 @@ action_icon_state = "smoke" + +/obj/effect/proc_holder/spell/targeted/smoke/lesser //Chaplain smoke book + name = "Smoke" + desc = "This spell spawns a small cloud of choking smoke at your location." + + school = "conjuration" + charge_max = 360 + clothes_req = 0 + invocation = "none" + invocation_type = "none" + range = -1 + include_user = 1 + + smoke_spread = 1 + smoke_amt = 2 + + action_icon_state = "smoke" + /obj/effect/proc_holder/spell/targeted/emplosion/disable_tech name = "Disable Tech" desc = "This spell disables all weapons, cameras and most other technology in range." From 4895d84fb96168afc1eafdf06951b2d22b274d16 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 8 May 2017 18:46:00 -0500 Subject: [PATCH 189/352] Automatic changelog generation for PR #758 [ci skip] --- html/changelogs/AutoChangeLog-pr-758.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-758.yml diff --git a/html/changelogs/AutoChangeLog-pr-758.yml b/html/changelogs/AutoChangeLog-pr-758.yml new file mode 100644 index 0000000000..fff062e111 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-758.yml @@ -0,0 +1,6 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "Lesser smoke book to Delta and Metastation" + - rscdel: "Normal smoke book from Delta and Metastation" + - tweak: "Civilian smoke book now has a 360 max cooldown (from 120) and halved smoke output." From c782e15d64fcc8d97a252d24961afab7f03df177 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 8 May 2017 18:47:21 -0500 Subject: [PATCH 190/352] [MIRROR] Fix server hop (#740) * Fix server hop * Delete new_player.dm.rej --- code/modules/mob/dead/dead.dm | 9 ++++++++- code/modules/mob/dead/new_player/new_player.dm | 11 ++++------- code/modules/mob/dead/observer/observer.dm | 1 + 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 666222aa27..dcd4762d64 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -3,9 +3,16 @@ INITIALIZE_IMMEDIATE(/mob/dead) /mob/dead/Initialize() - . = ..() + if(initialized) + stack_trace("Warning: [src]([type]) initialized multiple times!") + tag = "mob_[next_mob_id++]" + GLOB.mob_list += src + + prepare_huds() + if(config.cross_allowed) verbs += /mob/dead/proc/server_hop + return INITIALIZE_HINT_NORMAL /mob/dead/dust() //ghosts can't be vaporised. return diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index bc00dc395a..e3943d07e6 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -16,12 +16,6 @@ var/mob/living/new_character //for instant transfer once the round is set up /mob/dead/new_player/Initialize() - if(initialized) - stack_trace("Warning: [src]([type]) initialized multiple times!") - initialized = TRUE - tag = "mob_[next_mob_id++]" - GLOB.mob_list += src - if(client && SSticker.state == GAME_STATE_STARTUP) var/obj/screen/splash/S = new(client, TRUE, TRUE) S.Fade(TRUE) @@ -30,7 +24,10 @@ loc = pick(GLOB.newplayer_start) else loc = locate(1,1,1) - return INITIALIZE_HINT_NORMAL + . = ..() + +/mob/dead/new_player/prepare_huds() + return /mob/dead/new_player/proc/new_player_panel() diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 7f2c6d6485..7331312173 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -118,6 +118,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) animate(src, pixel_y = 2, time = 10, loop = -1) grant_all_languages() + GLOB.dead_mob_list += src ..() /mob/dead/observer/narsie_act() From 9abfbb46d457f201358d09a28f240d0ed309c28d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 8 May 2017 18:47:35 -0500 Subject: [PATCH 191/352] Fixes female undershirts showing all the time (#741) --- code/modules/mob/living/carbon/human/species.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 2c034dc64f..48f0dc8477 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -354,7 +354,7 @@ var/datum/sprite_accessory/undershirt/undershirt = GLOB.undershirt_list[H.undershirt] if(undershirt) if(H.dna.species.sexes && H.gender == FEMALE) - standing += wear_female_version(undershirt.icon_state, undershirt.icon, -BODY_LAYER) + standing += wear_female_version(undershirt.icon_state, undershirt.icon, BODY_LAYER) else standing += mutable_appearance(undershirt.icon, undershirt.icon_state, -BODY_LAYER) From 5c8a9c53420dc5cfbdf86010ddf93b3e8fba292e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 8 May 2017 18:48:28 -0500 Subject: [PATCH 192/352] Syndicate borg/reinforcement spawners have a Never For This Round option. (#851) --- code/_globalvars/lists/poll_ignore.dm | 1 + code/game/gamemodes/antag_spawner.dm | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/code/_globalvars/lists/poll_ignore.dm b/code/_globalvars/lists/poll_ignore.dm index ff6a4edd40..fadd68526d 100644 --- a/code/_globalvars/lists/poll_ignore.dm +++ b/code/_globalvars/lists/poll_ignore.dm @@ -5,5 +5,6 @@ #define POLL_IGNORE_POSSESSED_BLADE "possessed_blade" #define POLL_IGNORE_ALIEN_LARVA "alien_larva" #define POLL_IGNORE_CLOCKWORK_MARAUDER "clockwork_marauder" +#define POLL_IGNORE_SYNDICATE "syndicate" GLOBAL_LIST_EMPTY(poll_ignore) diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index 74c16cf132..5b568970d9 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -155,7 +155,8 @@ if(!(check_usability(user))) return - var/list/nuke_candidates = pollCandidatesForMob("Do you want to play as a syndicate [borg_to_spawn ? "[lowertext(borg_to_spawn)] cyborg":"operative"]?", ROLE_OPERATIVE, null, ROLE_OPERATIVE, 150, src) + to_chat(user, "You activate [src] and wait for confirmation.") + var/list/nuke_candidates = pollCandidatesForMob("Do you want to play as a syndicate [borg_to_spawn ? "[lowertext(borg_to_spawn)] cyborg":"operative"]?", ROLE_OPERATIVE, null, ROLE_OPERATIVE, 150, POLL_IGNORE_SYNDICATE, src) if(nuke_candidates.len) if(!(check_usability(user))) return From c7b78203a557a0c1ce4e90c511641dc4d7316397 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 8 May 2017 18:48:44 -0500 Subject: [PATCH 193/352] Fixes spelling error when implanting BITTEN organs (#847) --- code/modules/surgery/organ_manipulation.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm index 6e3c224924..9d88e491b2 100644 --- a/code/modules/surgery/organ_manipulation.dm +++ b/code/modules/surgery/organ_manipulation.dm @@ -106,7 +106,7 @@ "You begin to mend the incision in [target]'s [parse_zone(target_zone)]...") else if(istype(tool, /obj/item/weapon/reagent_containers/food/snacks/organ)) - to_chat(user, "[tool] was biten by someone! It's too damaged to use!") + to_chat(user, "[tool] was bitten by someone! It's too damaged to use!") return -1 /datum/surgery_step/manipulate_organs/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) From faf8829d30204671443040ccb1a3c99e90250a89 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 9 May 2017 00:16:09 -0500 Subject: [PATCH 194/352] [MIRROR] Adamantine golem leadership (#785) * Adamantine golem leadership * Update stylesheet.dm * Delete golems.dm.rej * Delete stylesheet.dm.rej * Update golems.dm * fuck line endings --- .../objects/items/stacks/sheets/mineral.dm | 8 +++ .../carbon/human/species_types/golems.dm | 55 +++++++++--------- .../chemistry/recipes/slime_extracts.dm | 21 ++----- code/modules/ruins/lavaland_ruin_code.dm | 3 + code/modules/surgery/organs/vocal_cords.dm | 34 +++++++++++ icons/obj/surgery.dmi | Bin 29118 -> 30870 bytes interface/stylesheet.dm | 1 + 7 files changed, 80 insertions(+), 42 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index f32fc2cea4..e76def6eee 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -335,12 +335,20 @@ GLOBAL_LIST_INIT(snow_recipes, list ( \ /* * Adamantine */ +GLOBAL_LIST_INIT(adamantine_recipes, list( + new /datum/stack_recipe("artificial golem shell", /obj/item/golem_shell/artificial, req_amount=1, res_amount=1), + )) + /obj/item/stack/sheet/mineral/adamantine name = "adamantine" icon_state = "sheet-adamantine" singular_name = "adamantine sheet" origin_tech = "materials=4" +/obj/item/stack/sheet/mineral/adamantine/Initialize(mapload, new_amount, merge = TRUE) + recipes = GLOB.adamantine_recipes + ..() + /* * Mythril */ diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 42608e1e5d..e56b2221ba 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -9,7 +9,7 @@ punchdamagelow = 5 punchdamagehigh = 14 punchstunthreshold = 11 //about 40% chance to stun - no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_w_uniform, slot_s_store) + no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_w_uniform, slot_s_store) nojumpsuit = 1 sexes = 1 damage_overlay_type = "" @@ -20,6 +20,7 @@ dangerous_existence = TRUE limbs_id = "golem" fixed_mut_color = "aaa" + mutant_organs = list(/obj/item/organ/adamantine_resonator) var/info_text = "As an Iron Golem, you don't have any special traits." var/prefix = "Iron" @@ -54,8 +55,9 @@ name = "Adamantine Golem" id = "adamantine golem" meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/golem/adamantine + mutant_organs = list(/obj/item/organ/adamantine_resonator, /obj/item/organ/vocal_cords/adamantine) fixed_mut_color = "4ed" - info_text = "As an Adamantine Golem, you don't have any special traits." + info_text = "As an Adamantine Golem, you possess special vocal cords allowing you to \"resonate\" messages to all golems." prefix = "Adamantine" //Explodes on death @@ -71,14 +73,14 @@ prefix = "Plasma" special_names = list("Flood","Fire","Bar","Man") -/datum/species/golem/plasma/spec_life(mob/living/carbon/human/H) - if(H.bodytemperature > 900 && H.on_fire) - explosion(get_turf(H),1,2,4,flame_range = 5) - if(H) - H.gib() - if(H.fire_stacks < 2) //flammable - H.adjust_fire_stacks(1) - ..() +/datum/species/golem/plasma/spec_life(mob/living/carbon/human/H) + if(H.bodytemperature > 900 && H.on_fire) + explosion(get_turf(H),1,2,4,flame_range = 5) + if(H) + H.gib() + if(H.fire_stacks < 2) //flammable + H.adjust_fire_stacks(1) + ..() //Harder to hurt /datum/species/golem/diamond @@ -505,7 +507,7 @@ sexes = FALSE info_text = "As a Runic Golem, you possess eldritch powers granted by the Elder God Nar'Sie." species_traits = list(NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER) //no mutcolors - prefix = "Runic" + prefix = "Runic" var/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/golem/phase_shift var/obj/effect/proc_holder/spell/targeted/abyssal_gaze/abyssal_gaze @@ -643,18 +645,19 @@ if(P.is_hot()) visible_message("[src] bursts into flames!") - fire_act() -/datum/species/golem/plastic - name = "Plastic" - id = "plastic golem" - prefix = "Plastic" - fixed_mut_color = "fff" - info_text = "As a Plastic Golem, you are capable of ventcrawling, and passing through plastic flaps." - -/datum/species/golem/plastic/on_species_gain(mob/living/carbon/C, datum/species/old_species) - . = ..() - C.ventcrawler = VENTCRAWLER_NUDE - -/datum/species/golem/plastic/on_species_loss(mob/living/carbon/C) - . = ..() - C.ventcrawler = initial(C.ventcrawler) + + fire_act() +/datum/species/golem/plastic + name = "Plastic" + id = "plastic golem" + prefix = "Plastic" + fixed_mut_color = "fff" + info_text = "As a Plastic Golem, you are capable of ventcrawling, and passing through plastic flaps." + +/datum/species/golem/plastic/on_species_gain(mob/living/carbon/C, datum/species/old_species) + . = ..() + C.ventcrawler = VENTCRAWLER_NUDE + +/datum/species/golem/plastic/on_species_loss(mob/living/carbon/C) + . = ..() + C.ventcrawler = initial(C.ventcrawler) diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index a1c4a74795..c507dd6794 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -477,26 +477,15 @@ ..() //Adamantine -/datum/chemical_reaction/slime/slimegolem - name = "Slime Golem" - id = "m_golem" +/datum/chemical_reaction/slime/adamantine + name = "Adamantine" + id = "adamantine" required_reagents = list("plasma" = 1) required_container = /obj/item/slime_extract/adamantine required_other = 1 -/datum/chemical_reaction/slime/slimegolem/on_reaction(datum/reagents/holder) - new /obj/effect/golemrune(get_turf(holder.my_atom)) - ..() - -/datum/chemical_reaction/slime/slimegolem2 - name = "Slime Golem 2" - id = "m_golem2" - required_reagents = list("iron" = 1) - required_container = /obj/item/slime_extract/adamantine - required_other = 1 - -/datum/chemical_reaction/slime/slimegolem2/on_reaction(datum/reagents/holder) - new /obj/item/golem_shell/artificial(get_turf(holder.my_atom)) +/datum/chemical_reaction/slime/adamantine/on_reaction(datum/reagents/holder) + new /obj/item/stack/sheet/mineral/adamantine(get_turf(holder.my_atom)) ..() //Bluespace diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index 1007b32fe2..b34986c75f 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -107,6 +107,9 @@ if(istype(O, /obj/item/stack/sheet/plastic)) species = /datum/species/golem/plastic + if(istype(O, /obj/item/stack/sheet/mineral/adamantine)) + species = /datum/species/golem/adamantine + if(species) if(O.use(10)) to_chat(user, "You finish up the golem shell with ten sheets of [O].") diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 50f66fef27..e817557cc2 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -20,6 +20,40 @@ /obj/item/organ/vocal_cords/proc/handle_speech(message) //actually say the message owner.say(message, spans = spans, sanitize = FALSE) +/obj/item/organ/adamantine_resonator + name = "adamantine resonator" + desc = "Fragments of adamantine exists in all golems, stemming from their origins as purely magical constructs. These are used to \"hear\" messages from their leaders." + zone = "head" + slot = "adamantine_resonator" + icon_state = "adamantine_resonator" + +/obj/item/organ/vocal_cords/adamantine + name = "adamantine vocal cords" + desc = "When adamantine resonates, it causes all nearby pieces of adamantine to resonate as well. Adamantine golems use this to broadcast messages to nearby golems." + actions_types = list(/datum/action/item_action/organ_action/use/adamantine_vocal_cords) + zone = "mouth" + slot = "vocal_cords" + icon_state = "adamantine_cords" + +/datum/action/item_action/organ_action/use/adamantine_vocal_cords/Trigger() + if(!IsAvailable()) + return + var/message = input(owner, "Resonate a message to all nearby golems.", "Resonate") + if(QDELETED(src) || QDELETED(owner) || !message) + return + owner.say(".x[message]") + +/obj/item/organ/vocal_cords/adamantine/handle_speech(message) + var/msg = "[owner.real_name] resonates, \"[message]\"" + for(var/m in GLOB.player_list) + if(iscarbon(m)) + var/mob/living/carbon/C = m + if(C.getorganslot("adamantine_resonator")) + to_chat(C, msg) + if(isobserver(m)) + var/link = FOLLOW_LINK(m, src) + to_chat(m, "[link] [msg]") + //Colossus drop, forces the listeners to obey certain commands /obj/item/organ/vocal_cords/colossus name = "divine vocal cords" diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 19d6275d785108cfeac96ebff99ccaeeddd9bbd8..78657abe361504ce5cc19ee7c7890fa851d580f6 100644 GIT binary patch literal 30870 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"} From 46d1f5575acec001cb87339cae24c4028d0d951d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 9 May 2017 00:16:11 -0500 Subject: [PATCH 195/352] Automatic changelog generation for PR #785 [ci skip] --- html/changelogs/AutoChangeLog-pr-785.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-785.yml diff --git a/html/changelogs/AutoChangeLog-pr-785.yml b/html/changelogs/AutoChangeLog-pr-785.yml new file mode 100644 index 0000000000..608a090249 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-785.yml @@ -0,0 +1,14 @@ +author: "coiax" +delete-after: True +changes: + - rscadd: "Adamantine golems have special vocal cords that allow them to send +one-way messages to all golems, due to fragments of resonating +adamantine in their heads. Both of these are organs, and can be removed +and put in other species." + - rscadd: "You can use adamantine vocal cords by prefixing your message with +\":x\"." + - rscdel: "Xenobiology is no longer capable of making golem runes with plasma. +Instead, inject plasma into the adamantine slime core to get bars of adamantine +which you can then craft into an incomplete golem shell. Add 10 sheets of +suitable material to finish the shell." + - experiment: "The metal adamantine is also quite valuable when sold via cargo." From 0c5d7796f8ac7d30a5ca8b3ec5ffb488cbad056d Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Mon, 8 May 2017 22:39:50 -0700 Subject: [PATCH 196/352] Update useless.txt --- useless.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/useless.txt b/useless.txt index a266fc16c1..6be878be07 100644 --- a/useless.txt +++ b/useless.txt @@ -1 +1 @@ -no, really \ No newline at end of file +no, really From ba0f4b1c598d0710dcac8fa0975c8d10dc7adb28 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 9 May 2017 00:46:42 -0500 Subject: [PATCH 197/352] TGUI GPS (#608) --- code/game/objects/items/devices/gps.dm | 110 ++++++++++++++++++------- tgui/assets/tgui.css | 2 +- tgui/assets/tgui.js.rej | 36 ++++++++ tgui/src/interfaces/gps.ract | 30 +++++++ 4 files changed, 148 insertions(+), 30 deletions(-) create mode 100644 tgui/assets/tgui.js.rej create mode 100644 tgui/src/interfaces/gps.ract diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 00e221918c..2764d54d82 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -11,6 +11,9 @@ GLOBAL_LIST_EMPTY(GPS_list) var/emped = FALSE var/turf/locked_location var/tracking = TRUE + var/updating = TRUE //Automatic updating of GPS list. Can be set to manual by user. + var/global_mode = TRUE //If disabled, only GPS signals of the same Z level are shown + /obj/item/device/gps/Initialize() ..() @@ -27,6 +30,7 @@ GLOBAL_LIST_EMPTY(GPS_list) cut_overlay("working") add_overlay("emp") addtimer(CALLBACK(src, .proc/reboot), 300, TIMER_OVERRIDE) //if a new EMP happens, remove the old timer so it doesn't reactivate early + SStgui.close_uis(src) //Close the UI control if it is open. /obj/item/device/gps/proc/reboot() emped = FALSE @@ -34,6 +38,9 @@ GLOBAL_LIST_EMPTY(GPS_list) add_overlay("working") /obj/item/device/gps/AltClick(mob/user) + toggletracking(user) + +/obj/item/device/gps/proc/toggletracking(mob/user) if(!user.canUseTopic(src, be_close=TRUE)) return //user not valid to use gps if(emped) @@ -48,36 +55,81 @@ GLOBAL_LIST_EMPTY(GPS_list) to_chat(user, "[src] is now tracking, and visible to other GPS devices.") tracking = TRUE -/obj/item/device/gps/attack_self(mob/user) - if(!tracking) - to_chat(user, "[src] is turned off. Use alt+click to toggle it back on.") - return - var/obj/item/device/gps/t = "" - var/gps_window_height = 110 + GLOB.GPS_list.len * 20 // Variable window height, depending on how many GPS units there are to show +/obj/item/device/gps/ui_interact(mob/user, ui_key = "gps", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) // Remember to use the appropriate state. if(emped) - t += "ERROR" - else - t += "
Set Tag " - t += "
Tag: [gpstag]" - if(locked_location && locked_location.loc) - t += "
Bluespace coordinates saved: [locked_location.loc]" - gps_window_height += 20 - - for(var/obj/item/device/gps/G in GLOB.GPS_list) - var/turf/pos = get_turf(G) - var/area/gps_area = get_area(G) - var/tracked_gpstag = G.gpstag - if(G.emped == 1) - t += "
[tracked_gpstag]: ERROR" - else if(G.tracking) - t += "
[tracked_gpstag]: [format_text(gps_area.name)] ([pos.x], [pos.y], [pos.z])" - else - continue - var/datum/browser/popup = new(user, "GPS", name, 360, min(gps_window_height, 800)) - popup.set_content(t) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() + to_chat(user, "[src] fizzles weakly.") + return + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + var/gps_window_height = 300 + GLOB.GPS_list.len * 20 // Variable window height, depending on how many GPS units there are to show + ui = new(user, src, ui_key, "gps", "Global Positioning System", 600, gps_window_height, master_ui, state) //width, height + ui.open() + + ui.set_autoupdate(state = updating) + + +/obj/item/device/gps/ui_data(mob/user) + var/list/data = list() + data["power"] = tracking + data["tag"] = gpstag + data["updating"] = updating + data["globalmode"] = global_mode + if(!tracking || emped) //Do not bother scanning if the GPS is off or EMPed + return data + + var/turf/curr = get_turf(src) + data["current"] = "[get_area_name(curr)] ([curr.x], [curr.y], [curr.z])" + + var/list/signals = list() + data["signals"] = list() + + for(var/gps in GLOB.GPS_list) + var/obj/item/device/gps/G = gps + if(G.emped || !G.tracking || G == src) + continue + var/turf/pos = get_turf(G) + if(!global_mode && pos.z != curr.z) + continue + var/area/gps_area = get_area_name(G) + var/list/signal = list() + signal["entrytag"] = G.gpstag //Name or 'tag' of the GPS + signal["area"] = format_text(gps_area) + signal["coord"] = "[pos.x], [pos.y], [pos.z]" + if(pos.z == curr.z) //Distance/Direction calculations for same z-level only + signal["dist"] = max(get_dist(curr, pos), 0) //Distance between the src and remote GPS turfs + signal["degrees"] = round(Get_Angle(curr, pos)) //0-360 degree directional bearing, for more precision. + var/direction = uppertext(dir2text(get_dir(curr, pos))) //Direction text (East, etc). Not as precise, but still helpful. + if(!direction) + direction = "CENTER" + signal["degrees"] = "N/A" + signal["direction"] = direction + + signals += list(signal) //Add this signal to the list of signals + data["signals"] = signals + return data + + + +/obj/item/device/gps/ui_act(action, params) + if(..()) + return + switch(action) + if("rename") + var/a = input("Please enter desired tag.", name, gpstag) as text + a = uppertext(copytext(sanitize(a), 1, 5)) + gpstag = a + name = "global positioning system ([gpstag])" + . = TRUE + if("power") + toggletracking(usr) + . = TRUE + if("updating") + updating = !updating + . = TRUE + if("globalmode") + global_mode = !global_mode + . = TRUE /obj/item/device/gps/Topic(href, href_list) ..() @@ -157,4 +209,4 @@ GLOBAL_LIST_EMPTY(GPS_list) clear() tagged = null STOP_PROCESSING(SSfastprocess, src) - . = ..() + . = ..() \ No newline at end of file diff --git a/tgui/assets/tgui.css b/tgui/assets/tgui.css index d52500b9d6..531fb00530 100644 --- a/tgui/assets/tgui.css +++ b/tgui/assets/tgui.css @@ -1 +1 @@ -@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.clockwork{background:linear-gradient(180deg,#b18b25 0,#5f380e);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffb18b25',endColorstr='#ff5f380e',GradientType=0)}body.clockwork .normal{color:#b18b25}body.clockwork .good{color:#cfba47}body.clockwork .average{color:#896b19}body.clockwork .bad{color:#5f380e}body.clockwork .highlight{color:#b18b25}body.clockwork main{display:block;margin-top:32px;padding:2px 6px 0}body.clockwork hr{height:2px;background-color:#b18b25;border:none}body.clockwork .hidden{display:none}body.clockwork .bar .barText,body.clockwork span.button{color:#b18b25;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.clockwork .bold{font-weight:700}body.clockwork .italic{font-style:italic}body.clockwork [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.clockwork div[data-tooltip],body.clockwork span[data-tooltip]{position:relative}body.clockwork div[data-tooltip]:after,body.clockwork span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #170800;background-color:#2d1400}body.clockwork div[data-tooltip]:hover:after,body.clockwork span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.clockwork div[data-tooltip].tooltip-top:after,body.clockwork span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork div[data-tooltip].tooltip-top:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-top:hover:after{-webkit-transform:translateX(-50%) translateY(-8px);-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-bottom:after{top:100%;left:50%}body.clockwork div[data-tooltip].tooltip-bottom:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:hover:after{-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-left:after,body.clockwork span[data-tooltip].tooltip-left:after{top:50%;right:100%;-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-left:hover:after,body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-left:hover:after,body.clockwork span[data-tooltip].tooltip-right:after{-webkit-transform:translateX(-8px) translateY(-50%);-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-right:after{top:50%;left:100%}body.clockwork div[data-tooltip].tooltip-right:hover:after,body.clockwork span[data-tooltip].tooltip-right:hover:after{-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #170800;background:#2d1400}body.clockwork .bar .barText{position:absolute;top:0;right:3px}body.clockwork .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#b18b25}body.clockwork .bar .barFill.good{background-color:#cfba47}body.clockwork .bar .barFill.average{background-color:#896b19}body.clockwork .bar .barFill.bad{background-color:#5f380e}body.clockwork span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #170800}body.clockwork span.button .fa{padding-right:2px}body.clockwork span.button.normal{transition:background-color .5s;background-color:#5f380e}body.clockwork span.button.normal.active:focus,body.clockwork span.button.normal.active:hover{transition:background-color .25s;background-color:#704211;outline:0}body.clockwork span.button.disabled{transition:background-color .5s;background-color:#2d1400}body.clockwork span.button.disabled.active:focus,body.clockwork span.button.disabled.active:hover{transition:background-color .25s;background-color:#441e00;outline:0}body.clockwork span.button.selected{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.selected.active:focus,body.clockwork span.button.selected.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.toggle{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.toggle.active:focus,body.clockwork span.button.toggle.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.caution{transition:background-color .5s;background-color:#be6209}body.clockwork span.button.caution.active:focus,body.clockwork span.button.caution.active:hover{transition:background-color .25s;background-color:#cd6a0a;outline:0}body.clockwork span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.clockwork span.button.danger.active:focus,body.clockwork span.button.danger.active:hover{transition:background-color .25s;background-color:#abaf00;outline:0}body.clockwork span.button.gridable{width:125px;margin:2px 0}body.clockwork span.button+span:not(.button),body.clockwork span:not(.button)+span.button{margin-left:5px}body.clockwork div.display{width:100%;padding:4px;margin:6px 0;background-color:#2d1400;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400);background-color:rgba(45,20,0,.9);box-shadow:inset 0 0 5px rgba(0,0,0,.3)}body.clockwork div.display header,body.clockwork div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#cfba47;border-bottom:2px solid #b18b25}body.clockwork div.display header .buttonRight,body.clockwork div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.clockwork div.display article,body.clockwork div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.clockwork input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#b18b25;background-color:#cfba47;border:1px solid #272727}body.clockwork input::-webkit-input-placeholder{color:#999}body.clockwork input::-moz-placeholder{color:#999}body.clockwork input:-ms-input-placeholder{color:#999}body.clockwork input::placeholder{color:#999}body.clockwork input::-ms-clear{display:none}body.clockwork svg.linegraph{overflow:hidden}body.clockwork div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#2d1400;font-weight:700;font-style:italic;background-color:#000;background-image:repeating-linear-gradient(-45deg,#000,#000 10px,#170800 0,#170800 20px)}body.clockwork div.notice .label{color:#2d1400}body.clockwork div.notice .content:only-of-type{padding:0}body.clockwork div.notice hr{background-color:#896b19}body.clockwork div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #5f380e;-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}body.clockwork section .content,body.clockwork section .label,body.clockwork section .line,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.clockwork section{display:table-row;width:100%}body.clockwork section:not(:first-child){padding-top:4px}body.clockwork section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.clockwork section .label{width:1%;padding-right:32px;white-space:nowrap;color:#b18b25}body.clockwork section .content:not(:last-child){padding-right:16px}body.clockwork section .line{width:100%}body.clockwork div.subdisplay{width:100%;margin:0}body.clockwork header.titlebar .close,body.clockwork header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#cfba47}body.clockwork header.titlebar .close:hover,body.clockwork header.titlebar .minimize:hover{color:#d1bd50}body.clockwork header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#5f380e;border-bottom:1px solid #170800;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.clockwork header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.clockwork header.titlebar .title{position:absolute;top:6px;left:46px;color:#cfba47;font-size:16px;white-space:nowrap}body.clockwork header.titlebar .minimize{position:absolute;top:6px;right:46px}body.clockwork header.titlebar .close{position:absolute;top:4px;right:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCA0MjUgMjAwIiBvcGFjaXR5PSIuMzMiPgogIDxwYXRoIGQ9Im0gMTc4LjAwMzk5LDAuMDM4NjkgLTcxLjIwMzkzLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM0LDYuMDI1NTUgbCAwLDE4Ny44NzE0NyBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgNi43NjEzNCw2LjAyNTU0IGwgNTMuMTA3MiwwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM1LC02LjAyNTU0IGwgMCwtMTAxLjU0NDAxOCA3Mi4yMTYyOCwxMDQuNjk5Mzk4IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA1Ljc2MDE1LDIuODcwMTYgbCA3My41NTQ4NywwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM1LC02LjAyNTU0IGwgMCwtMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNi43NjEzNSwtNi4wMjU1NSBsIC01NC43MTY0NCwwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNi43NjEzMyw2LjAyNTU1IGwgMCwxMDIuNjE5MzUgTCAxODMuNzY0MTMsMi45MDg4NiBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTUuNzYwMTQsLTIuODcwMTcgeiIgLz4KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPgogIDxwYXRoIGQ9Im0gNDIwLjE1NTM1LDE3Ny44OTExOSBhIDEzLjQxMjAzOCwxMi41MDE4NDIgMCAwIDEgLTguNjMyOTUsMjIuMDY5NTEgbCAtNjYuMTE4MzIsMCBhIDUuMzY0ODE1Miw1LjAwMDczNyAwIDAgMSAtNS4zNjQ4MiwtNS4wMDA3NCBsIDAsLTc5Ljg3OTMxIHoiIC8+Cjwvc3ZnPgo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4KPCEtLSBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvIC0tPgo=") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-webkit-transform:translateX(-50%) translateY(-8px);-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:after{-webkit-transform:translateX(-8px) translateY(-50%);-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input::-webkit-input-placeholder{color:#999}body.nanotrasen input::-moz-placeholder{color:#999}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCAyMDAgMjg5Ljc0MiIgb3BhY2l0eT0iLjMzIj4KICA8cGF0aCBkPSJtIDkzLjUzNzY3NywwIGMgLTE4LjExMzEyNSwwIC0zNC4yMjAxMzMsMy4xMTE2NCAtNDguMzIzNDg0LDkuMzM0MzcgLTEzLjk2NTA5Miw2LjIyMTY3IC0yNC42MTI0NDIsMTUuMDcxMTQgLTMxLjk0MDY1MSwyNi41NDcxIC03LjE4OTkzOTgsMTEuMzM3ODkgLTEwLjMwMTIyNjYsMjQuNzQ5MTEgLTEwLjMwMTIyNjYsNDAuMjM0NzggMCwxMC42NDY2MiAyLjcyNTAwMjYsMjAuNDY0NjUgOC4xNzUxMTE2LDI5LjQ1MjU4IDUuNjE1Mjc3LDguOTg2ODYgMTQuMDM4Mjc3LDE3LjM1MjA0IDI1LjI2ODgyMSwyNS4wOTQzNiAxMS4yMzA1NDQsNy42MDUzMSAyNi41MDc0MjEsMTUuNDE4MzUgNDUuODMwNTE0LDIzLjQzNzgyIDE5Ljk4Mzc0OCw4LjI5NTU3IDM0Ljg0ODg0OCwxNS41NTQ3MSA0NC41OTI5OTgsMjEuNzc2MzggOS43NDQxNCw2LjIyMjczIDE2Ljc2MTcsMTIuODU4NSAyMS4wNTU3MiwxOS45MDk1MSA0LjI5NDA0LDcuMDUyMDggNi40NDE5MywxNS43NjQwOCA2LjQ0MTkzLDI2LjEzNDU5IDAsMTYuMTc3MDIgLTUuMjAxOTYsMjguNDgyMjIgLTE1LjYwNjczLDM2LjkxNjgyIC0xMC4yMzk2LDguNDM0NyAtMjUuMDIyMDMsMTIuNjUyMyAtNDQuMzQ1MTY5LDEyLjY1MjMgLTE0LjAzODE3MSwwIC0yNS41MTUyNDcsLTEuNjU5NCAtMzQuNDMzNjE4LC00Ljk3NzcgLTguOTE4MzcsLTMuNDU2NiAtMTYuMTg1NTcyLC04LjcxMTMgLTIxLjgwMDgzOSwtMTUuNzYzMyAtNS42MTUyNzcsLTcuMDUyMSAtMTAuMDc0Nzk1LC0xNi42NjA4OCAtMTMuMzc3ODk5LC0yOC44MjgxMiBsIC0yNC43NzMxNjI2MjkzOTQ1LDAgMCw1Ni44MjYzMiBDIDMzLjg1Njc2OSwyODYuMDc2MDEgNjMuNzQ5MDQsMjg5Ljc0MjAxIDg5LjY3ODM4MywyODkuNzQyMDEgYyAxNi4wMjAwMjcsMCAzMC43MTk3ODcsLTEuMzgyNyA0NC4wOTczMzcsLTQuMTQ3OSAxMy41NDI3MiwtMi45MDQzIDI1LjEwNDEsLTcuNDY3NiAzNC42ODMwOSwtMTMuNjg5MyA5Ljc0NDEzLC02LjM1OTcgMTcuMzQwNDIsLTE0LjUxOTUgMjIuNzkwNTIsLTI0LjQ3NDggNS40NTAxLC0xMC4wOTMzMiA4LjE3NTExLC0yMi4zOTk1OSA4LjE3NTExLC0zNi45MTY4MiAwLC0xMi45OTc2NCAtMy4zMDIxLC0yNC4zMzUzOSAtOS45MDgyOSwtMzQuMDE0NiAtNi40NDEwNSwtOS44MTcyNSAtMTUuNTI1NDUsLTE4LjUyNzA3IC0yNy4yNTE0NiwtMjYuMTMxMzMgLTExLjU2MDg1LC03LjYwNDI3IC0yNy45MTA4MywtMTUuODMxNDIgLTQ5LjA1MDY2LC0yNC42ODAyMiAtMTcuNTA2NDQsLTcuMTkwMTIgLTMwLjcxOTY2OCwtMTMuNjg5NDggLTM5LjYzODAzOCwtMTkuNDk3MDEgLTguOTE4MzcxLC01LjgwNzUyIC0xOC42MDc0NzQsLTEyLjQzNDA5IC0yNC4wOTY1MjQsLTE4Ljg3NDE3IC01LjQyNjA0MywtNi4zNjYxNiAtOS42NTg4MjYsLTE1LjA3MDAzIC05LjY1ODgyNiwtMjQuODg3MjkgMCwtOS4yNjQwMSAyLjA3NTQxNCwtMTcuMjEzNDUgNi4yMjM0NTQsLTIzLjg1MDMzIDExLjA5ODI5OCwtMTQuMzk3NDggNDEuMjg2NjM4LC0xLjc5NTA3IDQ1LjA3NTYwOSwyNC4zNDc2MiA0LjgzOTM5Miw2Ljc3NDkxIDguODQ5MzUsMTYuMjQ3MjkgMTIuMDI5NTE1LDI4LjQxNTYgbCAyMC41MzIzNCwwIDAsLTU1Ljk5OTY3IGMgLTQuNDc4MjUsLTUuOTI0NDggLTkuOTU0ODgsLTEwLjYzMjIyIC0xNS45MDgzNywtMTQuMzc0MTEgMS42NDA1NSwwLjQ3OTA1IDMuMTkwMzksMS4wMjM3NiA0LjYzODY1LDEuNjQwMjQgNi40OTg2MSwyLjYyNjA3IDEyLjE2NzkzLDcuMzI3NDcgMTcuMDA3MywxNC4xMDM0NSA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNSwxNi4yNDU2NyAxMi4wMjk1MiwyOC40MTM5NyAwLDAgOC40ODEyOCwtMC4xMjg5NCA4LjQ4OTc4LC0wLjAwMiAwLjQxNzc2LDYuNDE0OTQgLTEuNzUzMzksOS40NTI4NiAtNC4xMjM0MiwxMi41NjEwNCAtMi40MTc0LDMuMTY5NzggLTUuMTQ0ODYsNi43ODk3MyAtNC4wMDI3OCwxMy4wMDI5IDEuNTA3ODYsOC4yMDMxOCAxMC4xODM1NCwxMC41OTY0MiAxNC42MjE5NCw5LjMxMTU0IC0zLjMxODQyLC0wLjQ5OTExIC01LjMxODU1LC0xLjc0OTQ4IC01LjMxODU1LC0xLjc0OTQ4IDAsMCAxLjg3NjQ2LDAuOTk4NjggNS42NTExNywtMS4zNTk4MSAtMy4yNzY5NSwwLjk1NTcxIC0xMC43MDUyOSwtMC43OTczOCAtMTEuODAxMjUsLTYuNzYzMTMgLTAuOTU3NTIsLTUuMjA4NjEgMC45NDY1NCwtNy4yOTUxNCAzLjQwMTEzLC0xMC41MTQ4MiAyLjQ1NDYyLC0zLjIxOTY4IDUuMjg0MjYsLTYuOTU4MzEgNC42ODQzLC0xNC40ODgyNCBsIDAuMDAzLDAuMDAyIDguOTI2NzYsMCAwLC01NS45OTk2NyBjIC0xNS4wNzEyNSwtMy44NzE2OCAtMjcuNjUzMTQsLTYuMzYwNDIgLTM3Ljc0NjcxLC03LjQ2NTg2IC05Ljk1NTMxLC0xLjEwNzU1IC0yMC4xODgyMywtMS42NTk4MSAtMzAuNjk2NjEzLC0xLjY1OTgxIHogbSA3MC4zMjE2MDMsMTcuMzA4OTMgMC4yMzgwNSw0MC4zMDQ5IGMgMS4zMTgwOCwxLjIyNjY2IDIuNDM5NjUsMi4yNzgxNSAzLjM0MDgxLDMuMTA2MDIgNC44MzkzOSw2Ljc3NDkxIDguODQ5MzQsMTYuMjQ1NjYgMTIuMDI5NTEsMjguNDEzOTcgbCAyMC41MzIzNCwwIDAsLTU1Ljk5OTY3IGMgLTYuNjc3MzEsLTQuNTkzODEgLTE5LjgzNjQzLC0xMC40NzMwOSAtMzYuMTQwNzEsLTE1LjgyNTIyIHogbSAtMjguMTIwNDksNS42MDU1MSA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM3LC02LjQ2Njk3IC0xMy44NDY3OCwtOS43MTcyNiAtOC41NjQ3OSwtMTcuNzE2NTUgeiBtIDIyLjc5NzA1LDAgYyAyLjc3MTUsNy45OTkyOSAxLjc4NzQxLDExLjI0OTU4IC00LjQ5MzU0LDE3LjcxNjU1IGwgNC40OTM1NCwtMTcuNzE2NTUgeiBtIDE1LjIyMTk1LDI0LjAwODQ4IDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzgsLTYuNDY2OTcgLTEzLjg0Njc5LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDQsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gLTk5LjExMzg0LDIuMjA3NjQgOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzODIsLTYuNDY2OTcgLTEzLjg0Njc4MiwtOS43MTcyNiAtOC41NjQ3OSwtMTcuNzE2NTUgeiBtIDIyLjc5NTQyLDAgYyAyLjc3MTUsNy45OTkyOSAxLjc4NzQxLDExLjI0OTU4IC00LjQ5MzU0LDE3LjcxNjU1IGwgNC40OTM1NCwtMTcuNzE2NTUgeiIgLz4KPC9zdmc+CjwhLS0gVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDQuMCBJbnRlcm5hdGlvbmFsIExpY2Vuc2UuIC0tPgo8IS0tIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8gLS0+Cg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff750000',endColorstr='#ff340404',GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-webkit-transform:translateX(-50%) translateY(-8px);-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-right:after{-webkit-transform:translateX(-8px) translateY(-50%);-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input::-webkit-input-placeholder{color:#999}body.syndicate input::-moz-placeholder{color:#999}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"} \ No newline at end of file +@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.clockwork{background:linear-gradient(180deg,#b18b25 0,#5f380e);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffb18b25",endColorstr="#ff5f380e",GradientType=0)}body.clockwork .normal{color:#b18b25}body.clockwork .good{color:#cfba47}body.clockwork .average{color:#896b19}body.clockwork .bad{color:#5f380e}body.clockwork .highlight{color:#b18b25}body.clockwork main{display:block;margin-top:32px;padding:2px 6px 0}body.clockwork hr{height:2px;background-color:#b18b25;border:none}body.clockwork .hidden{display:none}body.clockwork .bar .barText,body.clockwork span.button{color:#b18b25;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.clockwork .bold{font-weight:700}body.clockwork .italic{font-style:italic}body.clockwork [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.clockwork div[data-tooltip],body.clockwork span[data-tooltip]{position:relative}body.clockwork div[data-tooltip]:after,body.clockwork span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #170800;background-color:#2d1400}body.clockwork div[data-tooltip]:hover:after,body.clockwork span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.clockwork div[data-tooltip].tooltip-top:after,body.clockwork span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-top:hover:after,body.clockwork span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-left:after,body.clockwork span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-left:hover:after,body.clockwork span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:hover:after,body.clockwork span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #170800;background:#2d1400}body.clockwork .bar .barText{position:absolute;top:0;right:3px}body.clockwork .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#b18b25}body.clockwork .bar .barFill.good{background-color:#cfba47}body.clockwork .bar .barFill.average{background-color:#896b19}body.clockwork .bar .barFill.bad{background-color:#5f380e}body.clockwork span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #170800}body.clockwork span.button .fa{padding-right:2px}body.clockwork span.button.normal{transition:background-color .5s;background-color:#5f380e}body.clockwork span.button.normal.active:focus,body.clockwork span.button.normal.active:hover{transition:background-color .25s;background-color:#704211;outline:0}body.clockwork span.button.disabled{transition:background-color .5s;background-color:#2d1400}body.clockwork span.button.disabled.active:focus,body.clockwork span.button.disabled.active:hover{transition:background-color .25s;background-color:#441e00;outline:0}body.clockwork span.button.selected{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.selected.active:focus,body.clockwork span.button.selected.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.toggle{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.toggle.active:focus,body.clockwork span.button.toggle.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.caution{transition:background-color .5s;background-color:#be6209}body.clockwork span.button.caution.active:focus,body.clockwork span.button.caution.active:hover{transition:background-color .25s;background-color:#cd6a0a;outline:0}body.clockwork span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.clockwork span.button.danger.active:focus,body.clockwork span.button.danger.active:hover{transition:background-color .25s;background-color:#abaf00;outline:0}body.clockwork span.button.gridable{width:125px;margin:2px 0}body.clockwork span.button+span:not(.button),body.clockwork span:not(.button)+span.button{margin-left:5px}body.clockwork div.display{width:100%;padding:4px;margin:6px 0;background-color:#2d1400;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400);background-color:rgba(45,20,0,.9);box-shadow:inset 0 0 5px rgba(0,0,0,.3)}body.clockwork div.display header,body.clockwork div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#cfba47;border-bottom:2px solid #b18b25}body.clockwork div.display header .buttonRight,body.clockwork div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.clockwork div.display article,body.clockwork div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.clockwork input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#b18b25;background-color:#cfba47;border:1px solid #272727}body.clockwork input::-webkit-input-placeholder{color:#999}body.clockwork input:-ms-input-placeholder{color:#999}body.clockwork input::placeholder{color:#999}body.clockwork input::-ms-clear{display:none}body.clockwork svg.linegraph{overflow:hidden}body.clockwork div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#2d1400;font-weight:700;font-style:italic;background-color:#000;background-image:repeating-linear-gradient(-45deg,#000,#000 10px,#170800 0,#170800 20px)}body.clockwork div.notice .label{color:#2d1400}body.clockwork div.notice .content:only-of-type{padding:0}body.clockwork div.notice hr{background-color:#896b19}body.clockwork div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #5f380e;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.clockwork section .content,body.clockwork section .label,body.clockwork section .line,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.clockwork section{display:table-row;width:100%}body.clockwork section:not(:first-child){padding-top:4px}body.clockwork section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.clockwork section .label{width:1%;padding-right:32px;white-space:nowrap;color:#b18b25}body.clockwork section .content:not(:last-child){padding-right:16px}body.clockwork section .line{width:100%}body.clockwork div.subdisplay{width:100%;margin:0}body.clockwork header.titlebar .close,body.clockwork header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#cfba47}body.clockwork header.titlebar .close:hover,body.clockwork header.titlebar .minimize:hover{color:#d1bd50}body.clockwork header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#5f380e;border-bottom:1px solid #170800;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.clockwork header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.clockwork header.titlebar .title{position:absolute;top:6px;left:46px;color:#cfba47;font-size:16px;white-space:nowrap}body.clockwork header.titlebar .minimize{position:absolute;top:6px;right:46px}body.clockwork header.titlebar .close{position:absolute;top:4px;right:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input::-webkit-input-placeholder{color:#999}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgMjAwIDI4OS43NDIiIG9wYWNpdHk9Ii4zMyI+DQogIDxwYXRoIGQ9Im0gOTMuNTM3Njc3LDAgYyAtMTguMTEzMTI1LDAgLTM0LjIyMDEzMywzLjExMTY0IC00OC4zMjM0ODQsOS4zMzQzNyAtMTMuOTY1MDkyLDYuMjIxNjcgLTI0LjYxMjQ0MiwxNS4wNzExNCAtMzEuOTQwNjUxLDI2LjU0NzEgLTcuMTg5OTM5OCwxMS4zMzc4OSAtMTAuMzAxMjI2NiwyNC43NDkxMSAtMTAuMzAxMjI2Niw0MC4yMzQ3OCAwLDEwLjY0NjYyIDIuNzI1MDAyNiwyMC40NjQ2NSA4LjE3NTExMTYsMjkuNDUyNTggNS42MTUyNzcsOC45ODY4NiAxNC4wMzgyNzcsMTcuMzUyMDQgMjUuMjY4ODIxLDI1LjA5NDM2IDExLjIzMDU0NCw3LjYwNTMxIDI2LjUwNzQyMSwxNS40MTgzNSA0NS44MzA1MTQsMjMuNDM3ODIgMTkuOTgzNzQ4LDguMjk1NTcgMzQuODQ4ODQ4LDE1LjU1NDcxIDQ0LjU5Mjk5OCwyMS43NzYzOCA5Ljc0NDE0LDYuMjIyNzMgMTYuNzYxNywxMi44NTg1IDIxLjA1NTcyLDE5LjkwOTUxIDQuMjk0MDQsNy4wNTIwOCA2LjQ0MTkzLDE1Ljc2NDA4IDYuNDQxOTMsMjYuMTM0NTkgMCwxNi4xNzcwMiAtNS4yMDE5NiwyOC40ODIyMiAtMTUuNjA2NzMsMzYuOTE2ODIgLTEwLjIzOTYsOC40MzQ3IC0yNS4wMjIwMywxMi42NTIzIC00NC4zNDUxNjksMTIuNjUyMyAtMTQuMDM4MTcxLDAgLTI1LjUxNTI0NywtMS42NTk0IC0zNC40MzM2MTgsLTQuOTc3NyAtOC45MTgzNywtMy40NTY2IC0xNi4xODU1NzIsLTguNzExMyAtMjEuODAwODM5LC0xNS43NjMzIC01LjYxNTI3NywtNy4wNTIxIC0xMC4wNzQ3OTUsLTE2LjY2MDg4IC0xMy4zNzc4OTksLTI4LjgyODEyIGwgLTI0Ljc3MzE2MjYyOTM5NDUsMCAwLDU2LjgyNjMyIEMgMzMuODU2NzY5LDI4Ni4wNzYwMSA2My43NDkwNCwyODkuNzQyMDEgODkuNjc4MzgzLDI4OS43NDIwMSBjIDE2LjAyMDAyNywwIDMwLjcxOTc4NywtMS4zODI3IDQ0LjA5NzMzNywtNC4xNDc5IDEzLjU0MjcyLC0yLjkwNDMgMjUuMTA0MSwtNy40Njc2IDM0LjY4MzA5LC0xMy42ODkzIDkuNzQ0MTMsLTYuMzU5NyAxNy4zNDA0MiwtMTQuNTE5NSAyMi43OTA1MiwtMjQuNDc0OCA1LjQ1MDEsLTEwLjA5MzMyIDguMTc1MTEsLTIyLjM5OTU5IDguMTc1MTEsLTM2LjkxNjgyIDAsLTEyLjk5NzY0IC0zLjMwMjEsLTI0LjMzNTM5IC05LjkwODI5LC0zNC4wMTQ2IC02LjQ0MTA1LC05LjgxNzI1IC0xNS41MjU0NSwtMTguNTI3MDcgLTI3LjI1MTQ2LC0yNi4xMzEzMyAtMTEuNTYwODUsLTcuNjA0MjcgLTI3LjkxMDgzLC0xNS44MzE0MiAtNDkuMDUwNjYsLTI0LjY4MDIyIC0xNy41MDY0NCwtNy4xOTAxMiAtMzAuNzE5NjY4LC0xMy42ODk0OCAtMzkuNjM4MDM4LC0xOS40OTcwMSAtOC45MTgzNzEsLTUuODA3NTIgLTE4LjYwNzQ3NCwtMTIuNDM0MDkgLTI0LjA5NjUyNCwtMTguODc0MTcgLTUuNDI2MDQzLC02LjM2NjE2IC05LjY1ODgyNiwtMTUuMDcwMDMgLTkuNjU4ODI2LC0yNC44ODcyOSAwLC05LjI2NDAxIDIuMDc1NDE0LC0xNy4yMTM0NSA2LjIyMzQ1NCwtMjMuODUwMzMgMTEuMDk4Mjk4LC0xNC4zOTc0OCA0MS4yODY2MzgsLTEuNzk1MDcgNDUuMDc1NjA5LDI0LjM0NzYyIDQuODM5MzkyLDYuNzc0OTEgOC44NDkzNSwxNi4yNDcyOSAxMi4wMjk1MTUsMjguNDE1NiBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNC40NzgyNSwtNS45MjQ0OCAtOS45NTQ4OCwtMTAuNjMyMjIgLTE1LjkwODM3LC0xNC4zNzQxMSAxLjY0MDU1LDAuNDc5MDUgMy4xOTAzOSwxLjAyMzc2IDQuNjM4NjUsMS42NDAyNCA2LjQ5ODYxLDIuNjI2MDcgMTIuMTY3OTMsNy4zMjc0NyAxNy4wMDczLDE0LjEwMzQ1IDQuODM5MzksNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NTY3IDEyLjAyOTUyLDI4LjQxMzk3IDAsMCA4LjQ4MTI4LC0wLjEyODk0IDguNDg5NzgsLTAuMDAyIDAuNDE3NzYsNi40MTQ5NCAtMS43NTMzOSw5LjQ1Mjg2IC00LjEyMzQyLDEyLjU2MTA0IC0yLjQxNzQsMy4xNjk3OCAtNS4xNDQ4Niw2Ljc4OTczIC00LjAwMjc4LDEzLjAwMjkgMS41MDc4Niw4LjIwMzE4IDEwLjE4MzU0LDEwLjU5NjQyIDE0LjYyMTk0LDkuMzExNTQgLTMuMzE4NDIsLTAuNDk5MTEgLTUuMzE4NTUsLTEuNzQ5NDggLTUuMzE4NTUsLTEuNzQ5NDggMCwwIDEuODc2NDYsMC45OTg2OCA1LjY1MTE3LC0xLjM1OTgxIC0zLjI3Njk1LDAuOTU1NzEgLTEwLjcwNTI5LC0wLjc5NzM4IC0xMS44MDEyNSwtNi43NjMxMyAtMC45NTc1MiwtNS4yMDg2MSAwLjk0NjU0LC03LjI5NTE0IDMuNDAxMTMsLTEwLjUxNDgyIDIuNDU0NjIsLTMuMjE5NjggNS4yODQyNiwtNi45NTgzMSA0LjY4NDMsLTE0LjQ4ODI0IGwgMC4wMDMsMC4wMDIgOC45MjY3NiwwIDAsLTU1Ljk5OTY3IGMgLTE1LjA3MTI1LC0zLjg3MTY4IC0yNy42NTMxNCwtNi4zNjA0MiAtMzcuNzQ2NzEsLTcuNDY1ODYgLTkuOTU1MzEsLTEuMTA3NTUgLTIwLjE4ODIzLC0xLjY1OTgxIC0zMC42OTY2MTMsLTEuNjU5ODEgeiBtIDcwLjMyMTYwMywxNy4zMDg5MyAwLjIzODA1LDQwLjMwNDkgYyAxLjMxODA4LDEuMjI2NjYgMi40Mzk2NSwyLjI3ODE1IDMuMzQwODEsMy4xMDYwMiA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNCwxNi4yNDU2NiAxMi4wMjk1MSwyOC40MTM5NyBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNi42NzczMSwtNC41OTM4MSAtMTkuODM2NDMsLTEwLjQ3MzA5IC0zNi4xNDA3MSwtMTUuODI1MjIgeiBtIC0yOC4xMjA0OSw1LjYwNTUxIDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzcsLTYuNDY2OTcgLTEzLjg0Njc4LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDUsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gMTUuMjIxOTUsMjQuMDA4NDggOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzOCwtNi40NjY5NyAtMTMuODQ2NzksLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNCwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAtOTkuMTEzODQsMi4yMDc2NCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4MiwtNi40NjY5NyAtMTMuODQ2NzgyLC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk1NDIsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff750000",endColorstr="#ff340404",GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input::-webkit-input-placeholder{color:#999}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"} \ No newline at end of file diff --git a/tgui/assets/tgui.js.rej b/tgui/assets/tgui.js.rej new file mode 100644 index 0000000000..7b53fc65bf --- /dev/null +++ b/tgui/assets/tgui.js.rej @@ -0,0 +1,36 @@ +diff a/tgui/assets/tgui.js b/tgui/assets/tgui.js (rejected hunks) +@@ -1,16 +1,16 @@ +-require=function t(e,n,a){function r(o,s){if(!n[o]){if(!e[o]){var p="function"==typeof require&&require;if(!s&&p)return p(o,!0);if(i)return i(o,!0);var u=Error("Cannot find module '"+o+"'");throw u.code="MODULE_NOT_FOUND",u}var c=n[o]={exports:{}};e[o][0].call(c.exports,function(t){var n=e[o][1][t];return r(n?n:t)},c,c.exports,t,e,n,a)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o=0;--a){var r=this.tryEntries[a],i=r.completion;if("root"===r.tryLoc)return e("end");if(r.tryLoc<=this.prev){var o=b.call(r,"catchLoc"),s=b.call(r,"finallyLoc");if(o&&s){if(this.prev=0;--n){var a=this.tryEntries[n];if(a.tryLoc<=this.prev&&b.call(a,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),d(n),E}},"catch":function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var a=n.completion;if("throw"===a.type){var r=a.arg;d(n)}return r}}throw Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:m(t),resultName:e,nextLoc:n},E}}}("object"==typeof n?n:"object"==typeof window?window:"object"==typeof self?self:this)}).call(this,t(190),void 0!==n?n:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{190:190}],3:[function(t,e,n){e.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},{}],4:[function(t,e,n){var a=t(84)("unscopables"),r=Array.prototype;void 0==r[a]&&t(32)(r,a,{}),e.exports=function(t){r[a][t]=!0}},{32:32,84:84}],5:[function(t,e,n){var a=t(39);e.exports=function(t){if(!a(t))throw TypeError(t+" is not an object!");return t}},{39:39}],6:[function(t,e,n){"use strict";var a=t(81),r=t(77),i=t(80);e.exports=[].copyWithin||function(t,e){var n=a(this),o=i(n.length),s=r(t,o),p=r(e,o),u=arguments,c=u.length>2?u[2]:void 0,l=Math.min((void 0===c?o:r(c,o))-p,o-s),f=1;for(s>p&&p+l>s&&(f=-1,p+=l-1,s+=l-1);l-- >0;)p in n?n[s]=n[p]:delete n[s],s+=f,p+=f;return n}},{77:77,80:80,81:81}],7:[function(t,e,n){"use strict";var a=t(81),r=t(77),i=t(80);e.exports=[].fill||function(t){for(var e=a(this),n=i(e.length),o=arguments,s=o.length,p=r(s>1?o[1]:void 0,n),u=s>2?o[2]:void 0,c=void 0===u?n:r(u,n);c>p;)e[p++]=t;return e}},{77:77,80:80,81:81}],8:[function(t,e,n){var a=t(79),r=t(80),i=t(77);e.exports=function(t){return function(e,n,o){var s,p=a(e),u=r(p.length),c=i(o,u);if(t&&n!=n){for(;u>c;)if(s=p[c++],s!=s)return!0}else for(;u>c;c++)if((t||c in p)&&p[c]===n)return t||c;return!t&&-1}}},{77:77,79:79,80:80}],9:[function(t,e,n){var a=t(18),r=t(35),i=t(81),o=t(80),s=t(10);e.exports=function(t){var e=1==t,n=2==t,p=3==t,u=4==t,c=6==t,l=5==t||c;return function(f,d,h){for(var m,v,g=i(f),b=r(g),y=a(d,h,3),_=o(b.length),x=0,w=e?s(f,_):n?s(f,0):void 0;_>x;x++)if((l||x in b)&&(m=b[x],v=y(m,x,g),t))if(e)w[x]=v;else if(v)switch(t){case 3:return!0;case 5:return m;case 6:return x;case 2:w.push(m)}else if(u)return!1;return c?-1:p||u?u:w}}},{10:10,18:18,35:35,80:80,81:81}],10:[function(t,e,n){var a=t(39),r=t(37),i=t(84)("species");e.exports=function(t,e){var n;return r(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!r(n.prototype)||(n=void 0),a(n)&&(n=n[i],null===n&&(n=void 0))),new(void 0===n?Array:n)(e)}},{37:37,39:39,84:84}],11:[function(t,e,n){var a=t(12),r=t(84)("toStringTag"),i="Arguments"==a(function(){return arguments}());e.exports=function(t){var e,n,o;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=(e=Object(t))[r])?n:i?a(e):"Object"==(o=a(e))&&"function"==typeof e.callee?"Arguments":o}},{12:12,84:84}],12:[function(t,e,n){var a={}.toString;e.exports=function(t){return a.call(t).slice(8,-1)}},{}],13:[function(t,e,n){"use strict";var a=t(47),r=t(32),i=t(61),o=t(18),s=t(70),p=t(19),u=t(28),c=t(43),l=t(45),f=t(83)("id"),d=t(31),h=t(39),m=t(66),v=t(20),g=Object.isExtensible||h,b=v?"_s":"size",y=0,_=function(t,e){if(!h(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!d(t,f)){if(!g(t))return"F";if(!e)return"E";r(t,f,++y)}return"O"+t[f]},x=function(t,e){var n,a=_(e);if("F"!==a)return t._i[a];for(n=t._f;n;n=n.n)if(n.k==e)return n};e.exports={getConstructor:function(t,e,n,r){var c=t(function(t,i){s(t,c,e),t._i=a.create(null),t._f=void 0,t._l=void 0,t[b]=0,void 0!=i&&u(i,n,t[r],t)});return i(c.prototype,{clear:function(){for(var t=this,e=t._i,n=t._f;n;n=n.n)n.r=!0,n.p&&(n.p=n.p.n=void 0),delete e[n.i];t._f=t._l=void 0,t[b]=0},"delete":function(t){var e=this,n=x(e,t);if(n){var a=n.n,r=n.p;delete e._i[n.i],n.r=!0,r&&(r.n=a),a&&(a.p=r),e._f==n&&(e._f=a),e._l==n&&(e._l=r),e[b]--}return!!n},forEach:function(t){for(var e,n=o(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.n:this._f;)for(n(e.v,e.k,this);e&&e.r;)e=e.p},has:function(t){return!!x(this,t)}}),v&&a.setDesc(c.prototype,"size",{get:function(){return p(this[b])}}),c},def:function(t,e,n){var a,r,i=x(t,e);return i?i.v=n:(t._l=i={i:r=_(e,!0),k:e,v:n,p:a=t._l,n:void 0,r:!1},t._f||(t._f=i),a&&(a.n=i),t[b]++,"F"!==r&&(t._i[r]=i)),t},getEntry:x,setStrong:function(t,e,n){c(t,e,function(t,e){this._t=t,this._k=e,this._l=void 0},function(){for(var t=this,e=t._k,n=t._l;n&&n.r;)n=n.p;return t._t&&(t._l=n=n?n.n:t._t._f)?"keys"==e?l(0,n.k):"values"==e?l(0,n.v):l(0,[n.k,n.v]):(t._t=void 0,l(1))},n?"entries":"values",!n,!0),m(e)}}},{18:18,19:19,20:20,28:28,31:31,32:32,39:39,43:43,45:45,47:47,61:61,66:66,70:70,83:83}],14:[function(t,e,n){var a=t(28),r=t(11);e.exports=function(t){return function(){if(r(this)!=t)throw TypeError(t+"#toJSON isn't generic");var e=[];return a(this,!1,e.push,e),e}}},{11:11,28:28}],15:[function(t,e,n){"use strict";var a=t(32),r=t(61),i=t(5),o=t(39),s=t(70),p=t(28),u=t(9),c=t(31),l=t(83)("weak"),f=Object.isExtensible||o,d=u(5),h=u(6),m=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},b=function(t,e){return d(t.a,function(t){return t[0]===e})};g.prototype={get:function(t){var e=b(this,t);return e?e[1]:void 0},has:function(t){return!!b(this,t)},set:function(t,e){var n=b(this,t);n?n[1]=e:this.a.push([t,e])},"delete":function(t){var e=h(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},e.exports={getConstructor:function(t,e,n,a){var i=t(function(t,r){s(t,i,e),t._i=m++,t._l=void 0,void 0!=r&&p(r,n,t[a],t)});return r(i.prototype,{"delete":function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i)&&delete t[l][this._i]:v(this)["delete"](t):!1},has:function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i):v(this).has(t):!1}}),i},def:function(t,e,n){return f(i(e))?(c(e,l)||a(e,l,{}),e[l][t._i]=n):v(t).set(e,n),t},frozenStore:v,WEAK:l}},{28:28,31:31,32:32,39:39,5:5,61:61,70:70,83:83,9:9}],16:[function(t,e,n){"use strict";var a=t(30),r=t(23),i=t(62),o=t(61),s=t(28),p=t(70),u=t(39),c=t(25),l=t(44),f=t(67);e.exports=function(t,e,n,d,h,m){var v=a[t],g=v,b=h?"set":"add",y=g&&g.prototype,_={},x=function(t){var e=y[t];i(y,t,"delete"==t?function(t){return m&&!u(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!u(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!u(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof g&&(m||y.forEach&&!c(function(){(new g).entries().next()}))){var w,k=new g,P=k[b](m?{}:-0,1)!=k,C=c(function(){k.has(1)}),E=l(function(t){new g(t)});E||(g=e(function(e,n){p(e,g,t);var a=new v;return void 0!=n&&s(n,h,a[b],a),a}),g.prototype=y,y.constructor=g),m||k.forEach(function(t,e){w=1/e===-(1/0)}),(C||w)&&(x("delete"),x("has"),h&&x("get")),(w||P)&&x(b),m&&y.clear&&delete y.clear}else g=d.getConstructor(e,t,h,b),o(g.prototype,n);return f(g,t),_[t]=g,r(r.G+r.W+r.F*(g!=v),_),m||d.setStrong(g,t,h),g}},{23:23,25:25,28:28,30:30,39:39,44:44,61:61,62:62,67:67,70:70}],17:[function(t,e,n){var a=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=a)},{}],18:[function(t,e,n){var a=t(3);e.exports=function(t,e,n){if(a(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,a){return t.call(e,n,a)};case 3:return function(n,a,r){return t.call(e,n,a,r)}}return function(){return t.apply(e,arguments)}}},{3:3}],19:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],20:[function(t,e,n){e.exports=!t(25)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{25:25}],21:[function(t,e,n){var a=t(39),r=t(30).document,i=a(r)&&a(r.createElement);e.exports=function(t){return i?r.createElement(t):{}}},{30:30,39:39}],22:[function(t,e,n){var a=t(47);e.exports=function(t){var e=a.getKeys(t),n=a.getSymbols;if(n)for(var r,i=n(t),o=a.isEnum,s=0;i.length>s;)o.call(t,r=i[s++])&&e.push(r);return e}},{47:47}],23:[function(t,e,n){var a=t(30),r=t(17),i=t(32),o=t(62),s=t(18),p="prototype",u=function(t,e,n){var c,l,f,d,h=t&u.F,m=t&u.G,v=t&u.S,g=t&u.P,b=t&u.B,y=m?a:v?a[e]||(a[e]={}):(a[e]||{})[p],_=m?r:r[e]||(r[e]={}),x=_[p]||(_[p]={});m&&(n=e);for(c in n)l=!h&&y&&c in y,f=(l?y:n)[c],d=b&&l?s(f,a):g&&"function"==typeof f?s(Function.call,f):f,y&&!l&&o(y,c,f),_[c]!=f&&i(_,c,d),g&&x[c]!=f&&(x[c]=f)};a.core=r,u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,e.exports=u},{17:17,18:18,30:30,32:32,62:62}],24:[function(t,e,n){var a=t(84)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[a]=!1,!"/./"[t](e)}catch(r){}}return!0}},{84:84}],25:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],26:[function(t,e,n){"use strict";var a=t(32),r=t(62),i=t(25),o=t(19),s=t(84);e.exports=function(t,e,n){var p=s(t),u=""[t];i(function(){var e={};return e[p]=function(){return 7},7!=""[t](e)})&&(r(String.prototype,t,n(o,p,u)),a(RegExp.prototype,p,2==e?function(t,e){return u.call(t,this,e)}:function(t){return u.call(t,this)}))}},{19:19,25:25,32:32,62:62,84:84}],27:[function(t,e,n){"use strict";var a=t(5);e.exports=function(){var t=a(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},{5:5}],28:[function(t,e,n){var a=t(18),r=t(41),i=t(36),o=t(5),s=t(80),p=t(85);e.exports=function(t,e,n,u){var c,l,f,d=p(t),h=a(n,u,e?2:1),m=0;if("function"!=typeof d)throw TypeError(t+" is not iterable!");if(i(d))for(c=s(t.length);c>m;m++)e?h(o(l=t[m])[0],l[1]):h(t[m]);else for(f=d.call(t);!(l=f.next()).done;)r(f,h,l.value,e)}},{18:18,36:36,41:41,5:5,80:80,85:85}],29:[function(t,e,n){var a=t(79),r=t(47).getNames,i={}.toString,o="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return r(t)}catch(e){return o.slice()}};e.exports.get=function(t){return o&&"[object Window]"==i.call(t)?s(t):r(a(t))}},{47:47,79:79}],30:[function(t,e,n){var a=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=a)},{}],31:[function(t,e,n){var a={}.hasOwnProperty;e.exports=function(t,e){return a.call(t,e)}},{}],32:[function(t,e,n){var a=t(47),r=t(60);e.exports=t(20)?function(t,e,n){return a.setDesc(t,e,r(1,n))}:function(t,e,n){return t[e]=n,t}},{20:20,47:47,60:60}],33:[function(t,e,n){e.exports=t(30).document&&document.documentElement},{30:30}],34:[function(t,e,n){e.exports=function(t,e,n){var a=void 0===n;switch(e.length){case 0:return a?t():t.call(n);case 1:return a?t(e[0]):t.call(n,e[0]);case 2:return a?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return a?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return a?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},{}],35:[function(t,e,n){var a=t(12);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==a(t)?t.split(""):Object(t)}},{12:12}],36:[function(t,e,n){var a=t(46),r=t(84)("iterator"),i=Array.prototype;e.exports=function(t){return void 0!==t&&(a.Array===t||i[r]===t)}},{46:46,84:84}],37:[function(t,e,n){var a=t(12);e.exports=Array.isArray||function(t){return"Array"==a(t)}},{12:12}],38:[function(t,e,n){var a=t(39),r=Math.floor;e.exports=function(t){return!a(t)&&isFinite(t)&&r(t)===t}},{39:39}],39:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],40:[function(t,e,n){var a=t(39),r=t(12),i=t(84)("match");e.exports=function(t){var e;return a(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==r(t))}},{12:12,39:39,84:84}],41:[function(t,e,n){var a=t(5);e.exports=function(t,e,n,r){try{return r?e(a(n)[0],n[1]):e(n)}catch(i){var o=t["return"];throw void 0!==o&&a(o.call(t)),i}}},{5:5}],42:[function(t,e,n){"use strict";var a=t(47),r=t(60),i=t(67),o={};t(32)(o,t(84)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=a.create(o,{next:r(1,n)}),i(t,e+" Iterator")}},{32:32,47:47,60:60,67:67,84:84}],43:[function(t,e,n){"use strict";var a=t(49),r=t(23),i=t(62),o=t(32),s=t(31),p=t(46),u=t(42),c=t(67),l=t(47).getProto,f=t(84)("iterator"),d=!([].keys&&"next"in[].keys()),h="@@iterator",m="keys",v="values",g=function(){return this};e.exports=function(t,e,n,b,y,_,x){u(n,e,b);var w,k,P=function(t){if(!d&&t in A)return A[t];switch(t){case m:return function(){return new n(this,t)};case v:return function(){return new n(this,t)}}return function(){return new n(this,t)}},C=e+" Iterator",E=y==v,S=!1,A=t.prototype,O=A[f]||A[h]||y&&A[y],T=O||P(y);if(O){var M=l(T.call(new t));c(M,C,!0),!a&&s(A,h)&&o(M,f,g),E&&O.name!==v&&(S=!0,T=function(){return O.call(this)})}if(a&&!x||!d&&!S&&A[f]||o(A,f,T),p[e]=T,p[C]=g,y)if(w={values:E?T:P(v),keys:_?T:P(m),entries:E?P("entries"):T},x)for(k in w)k in A||i(A,k,w[k]);else r(r.P+r.F*(d||S),e,w);return w}},{23:23,31:31,32:32,42:42,46:46,47:47,49:49,62:62,67:67,84:84}],44:[function(t,e,n){var a=t(84)("iterator"),r=!1;try{var i=[7][a]();i["return"]=function(){r=!0},Array.from(i,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!r)return!1;var n=!1;try{var i=[7],o=i[a]();o.next=function(){n=!0},i[a]=function(){return o},t(i)}catch(s){}return n}},{84:84}],45:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],46:[function(t,e,n){e.exports={}},{}],47:[function(t,e,n){var a=Object;e.exports={create:a.create,getProto:a.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:a.getOwnPropertyDescriptor,setDesc:a.defineProperty,setDescs:a.defineProperties,getKeys:a.keys,getNames:a.getOwnPropertyNames,getSymbols:a.getOwnPropertySymbols,each:[].forEach}},{}],48:[function(t,e,n){var a=t(47),r=t(79);e.exports=function(t,e){for(var n,i=r(t),o=a.getKeys(i),s=o.length,p=0;s>p;)if(i[n=o[p++]]===e)return n}},{47:47,79:79}],49:[function(t,e,n){e.exports=!1},{}],50:[function(t,e,n){e.exports=Math.expm1||function(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}},{}],51:[function(t,e,n){e.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&1e-8>t?t-t*t/2:Math.log(1+t)}},{}],52:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],53:[function(t,e,n){var a,r,i,o=t(30),s=t(76).set,p=o.MutationObserver||o.WebKitMutationObserver,u=o.process,c=o.Promise,l="process"==t(12)(u),f=function(){var t,e,n;for(l&&(t=u.domain)&&(u.domain=null,t.exit());a;)e=a.domain,n=a.fn,e&&e.enter(),n(),e&&e.exit(),a=a.next;r=void 0,t&&t.enter()};if(l)i=function(){u.nextTick(f)};else if(p){var d=1,h=document.createTextNode("");new p(f).observe(h,{characterData:!0}),i=function(){h.data=d=-d}}else i=c&&c.resolve?function(){c.resolve().then(f)}:function(){s.call(o,f)};e.exports=function(t){var e={fn:t,next:void 0,domain:l&&u.domain};r&&(r.next=e),a||(a=e,i()),r=e}},{12:12,30:30,76:76}],54:[function(t,e,n){var a=t(47),r=t(81),i=t(35);e.exports=t(25)(function(){var t=Object.assign,e={},n={},a=Symbol(),r="abcdefghijklmnopqrst";return e[a]=7,r.split("").forEach(function(t){n[t]=t}),7!=t({},e)[a]||Object.keys(t({},n)).join("")!=r})?function(t,e){for(var n=r(t),o=arguments,s=o.length,p=1,u=a.getKeys,c=a.getSymbols,l=a.isEnum;s>p;)for(var f,d=i(o[p++]),h=c?u(d).concat(c(d)):u(d),m=h.length,v=0;m>v;)l.call(d,f=h[v++])&&(n[f]=d[f]);return n}:Object.assign},{25:25,35:35,47:47,81:81}],55:[function(t,e,n){var a=t(23),r=t(17),i=t(25);e.exports=function(t,e){var n=(r.Object||{})[t]||Object[t],o={};o[t]=e(n),a(a.S+a.F*i(function(){n(1)}),"Object",o)}},{17:17,23:23,25:25}],56:[function(t,e,n){var a=t(47),r=t(79),i=a.isEnum;e.exports=function(t){return function(e){for(var n,o=r(e),s=a.getKeys(o),p=s.length,u=0,c=[];p>u;)i.call(o,n=s[u++])&&c.push(t?[n,o[n]]:o[n]);return c}}},{47:47,79:79}],57:[function(t,e,n){var a=t(47),r=t(5),i=t(30).Reflect;e.exports=i&&i.ownKeys||function(t){var e=a.getNames(r(t)),n=a.getSymbols;return n?e.concat(n(t)):e}},{30:30,47:47,5:5}],58:[function(t,e,n){"use strict";var a=t(59),r=t(34),i=t(3);e.exports=function(){for(var t=i(this),e=arguments.length,n=Array(e),o=0,s=a._,p=!1;e>o;)(n[o]=arguments[o++])===s&&(p=!0);return function(){var a,i=this,o=arguments,u=o.length,c=0,l=0;if(!p&&!u)return r(t,n,i);if(a=n.slice(),p)for(;e>c;c++)a[c]===s&&(a[c]=o[l++]);for(;u>l;)a.push(o[l++]);return r(t,a,i)}}},{3:3,34:34,59:59}],59:[function(t,e,n){e.exports=t(30)},{30:30}],60:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],61:[function(t,e,n){var a=t(62);e.exports=function(t,e){for(var n in e)a(t,n,e[n]);return t}},{62:62}],62:[function(t,e,n){var a=t(30),r=t(32),i=t(83)("src"),o="toString",s=Function[o],p=(""+s).split(o);t(17).inspectSource=function(t){return s.call(t)},(e.exports=function(t,e,n,o){"function"==typeof n&&(n.hasOwnProperty(i)||r(n,i,t[e]?""+t[e]:p.join(e+"")),n.hasOwnProperty("name")||r(n,"name",e)),t===a?t[e]=n:(o||delete t[e],r(t,e,n))})(Function.prototype,o,function(){return"function"==typeof this&&this[i]||s.call(this)})},{17:17,30:30,32:32,83:83}],63:[function(t,e,n){e.exports=function(t,e){var n=e===Object(e)?function(t){return e[t]}:e;return function(e){return(e+"").replace(t,n)}}},{}],64:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],65:[function(t,e,n){var a=t(47).getDesc,r=t(39),i=t(5),o=function(t,e){if(i(t),!r(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,r){try{r=t(18)(Function.call,a(Object.prototype,"__proto__").set,2),r(e,[]),n=!(e instanceof Array)}catch(i){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:r(t,e),t}}({},!1):void 0),check:o}},{18:18,39:39,47:47,5:5}],66:[function(t,e,n){"use strict";var a=t(30),r=t(47),i=t(20),o=t(84)("species");e.exports=function(t){var e=a[t];i&&e&&!e[o]&&r.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{20:20,30:30,47:47,84:84}],67:[function(t,e,n){var a=t(47).setDesc,r=t(31),i=t(84)("toStringTag");e.exports=function(t,e,n){t&&!r(t=n?t:t.prototype,i)&&a(t,i,{configurable:!0,value:e})}},{31:31,47:47,84:84}],68:[function(t,e,n){var a=t(30),r="__core-js_shared__",i=a[r]||(a[r]={});e.exports=function(t){return i[t]||(i[t]={})}},{30:30}],69:[function(t,e,n){var a=t(5),r=t(3),i=t(84)("species");e.exports=function(t,e){var n,o=a(t).constructor;return void 0===o||void 0==(n=a(o)[i])?e:r(n)}},{3:3,5:5,84:84}],70:[function(t,e,n){e.exports=function(t,e,n){if(!(t instanceof e))throw TypeError(n+": use the 'new' operator!");return t}},{}],71:[function(t,e,n){var a=t(78),r=t(19);e.exports=function(t){return function(e,n){var i,o,s=r(e)+"",p=a(n),u=s.length;return 0>p||p>=u?t?"":void 0:(i=s.charCodeAt(p),55296>i||i>56319||p+1===u||(o=s.charCodeAt(p+1))<56320||o>57343?t?s.charAt(p):i:t?s.slice(p,p+2):(i-55296<<10)+(o-56320)+65536)}}},{19:19,78:78}],72:[function(t,e,n){var a=t(40),r=t(19);e.exports=function(t,e,n){if(a(e))throw TypeError("String#"+n+" doesn't accept regex!");return r(t)+""}},{19:19,40:40}],73:[function(t,e,n){var a=t(80),r=t(74),i=t(19);e.exports=function(t,e,n,o){var s=i(t)+"",p=s.length,u=void 0===n?" ":n+"",c=a(e);if(p>=c)return s;""==u&&(u=" ");var l=c-p,f=r.call(u,Math.ceil(l/u.length));return f.length>l&&(f=f.slice(0,l)),o?f+s:s+f}},{19:19,74:74,80:80}],74:[function(t,e,n){"use strict";var a=t(78),r=t(19);e.exports=function(t){var e=r(this)+"",n="",i=a(t);if(0>i||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(e+=e))1&i&&(n+=e);return n}},{19:19,78:78}],75:[function(t,e,n){var a=t(23),r=t(19),i=t(25),o=" \n\x0B\f\r   ᠎              \u2028\u2029\ufeff",s="["+o+"]",p="​…",u=RegExp("^"+s+s+"*"),c=RegExp(s+s+"*$"),l=function(t,e){var n={};n[t]=e(f),a(a.P+a.F*i(function(){return!!o[t]()||p[t]()!=p}),"String",n)},f=l.trim=function(t,e){return t=r(t)+"",1&e&&(t=t.replace(u,"")),2&e&&(t=t.replace(c,"")),t};e.exports=l},{19:19,23:23,25:25}],76:[function(t,e,n){var a,r,i,o=t(18),s=t(34),p=t(33),u=t(21),c=t(30),l=c.process,f=c.setImmediate,d=c.clearImmediate,h=c.MessageChannel,m=0,v={},g="onreadystatechange",b=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},y=function(t){b.call(t.data)};f&&d||(f=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++m]=function(){s("function"==typeof t?t:Function(t),e)},a(m),m},d=function(t){delete v[t]},"process"==t(12)(l)?a=function(t){l.nextTick(o(b,t,1))}:h?(r=new h,i=r.port2,r.port1.onmessage=y,a=o(i.postMessage,i,1)):c.addEventListener&&"function"==typeof postMessage&&!c.importScripts?(a=function(t){c.postMessage(t+"","*")},c.addEventListener("message",y,!1)):a=g in u("script")?function(t){p.appendChild(u("script"))[g]=function(){p.removeChild(this),b.call(t)}}:function(t){setTimeout(o(b,t,1),0)}),e.exports={set:f,clear:d}},{12:12,18:18,21:21,30:30,33:33,34:34}],77:[function(t,e,n){var a=t(78),r=Math.max,i=Math.min;e.exports=function(t,e){return t=a(t),0>t?r(t+e,0):i(t,e)}},{78:78}],78:[function(t,e,n){var a=Math.ceil,r=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?r:a)(t)}},{}],79:[function(t,e,n){var a=t(35),r=t(19);e.exports=function(t){return a(r(t))}},{19:19,35:35}],80:[function(t,e,n){var a=t(78),r=Math.min;e.exports=function(t){return t>0?r(a(t),9007199254740991):0}},{78:78}],81:[function(t,e,n){var a=t(19);e.exports=function(t){return Object(a(t))}},{19:19}],82:[function(t,e,n){var a=t(39);e.exports=function(t,e){if(!a(t))return t;var n,r;if(e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;if("function"==typeof(n=t.valueOf)&&!a(r=n.call(t)))return r;if(!e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;throw TypeError("Can't convert object to primitive value")}},{39:39}],83:[function(t,e,n){var a=0,r=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++a+r).toString(36))}},{}],84:[function(t,e,n){var a=t(68)("wks"),r=t(83),i=t(30).Symbol;e.exports=function(t){return a[t]||(a[t]=i&&i[t]||(i||r)("Symbol."+t))}},{30:30,68:68,83:83}],85:[function(t,e,n){var a=t(11),r=t(84)("iterator"),i=t(46);e.exports=t(17).getIteratorMethod=function(t){return void 0!=t?t[r]||t["@@iterator"]||i[a(t)]:void 0}},{11:11,17:17,46:46,84:84}],86:[function(t,e,n){"use strict";var a,r=t(47),i=t(23),o=t(20),s=t(60),p=t(33),u=t(21),c=t(31),l=t(12),f=t(34),d=t(25),h=t(5),m=t(3),v=t(39),g=t(81),b=t(79),y=t(78),_=t(77),x=t(80),w=t(35),k=t(83)("__proto__"),P=t(9),C=t(8)(!1),E=Object.prototype,S=Array.prototype,A=S.slice,O=S.join,T=r.setDesc,M=r.getDesc,R=r.setDescs,j={};o||(a=!d(function(){return 7!=T(u("div"),"a",{get:function(){return 7}}).a}),r.setDesc=function(t,e,n){if(a)try{return T(t,e,n)}catch(r){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(h(t)[e]=n.value),t},r.getDesc=function(t,e){if(a)try{return M(t,e)}catch(n){}return c(t,e)?s(!E.propertyIsEnumerable.call(t,e),t[e]):void 0},r.setDescs=R=function(t,e){h(t);for(var n,a=r.getKeys(e),i=a.length,o=0;i>o;)r.setDesc(t,n=a[o++],e[n]);return t}),i(i.S+i.F*!o,"Object",{getOwnPropertyDescriptor:r.getDesc,defineProperty:r.setDesc,defineProperties:R});var L="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),N=L.concat("length","prototype"),D=L.length,F=function(){var t,e=u("iframe"),n=D,a=">";for(e.style.display="none",p.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("