From 01a344e58936de2b6d1f323d779cccd973ddc766 Mon Sep 17 00:00:00 2001 From: BeeSting12 Date: Mon, 1 May 2017 19:15:24 -0400 Subject: [PATCH 001/103] fixes #26550 --- _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 d841a0f335f..3c872a9dfc8 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 7a70c6bfbf83282fdf543ffe034faba377233d47 Mon Sep 17 00:00:00 2001 From: 4DPlanner <3combined@gmail.com> Date: Tue, 2 May 2017 02:03:29 +0100 Subject: [PATCH 002/103] 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 d64e01e3de1..aa8aedbbe2e 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 7e5c365adec6cdbc3e69027c50f66e674e01e44b Mon Sep 17 00:00:00 2001 From: QualityVan Date: Mon, 1 May 2017 21:37:30 -0400 Subject: [PATCH 003/103] Adds examining mouths with flashlights --- code/game/objects/items/devices/flashlight.dm | 68 ++++++++++++------- 1 file changed, 45 insertions(+), 23 deletions(-) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index d8d673ce0b8..adbafc03fba 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,50 @@ 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 + + if(M == user) + M.visible_message("[M] directs [src] to [M.p_their()] mouth.", "You point the flashlight into your mouth, but can't see anything.") + else + user.visible_message("[user] directs [src] to [M]'s mouth.",\ + "You direct [src] to [M]'s mouth.") + var/obj/item/organ/tongue/T = M.getorganslot("tongue") + if(T) + to_chat(user, "Inside the mouth is \a [T.name].") + else return ..() @@ -280,7 +302,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 001002c68e364baf63cea001ae229f5027aca376 Mon Sep 17 00:00:00 2001 From: QualityVan Date: Tue, 2 May 2017 01:25:06 -0400 Subject: [PATCH 004/103] Mirrors, pills, and arbitrary mouth organs --- code/game/objects/items/devices/flashlight.dm | 61 +++++++++++++++++-- 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index adbafc03fba..f36e6202397 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -79,18 +79,67 @@ 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 = "" + for(var/I = 1, I <= mouth_organs.len, I++) + 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) - M.visible_message("[M] directs [src] to [M.p_their()] mouth.", "You point the flashlight into your mouth, but can't see anything.") + 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(1) + can_use_mirror = mirror.pixel_y > 0 + if(2) + can_use_mirror = mirror.pixel_y < 0 + if(4) + can_use_mirror = mirror.pixel_x > 0 + if(8) + 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(mouth_organs.len) + to_chat(user, "Inside your mouth [mouth_organs.len > 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.") - var/obj/item/organ/tongue/T = M.getorganslot("tongue") - if(T) - to_chat(user, "Inside the mouth is \a [T.name].") + user.visible_message("[user] directs [src] to [M]'s mouth.",\ + "You direct [src] to [M]'s mouth.") + if(mouth_organs.len) + to_chat(user, "Inside [their] mouth [mouth_organs.len > 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 ..() From 7980b7706f411a96909703fc2a58bcff2afa18db Mon Sep 17 00:00:00 2001 From: QualityVan Date: Tue, 2 May 2017 01:48:59 -0400 Subject: [PATCH 005/103] Defines, their --- code/game/objects/items/devices/flashlight.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index f36e6202397..c87eaaf0890 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -110,13 +110,13 @@ var/obj/structure/mirror/mirror = locate(/obj/structure/mirror, user.loc) if(mirror) switch(user.dir) - if(1) + if(NORTH) can_use_mirror = mirror.pixel_y > 0 - if(2) + if(SOUTH) can_use_mirror = mirror.pixel_y < 0 - if(4) + if(EAST) can_use_mirror = mirror.pixel_x > 0 - if(8) + if(WEST) can_use_mirror = mirror.pixel_x < 0 M.visible_message("[M] directs [src] to [their] mouth.", \ @@ -137,7 +137,7 @@ if(mouth_organs.len) to_chat(user, "Inside [their] mouth [mouth_organs.len > 1 ? "are" : "is"] [organ_list].") else - to_chat(user, "[M] doesn't have any organs in their mouth.") + 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.") From 2d82d3d597ba7b940a26f6d5710dfcf4d3e4b45d Mon Sep 17 00:00:00 2001 From: FantasticFwoosh Date: Tue, 2 May 2017 08:24:07 +0100 Subject: [PATCH 006/103] Adds fake basalt floor tile to sandstone recipies Without meaning to split sand and ash (since they are not distinct enough) it is fair to add it to the relevant recipe of sandstone, mainly since you can dig up the turf the patch it over again --- code/game/objects/items/stacks/sheets/mineral.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 611ef76eb46..f32fc2cea41 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", ???), \ From 534242599c2b401b36b11b9405a01a8e82aa0469 Mon Sep 17 00:00:00 2001 From: FantasticFwoosh Date: Tue, 2 May 2017 08:26:15 +0100 Subject: [PATCH 007/103] Adds fake basalt tiles --- code/game/objects/items/stacks/tiles/tile_types.dm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index f2432cee3d0..1737699e5b6 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 From 876c75a83e573f1ba9b527e24a35f54e27963c75 Mon Sep 17 00:00:00 2001 From: FantasticFwoosh Date: Tue, 2 May 2017 08:34:07 +0100 Subject: [PATCH 008/103] Adds fake basalt floors Non-atmos set fake basalt floors for aeshetic purposes to compliment fake chasm without dying of oxyloss actually visiting lavaland- dig up to reclaim ash functionally the same as grass & place/pick up tiles. Also cycles sprites with realistic basalt lighting effect. --- .../game/turfs/simulated/floor/fancy_floor.dm | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index eaba3d50eb2..6407a523672 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 @@ -113,6 +114,32 @@ 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 + slowdown = 0 + +/turf/open/floor/grass/fakebasalt/Initialize() + ..() + if(prob(15)) + icon_state = "basalt[rand(0, 12)]" + set_basalt_light(src) + +/turf/open/floor/grass/fakebasalt/attackby(obj/item/C, mob/user, params) + if(istype(C, /obj/item/weapon/shovel) && params) + new ore_type(src) + new ore_type(src) //Time to collect your ashes + user.visible_message("[user] digs up [src].", "You dig up [src].") + playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) + make_plating() + if(..()) + + /turf/open/floor/carpet name = "carpet" desc = "Soft velvet carpeting. Feels good between your toes." From 39252ad7d7ac79463bb0dce02c631c90ad14af83 Mon Sep 17 00:00:00 2001 From: FantasticFwoosh Date: Tue, 2 May 2017 08:35:46 +0100 Subject: [PATCH 009/103] Delete tiles.dmi To resubmit --- icons/obj/tiles.dmi | Bin 11236 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 icons/obj/tiles.dmi diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi deleted file mode 100644 index d629cfe24d48dd006e6dc2df315be4748182db8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 b59b50ad3ba652ec8335a0b88174a5f19c50f7c5 Mon Sep 17 00:00:00 2001 From: FantasticFwoosh Date: Tue, 2 May 2017 08:36:16 +0100 Subject: [PATCH 010/103] Adds basalt tile sprite --- icons/obj/tiles.dmi | Bin 0 -> 11741 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 icons/obj/tiles.dmi diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5a8afeee510bc271ab7b5ba3d4df813951a581d0 GIT binary patch literal 11741 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 literal 0 HcmV?d00001 From fbe3e45ee815acc9c8d7e820b474e8d3698d68a7 Mon Sep 17 00:00:00 2001 From: FantasticFwoosh Date: Tue, 2 May 2017 08:53:53 +0100 Subject: [PATCH 011/103] Update fancy_floor.dm adds a return to allow it to hopefully compile now. --- code/game/turfs/simulated/floor/fancy_floor.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index 6407a523672..18558d694c6 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -138,7 +138,7 @@ playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) make_plating() if(..()) - + return /turf/open/floor/carpet name = "carpet" From db9e6b86470b25c1418411629d406586f2965488 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Tue, 2 May 2017 01:03:07 -0700 Subject: [PATCH 012/103] Update energy_ball.dm --- code/modules/power/tesla/energy_ball.dm | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index fbb82cb36a7..7508e2fa5c2 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -54,6 +54,20 @@ GLOBAL_LIST_INIT(blacklisted_tesla_types, typecacheof(list(/obj/machinery/atmosp . = ..() +/obj/singularity/energy_ball/admin_investigate_setup() + last_warning = world.time + var/notify = FALSE + var/containment_count = 0 + for(var/obj/machinery/field/containment in urange(30, src, 1)) + containment_count++ + if(!containment_count) + notify = TRUE + if(istype(loc, /obj/singularity/energy_ball)) //We're an orbitting mini-ball. + notify = FALSE + if(notify) + message_admins("A tesla energy ball has been created without containment fields active ([x],[y],[z])",1) + investigate_log("was created with [containment_count? "":""][containment_count] containment segments in range.","singulo") + /obj/singularity/energy_ball/process() if(!orbiting) handle_energy() From f6b1ba58d7af5b8cef825cd0c5655297a036f88f Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Tue, 2 May 2017 01:19:50 -0700 Subject: [PATCH 013/103] Update flightsuit.dm --- .../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 275ad542b57..479ad777420 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 75aaec129ffc16f672cb0f38c1b46454f6283338 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Tue, 2 May 2017 01:59:02 -0700 Subject: [PATCH 014/103] Update projectile.dm --- 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 005389fa6f3..3dedaa9ae1c 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 ff025e01c37ac636a3ff5edcdd0c943e8c0a5547 Mon Sep 17 00:00:00 2001 From: QualityVan Date: Tue, 2 May 2017 10:20:59 -0400 Subject: [PATCH 015/103] LAZYLEN and sanity checks --- code/game/objects/items/devices/flashlight.dm | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index c87eaaf0890..7ed563d6b78 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -91,14 +91,16 @@ if(O.zone == "mouth") mouth_organs.Add(O) var/organ_list = "" - for(var/I = 1, I <= mouth_organs.len, I++) - 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/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) @@ -124,8 +126,8 @@ if(!can_use_mirror) to_chat(user, "You can't see anything without a mirror.") return - if(mouth_organs.len) - to_chat(user, "Inside your mouth [mouth_organs.len > 1 ? "are" : "is"] [organ_list].") + 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) @@ -134,8 +136,8 @@ else user.visible_message("[user] directs [src] to [M]'s mouth.",\ "You direct [src] to [M]'s mouth.") - if(mouth_organs.len) - to_chat(user, "Inside [their] mouth [mouth_organs.len > 1 ? "are" : "is"] [organ_list].") + 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) From 59eed8f11cbbd411ff5e839141d32b52c8dbd7e9 Mon Sep 17 00:00:00 2001 From: Lzimann Date: Tue, 2 May 2017 14:26:21 -0300 Subject: [PATCH 016/103] Removes the gang gamemode --- code/__DEFINES/role_preferences.dm | 1 - code/datums/hud.dm | 7 +- code/datums/mind.dm | 131 -------- code/game/gamemodes/game_mode.dm | 1 - code/game/gamemodes/gang/dominator.dm | 188 ----------- code/game/gamemodes/gang/gang.dm | 318 ------------------ code/game/gamemodes/gang/gang_datum.dm | 265 --------------- code/game/gamemodes/gang/gang_items.dm | 294 ---------------- code/game/gamemodes/gang/gang_pen.dm | 60 ---- code/game/gamemodes/gang/recaller.dm | 240 ------------- code/game/gamemodes/wizard/artefact.dm | 23 +- code/game/objects/effects/countdown.dm | 15 - code/game/objects/effects/decals/crayon.dm | 36 +- code/game/objects/items/crayons.dm | 107 +----- code/game/objects/items/weapons/explosives.dm | 2 - .../objects/items/weapons/grenades/plastic.dm | 2 - .../weapons/implants/implant_loyality.dm | 9 +- code/modules/admin/player_panel.dm | 18 - code/modules/admin/topic.dm | 18 - code/modules/admin/verbs/one_click_antag.dm | 37 -- code/modules/admin/verbs/onlyone.dm | 6 - code/modules/admin/verbs/randomverbs.dm | 4 - code/modules/mob/dead/observer/observer.dm | 3 - code/modules/mob/living/living.dm | 3 - code/modules/mob/living/silicon/login.dm | 1 - .../modules/mob/living/silicon/robot/login.dm | 1 - code/modules/shuttle/emergency.dm | 6 - code/modules/uplink/uplink_item.dm | 30 +- config/game_options.txt | 6 - tgstation.dme | 7 - 30 files changed, 42 insertions(+), 1797 deletions(-) delete mode 100644 code/game/gamemodes/gang/dominator.dm delete mode 100644 code/game/gamemodes/gang/gang.dm delete mode 100644 code/game/gamemodes/gang/gang_datum.dm delete mode 100644 code/game/gamemodes/gang/gang_items.dm delete mode 100644 code/game/gamemodes/gang/gang_pen.dm delete mode 100644 code/game/gamemodes/gang/recaller.dm diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index dc9fbe6fe3b..9af7868e33f 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -41,7 +41,6 @@ GLOBAL_LIST_INIT(special_roles, list( ROLE_BLOB = /datum/game_mode/blob, ROLE_NINJA, ROLE_MONKEY = /datum/game_mode/monkey, - ROLE_GANG = /datum/game_mode/gang, ROLE_REVENANT, ROLE_ABDUCTOR = /datum/game_mode/abduction, ROLE_DEVIL = /datum/game_mode/devil, diff --git a/code/datums/hud.dm b/code/datums/hud.dm index f9444898ceb..9c37b46d105 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -74,12 +74,7 @@ GLOBAL_LIST_INIT(huds, list( //MOB PROCS /mob/proc/reload_huds() - var/gang_huds = list() - if(SSticker.mode) - for(var/datum/gang/G in SSticker.mode.gangs) - gang_huds += G.ganghud - - for(var/datum/atom_hud/hud in (GLOB.huds|gang_huds|GLOB.active_alternate_appearances)) + for(var/datum/atom_hud/hud in (GLOB.huds|GLOB.active_alternate_appearances)) if(hud && hud.hudusers[src]) hud.add_hud_to(src) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 7e4d175537f..1c23d9eceb7 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -223,11 +223,6 @@ remove_objectives() remove_antag_equip() - -/datum/mind/proc/remove_gang() - SSticker.mode.remove_gangster(src,0,1,1) - remove_objectives() - /datum/mind/proc/remove_antag_equip() var/list/Mob_Contents = current.get_contents() for(var/obj/item/I in Mob_Contents) @@ -246,15 +241,11 @@ remove_wizard() remove_cultist() remove_rev() - remove_gang() SSticker.mode.update_changeling_icons_removed(src) SSticker.mode.update_traitor_icons_removed(src) SSticker.mode.update_wiz_icons_removed(src) SSticker.mode.update_cult_icons_removed(src) SSticker.mode.update_rev_icons_removed(src) - if(gang_datum) - gang_datum.remove_gang_hud(src) - //Link a new mobs mind to the creator of said mob. They will join any team they are currently on, and will only switch teams when their creator does. @@ -262,9 +253,6 @@ if(iscultist(creator)) SSticker.mode.add_cultist(src) - else if(is_gangster(creator)) - SSticker.mode.add_gangster(src, creator.mind.gang_datum, TRUE) - else if(is_revolutionary_in_general(creator)) SSticker.mode.add_revolutionary(src) @@ -362,46 +350,6 @@ sections["revolution"] = text - /** GANG ***/ - text = "gang" - if (SSticker.mode.config_tag=="gang") - text = uppertext(text) - text = "[text]: " - text += "[current.isloyal() ? "LOYAL" : "loyal"]|" - if(src in SSticker.mode.get_all_gangsters()) - text += "none" - else - text += "NONE" - - if(current && current.client && (ROLE_GANG in current.client.prefs.be_special)) - text += "|Enabled in Prefs
" - else - text += "|Disabled in Prefs
" - - for(var/datum/gang/G in SSticker.mode.gangs) - text += "[G.name]: " - if(src in (G.gangsters)) - text += "GANGSTER" - else - text += "gangster" - text += "|" - if(src in (G.bosses)) - text += "GANG LEADER" - text += "|Equipment: give" - var/list/L = current.get_contents() - var/obj/item/device/gangtool/gangtool = locate() in L - if (gangtool) - text += "|take" - - else - text += "gang leader" - text += "
" - - if(GLOB.gang_colors_pool.len) - text += "Create New Gang" - - sections["gang"] = text - /** Abductors **/ text = "Abductor" if(SSticker.mode.config_tag == "abductor") @@ -914,75 +862,6 @@ flash.crit_fail = 0 flash.update_icon() - - -//////////////////// GANG MODE - - else if (href_list["gang"]) - switch(href_list["gang"]) - if("clear") - remove_gang() - message_admins("[key_name_admin(usr)] has de-gang'ed [current].") - log_admin("[key_name(usr)] has de-gang'ed [current].") - - if("equip") - switch(SSticker.mode.equip_gang(current,gang_datum)) - if(1) - to_chat(usr, "Unable to equip territory spraycan!") - if(2) - to_chat(usr, "Unable to equip recruitment pen and spraycan!") - if(3) - to_chat(usr, "Unable to equip gangtool, pen, and spraycan!") - - if("takeequip") - var/list/L = current.get_contents() - for(var/obj/item/weapon/pen/gang/pen in L) - qdel(pen) - for(var/obj/item/device/gangtool/gangtool in L) - qdel(gangtool) - for(var/obj/item/toy/crayon/spraycan/gang/SC in L) - qdel(SC) - - if("new") - if(GLOB.gang_colors_pool.len) - var/list/names = list("Random") + GLOB.gang_name_pool - var/gangname = input("Pick a gang name.","Select Name") as null|anything in names - if(gangname && GLOB.gang_colors_pool.len) //Check again just in case another admin made max gangs at the same time - if(!(gangname in GLOB.gang_name_pool)) - gangname = null - var/datum/gang/newgang = new(null,gangname) - SSticker.mode.gangs += newgang - message_admins("[key_name_admin(usr)] has created the [newgang.name] Gang.") - log_admin("[key_name(usr)] has created the [newgang.name] Gang.") - - else if (href_list["gangboss"]) - var/datum/gang/G = locate(href_list["gangboss"]) in SSticker.mode.gangs - if(!G || (src in G.bosses)) - return - SSticker.mode.remove_gangster(src,0,2,1) - G.bosses += src - gang_datum = G - special_role = "[G.name] Gang Boss" - G.add_gang_hud(src) - to_chat(current, "You are a [G.name] Gang Boss!") - message_admins("[key_name_admin(usr)] has added [current] to the [G.name] Gang leadership.") - log_admin("[key_name(usr)] has added [current] to the [G.name] Gang leadership.") - SSticker.mode.forge_gang_objectives(src) - SSticker.mode.greet_gang(src,0) - - else if (href_list["gangster"]) - var/datum/gang/G = locate(href_list["gangster"]) in SSticker.mode.gangs - if(!G || (src in G.gangsters)) - return - SSticker.mode.remove_gangster(src,0,2,1) - SSticker.mode.add_gangster(src,G,0) - message_admins("[key_name_admin(usr)] has added [current] to the [G.name] Gang (A).") - log_admin("[key_name(usr)] has added [current] to the [G.name] Gang (A).") - -///////////////////////////////// - - - else if (href_list["cult"]) switch(href_list["cult"]) if("clear") @@ -1485,16 +1364,6 @@ // fail |= !SSticker.mode.equip_traitor(current, 1) fail |= !SSticker.mode.equip_revolutionary(current) - -/datum/mind/proc/make_Gang(datum/gang/G) - special_role = "[G.name] Gang Boss" - G.bosses += src - gang_datum = G - G.add_gang_hud(src) - SSticker.mode.forge_gang_objectives(src) - SSticker.mode.greet_gang(src) - SSticker.mode.equip_gang(current,G) - /datum/mind/proc/make_Abductor() var/role = alert("Abductor Role ?","Role","Agent","Scientist") var/team = input("Abductor Team ?","Team ?") in list(1,2,3,4) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index f1144afc13d..f78428b8c9e 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -539,7 +539,6 @@ /datum/game_mode/proc/remove_antag_for_borging(datum/mind/newborgie) SSticker.mode.remove_cultist(newborgie, 0, 0) SSticker.mode.remove_revolutionary(newborgie, 0) - SSticker.mode.remove_gangster(newborgie, 0, remove_bosses=1) /datum/game_mode/proc/generate_station_goals() var/list/possible = list() diff --git a/code/game/gamemodes/gang/dominator.dm b/code/game/gamemodes/gang/dominator.dm deleted file mode 100644 index 54099070cdd..00000000000 --- a/code/game/gamemodes/gang/dominator.dm +++ /dev/null @@ -1,188 +0,0 @@ -/obj/machinery/dominator - name = "dominator" - desc = "A visibly sinister device. Looks like you can break it if you hit it enough." - icon = 'icons/obj/machines/dominator.dmi' - icon_state = "dominator" - density = 1 - anchored = 1 - layer = HIGH_OBJ_LAYER - max_integrity = 300 - obj_integrity = 300 - integrity_failure = 100 - armor = list(melee = 20, bullet = 50, laser = 50, energy = 50, bomb = 10, bio = 100, rad = 100, fire = 10, acid = 70) - var/datum/gang/gang - var/operating = 0 //0=standby or broken, 1=takeover - var/warned = 0 //if this device has set off the warning at <3 minutes yet - var/datum/effect_system/spark_spread/spark_system - var/obj/effect/countdown/dominator/countdown - -/obj/machinery/dominator/tesla_act() - qdel(src) - -/obj/machinery/dominator/New() - ..() - set_light(2) - GLOB.poi_list |= src - spark_system = new - spark_system.set_up(5, TRUE, src) - countdown = new(src) - -/obj/machinery/dominator/examine(mob/user) - ..() - if(stat & BROKEN) - return - - var/time - if(gang && gang.is_dominating) - time = gang.domination_time_remaining() - if(time > 0) - to_chat(user, "Hostile Takeover in progress. Estimated [time] seconds remain.") - else - to_chat(user, "Hostile Takeover of [station_name()] successful. Have a great day.") - else - to_chat(user, "System on standby.") - to_chat(user, "System Integrity: [round((obj_integrity/max_integrity)*100,1)]%") - -/obj/machinery/dominator/process() - ..() - if(gang && gang.is_dominating) - var/time_remaining = gang.domination_time_remaining() - if(time_remaining > 0) - . = TRUE - playsound(loc, 'sound/items/timer.ogg', 10, 0) - if(!warned && (time_remaining < 180)) - warned = 1 - var/area/domloc = get_area(loc) - gang.message_gangtools("Less than 3 minutes remains in hostile takeover. Defend your dominator at [domloc.map_name]!") - for(var/datum/gang/G in SSticker.mode.gangs) - if(G != gang) - G.message_gangtools("WARNING: [gang.name] Gang takeover imminent. Their dominator at [domloc.map_name] must be destroyed!",1,1) - - if(!.) - STOP_PROCESSING(SSmachines, src) - -/obj/machinery/dominator/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) - switch(damage_type) - if(BRUTE) - if(damage_amount) - playsound(src, 'sound/effects/bang.ogg', 50, 1) - else - playsound(loc, 'sound/weapons/tap.ogg', 50, 1) - if(BURN) - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - -/obj/machinery/dominator/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) - . = ..() - if(.) - if(obj_integrity/max_integrity > 0.66) - if(prob(damage_amount*2)) - spark_system.start() - else if(!(stat & BROKEN)) - spark_system.start() - cut_overlays() - add_overlay("damage") - -/obj/machinery/dominator/obj_break(damage_flag) - if(!(stat & BROKEN) && !(flags & NODECONSTRUCT)) - set_broken() - -/obj/machinery/dominator/deconstruct(disassembled = TRUE) - if(!(flags & NODECONSTRUCT)) - if(!(stat & BROKEN)) - set_broken() - new /obj/item/stack/sheet/plasteel(src.loc) - qdel(src) - -/obj/machinery/dominator/attacked_by(obj/item/I, mob/living/user) - add_fingerprint(user) - ..() - -/obj/machinery/dominator/proc/set_broken() - if(gang) - gang.is_dominating = FALSE - - var/takeover_in_progress = 0 - for(var/datum/gang/G in SSticker.mode.gangs) - if(G.is_dominating) - takeover_in_progress = 1 - break - if(!takeover_in_progress) - var/was_stranded = SSshuttle.emergency.mode == SHUTTLE_STRANDED - SSshuttle.clearHostileEnvironment(src) - if(!was_stranded) - priority_announce("All hostile activity within station systems has ceased.","Network Alert") - - if(get_security_level() == "delta") - set_security_level("red") - - gang.message_gangtools("Hostile takeover cancelled: Dominator is no longer operational.[gang.dom_attempts ? " You have [gang.dom_attempts] attempt remaining." : " The station network will have likely blocked any more attempts by us."]",1,1) - - set_light(0) - icon_state = "dominator-broken" - cut_overlays() - operating = 0 - stat |= BROKEN - STOP_PROCESSING(SSmachines, src) - -/obj/machinery/dominator/Destroy() - if(!(stat & BROKEN)) - set_broken() - GLOB.poi_list.Remove(src) - gang = null - QDEL_NULL(spark_system) - QDEL_NULL(countdown) - STOP_PROCESSING(SSmachines, src) - return ..() - -/obj/machinery/dominator/emp_act(severity) - take_damage(100, BURN, "energy", 0) - ..() - -/obj/machinery/dominator/attack_hand(mob/user) - if(operating || (stat & BROKEN)) - examine(user) - return - - var/datum/gang/tempgang - - if(user.mind in SSticker.mode.get_all_gangsters()) - tempgang = user.mind.gang_datum - else - examine(user) - return - - if(tempgang.is_dominating) - to_chat(user, "Error: Hostile Takeover is already in progress.") - return - - if(!tempgang.dom_attempts) - to_chat(user, "Error: Unable to breach station network. Firewall has logged our signature and is blocking all further attempts.") - return - - var/time = round(determine_domination_time(tempgang)/60,0.1) - if(alert(user,"With [round((tempgang.territory.len/GLOB.start_state.num_territories)*100, 1)]% station control, a takeover will require [time] minutes.\nYour gang will be unable to gain influence while it is active.\nThe entire station will likely be alerted to it once it starts.\nYou have [tempgang.dom_attempts] attempt(s) remaining. Are you ready?","Confirm","Ready","Later") == "Ready") - if((tempgang.is_dominating) || !tempgang.dom_attempts || !in_range(src, user) || !isturf(loc)) - return 0 - - var/area/A = get_area(loc) - var/locname = A.map_name - - gang = tempgang - gang.dom_attempts -- - priority_announce("Network breach detected in [locname]. The [gang.name] Gang is attempting to seize control of the station!","Network Alert") - gang.domination() - SSshuttle.registerHostileEnvironment(src) - src.name = "[gang.name] Gang [src.name]" - operating = 1 - icon_state = "dominator-[gang.color]" - - countdown.color = gang.color_hex - countdown.start() - - set_light(3) - START_PROCESSING(SSmachines, src) - - gang.message_gangtools("Hostile takeover in progress: Estimated [time] minutes until victory.[gang.dom_attempts ? "" : " This is your final attempt."]") - for(var/datum/gang/G in SSticker.mode.gangs) - if(G != gang) - G.message_gangtools("Enemy takeover attempt detected in [locname]: Estimated [time] minutes until our defeat.",1,1) diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm deleted file mode 100644 index 9c31edf55fb..00000000000 --- a/code/game/gamemodes/gang/gang.dm +++ /dev/null @@ -1,318 +0,0 @@ -//gang.dm -//Gang War Game Mode - -GLOBAL_LIST_INIT(gang_name_pool, list("Clandestine", "Prima", "Zero-G", "Max", "Blasto", "Waffle", "North", "Omni", "Newton", "Cyber", "Donk", "Gene", "Gib", "Tunnel", "Diablo", "Psyke", "Osiron", "Sirius", "Sleeping Carp")) -GLOBAL_LIST_INIT(gang_colors_pool, list("red","orange","yellow","green","blue","purple")) - -/datum/game_mode - var/list/datum/gang/gangs = list() - var/datum/gang_points/gang_points - -/proc/is_gangster(var/mob/living/M) - return istype(M) && M.mind && M.mind.gang_datum - -/proc/is_in_gang(var/mob/living/M, var/gang_type) - if(!is_gangster(M) || !gang_type) - return 0 - var/datum/gang/G = M.mind.gang_datum - if(G.name == gang_type) - return 1 - return 0 - -/datum/game_mode/gang - name = "gang war" - config_tag = "gang" - antag_flag = ROLE_GANG - restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer") - required_players = 20 - required_enemies = 2 - recommended_enemies = 2 - enemy_minimum_age = 14 - - announce_span = "danger" - announce_text = "A violent turf war has erupted on the station!\n\ - Gangsters: Take over the station with a dominator.\n\ - Crew: Prevent the gangs from expanding and initiating takeover." - -/////////////////////////////////////////////////////////////////////////////// -//Gets the round setup, cancelling if there's not enough players at the start// -/////////////////////////////////////////////////////////////////////////////// -/datum/game_mode/gang/pre_setup() - if(config.protect_roles_from_antagonist) - restricted_jobs += protected_jobs - - if(config.protect_assistant_from_antagonist) - restricted_jobs += "Assistant" - - //Spawn more bosses depending on server population - var/gangs_to_create = 2 - if(prob(num_players() * 2)) - gangs_to_create ++ - - for(var/i=1 to gangs_to_create) - if(!antag_candidates.len) - break - - //Create the gang - var/datum/gang/G = new() - gangs += G - - //Now assign a boss for the gang - var/datum/mind/boss = pick(antag_candidates) - antag_candidates -= boss - G.bosses += boss - boss.gang_datum = G - boss.special_role = "[G.name] Gang Boss" - boss.restricted_roles = restricted_jobs - log_game("[boss.key] has been selected as the Boss for the [G.name] Gang") - - if(gangs.len < 2) //Need at least two gangs - return 0 - - return 1 - - -/datum/game_mode/gang/post_setup() - set waitfor = FALSE - ..() - sleep(rand(10,100)) - for(var/datum/gang/G in gangs) - for(var/datum/mind/boss_mind in G.bosses) - G.add_gang_hud(boss_mind) - forge_gang_objectives(boss_mind) - greet_gang(boss_mind) - equip_gang(boss_mind.current,G) - modePlayer += boss_mind - - -/datum/game_mode/proc/forge_gang_objectives(datum/mind/boss_mind) - var/datum/objective/rival_obj = new - rival_obj.owner = boss_mind - rival_obj.explanation_text = "Be the first gang to successfully takeover the station with a Dominator." - boss_mind.objectives += rival_obj - -/datum/game_mode/proc/greet_gang(datum/mind/boss_mind, you_are=1) - if (you_are) - to_chat(boss_mind.current, "You are the Boss of the [boss_mind.gang_datum.name] Gang!") - boss_mind.announce_objectives() - -/////////////////////////////////////////////////////////////////////////// -//This equips the bosses with their gear, and makes the clown not clumsy// -/////////////////////////////////////////////////////////////////////////// -/datum/game_mode/proc/equip_gang(mob/living/carbon/human/mob, gang) - if(!istype(mob)) - return - - if (mob.mind) - if (mob.mind.assigned_role == "Clown") - to_chat(mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") - mob.dna.remove_mutation(CLOWNMUT) - - var/obj/item/device/gangtool/gangtool = new(mob) - var/obj/item/weapon/pen/gang/T = new(mob) - var/obj/item/toy/crayon/spraycan/gang/SC = new(mob,gang) - var/obj/item/clothing/glasses/hud/security/chameleon/C = new(mob,gang) - - var/list/slots = list ( - "backpack" = slot_in_backpack, - "left pocket" = slot_l_store, - "right pocket" = slot_r_store - ) - - . = 0 - - var/where = mob.equip_in_one_of_slots(gangtool, slots) - if (!where) - to_chat(mob, "Your Syndicate benefactors were unfortunately unable to get you a Gangtool.") - . += 1 - else - gangtool.register_device(mob) - to_chat(mob, "The Gangtool in your [where] will allow you to purchase weapons and equipment, send messages to your gang, and recall the emergency shuttle from anywhere on the station.") - to_chat(mob, "As the gang boss, you can also promote your gang members to lieutenant. Unlike regular gangsters, Lieutenants cannot be deconverted and are able to use recruitment pens and gangtools.") - - var/where2 = mob.equip_in_one_of_slots(T, slots) - if (!where2) - to_chat(mob, "Your Syndicate benefactors were unfortunately unable to get you a recruitment pen to start.") - . += 1 - else - to_chat(mob, "The recruitment pen in your [where2] will help you get your gang started. Stab unsuspecting crew members with it to recruit them.") - - var/where3 = mob.equip_in_one_of_slots(SC, slots) - if (!where3) - to_chat(mob, "Your Syndicate benefactors were unfortunately unable to get you a territory spraycan to start.") - . += 1 - else - to_chat(mob, "The territory spraycan in your [where3] can be used to claim areas of the station for your gang. The more territory your gang controls, the more influence you get. All gangsters can use these, so distribute them to grow your influence faster.") - - var/where4 = mob.equip_in_one_of_slots(C, slots) - if (!where4) - to_chat(mob, "Your Syndicate benefactors were unfortunately unable to get you a chameleon security HUD.") - . += 1 - else - to_chat(mob, "The chameleon security HUD in your [where4] will help you keep track of who is mindshield-implanted, and unable to be recruited.") - return . - - -/////////////////////////////////////////// -//Deals with converting players to a gang// -/////////////////////////////////////////// -/datum/game_mode/proc/add_gangster(datum/mind/gangster_mind, datum/gang/G, check = 1) - if(!G || (gangster_mind in get_all_gangsters()) || (gangster_mind.enslaved_to && !is_gangster(gangster_mind.enslaved_to))) - return 0 - if(check && gangster_mind.current.isloyal()) //Check to see if the potential gangster is implanted - return 1 - G.gangsters += gangster_mind - gangster_mind.gang_datum = G - if(check) - if(iscarbon(gangster_mind.current)) - var/mob/living/carbon/carbon_mob = gangster_mind.current - carbon_mob.silent = max(carbon_mob.silent, 5) - carbon_mob.flash_act(1, 1) - gangster_mind.current.Stun(5) - if(G.is_deconvertible) - to_chat(gangster_mind.current, "You are now a member of the [G.name] Gang!") - to_chat(gangster_mind.current, "Help your bosses take over the station by claiming territory with special spraycans only they can provide. Simply spray on any unclaimed area of the station.") - to_chat(gangster_mind.current, "Their ultimate objective is to take over the station with a Dominator machine.") - to_chat(gangster_mind.current, "You can identify your bosses by their large, bright [G.color] \[G\] icon.") - gangster_mind.store_memory("You are a member of the [G.name] Gang!") - gangster_mind.current.log_message("Has been converted to the [G.name] Gang!", INDIVIDUAL_ATTACK_LOG) - gangster_mind.special_role = "[G.name] Gangster" - - G.add_gang_hud(gangster_mind) - if(jobban_isbanned(gangster_mind.current, ROLE_GANG)) - INVOKE_ASYNC(src, /datum/game_mode.proc/replace_jobbaned_player, gangster_mind.current, ROLE_GANG, ROLE_GANG) - return 2 -//////////////////////////////////////////////////////////////////// -//Deals with players reverting to neutral (Not a gangster anymore)// -//////////////////////////////////////////////////////////////////// -/datum/game_mode/proc/remove_gangster(datum/mind/gangster_mind, beingborged, silent, remove_bosses=0) - var/datum/gang/gang = gangster_mind.gang_datum - if(!gang) - return 0 - - var/removed - - for(var/datum/gang/G in gangs) - if(!G.is_deconvertible && !remove_bosses) - return 0 - if(gangster_mind in G.gangsters) - G.gangsters -= gangster_mind - removed = 1 - if(remove_bosses && (gangster_mind in G.bosses)) - G.bosses -= gangster_mind - removed = 1 - - if(!removed) - return 0 - - gangster_mind.special_role = null - gangster_mind.gang_datum = null - - if(silent < 2) - gangster_mind.current.log_message("Has reformed and defected from the [gang.name] Gang!", INDIVIDUAL_ATTACK_LOG) - - if(beingborged) - if(!silent) - gangster_mind.current.visible_message("The frame beeps contentedly from the MMI before initalizing it.") - to_chat(gangster_mind.current, "The frame's firmware detects and deletes your criminal behavior! You are no longer a gangster!") - message_admins("[ADMIN_LOOKUPFLW(gangster_mind.current)] has been borged while being a member of the [gang.name] Gang. They are no longer a gangster.") - else - if(!silent) - gangster_mind.current.Paralyse(5) - gangster_mind.current.visible_message("[gangster_mind.current] looks like they've given up the life of crime!") - to_chat(gangster_mind.current, "You have been reformed! You are no longer a gangster!
You try as hard as you can, but you can't seem to recall any of the identities of your former gangsters...
") - gangster_mind.memory = "" - - gang.remove_gang_hud(gangster_mind) - return 1 - -//////////////// -//Helper Procs// -//////////////// - -/datum/game_mode/proc/get_all_gangsters() - var/list/all_gangsters = list() - all_gangsters += get_gangsters() - all_gangsters += get_gang_bosses() - return all_gangsters - -/datum/game_mode/proc/get_gangsters() - var/list/gangsters = list() - for(var/datum/gang/G in gangs) - gangsters += G.gangsters - return gangsters - -/datum/game_mode/proc/get_gang_bosses() - var/list/gang_bosses = list() - for(var/datum/gang/G in gangs) - gang_bosses += G.bosses - 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)) - -////////////////////////////////////////////////////////////////////// -//Announces the end of the game with all relavent information stated// -////////////////////////////////////////////////////////////////////// - -/datum/game_mode/proc/auto_declare_completion_gang(datum/gang/winner) - if(!gangs.len) - return - if(!winner) - to_chat(world, "The station was [station_was_nuked ? "destroyed!" : "evacuated before a gang could claim it! The station wins!"]
") - SSblackbox.set_details("round_end_result","loss - gangs failed takeover") - - SSticker.news_report = GANG_LOSS - else - to_chat(world, "The [winner.name] Gang successfully performed a hostile takeover of the station!
") - SSblackbox.set_details("round_end_result","win - gang domination complete") - - SSticker.news_report = GANG_TAKEOVER - - for(var/datum/gang/G in gangs) - var/text = "The [G.name] Gang was [winner==G ? "victorious" : "defeated"] with [round((G.territory.len/GLOB.start_state.num_territories)*100, 1)]% control of the station!" - text += "
The [G.name] Gang Bosses were:" - for(var/datum/mind/boss in G.bosses) - text += printplayer(boss, 1) - text += "
The [G.name] Gangsters were:" - for(var/datum/mind/gangster in G.gangsters) - text += printplayer(gangster, 1) - text += "
" - to_chat(world, text) - -////////////////////////////////////////////////////////// -//Handles influence, territories, and the victory checks// -////////////////////////////////////////////////////////// - -/datum/gang_points - var/next_point_interval = 1800 - var/next_point_time - -/datum/gang_points/New() - next_point_time = world.time + next_point_interval - START_PROCESSING(SSobj, src) - -/datum/gang_points/process(seconds) - var/list/winners = list() //stores the winners if there are any - - for(var/datum/gang/G in SSticker.mode.gangs) - if(world.time > next_point_time) - G.income() - - if(G.is_dominating) - if(G.domination_time_remaining() < 0) - winners += G - - if(world.time > next_point_time) - next_point_time = world.time + next_point_interval - - if(winners.len) - if(winners.len > 1) //Edge Case: If more than one dominator complete at the same time - for(var/datum/gang/G in winners) - G.domination(0.5) - priority_announce("Multiple station takeover attempts have made simultaneously. Conflicting takeover attempts appears to have restarted.","Network Alert") - else - SSticker.mode.explosion_in_progress = 1 - SSticker.station_explosion_cinematic(1) - SSticker.mode.explosion_in_progress = 0 - SSticker.force_ending = pick(winners) diff --git a/code/game/gamemodes/gang/gang_datum.dm b/code/game/gamemodes/gang/gang_datum.dm deleted file mode 100644 index 3c54d5436b7..00000000000 --- a/code/game/gamemodes/gang/gang_datum.dm +++ /dev/null @@ -1,265 +0,0 @@ -//gang_datum.dm -//Datum-based gangs - -/datum/gang - var/name = "ERROR" - var/color = "white" - var/color_hex = "#FFFFFF" - var/list/datum/mind/gangsters = list() //gang B Members - var/list/datum/mind/bosses = list() //gang A Bosses - var/list/obj/item/device/gangtool/gangtools = list() - var/style - var/fighting_style = "normal" - var/list/territory = list() - var/list/territory_new = list() - var/list/territory_lost = list() - var/dom_attempts = 2 - var/points = 15 - var/datum/atom_hud/antag/gang/ganghud - var/is_deconvertible = TRUE //Can you deconvert normal gangsters from the gang - - var/domination_timer - var/is_dominating - - var/item_list - var/item_category_list - var/buyable_items = list( - /datum/gang_item/function/gang_ping, - /datum/gang_item/function/recall, - /datum/gang_item/function/outfit, - /datum/gang_item/weapon/switchblade, - /datum/gang_item/weapon/pistol, - /datum/gang_item/weapon/ammo/pistol_ammo, - /datum/gang_item/weapon/uzi, - /datum/gang_item/weapon/ammo/uzi_ammo, - /datum/gang_item/equipment/spraycan, - /datum/gang_item/equipment/c4, - /datum/gang_item/equipment/implant_breaker, - /datum/gang_item/equipment/pen, - /datum/gang_item/equipment/gangtool, - /datum/gang_item/equipment/necklace, - /datum/gang_item/equipment/dominator - ) - -/datum/gang/New(loc,gangname) - if(!GLOB.gang_colors_pool.len) - message_admins("WARNING: Maximum number of gangs have been exceeded!") - throw EXCEPTION("Maximum number of gangs has been exceeded") - return - else - color = pick(GLOB.gang_colors_pool) - GLOB.gang_colors_pool -= color - switch(color) - if("red") - color_hex = "#DA0000" - if("orange") - color_hex = "#FF9300" - if("yellow") - color_hex = "#FFF200" - if("green") - color_hex = "#A8E61D" - if("blue") - color_hex = "#00B7EF" - if("purple") - color_hex = "#DA00FF" - - name = (gangname ? gangname : pick(GLOB.gang_name_pool)) - GLOB.gang_name_pool -= name - - ganghud = new() - ganghud.color = color_hex - log_game("The [name] Gang has been created. Their gang color is [color].") - build_item_list() - -/datum/gang/proc/build_item_list() - item_list = list() - item_category_list = list() - for(var/V in buyable_items) - var/datum/gang_item/G = new V() - item_list[G.id] = G - var/list/Cat = item_category_list[G.category] - if(Cat) - Cat += G - else - item_category_list[G.category] = list(G) - -/datum/gang/proc/add_gang_hud(datum/mind/recruit_mind) - ganghud.join_hud(recruit_mind.current) - SSticker.mode.set_antag_hud(recruit_mind.current, ((recruit_mind in bosses) ? "gang_boss" : "gangster")) - -/datum/gang/proc/remove_gang_hud(datum/mind/defector_mind) - ganghud.leave_hud(defector_mind.current) - SSticker.mode.set_antag_hud(defector_mind.current, null) - -/datum/gang/proc/domination(modifier=1) - set_domination_time(determine_domination_time(src) * modifier) - is_dominating = TRUE - set_security_level("delta") - -/datum/gang/proc/set_domination_time(d) - domination_timer = world.time + (10 * d) - -/datum/gang/proc/domination_time_remaining() - var/diff = domination_timer - world.time - return diff / 10 -//////////////////////////////////////////// OUTFITS - - -//Used by recallers when purchasing a gang outfit. First time a gang outfit is purchased the buyer decides a gang style which is stored so gang outfits are uniform -/datum/gang/proc/gang_outfit(mob/living/carbon/user,obj/item/device/gangtool/gangtool) - if(!user || !gangtool) - return 0 - if(!gangtool.can_use(user)) - return 0 - - var/gang_style_list = list("Gang Colors","Black Suits","White Suits","Leather Jackets","Leather Overcoats","Puffer Jackets","Military Jackets","Tactical Turtlenecks","Soviet Uniforms") - if(!style && (user.mind in SSticker.mode.get_gang_bosses())) //Only the boss gets to pick a style - style = input("Pick an outfit style.", "Pick Style") as null|anything in gang_style_list - - if(gangtool.can_use(user) && (gangtool.outfits >= 1)) - var/outfit_path - switch(style) - if(null || "Gang Colors") - outfit_path = text2path("/obj/item/clothing/under/color/[color]") - if("Black Suits") - outfit_path = /obj/item/clothing/under/suit_jacket/charcoal - if("White Suits") - outfit_path = /obj/item/clothing/under/suit_jacket/white - if("Puffer Jackets") - outfit_path = /obj/item/clothing/suit/jacket/puffer - if("Leather Jackets") - outfit_path = /obj/item/clothing/suit/jacket/leather - if("Leather Overcoats") - outfit_path = /obj/item/clothing/suit/jacket/leather/overcoat - if("Military Jackets") - outfit_path = /obj/item/clothing/suit/jacket/miljacket - if("Soviet Uniforms") - outfit_path = /obj/item/clothing/under/soviet - if("Tactical Turtlenecks") - outfit_path = /obj/item/clothing/under/syndicate - - if(outfit_path) - var/obj/item/clothing/outfit = new outfit_path(user.loc) - outfit.armor = list(melee = 20, bullet = 30, laser = 10, energy = 10, bomb = 20, bio = 0, rad = 0, fire = 30, acid = 30) - outfit.desc += " Tailored for the [name] Gang to offer the wearer moderate protection against ballistics and physical trauma." - outfit.gang = src - user.put_in_hands(outfit) - return 1 - - return 0 - - -//////////////////////////////////////////// MESSAGING - - -/datum/gang/proc/message_gangtools(message,beep=1,warning) - if(!gangtools.len || !message) - return - for(var/obj/item/device/gangtool/tool in gangtools) - var/mob/living/mob = get(tool.loc,/mob/living) - if(mob && mob.mind && mob.stat == CONSCIOUS) - if(mob.mind.gang_datum == src) - to_chat(mob, "\icon[tool] [message]") - return - - -//////////////////////////////////////////// INCOME - - -/datum/gang/proc/income() - if(!bosses.len) - return - var/added_names = "" - var/lost_names = "" - - //Re-add territories that were reclaimed, so if they got tagged over, they can still earn income if they tag it back before the next status report - var/list/reclaimed_territories = territory_new & territory_lost - territory |= reclaimed_territories - territory_new -= reclaimed_territories - territory_lost -= reclaimed_territories - - //Process lost territories - for(var/area in territory_lost) - if(lost_names != "") - lost_names += ", " - lost_names += "[territory_lost[area]]" - territory -= area - - //Count uniformed gangsters - var/uniformed = 0 - for(var/datum/mind/gangmind in (gangsters|bosses)) - if(ishuman(gangmind.current)) - var/mob/living/carbon/human/gangster = gangmind.current - //Gangster must be alive and on station - if((gangster.stat == DEAD) || (gangster.z > ZLEVEL_STATION)) - continue - - var/obj/item/clothing/outfit - var/obj/item/clothing/gang_outfit - if(gangster.w_uniform) - outfit = gangster.w_uniform - if(outfit.gang == src) - gang_outfit = outfit - if(gangster.wear_suit) - outfit = gangster.wear_suit - if(outfit.gang == src) - gang_outfit = outfit - - if(gang_outfit) - to_chat(gangster, "The [src] Gang's influence grows as you wear [gang_outfit].") - uniformed ++ - - //Calculate and report influence growth - var/message = "[src] Gang Status Report:
*---------*
" - if(is_dominating) - var/seconds_remaining = domination_time_remaining() - var/new_time = max(180, seconds_remaining - (uniformed * 4) - (territory.len * 2)) - if(new_time < seconds_remaining) - message += "Takeover shortened by [seconds_remaining - new_time] seconds for defending [territory.len] territories and [uniformed] uniformed gangsters.
" - set_domination_time(new_time) - message += "[seconds_remaining] seconds remain in hostile takeover.
" - else - var/points_new = min(999,points + 15 + (uniformed * 2) + territory.len) - if(points_new != points) - message += "Gang influence has increased by [points_new - points] for defending [territory.len] territories and [uniformed] uniformed gangsters.
" - points = points_new - message += "Your gang now has [points] influence.
" - - //Process new territories - for(var/area in territory_new) - if(added_names != "") - added_names += ", " - added_names += "[territory_new[area]]" - territory += area - - //Report territory changes - message += "[territory_new.len] new territories:
[added_names]
" - message += "[territory_lost.len] territories lost:
[lost_names]
" - - //Clear the lists - territory_new = list() - territory_lost = list() - - var/control = round((territory.len/GLOB.start_state.num_territories)*100, 1) - message += "Your gang now has [control]% control of the station.
*---------*" - message_gangtools(message) - - //Increase outfit stock - for(var/obj/item/device/gangtool/tool in gangtools) - tool.outfits = min(tool.outfits+1,5) - - -//Multiverse - -/datum/gang/multiverse - dom_attempts = 0 - points = 0 - fighting_style = "multiverse" - is_deconvertible = FALSE - -/datum/gang/multiverse/New(loc, multiverse_override) - name = multiverse_override - ganghud = new() - -/datum/gang/multiverse/income() - return \ No newline at end of file diff --git a/code/game/gamemodes/gang/gang_items.dm b/code/game/gamemodes/gang/gang_items.dm deleted file mode 100644 index a8732c10469..00000000000 --- a/code/game/gamemodes/gang/gang_items.dm +++ /dev/null @@ -1,294 +0,0 @@ -/datum/gang_item - var/name - var/item_path - var/cost - var/spawn_msg - var/category - var/id - -/datum/gang_item/proc/purchase(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool, check_canbuy = TRUE) - if(check_canbuy && !can_buy(user, gang, gangtool)) - return FALSE - var/real_cost = get_cost(user, gang, gangtool) - if(gang && real_cost) - gang.message_gangtools("A [get_name_display(user, gang, gangtool)] was purchased by [user.real_name] for [real_cost] Influence.") - log_game("A [id] was purchased by [key_name(user)] ([gang.name] Gang) for [real_cost] Influence.") - gang.points -= real_cost - spawn_item(user, gang, gangtool) - return TRUE - -/datum/gang_item/proc/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - if(item_path) - var/obj/item/O = new item_path(user.loc) - user.put_in_hands(O) - if(spawn_msg) - to_chat(user, spawn_msg) - -/datum/gang_item/proc/can_buy(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - return gang && (gang.points >= get_cost(user, gang, gangtool)) && can_see(user, gang, gangtool) - -/datum/gang_item/proc/can_see(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - return TRUE - -/datum/gang_item/proc/get_cost(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - return cost - -/datum/gang_item/proc/get_cost_display(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - return "([get_cost(user, gang, gangtool)] Influence)" - -/datum/gang_item/proc/get_name_display(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - return name - -/datum/gang_item/proc/isboss(mob/living/carbon/user, datum/gang/gang) - return user && gang && (user.mind == gang.bosses[1]) - -/datum/gang_item/proc/get_extra_info(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - return - -/////////////////// -//FUNCTIONS -/////////////////// - -/datum/gang_item/function - category = "Gangtool Functions:" - cost = 0 - -/datum/gang_item/function/get_cost_display(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - return "" - - -/datum/gang_item/function/gang_ping - name = "Send Message to Gang" - id = "gang_ping" - -/datum/gang_item/function/gang_ping/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - if(gangtool) - gangtool.ping_gang(user) - - -/datum/gang_item/function/recall - name = "Recall Emergency Shuttle" - id = "recall" - -/datum/gang_item/function/recall/can_see(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - return isboss(user, gang) - -/datum/gang_item/function/recall/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - if(gangtool) - gangtool.recall(user) - - -/datum/gang_item/function/outfit - name = "Create Armored Gang Outfit" - id = "outfit" - -/datum/gang_item/function/outfit/can_buy(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - return gangtool && (gangtool.outfits > 0) && ..() - -/datum/gang_item/function/outfit/get_cost_display(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - if(gangtool && !gangtool.outfits) - return "(Restocking)" - return ..() - -/datum/gang_item/function/outfit/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - if(gang && gang.gang_outfit(user, gangtool)) - to_chat(user, "Gang Outfits can act as armor with moderate protection against ballistic and melee attacks. Every gangster wearing one will also help grow your gang's influence.") - if(gangtool) - gangtool.outfits -= 1 - -/////////////////// -//WEAPONS -/////////////////// - -/datum/gang_item/weapon - category = "Purchase Weapons:" - -/datum/gang_item/weapon/ammo - -/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/switchblade - name = "Switchblade" - id = "switchblade" - cost = 10 - item_path = /obj/item/weapon/switchblade - -/datum/gang_item/weapon/pistol - name = "10mm Pistol" - id = "pistol" - cost = 25 - item_path = /obj/item/weapon/gun/ballistic/automatic/pistol - -/datum/gang_item/weapon/ammo/pistol_ammo - name = "10mm Ammo" - id = "pistol_ammo" - cost = 10 - item_path = /obj/item/ammo_box/magazine/m10mm - -/datum/gang_item/weapon/uzi - name = "Uzi SMG" - id = "uzi" - cost = 60 - item_path = /obj/item/weapon/gun/ballistic/automatic/mini_uzi - id = "uzi" - -/datum/gang_item/weapon/ammo/uzi_ammo - name = "Uzi Ammo" - 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 -/////////////////// - -/datum/gang_item/equipment - category = "Purchase Equipment:" - - -/datum/gang_item/equipment/spraycan - name = "Territory Spraycan" - id = "spraycan" - cost = 5 - item_path = /obj/item/toy/crayon/spraycan/gang - -/datum/gang_item/equipment/necklace - name = "Gold Necklace" - id = "necklace" - cost = 1 - item_path = /obj/item/clothing/neck/necklace/dope - -/datum/gang_item/equipment/c4 - name = "C4 Explosive" - id = "c4" - cost = 10 - item_path = /obj/item/weapon/grenade/plastic/c4 - -/datum/gang_item/equipment/implant_breaker - name = "Implant Breaker" - id = "implant_breaker" - cost = 10 - item_path = /obj/item/weapon/implanter/gang - spawn_msg = "The implant breaker is a single-use device that destroys all implants within the target before trying to recruit them to your gang. Also works on enemy gangsters." - -/datum/gang_item/equipment/implant_breaker/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - if(item_path) - var/obj/item/O = new item_path(user.loc, gang) //we need to override this whole proc for this one argument - user.put_in_hands(O) - if(spawn_msg) - to_chat(user, spawn_msg) - -/datum/gang_item/equipment/pen - name = "Recruitment Pen" - id = "pen" - cost = 50 - item_path = /obj/item/weapon/pen/gang - spawn_msg = "More recruitment pens will allow you to recruit gangsters faster. Only gang leaders can recruit with pens." - -/datum/gang_item/equipment/pen/purchase(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - if(..()) - gangtool.free_pen = FALSE - return TRUE - return FALSE - -/datum/gang_item/equipment/pen/get_cost(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - if(gangtool && gangtool.free_pen) - return 0 - return ..() - -/datum/gang_item/equipment/pen/get_cost_display(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - if(gangtool && gangtool.free_pen) - return "(GET ONE FREE)" - return ..() - - -/datum/gang_item/equipment/gangtool - id = "gangtool" - cost = 10 - -/datum/gang_item/equipment/gangtool/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - var/item_type - if(gang && isboss(user, gang)) - item_type = /obj/item/device/gangtool/spare/lt - if(gang.bosses.len < 3) - to_chat(user, "Gangtools allow you to promote a gangster to be your Lieutenant, enabling them to recruit and purchase items like you. Simply have them register the gangtool. You may promote up to [3-gang.bosses.len] more Lieutenants") - else - item_type = /obj/item/device/gangtool/spare - var/obj/item/device/gangtool/spare/tool = new item_type(user.loc) - user.put_in_hands(tool) - -/datum/gang_item/equipment/gangtool/get_name_display(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - if(gang && isboss(user, gang) && (gang.bosses.len < 3)) - return "Promote a Gangster" - return "Spare Gangtool" - - -/datum/gang_item/equipment/dominator - name = "Station Dominator" - id = "dominator" - cost = 30 - item_path = /obj/machinery/dominator - spawn_msg = "The dominator will secure your gang's dominance over the station. Turn it on when you are ready to defend it." - -/datum/gang_item/equipment/dominator/can_buy(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - if(!gang || !gang.dom_attempts) - return FALSE - return ..() - -/datum/gang_item/equipment/dominator/get_name_display(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - if(!gang || !gang.dom_attempts) - return ..() - return "[..()]" - -/datum/gang_item/equipment/dominator/get_cost_display(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - if(!gang || !gang.dom_attempts) - return "(Out of stock)" - return ..() - -/datum/gang_item/equipment/dominator/get_extra_info(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - if(gang) - return "(Estimated Takeover Time: [round(determine_domination_time(gang)/60,0.1)] minutes)" - -/datum/gang_item/equipment/dominator/purchase(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - var/area/usrarea = get_area(user.loc) - var/usrturf = get_turf(user.loc) - if(initial(usrarea.name) == "Space" || isspaceturf(usrturf) || usr.z != 1) - to_chat(user, "You can only use this on the station!") - return FALSE - - for(var/obj/obj in usrturf) - if(obj.density) - to_chat(user, "There's not enough room here!") - return FALSE - - if(!(usrarea.type in gang.territory|gang.territory_new)) - to_chat(user, "The dominator can be spawned only on territory controlled by your gang!") - return FALSE - return ..() - -/datum/gang_item/equipment/dominator/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - new item_path(user.loc) diff --git a/code/game/gamemodes/gang/gang_pen.dm b/code/game/gamemodes/gang/gang_pen.dm deleted file mode 100644 index 621d40cc458..00000000000 --- a/code/game/gamemodes/gang/gang_pen.dm +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Gang Boss Pens - */ -/obj/item/weapon/pen/gang - origin_tech = "materials=2;syndicate=3" - var/cooldown - var/last_used = 0 - var/charges = 1 - -/obj/item/weapon/pen/gang/New() - ..() - last_used = world.time - -/obj/item/weapon/pen/gang/attack(mob/living/M, mob/user, stealth = TRUE) - if(!istype(M)) - return - if(ishuman(M) && ishuman(user) && M.stat != DEAD) - if(user.mind && (user.mind in SSticker.mode.get_gang_bosses())) - if(..(M,user,1)) - if(cooldown) - to_chat(user, "[src] needs more time to recharge before it can be used.") - return - if(M.client) - M.mind_initialize() //give them a mind datum if they don't have one. - var/datum/gang/G = user.mind.gang_datum - var/recruitable = SSticker.mode.add_gangster(M.mind,G) - switch(recruitable) - if(2) - M.Paralyse(5) - cooldown(G) - if(1) - to_chat(user, "This mind is resistant to recruitment!") - else - to_chat(user, "This mind has already been recruited into a gang!") - return - ..() - -/obj/item/weapon/pen/gang/proc/cooldown(datum/gang/gang) - set waitfor = FALSE - var/cooldown_time = 600+(600*gang.bosses.len) // 1recruiter=2mins, 2recruiters=3mins, 3recruiters=4mins - - cooldown = 1 - icon_state = "pen_blink" - - var/time_passed = world.time - last_used - var/time - for(time=time_passed, time>=cooldown_time, time-=cooldown_time) //get 1 charge every cooldown interval - charges++ - - charges = max(0,charges-1) - - last_used = world.time - time - - if(charges) - cooldown_time = 50 - sleep(cooldown_time) - cooldown = 0 - icon_state = "pen" - var/mob/M = get(src, /mob) - to_chat(M, "\icon[src] [src][(src.loc == M)?(""):(" in your [src.loc]")] vibrates softly. It is ready to be used again.") diff --git a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm deleted file mode 100644 index 0885b326122..00000000000 --- a/code/game/gamemodes/gang/recaller.dm +++ /dev/null @@ -1,240 +0,0 @@ -//gangtool device -/obj/item/device/gangtool - name = "suspicious device" - desc = "A strange device of sorts. Hard to really make out what it actually does if you don't know how to operate it." - icon_state = "gangtool-white" - item_state = "walkietalkie" - throwforce = 0 - w_class = WEIGHT_CLASS_TINY - throw_speed = 3 - throw_range = 7 - flags = CONDUCT - origin_tech = "programming=5;bluespace=2;syndicate=5" - var/datum/gang/gang //Which gang uses this? - var/recalling = 0 - var/outfits = 3 - var/free_pen = 0 - var/promotable = 0 - -/obj/item/device/gangtool/Initialize() //Initialize supply point income if it hasn't already been started - ..() - if(!SSticker.mode.gang_points) - SSticker.mode.gang_points = new /datum/gang_points(SSticker.mode) - -/obj/item/device/gangtool/attack_self(mob/user) - if (!can_use(user)) - return - - var/dat - if(!gang) - dat += "This device is not registered.

" - if(user.mind in SSticker.mode.get_gang_bosses()) - if(promotable && user.mind.gang_datum.bosses.len < 3) - dat += "Give this device to another member of your organization to use to promote them to Lieutenant.

" - dat += "If this is meant as a spare device for yourself:
" - dat += "Register Device as Spare
" - else if (promotable) - if(user.mind.gang_datum.bosses.len < 3) - dat += "You have been selected for a promotion!
" - dat += "Accept Promotion
" - else - dat += "No promotions available: All positions filled.
" - else - dat += "This device is not authorized to promote.
" - else - if(gang.is_dominating) - dat += "

Takeover In Progress:
[gang.domination_time_remaining()] seconds remain
" - - var/isboss = (user.mind == gang.bosses[1]) - dat += "Registration: [gang.name] Gang [isboss ? "Boss" : "Lieutenant"]
" - dat += "Organization Size: [gang.gangsters.len + gang.bosses.len] | Station Control: [round((gang.territory.len/GLOB.start_state.num_territories)*100, 1)]%
" - dat += "Gang Influence: [gang.points]
" - dat += "Time until Influence grows: [(gang.points >= 999) ? ("--:--") : (time2text(SSticker.mode.gang_points.next_point_time - world.time, "mm:ss"))]
" - dat += "
" - - - for(var/cat in gang.item_category_list) - dat += "[cat]
" - for(var/V in gang.item_category_list[cat]) - var/datum/gang_item/G = V - if(!G.can_see(user, gang, src)) - continue - - var/cost = G.get_cost_display(user, gang, src) - if(cost) - dat += cost + " " - - var/toAdd = G.get_name_display(user, gang, src) - if(G.can_buy(user, gang, src)) - toAdd = "[toAdd]" - dat += toAdd - var/extra = G.get_extra_info(user, gang, src) - if(extra) - dat += "
[extra]" - dat += "
" - dat += "
" - - dat += "Refresh
" - - var/datum/browser/popup = new(user, "gangtool", "Welcome to GangTool v3.4", 340, 625) - popup.set_content(dat) - popup.open() - - - -/obj/item/device/gangtool/Topic(href, href_list) - if(!can_use(usr)) - return - - add_fingerprint(usr) - - if(href_list["register"]) - register_device(usr) - - else if(!gang) //Gangtool must be registered before you can use the functions below - return - - if(href_list["purchase"]) - var/datum/gang_item/G = gang.item_list[href_list["purchase"]] - if(G && G.can_buy(usr, gang, src)) - G.purchase(usr, gang, src, FALSE) - - attack_self(usr) - - -/obj/item/device/gangtool/proc/ping_gang(mob/user) - if(!user) - return - var/message = stripped_input(user,"Discreetly send a gang-wide message.","Send Message") as null|text - if(!message || !can_use(user)) - return - if(user.z > 2) - to_chat(user, "\icon[src]Error: Station out of range.") - return - var/list/members = list() - members += gang.gangsters - members += gang.bosses - if(members.len) - var/gang_rank = gang.bosses.Find(user.mind) - switch(gang_rank) - if(1) - gang_rank = "Gang Boss" - if(2) - gang_rank = "1st Lieutenant" - if(3) - gang_rank = "2nd Lieutenant" - if(4) - gang_rank = "3rd Lieutenant" - else - gang_rank = "[gang_rank - 1]th Lieutenant" - var/ping = "[gang.name] [gang_rank]: [message]" - for(var/datum/mind/ganger in members) - if(ganger.current && (ganger.current.z <= 2) && (ganger.current.stat == CONSCIOUS)) - to_chat(ganger.current, ping) - for(var/mob/M in GLOB.dead_mob_list) - var/link = FOLLOW_LINK(M, user) - to_chat(M, "[link] [ping]") - log_game("[key_name(user)] Messaged [gang.name] Gang: [message].") - - -/obj/item/device/gangtool/proc/register_device(mob/user) - if(gang) //It's already been registered! - return - if((promotable && (user.mind in SSticker.mode.get_gangsters())) || (user.mind in SSticker.mode.get_gang_bosses())) - gang = user.mind.gang_datum - gang.gangtools += src - icon_state = "gangtool-[gang.color]" - if(!(user.mind in gang.bosses)) - SSticker.mode.remove_gangster(user.mind, 0, 2) - gang.bosses += user.mind - user.mind.gang_datum = gang - user.mind.special_role = "[gang.name] Gang Lieutenant" - gang.add_gang_hud(user.mind) - log_game("[key_name(user)] has been promoted to Lieutenant in the [gang.name] Gang") - free_pen = 1 - gang.message_gangtools("[user] has been promoted to Lieutenant.") - to_chat(user, "You have been promoted to Lieutenant!") - SSticker.mode.forge_gang_objectives(user.mind) - SSticker.mode.greet_gang(user.mind,0) - to_chat(user, "The Gangtool you registered will allow you to purchase weapons and equipment, and send messages to your gang.") - to_chat(user, "Unlike regular gangsters, you may use recruitment pens to add recruits to your gang. Use them on unsuspecting crew members to recruit them. Don't forget to get your one free pen from the gangtool.") - else - to_chat(usr, "ACCESS DENIED: Unauthorized user.") - -/obj/item/device/gangtool/proc/recall(mob/user) - if(!can_use(user)) - return 0 - - if(recalling) - to_chat(usr, "Error: Recall already in progress.") - return 0 - - gang.message_gangtools("[usr] is attempting to recall the emergency shuttle.") - recalling = 1 - to_chat(loc, "\icon[src]Generating shuttle recall order with codes retrieved from last call signal...") - - sleep(rand(100,300)) - - if(SSshuttle.emergency.mode != SHUTTLE_CALL) //Shuttle can only be recalled when it's moving to the station - to_chat(user, "\icon[src]Emergency shuttle cannot be recalled at this time.") - recalling = 0 - return 0 - to_chat(loc, "\icon[src]Shuttle recall order generated. Accessing station long-range communication arrays...") - - sleep(rand(100,300)) - - if(!gang.dom_attempts) - to_chat(user, "\icon[src]Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts.") - recalling = 0 - return 0 - - var/turf/userturf = get_turf(user) - if(userturf.z != 1) //Shuttle can only be recalled while on station - to_chat(user, "\icon[src]Error: Device out of range of station communication arrays.") - recalling = 0 - return 0 - var/datum/station_state/end_state = new /datum/station_state() - end_state.count() - if((100 * GLOB.start_state.score(end_state)) < 80) //Shuttle cannot be recalled if the station is too damaged - to_chat(user, "\icon[src]Error: Station communication systems compromised. Unable to establish connection.") - recalling = 0 - return 0 - to_chat(loc, "\icon[src]Comm arrays accessed. Broadcasting recall signal...") - - sleep(rand(100,300)) - - recalling = 0 - log_game("[key_name(user)] has tried to recall the shuttle with a gangtool.") - message_admins("[key_name_admin(user)] has tried to recall the shuttle with a gangtool.", 1) - userturf = get_turf(user) - if(userturf.z == 1) //Check one more time that they are on station. - if(SSshuttle.cancelEvac(user)) - return 1 - - to_chat(loc, "\icon[src]No response recieved. Emergency shuttle cannot be recalled at this time.") - return 0 - -/obj/item/device/gangtool/proc/can_use(mob/living/carbon/human/user) - if(!istype(user)) - return 0 - if(user.restrained() || user.lying || user.stat || user.stunned || user.weakened) - return 0 - if(!(src in user.contents)) - return 0 - if(!user.mind) - return 0 - - if(gang) //If it's already registered, only let the gang's bosses use this - if(user.mind in gang.bosses) - return 1 - else //If it's not registered, any gangster can use this to register - if(user.mind in SSticker.mode.get_all_gangsters()) - return 1 - - return 0 - -/obj/item/device/gangtool/spare - outfits = 1 - -/obj/item/device/gangtool/spare/lt - promotable = 1 diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index dde67fb664e..f009b8ada71 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -239,20 +239,14 @@ assigned = "[user.real_name]" user.faction = list("[user.real_name]") to_chat(user, "You bind the sword to yourself. You can now use it to summon help.") - if(!is_gangster(user)) - var/datum/gang/multiverse/G = new(src, "[user.real_name]") - SSticker.mode.gangs += G - G.bosses += user.mind - G.add_gang_hud(user.mind) - user.mind.gang_datum = G - to_chat(user, "With your new found power you could easily conquer the station!") - var/datum/objective/hijackclone/hijack_objective = new /datum/objective/hijackclone - hijack_objective.owner = user.mind - user.mind.objectives += hijack_objective - hijack_objective.explanation_text = "Ensure only [user.real_name] and their copies are on the shuttle!" - to_chat(user, "Objective #[1]: [hijack_objective.explanation_text]") - SSticker.mode.traitors += user.mind - user.mind.special_role = "[user.real_name] Prime" + to_chat(user, "With your new found power you could easily conquer the station!") + var/datum/objective/hijackclone/hijack_objective = new /datum/objective/hijackclone + hijack_objective.owner = user.mind + user.mind.objectives += hijack_objective + hijack_objective.explanation_text = "Ensure only [user.real_name] and their copies are on the shuttle!" + to_chat(user, "Objective #[1]: [hijack_objective.explanation_text]") + SSticker.mode.traitors += user.mind + user.mind.special_role = "[user.real_name] Prime" else var/list/candidates = get_candidates(ROLE_WIZARD) if(candidates.len) @@ -276,7 +270,6 @@ M.key = C.key M.mind.name = user.real_name to_chat(M, "You are an alternate version of [user.real_name] from another universe! Help them accomplish their goals at all costs.") - SSticker.mode.add_gangster(M.mind, user.mind.gang_datum, FALSE) M.real_name = user.real_name M.name = user.real_name M.faction = list("[user.real_name]") diff --git a/code/game/objects/effects/countdown.dm b/code/game/objects/effects/countdown.dm index 520158dfb0c..bd9bd3a3311 100644 --- a/code/game/objects/effects/countdown.dm +++ b/code/game/objects/effects/countdown.dm @@ -97,21 +97,6 @@ var/completion = round(C.get_completion()) return completion -/obj/effect/countdown/dominator - name = "dominator countdown" - text_size = 1 - color = "#ff00ff" // Overwritten when the dominator starts - -/obj/effect/countdown/dominator/get_value() - var/obj/machinery/dominator/D = attached_to - if(!istype(D)) - return - else if(D.gang && D.gang.is_dominating) - var/timer = D.gang.domination_time_remaining() - return timer - else - return "OFFLINE" - /obj/effect/countdown/clockworkgate name = "gateway countdown" text_size = 1 diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index 6a41809eb17..dce98cf5fd8 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -8,11 +8,14 @@ /obj/effect/decal/cleanable/crayon/Initialize(mapload, main = "#FFFFFF", var/type = "rune1", var/e_name = "rune", var/rotation = 0, var/alt_icon = null) ..() - + name = e_name desc = "A [name] vandalizing the station." + + var/static/list/gang_name_pool = list("Clandestine", "Prima", "Zero-G", "Max", "Blasto", "Waffle", "North", "Omni", "Newton", "Cyber", "Donk", "Gene", "Gib", "Tunnel", "Diablo", "Psyke", "Osiron", "Sirius", "Sleeping Carp") if(type == "poseur tag") - type = pick(GLOB.gang_name_pool) + type = pick(gang_name_pool) + if(alt_icon) icon = alt_icon @@ -23,31 +26,4 @@ M.Turn(rotation) src.transform = M - add_atom_colour(main, FIXED_COLOUR_PRIORITY) - - -/obj/effect/decal/cleanable/crayon/gang - layer = HIGH_OBJ_LAYER //Harder to hide - do_icon_rotate = FALSE //These are designed to always face south, so no rotation please. - var/datum/gang/gang - -/obj/effect/decal/cleanable/crayon/gang/Initialize(mapload, var/datum/gang/G, var/e_name = "gang tag", var/rotation = 0) - if(!type || !G) - qdel(src) - - var/area/territory = get_area(src) - gang = G - var/newcolor = G.color_hex - icon_state = G.name - G.territory_new |= list(territory.type = territory.name) - - ..(mapload, newcolor, icon_state, e_name, rotation) - -/obj/effect/decal/cleanable/crayon/gang/Destroy() - var/area/territory = get_area(src) - - if(gang) - gang.territory -= territory.type - gang.territory_new -= territory.type - gang.territory_lost |= list(territory.type = territory.name) - return ..() + add_atom_colour(main, FIXED_COLOUR_PRIORITY) \ No newline at end of file diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index af8b9341f94..132b6af99f5 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -54,7 +54,6 @@ var/self_contained = TRUE // If it deletes itself when it is empty var/list/validSurfaces = list(/turf/open/floor) - var/gang = FALSE //For marking territory var/edible = TRUE // That doesn't mean eating it is a good idea @@ -277,15 +276,6 @@ else if(drawing in numerals) temp = "number" - // If a gang member is using a gang spraycan, it'll behave differently - var/gang_mode = FALSE - if(gang && user.mind && user.mind.gang_datum) - gang_mode = TRUE - - // discontinue if the area isn't valid for tagging because gang "honour" - if(gang_mode && (!can_claim_for_gang(user, target))) - return - var/graf_rot if(drawing in oriented) switch(user.dir) @@ -306,8 +296,6 @@ playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5) var/takes_time = !instant - if(gang_mode) - takes_time = TRUE var/wait_time = 50 if(PAINT_LARGE_HORIZONTAL) @@ -324,28 +312,21 @@ var/list/turf/affected_turfs = list() if(actually_paints) - if(gang_mode) - // Double check it wasn't tagged in the meanwhile - if(!can_claim_for_gang(user, target)) - return - tag_for_gang(user, target) - affected_turfs += target - else - switch(paint_mode) - if(PAINT_NORMAL) - new /obj/effect/decal/cleanable/crayon(target, paint_color, drawing, temp, graf_rot) + switch(paint_mode) + if(PAINT_NORMAL) + new /obj/effect/decal/cleanable/crayon(target, paint_color, drawing, temp, graf_rot) + affected_turfs += target + if(PAINT_LARGE_HORIZONTAL) + var/turf/left = locate(target.x-1,target.y,target.z) + var/turf/right = locate(target.x+1,target.y,target.z) + if(is_type_in_list(left, validSurfaces) && is_type_in_list(right, validSurfaces)) + new /obj/effect/decal/cleanable/crayon(left, paint_color, drawing, temp, graf_rot, PAINT_LARGE_HORIZONTAL_ICON) + affected_turfs += left + affected_turfs += right affected_turfs += target - if(PAINT_LARGE_HORIZONTAL) - var/turf/left = locate(target.x-1,target.y,target.z) - var/turf/right = locate(target.x+1,target.y,target.z) - if(is_type_in_list(left, validSurfaces) && is_type_in_list(right, validSurfaces)) - new /obj/effect/decal/cleanable/crayon(left, paint_color, drawing, temp, graf_rot, PAINT_LARGE_HORIZONTAL_ICON) - affected_turfs += left - affected_turfs += right - affected_turfs += target - else - to_chat(user, "There isn't enough space to paint!") - return + else + to_chat(user, "There isn't enough space to paint!") + return if(!instant) to_chat(user, "You finish drawing \the [temp].") @@ -384,47 +365,6 @@ else ..() -/obj/item/toy/crayon/proc/can_claim_for_gang(mob/user, atom/target) - // Check area validity. - // Reject space, player-created areas, and non-station z-levels. - var/area/A = get_area(target) - if(!A || (A.z != ZLEVEL_STATION) || !A.valid_territory) - to_chat(user, "[A] is unsuitable for tagging.") - return FALSE - - var/spraying_over = FALSE - for(var/obj/effect/decal/cleanable/crayon/gang/G in target) - spraying_over = TRUE - - for(var/obj/machinery/power/apc in target) - to_chat(user, "You can't tag an APC.") - return FALSE - - var/occupying_gang = territory_claimed(A, user) - if(occupying_gang && !spraying_over) - to_chat(user, "[A] has already been tagged by the [occupying_gang] gang! You must get rid of or spray over the old tag first!") - return FALSE - - // If you pass the gaunlet of checks, you're good to proceed - return TRUE - -/obj/item/toy/crayon/proc/territory_claimed(area/territory, mob/user) - for(var/datum/gang/G in SSticker.mode.gangs) - if(territory.type in (G.territory|G.territory_new)) - . = G.name - break - -/obj/item/toy/crayon/proc/tag_for_gang(mob/user, atom/target) - //Delete any old markings on this tile, including other gang tags - for(var/obj/effect/decal/cleanable/crayon/old_marking in target) - qdel(old_marking) - - var/gangID = user.mind.gang_datum - var/area/territory = get_area(target) - - new /obj/effect/decal/cleanable/crayon/gang(target,gangID,"graffiti",0) - to_chat(user, "You tagged [territory] for your gang!") - /obj/item/toy/crayon/red icon_state = "crayonred" paint_color = "#DA0000" @@ -673,25 +613,6 @@ spray_overlay.color = paint_color add_overlay(spray_overlay) -/obj/item/toy/crayon/spraycan/gang - //desc = "A modified container containing suspicious paint." - charges = 20 - gang = TRUE - - pre_noise = FALSE - post_noise = TRUE - -/obj/item/toy/crayon/spraycan/gang/New(loc, datum/gang/G) - ..() - if(G) - paint_color = G.color_hex - update_icon() - -/obj/item/toy/crayon/spraycan/gang/examine(mob/user) - . = ..() - if((user.mind && user.mind.gang_datum) || isobserver(user)) - to_chat(user, "This spraycan has been specially modified for tagging territory.") - /obj/item/toy/crayon/spraycan/borg name = "cyborg spraycan" desc = "A metallic container containing shiny synthesised paint." diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 404c40c4b6a..899c066b111 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -39,8 +39,6 @@ message_say = "FOR NAR-SIE!" else if(role == "revolutionary" || role == "head revolutionary") message_say = "VIVA LA REVOLUTION!" - else if(user.mind.gang_datum) - message_say = "[uppertext(user.mind.gang_datum.name)] RULES!" user.say(message_say) target = user message_admins("[ADMIN_LOOKUPFLW(user)] suicided with [name] at [ADMIN_COORDJMP(src)]",0,1) diff --git a/code/game/objects/items/weapons/grenades/plastic.dm b/code/game/objects/items/weapons/grenades/plastic.dm index fb5b92aee2e..2e6170fae71 100644 --- a/code/game/objects/items/weapons/grenades/plastic.dm +++ b/code/game/objects/items/weapons/grenades/plastic.dm @@ -134,8 +134,6 @@ message_say = "FOR NAR-SIE!" else if(role == "revolutionary" || role == "head revolutionary") message_say = "VIVA LA REVOLUTION!" - else if(user.mind.gang_datum) - message_say = "[uppertext(user.mind.gang_datum.name)] RULES!" user.say(message_say) explosion(user,0,2,0) //Cheap explosion imitation because putting prime() here causes runtimes user.gib(1, 1) diff --git a/code/game/objects/items/weapons/implants/implant_loyality.dm b/code/game/objects/items/weapons/implants/implant_loyality.dm index 67182d48a8f..e9cb32b3e5e 100644 --- a/code/game/objects/items/weapons/implants/implant_loyality.dm +++ b/code/game/objects/items/weapons/implants/implant_loyality.dm @@ -19,19 +19,12 @@ /obj/item/weapon/implant/mindshield/implant(mob/living/target, mob/user, silent = 0) if(..()) - if((target.mind in (SSticker.mode.head_revolutionaries | SSticker.mode.get_gang_bosses()))) + if(target.mind in SSticker.mode.head_revolutionaries) if(!silent) target.visible_message("[target] seems to resist the implant!", "You feel something interfering with your mental conditioning, but you resist it!") removed(target, 1) qdel(src) return 0 - if(target.mind in SSticker.mode.get_gangsters()) - SSticker.mode.remove_gangster(target.mind) - if(!silent) - target.visible_message("[src] was destroyed in the process!", "You feel a sense of peace and security. You are now protected from brainwashing.") - removed(target, 1) - qdel(src) - return 0 if(target.mind in SSticker.mode.revolutionaries) SSticker.mode.remove_revolutionary(target.mind) if(!silent) diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 396d7d93fa0..3fad50a06e4 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -441,24 +441,6 @@ dat += "PM" dat += "" - for(var/datum/gang/G in SSticker.mode.gangs) - dat += "
" - for(var/datum/mind/N in G.bosses) - var/mob/M = N.current - if(!M) - dat += "" - dat += "" - else - dat += "" - dat += "" - dat += "" - for(var/datum/mind/N in G.gangsters) - var/mob/M = N.current - if(M) - dat += "" - dat += "" - dat += "
[G.name] Gang: [G.points] Influence | [round((G.territory.len/GLOB.start_state.num_territories)*100, 1)]% Control
[N.name]([N.key])Gang Boss body destroyed!PM
[M.real_name] (Boss)[M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""]PMFLW
[M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""]PM
" - if(SSticker.mode.changelings.len > 0) dat += "
" for(var/datum/mind/changeling in SSticker.mode.changelings) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 1f8778361fd..3e47ce75a4a 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -94,13 +94,6 @@ message_admins("[key_name(usr)] spawned a blob with base resource gain [strength].") log_admin("[key_name(usr)] spawned a blob with base resource gain [strength].") new/datum/round_event/ghost_role/blob(TRUE, strength) - if("gangs") - if(src.makeGangsters()) - message_admins("[key_name(usr)] created gangs.") - log_admin("[key_name(usr)] created gangs.") - else - message_admins("[key_name(usr)] tried to create gangs. Unfortunately, there were not enough candidates available.") - log_admin("[key_name(usr)] failed create gangs.") if("centcom") message_admins("[key_name(usr)] is creating a Centcom response team...") if(src.makeEmergencyresponseteam()) @@ -1511,17 +1504,6 @@ usr.client.cmd_admin_animalize(M) - else if(href_list["gangpoints"]) - var/datum/gang/G = locate(href_list["gangpoints"]) in SSticker.mode.gangs - if(G) - var/newpoints = input("Set [G.name ] Gang's influence.","Set Influence",G.points) as null|num - if(!newpoints) - return - message_admins("[key_name_admin(usr)] changed the [G.name] Gang's influence from [G.points] to [newpoints].") - log_admin("[key_name(usr)] changed the [G.name] Gang's influence from [G.points] to [newpoints].") - G.points = newpoints - G.message_gangtools("Your gang now has [G.points] influence.") - else if(href_list["adminplayeropts"]) var/mob/M = locate(href_list["adminplayeropts"]) show_player_panel(M) diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index d7b06ee9c87..021853eb6a4 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -357,43 +357,6 @@ return - -/datum/admins/proc/makeGangsters() - - var/datum/game_mode/gang/temp = new - if(config.protect_roles_from_antagonist) - temp.restricted_jobs += temp.protected_jobs - - if(config.protect_assistant_from_antagonist) - temp.restricted_jobs += "Assistant" - - var/list/mob/living/carbon/human/candidates = list() - var/mob/living/carbon/human/H = null - - for(var/mob/living/carbon/human/applicant in GLOB.player_list) - if(ROLE_GANG in applicant.client.prefs.be_special) - var/turf/T = get_turf(applicant) - if(applicant.stat == CONSCIOUS && applicant.mind && !applicant.mind.special_role && T.z == ZLEVEL_STATION) - if(!jobban_isbanned(applicant, ROLE_GANG) && !jobban_isbanned(applicant, "Syndicate")) - if(temp.age_check(applicant.client)) - if(!(applicant.job in temp.restricted_jobs)) - candidates += applicant - - if(candidates.len >= 2) - for(var/needs_assigned=2,needs_assigned>0,needs_assigned--) - H = pick(candidates) - if(GLOB.gang_colors_pool.len) - var/datum/gang/newgang = new() - SSticker.mode.gangs += newgang - H.mind.make_Gang(newgang) - candidates.Remove(H) - else if(needs_assigned == 2) - return 0 - return 1 - - return 0 - - /datum/admins/proc/makeOfficial() var/mission = input("Assign a task for the official", "Assign Task", "Conduct a routine preformance review of [station_name()] and its Captain.") var/list/mob/dead/observer/candidates = pollCandidates("Do you wish to be considered to be a Centcom Official?", "deathsquad") diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm index feba659d725..776296807b8 100644 --- a/code/modules/admin/verbs/onlyone.dm +++ b/code/modules/admin/verbs/onlyone.dm @@ -97,12 +97,6 @@ GLOBAL_VAR_INIT(highlander, FALSE) to_chat(H, "You are the multiverse summoner. Activate your blade to summon copies of yourself from another universe to fight by your side.") H.mind.announce_objectives() - var/datum/gang/multiverse/G = new(src, "[H.real_name]") - SSticker.mode.gangs += G - G.bosses += H.mind - G.add_gang_hud(H.mind) - H.mind.gang_datum = G - var/obj/item/slot_item_ID = H.get_item_by_slot(slot_wear_id) qdel(slot_item_ID) var/obj/item/slot_item_hand = H.get_item_for_held_index(2) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index be0738106d3..280ca7091c8 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -968,10 +968,6 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits if(istype(H, /datum/atom_hud/antag)) (adding_hud) ? H.add_hud_to(usr) : H.remove_hud_from(usr) - for(var/datum/gang/G in SSticker.mode.gangs) - var/datum/atom_hud/antag/H = G.ganghud - (adding_hud) ? H.add_hud_to(usr) : H.remove_hud_from(usr) - to_chat(usr, "You toggled your admin antag HUD [adding_hud ? "ON" : "OFF"].") message_admins("[key_name_admin(usr)] toggled their admin antag HUD [adding_hud ? "ON" : "OFF"].") log_admin("[key_name(usr)] toggled their admin antag HUD [adding_hud ? "ON" : "OFF"].") diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 300c4636ea2..8a95f4f6ff3 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -295,9 +295,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp ..() if(statpanel("Status")) if(SSticker.HasRoundStarted()) - for(var/datum/gang/G in SSticker.mode.gangs) - if(G.is_dominating) - stat(null, "[G.name] Gang Takeover: [max(G.domination_time_remaining(), 0)]") if(istype(SSticker.mode, /datum/game_mode/blob)) var/datum/game_mode/blob/B = SSticker.mode if(B.message_sent) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 0421ccabefd..20fb0d701f3 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -733,9 +733,6 @@ if(statpanel("Status")) if(SSticker && SSticker.mode) - for(var/datum/gang/G in SSticker.mode.gangs) - if(G.is_dominating) - stat(null, "[G.name] Gang Takeover: [max(G.domination_time_remaining(), 0)]") if(istype(SSticker.mode, /datum/game_mode/blob)) var/datum/game_mode/blob/B = SSticker.mode if(B.message_sent) diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm index 9474b787ead..b0e9d410385 100644 --- a/code/modules/mob/living/silicon/login.dm +++ b/code/modules/mob/living/silicon/login.dm @@ -2,5 +2,4 @@ if(mind && SSticker.mode) SSticker.mode.remove_cultist(mind, 0, 0) SSticker.mode.remove_revolutionary(mind, 0) - SSticker.mode.remove_gangster(mind, remove_bosses=1) ..() diff --git a/code/modules/mob/living/silicon/robot/login.dm b/code/modules/mob/living/silicon/robot/login.dm index 742a4b20ce0..577832a229e 100644 --- a/code/modules/mob/living/silicon/robot/login.dm +++ b/code/modules/mob/living/silicon/robot/login.dm @@ -5,4 +5,3 @@ show_laws(0) if(mind) SSticker.mode.remove_revolutionary(mind) - SSticker.mode.remove_gangster(mind,1,remove_bosses=1) diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 6344689f0bd..4f348c862ba 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -300,12 +300,6 @@ // Gangs only have one attempt left if the shuttle has // docked with the station to prevent suffering from // endless dominator delays - for(var/datum/gang/G in SSticker.mode.gangs) - if(G.is_dominating) - G.dom_attempts = 0 - else - G.dom_attempts = min(1,G.dom_attempts) - if(SHUTTLE_DOCKED) if(time_left <= ENGINES_START_TIME) diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm index d80a8e21b3c..d887326416a 100644 --- a/code/modules/uplink/uplink_item.dm +++ b/code/modules/uplink/uplink_item.dm @@ -217,7 +217,6 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. /datum/uplink_item/dangerous/smg/unrestricted item = /obj/item/weapon/gun/ballistic/automatic/c20r/unrestricted - include_modes = list(/datum/game_mode/gang) /datum/uplink_item/dangerous/machinegun name = "L6 Squad Automatic Weapon" @@ -262,7 +261,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. item = /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow cost = 12 surplus = 50 - exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang) + exclude_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/dangerous/flamethrower name = "Flamethrower" @@ -271,7 +270,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. item = /obj/item/weapon/flamethrower/full/tank cost = 4 surplus = 40 - include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang) + include_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/dangerous/sword name = "Energy Sword" @@ -349,7 +348,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. item = /obj/item/weapon/reagent_containers/spray/chemsprayer/bioterror cost = 20 surplus = 0 - include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang) + include_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/stealthy_weapons/virus_grenade name = "Fungal Tuberculosis Grenade" @@ -454,7 +453,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. These bullets pack a lot of punch that can knock most targets down, but do limited overall damage." item = /obj/item/ammo_box/magazine/smgm45 cost = 3 - include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang) + include_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/ammo/smg/bag name = ".45 Ammo Duffelbag" @@ -595,7 +594,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. item = /obj/item/weapon/sleeping_carp_scroll cost = 17 surplus = 0 - exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang) + exclude_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/stealthy_weapons/cqc name = "CQC Manual" @@ -625,7 +624,6 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. item = /obj/item/weapon/gun/ballistic/automatic/toy/pistol/riot cost = 3 surplus = 10 - exclude_modes = list(/datum/game_mode/gang) /datum/uplink_item/stealthy_weapons/sleepy_pen name = "Sleepy Pen" @@ -635,7 +633,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. falls asleep, they will be able to move and act." item = /obj/item/weapon/pen/sleepy cost = 4 - exclude_modes = list(/datum/game_mode/nuclear,/datum/game_mode/gang) + exclude_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/stealthy_weapons/poison_pen name = "Poison Pen" @@ -665,7 +663,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. item = /obj/item/weapon/storage/box/syndie_kit/romerol cost = 25 cant_discount = TRUE - exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang) + exclude_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/stealthy_weapons/dart_pistol name = "Dart Pistol" @@ -774,7 +772,6 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. move the projector from their hand. Disguised users move slowly, and projectiles pass over them." item = /obj/item/device/chameleon cost = 7 - exclude_modes = list(/datum/game_mode/gang) /datum/uplink_item/stealthy_tools/camera_bug name = "Camera Bug" @@ -808,7 +805,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. item = /obj/item/weapon/reagent_containers/syringe/mulligan cost = 4 surplus = 30 - exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang) + exclude_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/stealthy_tools/emplight name = "EMP Flashlight" @@ -836,7 +833,6 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. //Space Suits and Hardsuits /datum/uplink_item/suits category = "Space Suits and Hardsuits" - exclude_modes = list(/datum/game_mode/gang) surplus = 40 /datum/uplink_item/suits/space_suit @@ -885,7 +881,6 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. in electronic devices, subverts intended functions, and easily breaks security mechanisms." item = /obj/item/weapon/card/emag cost = 6 - exclude_modes = list(/datum/game_mode/gang) /datum/uplink_item/device_tools/toolbox name = "Full Syndicate Toolbox" @@ -915,7 +910,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. and other supplies helpful for a field medic." item = /obj/item/weapon/storage/firstaid/tactical cost = 4 - include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang) + include_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/device_tools/thermal name = "Thermal Imaging Glasses" @@ -1005,7 +1000,6 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. sends you a small beacon that will teleport the larger beacon to your location upon activation." item = /obj/item/device/sbeacondrop cost = 14 - exclude_modes = list(/datum/game_mode/gang) /datum/uplink_item/device_tools/syndicate_bomb name = "Syndicate Bomb" @@ -1051,7 +1045,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. item = /obj/item/weapon/shield/energy cost = 16 surplus = 20 - include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang) + include_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/device_tools/medgun name = "Medbeam Gun" @@ -1296,7 +1290,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. you will receive." item = /obj/item/weapon/storage/box/syndicate cost = 20 - exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang) + exclude_modes = list(/datum/game_mode/nuclear) cant_discount = TRUE /datum/uplink_item/badass/surplus @@ -1306,7 +1300,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. item = /obj/structure/closet/crate cost = 20 player_minimum = 25 - exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang) + exclude_modes = list(/datum/game_mode/nuclear) cant_discount = TRUE /datum/uplink_item/badass/surplus/spawn_item(turf/loc, obj/item/device/uplink/U) diff --git a/config/game_options.txt b/config/game_options.txt index e519e9fa8c3..b9139a078a7 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -81,7 +81,6 @@ PROBABILITY TRAITORCHAN 4 PROBABILITY INTERNAL_AFFAIRS 3 PROBABILITY NUCLEAR 2 PROBABILITY REVOLUTION 2 -PROBABILITY GANG 2 PROBABILITY CULT 2 PROBABILITY CHANGELING 2 PROBABILITY WIZARD 4 @@ -106,7 +105,6 @@ CONTINUOUS TRAITORCHAN CONTINUOUS DOUBLE_AGENTS #CONTINUOUS NUCLEAR #CONTINUOUS REVOLUTION -CONTINUOUS GANG CONTINUOUS CULT CONTINUOUS CLOCKWORK_CULT CONTINUOUS CHANGELING @@ -131,7 +129,6 @@ MIDROUND_ANTAG TRAITORCHAN MIDROUND_ANTAG DOUBLE_AGENTS #MIDROUND_ANTAG NUCLEAR #MIDROUND_ANTAG REVOLUTION -#MIDROUND_ANTAG GANG MIDROUND_ANTAG CULT MIDROUND_ANTAG CLOCKWORK_CULT MIDROUND_ANTAG CHANGELING @@ -163,9 +160,6 @@ MIDROUND_ANTAG ABDUCTION #MIN_POP REVOLUTION 20 #MAX_POP REVOLUTION -1 -#MIN_POP GANG 20 -#MAX_POP GANG -1 - #MIN_POP CULT 24 #MAX_POP CULT -1 diff --git a/tgstation.dme b/tgstation.dme index d8a1b779610..b2ed887094f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -448,12 +448,6 @@ #include "code\game\gamemodes\devil\true_devil\_true_devil.dm" #include "code\game\gamemodes\devil\true_devil\inventory.dm" #include "code\game\gamemodes\extended\extended.dm" -#include "code\game\gamemodes\gang\dominator.dm" -#include "code\game\gamemodes\gang\gang.dm" -#include "code\game\gamemodes\gang\gang_datum.dm" -#include "code\game\gamemodes\gang\gang_items.dm" -#include "code\game\gamemodes\gang\gang_pen.dm" -#include "code\game\gamemodes\gang\recaller.dm" #include "code\game\gamemodes\malfunction\Malf_Modules.dm" #include "code\game\gamemodes\meteor\meteor.dm" #include "code\game\gamemodes\meteor\meteors.dm" @@ -822,7 +816,6 @@ #include "code\game\objects\items\weapons\implants\implant_exile.dm" #include "code\game\objects\items\weapons\implants\implant_explosive.dm" #include "code\game\objects\items\weapons\implants\implant_freedom.dm" -#include "code\game\objects\items\weapons\implants\implant_gang.dm" #include "code\game\objects\items\weapons\implants\implant_krav_maga.dm" #include "code\game\objects\items\weapons\implants\implant_loyality.dm" #include "code\game\objects\items\weapons\implants\implant_misc.dm" From 7d72c7331ed34aedc0d4917accb5d9fd0e33a1a8 Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Tue, 2 May 2017 23:30:41 -0700 Subject: [PATCH 017/103] Fixes character saves getting fucked up if there are no configured round start races. --- code/modules/client/preferences_savefile.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index e78ec61a3b1..79ec0dd1977 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -267,7 +267,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car pref_species = new newtype() else var/rando_race = pick(config.roundstart_races) - pref_species = new rando_race() + if (rando_race) + pref_species = new rando_race() if(!S["features["mcolor"]"] || S["features["mcolor"]"] == "#000") S["features["mcolor"]"] << "#FFF" From 79f40d49c3684305a3501f591f62b3f7492f9982 Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Tue, 2 May 2017 23:36:48 -0700 Subject: [PATCH 018/103] Update preferences_savefile.dm --- code/modules/client/preferences_savefile.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 79ec0dd1977..6aaae5f029a 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -265,7 +265,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(config.mutant_races && species_id && (species_id in GLOB.roundstart_species)) var/newtype = GLOB.roundstart_species[species_id] pref_species = new newtype() - else + else if (config.roundstart_races.len) var/rando_race = pick(config.roundstart_races) if (rando_race) pref_species = new rando_race() From 9fa9673c15aa82d39474a0877c55108855204427 Mon Sep 17 00:00:00 2001 From: Jack Edge Date: Tue, 2 May 2017 22:08:43 +0100 Subject: [PATCH 019/103] Moves tongues to `mutanttongue` var Moves tongues from mutant_organs list to a specific var, in line with mutant eyes, lungs and ears. --- code/modules/mob/living/carbon/human/human.dm | 3 ++- code/modules/mob/living/carbon/human/species.dm | 15 ++++++++------- .../carbon/human/species_types/abductors.dm | 4 ++-- .../living/carbon/human/species_types/android.dm | 4 ++-- .../carbon/human/species_types/flypeople.dm | 2 +- .../carbon/human/species_types/lizardpeople.dm | 2 +- .../carbon/human/species_types/plasmamen.dm | 4 ++-- code/modules/surgery/organs/organ_internal.dm | 13 +++++-------- 8 files changed, 23 insertions(+), 24 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b43245192c0..7ae7e4230f2 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -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 f87b01c6671..ca516b2c261 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -36,7 +36,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 @@ -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 // @@ -132,6 +127,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) @@ -155,6 +151,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_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm index 0b8ca1500d7..18444bb366d 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 748bd238b2f..44f1e5c456a 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 8aae311330b..e77e424d405 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 b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 45007140dc4..6de793a3cc2 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -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 09d89d3a01a..664eabefcdd 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 9dbca40558b..e27337a813e 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 758f56c6f6068048e9aa352cb7c6a7d054414cc2 Mon Sep 17 00:00:00 2001 From: FantasticFwoosh Date: Wed, 3 May 2017 14:43:23 +0100 Subject: [PATCH 020/103] Adds a turfverb var, cuts on copypasta Thanks for the advice MMMiracles, anyway this [src]'s the turf you are going to dig up with appropriate verb via [src.turfverb]. Also removed copypasta code i was silly enough to use in its place. Its been playtested and it inherits & executes correctly. Some minor space shifting too. --- code/game/turfs/simulated/floor/fancy_floor.dm | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index 18558d694c6..cce77568928 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -68,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() ..() @@ -77,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(..()) @@ -94,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 @@ -122,6 +122,7 @@ 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() @@ -130,15 +131,6 @@ icon_state = "basalt[rand(0, 12)]" set_basalt_light(src) -/turf/open/floor/grass/fakebasalt/attackby(obj/item/C, mob/user, params) - if(istype(C, /obj/item/weapon/shovel) && params) - new ore_type(src) - new ore_type(src) //Time to collect your ashes - user.visible_message("[user] digs up [src].", "You dig up [src].") - playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) - make_plating() - if(..()) - return /turf/open/floor/carpet name = "carpet" From d388dee8b7b6d854f6f0d844988552acf5962b1f Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Wed, 3 May 2017 10:19:56 -0400 Subject: [PATCH 021/103] 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 84fe78cef64..411e81de85e 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 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 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: Wed, 3 May 2017 15:21:27 +0100 Subject: [PATCH 022/103] 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 442772fea84..56a89fe389f 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 8c58d1696f4d230aa8619bedf08bcd298f7e839e Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Wed, 3 May 2017 10:51:22 -0400 Subject: [PATCH 023/103] New Floors --- 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 8890c501293..8b24a4c816a 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 580aadc85f6..0d13b934328 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 zcmZ`*dpy&7AOFp0!ZsqbotVoBT}&a5G+T^FWiC%H^=urMQi|5)%!I8Zsg>NyNpd+l za!SZ0Wj4Anq1=gvShD5vm|+{+nV#2E=k>f^&mZ5<_w)I@FQ4!CkMHaCy-GN^7pjI( z0{{T(?uPeP?CjO03|7Rvxzjd^4N2JV>%wNUEjO9$wA|`wXKS(%xnaGwCR9VNV6xfe zp(SMs8tAO|K_3A3xj$S{v{QZk&*H<*gpebm&qhR@0su-5qpMu4(MppxY9EvGzFn&; z^jycG$)JrFE;{)jk7+l%NF{63KcR+B+ApbMjr>wV&O|tPkq*l$w2sVvLbaZHH^5J_ z;qCFuInaxFPzgy=+PJw!+ZKHvCWNnqBhez$ zr76)=tabz`xD-ncD{)*l)$4iTz29}Ol_mC)=I-}h97IT+*Fr|WdCsrxjELCdy5h@*QVLV;C4rRK+M$>u(H+~)FZ6@Xq)QHK10A)P`5*erfvD^#M+Tv z9)(lxu~C_4>}lJ7nJ4-H9|n)sW+oj|pJ=$6-ph@^l+1&It9BB*00cF<_A}5oxOJ3g zrXT;s%~9vz^$&Ctb6{ePeUmr*vwqN$XZU+(!h}&=5Jh*L>~hMgzv{-Jut3Usa8dhZ)rAnF$_w?@OEqJxtUr%pYT~WRWezLD12gwq{Th zBj@Bv@Y4*?n;YjVG>zV@WAFA*p;!Nka%UXpx zHW1tuk6MV`EZyE>wxP1sL&8S%t-XLU2UNDauFM3gEtLI>swlc$f&7LY53P^tK9qQG zKRyTcd{g^|>glP}xm?T_FrWT@(+z1`&RzU%hjT1*#c!(EUfTjpOh#h1{nG-7>}81XfpLXfnEy9IGo#%FlGm+q9~Sf zZ=A}$;(8+(8#3l^+|(QBBHYyJiV7;(e?vvHI?DfA<)xm+Q0c`rjg!z2rWxowY1h5B zfzD5rFoygM!r?+mOSUp*LTMESDzbLFs#8m z-6ZduKQ31DHEp`Nut{z>DK!on7?k~4T_eWEk?^qKbh)~u{+MBsF;HzMX64UZYc{YE z%W=Y7slVRd5iWOJez6|?JRyR^S=FP5c$uVbL_ztvVdr7JTL4>*T*S<~Cr|?~X0R$4 z5TZ;#5?4$uvrez#4BdjCmm-C55QTAhrE#z~4j$JmoQ7M)+;*w6#z`5`4)Um>MXS;? zn+DSaoy}+s-6#{1Ko^rUrj0fA0GB34^lM4Xm|Q}){XH| zUYG^=k*DYN*Ec@EBUMjqO=zfd8(`_W`@5C$Af;1XdOV3okJ%ceD6YC=neFVtE zv&Wq)FT9NF(4-Ceg?EspNe&Lsy{`gIUv9q@I{f>F^&xE>;Z_N{>2mtHK<)a`X@qER zv7H3HeMoPX)Vifis9ub9VtT=%hxKN!#HgH)2d(0p7e-#fg=$}ymH0OaQ5m2M`nfAV z*jhc{AIbs9+a&ofMEX4vZbggFXu(h*4RuNmESkim8|meo_}#MruzJF7N9V~@MXtVi z!QT}r2e}6E{UC!M#3a@4qw#IVKSr%d#qapMzF(};ZJ5tZCjTv;+aoa%V?XN=Jn)FR*NV=|O-2;_L>rOcA>lAuw%1^bfa2z6ySU(s|KWxi)Vcp(9iOR<>*fwO);Eivxaj@$Mgv4|-~J7K&!IED+C zUOFd!Yj;3I0f}NzxAw;SE_lM9XK zDspM+gtypKk@68*pp5>=Yy_MkgeyQ~URnZ5uyzUHErSC**($|6!)B_IC2pG>*Q-4X zYWXIG5;&_;2$1sk^1n_>Lw0#N_30wzNSd0Kpwx^4c58=B#-QYv-ce1+X40Wd_#$RM zQ!B>O?L}HHgiKSk7Y=1tD3x-PL$#~WqkP5^#%&4X7lqGNcTC_&Umjs?3LYN;kW0sf`xD+bAb+C672Rdmm(MX13CpKHqZal-d7G{T#*elU3=^rSQm(2HQnlQ8H{VfJgge6Qkac1bR{0y|627?& zntUq*O3?hre(hU(^hCW|j%M+%Q3aXS9wHZ}s3p5dQoyD1TD{}EqL^e@>X-kEg+Ht> zt|8h#^(A#5ev Date: Wed, 3 May 2017 16:47:52 +0100 Subject: [PATCH 024/103] Draconic language, for lizards (#26780) * Lizard language :cl: coiax add: Restrictions on Lizardpeople using their native language on the station have been lifted by Centcom, in order to maximise worker productivity. The language's key is ",o". /:cl: - The language is added as part of the job equipping code, changing your species to lizard via xenobio will not magically teach you the language. - Normal human tongues are capable of speaking Unathi. - pAIs with translator and Librarians are capable of speaking and understanding Unathi. The design lead has instructed me to grant lizardpeople their own language, in order to increase paranoia in the crew. Also, it'll be funny to see how much people overreact to this. * Rename unathi to draconic --- code/modules/language/draconic.dm | 20 +++++++++++++++++++ .../human/species_types/lizardpeople.dm | 3 +++ code/modules/surgery/organs/tongue.dm | 14 ++++--------- tgstation.dme | 1 + 4 files changed, 28 insertions(+), 10 deletions(-) create mode 100644 code/modules/language/draconic.dm diff --git a/code/modules/language/draconic.dm b/code/modules/language/draconic.dm new file mode 100644 index 00000000000..aaa998c2c0d --- /dev/null +++ b/code/modules/language/draconic.dm @@ -0,0 +1,20 @@ +/datum/language/draconic + name = "Draconic" + 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 45007140dc4..41e6e03c4dc 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 c02c22d19e0..e35162f89df 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -13,6 +13,7 @@ . = ..() languages_possible = typecacheof(list( /datum/language/common, + /datum/language/draconic, /datum/language/monkey, /datum/language/ratvar )) @@ -127,6 +128,7 @@ languages_possible = typecacheof(list( /datum/language/xenocommon, /datum/language/common, + /datum/language/draconic, /datum/language/ratvar, /datum/language/monkey)) @@ -183,16 +185,8 @@ attack_verb = list("beeped", "booped") taste_sensitivity = 25 // not as good as an organic tongue -/obj/item/organ/tongue/robot/Initialize(mapload) - . = ..() - languages_possible = typecacheof(list( - /datum/language/xenocommon, - /datum/language/common, - /datum/language/ratvar, - /datum/language/monkey, - /datum/language/drone, - /datum/language/machine, - /datum/language/swarmer)) +/obj/item/organ/tongue/robot/can_speak_in_language(datum/language/dt) + . = TRUE // THE MAGIC OF ELECTRONICS /obj/item/organ/tongue/robot/get_spans() return ..() | SPAN_ROBOT diff --git a/tgstation.dme b/tgstation.dme index d8a1b779610..762a093a9bb 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -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 b126edc1563368ebb4d61d34e1e21a036fceb2db Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Wed, 3 May 2017 08:47:53 -0700 Subject: [PATCH 025/103] Automatic changelog generation for PR #26780 [ci skip] --- html/changelogs/AutoChangeLog-pr-26780.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26780.yml diff --git a/html/changelogs/AutoChangeLog-pr-26780.yml b/html/changelogs/AutoChangeLog-pr-26780.yml new file mode 100644 index 00000000000..53785c45e68 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26780.yml @@ -0,0 +1,6 @@ +author: "coiax" +delete-after: True +changes: + - rscadd: "Restrictions on Lizardpeople using their native language on the +station have been lifted by Centcom, in order to maximise worker +productivity. The language's key is \",o\"." From 0ff1ec22f9f3e319962672b31bc62269a6e2b683 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Wed, 3 May 2017 09:31:04 -0700 Subject: [PATCH 026/103] Automatic changelog generation for PR #26789 [ci skip] --- html/changelogs/AutoChangeLog-pr-26789.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26789.yml diff --git a/html/changelogs/AutoChangeLog-pr-26789.yml b/html/changelogs/AutoChangeLog-pr-26789.yml new file mode 100644 index 00000000000..ef779f70a1e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26789.yml @@ -0,0 +1,4 @@ +author: "BeeSting12" +delete-after: True +changes: + - bugfix: "Omega shuttle now has lighting." From 0b5c4f6d6e37000907e22e472dfd9c05c54e3a9f Mon Sep 17 00:00:00 2001 From: coiax Date: Wed, 3 May 2017 17:39:28 +0100 Subject: [PATCH 027/103] Plasma vessels regenerate slowly off resin (#26778) :cl: coiax balance: Plasma vessels, the organs inside aliens that are responsible for their internal plasma storage, will regenerate small amounts of plasma even if the owner is not on resin weeds. /:cl: - Rate is 10% of normal. Stops aliens accidentally spending their plasma poorly, and then being unable to plant weeds ever again. Breathing in plasma is not really an option for most aliens, and not many people know about it. - This is an "anti-stupidity" feature, in essence. --- 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 8a9ee012d9d..f9bd64153e9 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 ea21b27f1c792eebd9745e71cd980c4861aeb7dc Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Wed, 3 May 2017 09:39:30 -0700 Subject: [PATCH 028/103] Automatic changelog generation for PR #26778 [ci skip] --- html/changelogs/AutoChangeLog-pr-26778.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26778.yml diff --git a/html/changelogs/AutoChangeLog-pr-26778.yml b/html/changelogs/AutoChangeLog-pr-26778.yml new file mode 100644 index 00000000000..fd9115d6c80 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26778.yml @@ -0,0 +1,6 @@ +author: "coiax" +delete-after: True +changes: + - balance: "Plasma vessels, the organs inside aliens that are responsible +for their internal plasma storage, will regenerate small amounts of +plasma even if the owner is not on resin weeds." From 5d3e0b0b21bd27e8ead0372e6c3b33a20b6ba1f9 Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Wed, 3 May 2017 12:40:55 -0400 Subject: [PATCH 029/103] Clockwork component generation is twice as fast, but scriptures cost up to twice as much (#26814) * Clockwork component generation is twice as fast, but scriptures cost about twice as much * sssh * gotta double that, too * slab text fix that nobody looks at anyway --- 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 9c86e031abc..acc0cdc9ab4 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 35caabab5a8..8b3aa01533a 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 25576f57107..0941d332f15 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 2e822199d3f..b49b0c58196 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm @@ -259,7 +259,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 0dbd2d46e80..25bedd79d30 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 f7fcc8c2998..01fc369c8f4 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 22ea9e2ce50..b0a17338ffe 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 7174276d1bae4ff51304048b2bc04d55e408f4ac Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Wed, 3 May 2017 09:40:56 -0700 Subject: [PATCH 030/103] Automatic changelog generation for PR #26814 [ci skip] --- html/changelogs/AutoChangeLog-pr-26814.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26814.yml diff --git a/html/changelogs/AutoChangeLog-pr-26814.yml b/html/changelogs/AutoChangeLog-pr-26814.yml new file mode 100644 index 00000000000..7bb675eeb42 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26814.yml @@ -0,0 +1,5 @@ +author: "Joan" +delete-after: True +changes: + - balance: "Clockwork component generation is twice as fast." + - balance: "Scriptures cost up to twice as much; Driver scriptures are unaffected, meaning they cost 50% less, Script scriptures cost 25% less, Application scriptures cost about 12.5% less, and Revenant scriptures cost about 5% less." From e0b06c4f0a0684fd7a29a7ab1f7771e4fc76ed04 Mon Sep 17 00:00:00 2001 From: sybil Date: Wed, 3 May 2017 17:09:42 +0000 Subject: [PATCH 031/103] Automatic changelog compile, [ci skip] --- html/changelog.html | 21 +++++++++++++++++++++ html/changelogs/.all_changelog.yml | 21 +++++++++++++++++++++ html/changelogs/AutoChangeLog-pr-26778.yml | 6 ------ html/changelogs/AutoChangeLog-pr-26780.yml | 6 ------ html/changelogs/AutoChangeLog-pr-26789.yml | 4 ---- html/changelogs/AutoChangeLog-pr-26813.yml | 7 ------- html/changelogs/AutoChangeLog-pr-26814.yml | 5 ----- 7 files changed, 42 insertions(+), 28 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-26778.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26780.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26789.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26813.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26814.yml diff --git a/html/changelog.html b/html/changelog.html index 575ee862cc1..79fda0bf904 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,12 +56,33 @@ -->

03 May 2017

+

BeeSting12 updated:

+
    +
  • Omega shuttle now has lighting.
  • +
+

Joan updated:

+
    +
  • Clockwork component generation is twice as fast.
  • +
  • Scriptures cost up to twice as much; Driver scriptures are unaffected, meaning they cost 50% less, Script scriptures cost 25% less, Application scriptures cost about 12.5% less, and Revenant scriptures cost about 5% less.
  • +

Jordie0608 updated:

  • Investigate logs are now persistent.
  • Game logs are now stored per-round; use .getserverlog to access previous rounds.
  • .giveruntimelog and .getruntimelog removed.
+

Kor, Profakos, Iamgoofball updated:

+
    +
  • The Librarian has been replaced by the Curator.
  • +
  • Persistent trophy cases have been added to the library on Meta, Delta, and Box. These are only usable by the Curator.
  • +
  • The Curator now starts with his whip.
  • +
  • The Curator now has access to his treasure hunter outfit, stashed in his private office.
  • +
+

coiax updated:

+
    +
  • Plasma vessels, the organs inside aliens that are responsible for their internal plasma storage, will regenerate small amounts of plasma even if the owner is not on resin weeds.
  • +
  • Restrictions on Lizardpeople using their native language on the station have been lifted by Centcom, in order to maximise worker productivity. The language's key is ",o".
  • +

deathride58 updated:

" dat += "
Changelings
PM
" + for(var/datum/gang/G in SSticker.mode.gangs) + dat += "
" + for(var/datum/mind/N in G.bosses) + var/mob/M = N.current + if(!M) + dat += "" + dat += "" + else + dat += "" + dat += "" + dat += "" + for(var/datum/mind/N in G.gangsters) + var/mob/M = N.current + if(M) + dat += "" + dat += "" + dat += "
[G.name] Gang: [G.points] Influence | [round((G.territory.len/GLOB.start_state.num_territories)*100, 1)]% Control
[N.name]([N.key])Gang Boss body destroyed!PM
[M.real_name] (Boss)[M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""]PMFLW
[M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""]PM
" + if(SSticker.mode.changelings.len > 0) dat += "
" for(var/datum/mind/changeling in SSticker.mode.changelings) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 3e47ce75a4a..1f8778361fd 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -94,6 +94,13 @@ message_admins("[key_name(usr)] spawned a blob with base resource gain [strength].") log_admin("[key_name(usr)] spawned a blob with base resource gain [strength].") new/datum/round_event/ghost_role/blob(TRUE, strength) + if("gangs") + if(src.makeGangsters()) + message_admins("[key_name(usr)] created gangs.") + log_admin("[key_name(usr)] created gangs.") + else + message_admins("[key_name(usr)] tried to create gangs. Unfortunately, there were not enough candidates available.") + log_admin("[key_name(usr)] failed create gangs.") if("centcom") message_admins("[key_name(usr)] is creating a Centcom response team...") if(src.makeEmergencyresponseteam()) @@ -1504,6 +1511,17 @@ usr.client.cmd_admin_animalize(M) + else if(href_list["gangpoints"]) + var/datum/gang/G = locate(href_list["gangpoints"]) in SSticker.mode.gangs + if(G) + var/newpoints = input("Set [G.name ] Gang's influence.","Set Influence",G.points) as null|num + if(!newpoints) + return + message_admins("[key_name_admin(usr)] changed the [G.name] Gang's influence from [G.points] to [newpoints].") + log_admin("[key_name(usr)] changed the [G.name] Gang's influence from [G.points] to [newpoints].") + G.points = newpoints + G.message_gangtools("Your gang now has [G.points] influence.") + else if(href_list["adminplayeropts"]) var/mob/M = locate(href_list["adminplayeropts"]) show_player_panel(M) diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 021853eb6a4..d7b06ee9c87 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -357,6 +357,43 @@ return + +/datum/admins/proc/makeGangsters() + + var/datum/game_mode/gang/temp = new + if(config.protect_roles_from_antagonist) + temp.restricted_jobs += temp.protected_jobs + + if(config.protect_assistant_from_antagonist) + temp.restricted_jobs += "Assistant" + + var/list/mob/living/carbon/human/candidates = list() + var/mob/living/carbon/human/H = null + + for(var/mob/living/carbon/human/applicant in GLOB.player_list) + if(ROLE_GANG in applicant.client.prefs.be_special) + var/turf/T = get_turf(applicant) + if(applicant.stat == CONSCIOUS && applicant.mind && !applicant.mind.special_role && T.z == ZLEVEL_STATION) + if(!jobban_isbanned(applicant, ROLE_GANG) && !jobban_isbanned(applicant, "Syndicate")) + if(temp.age_check(applicant.client)) + if(!(applicant.job in temp.restricted_jobs)) + candidates += applicant + + if(candidates.len >= 2) + for(var/needs_assigned=2,needs_assigned>0,needs_assigned--) + H = pick(candidates) + if(GLOB.gang_colors_pool.len) + var/datum/gang/newgang = new() + SSticker.mode.gangs += newgang + H.mind.make_Gang(newgang) + candidates.Remove(H) + else if(needs_assigned == 2) + return 0 + return 1 + + return 0 + + /datum/admins/proc/makeOfficial() var/mission = input("Assign a task for the official", "Assign Task", "Conduct a routine preformance review of [station_name()] and its Captain.") var/list/mob/dead/observer/candidates = pollCandidates("Do you wish to be considered to be a Centcom Official?", "deathsquad") diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm index 776296807b8..feba659d725 100644 --- a/code/modules/admin/verbs/onlyone.dm +++ b/code/modules/admin/verbs/onlyone.dm @@ -97,6 +97,12 @@ GLOBAL_VAR_INIT(highlander, FALSE) to_chat(H, "You are the multiverse summoner. Activate your blade to summon copies of yourself from another universe to fight by your side.") H.mind.announce_objectives() + var/datum/gang/multiverse/G = new(src, "[H.real_name]") + SSticker.mode.gangs += G + G.bosses += H.mind + G.add_gang_hud(H.mind) + H.mind.gang_datum = G + var/obj/item/slot_item_ID = H.get_item_by_slot(slot_wear_id) qdel(slot_item_ID) var/obj/item/slot_item_hand = H.get_item_for_held_index(2) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index b0641b5919a..22dfa9e5ee7 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -967,6 +967,10 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits if(istype(H, /datum/atom_hud/antag)) (adding_hud) ? H.add_hud_to(usr) : H.remove_hud_from(usr) + for(var/datum/gang/G in SSticker.mode.gangs) + var/datum/atom_hud/antag/H = G.ganghud + (adding_hud) ? H.add_hud_to(usr) : H.remove_hud_from(usr) + to_chat(usr, "You toggled your admin antag HUD [adding_hud ? "ON" : "OFF"].") message_admins("[key_name_admin(usr)] toggled their admin antag HUD [adding_hud ? "ON" : "OFF"].") log_admin("[key_name(usr)] toggled their admin antag HUD [adding_hud ? "ON" : "OFF"].") diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 0bd38c010f8..fdec84bc55e 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -296,6 +296,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp ..() if(statpanel("Status")) if(SSticker.HasRoundStarted()) + for(var/datum/gang/G in SSticker.mode.gangs) + if(G.is_dominating) + stat(null, "[G.name] Gang Takeover: [max(G.domination_time_remaining(), 0)]") if(istype(SSticker.mode, /datum/game_mode/blob)) var/datum/game_mode/blob/B = SSticker.mode if(B.message_sent) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 20fb0d701f3..0421ccabefd 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -733,6 +733,9 @@ if(statpanel("Status")) if(SSticker && SSticker.mode) + for(var/datum/gang/G in SSticker.mode.gangs) + if(G.is_dominating) + stat(null, "[G.name] Gang Takeover: [max(G.domination_time_remaining(), 0)]") if(istype(SSticker.mode, /datum/game_mode/blob)) var/datum/game_mode/blob/B = SSticker.mode if(B.message_sent) diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm index b0e9d410385..9474b787ead 100644 --- a/code/modules/mob/living/silicon/login.dm +++ b/code/modules/mob/living/silicon/login.dm @@ -2,4 +2,5 @@ if(mind && SSticker.mode) SSticker.mode.remove_cultist(mind, 0, 0) SSticker.mode.remove_revolutionary(mind, 0) + SSticker.mode.remove_gangster(mind, remove_bosses=1) ..() diff --git a/code/modules/mob/living/silicon/robot/login.dm b/code/modules/mob/living/silicon/robot/login.dm index 577832a229e..742a4b20ce0 100644 --- a/code/modules/mob/living/silicon/robot/login.dm +++ b/code/modules/mob/living/silicon/robot/login.dm @@ -5,3 +5,4 @@ show_laws(0) if(mind) SSticker.mode.remove_revolutionary(mind) + SSticker.mode.remove_gangster(mind,1,remove_bosses=1) diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 4f348c862ba..6344689f0bd 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -300,6 +300,12 @@ // Gangs only have one attempt left if the shuttle has // docked with the station to prevent suffering from // endless dominator delays + for(var/datum/gang/G in SSticker.mode.gangs) + if(G.is_dominating) + G.dom_attempts = 0 + else + G.dom_attempts = min(1,G.dom_attempts) + if(SHUTTLE_DOCKED) if(time_left <= ENGINES_START_TIME) diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm index b28525f416d..09334b24c8f 100644 --- a/code/modules/uplink/uplink_item.dm +++ b/code/modules/uplink/uplink_item.dm @@ -217,6 +217,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. /datum/uplink_item/dangerous/smg/unrestricted item = /obj/item/weapon/gun/ballistic/automatic/c20r/unrestricted + include_modes = list(/datum/game_mode/gang) /datum/uplink_item/dangerous/machinegun name = "L6 Squad Automatic Weapon" @@ -261,7 +262,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. item = /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow cost = 12 surplus = 50 - exclude_modes = list(/datum/game_mode/nuclear) + exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang) /datum/uplink_item/dangerous/flamethrower name = "Flamethrower" @@ -270,7 +271,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. item = /obj/item/weapon/flamethrower/full/tank cost = 4 surplus = 40 - include_modes = list(/datum/game_mode/nuclear) + include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang) /datum/uplink_item/dangerous/sword name = "Energy Sword" @@ -348,7 +349,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. item = /obj/item/weapon/reagent_containers/spray/chemsprayer/bioterror cost = 20 surplus = 0 - include_modes = list(/datum/game_mode/nuclear) + include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang) /datum/uplink_item/stealthy_weapons/virus_grenade name = "Fungal Tuberculosis Grenade" @@ -453,7 +454,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. These bullets pack a lot of punch that can knock most targets down, but do limited overall damage." item = /obj/item/ammo_box/magazine/smgm45 cost = 3 - include_modes = list(/datum/game_mode/nuclear) + include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang) /datum/uplink_item/ammo/smg/bag name = ".45 Ammo Duffelbag" @@ -594,7 +595,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. item = /obj/item/weapon/sleeping_carp_scroll cost = 17 surplus = 0 - exclude_modes = list(/datum/game_mode/nuclear) + exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang) /datum/uplink_item/stealthy_weapons/cqc name = "CQC Manual" @@ -624,6 +625,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. item = /obj/item/weapon/gun/ballistic/automatic/toy/pistol/riot cost = 3 surplus = 10 + exclude_modes = list(/datum/game_mode/gang) /datum/uplink_item/stealthy_weapons/sleepy_pen name = "Sleepy Pen" @@ -633,7 +635,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. falls asleep, they will be able to move and act." item = /obj/item/weapon/pen/sleepy cost = 4 - exclude_modes = list(/datum/game_mode/nuclear) + exclude_modes = list(/datum/game_mode/nuclear,/datum/game_mode/gang) /datum/uplink_item/stealthy_weapons/poison_pen name = "Poison Pen" @@ -663,7 +665,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. item = /obj/item/weapon/storage/box/syndie_kit/romerol cost = 25 cant_discount = TRUE - exclude_modes = list(/datum/game_mode/nuclear) + exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang) /datum/uplink_item/stealthy_weapons/dart_pistol name = "Dart Pistol" @@ -772,6 +774,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. move the projector from their hand. Disguised users move slowly, and projectiles pass over them." item = /obj/item/device/chameleon cost = 7 + exclude_modes = list(/datum/game_mode/gang) /datum/uplink_item/stealthy_tools/camera_bug name = "Camera Bug" @@ -805,7 +808,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. item = /obj/item/weapon/reagent_containers/syringe/mulligan cost = 4 surplus = 30 - exclude_modes = list(/datum/game_mode/nuclear) + exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang) /datum/uplink_item/stealthy_tools/emplight name = "EMP Flashlight" @@ -833,6 +836,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. //Space Suits and Hardsuits /datum/uplink_item/suits category = "Space Suits and Hardsuits" + exclude_modes = list(/datum/game_mode/gang) surplus = 40 /datum/uplink_item/suits/space_suit @@ -881,6 +885,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. in electronic devices, subverts intended functions, and easily breaks security mechanisms." item = /obj/item/weapon/card/emag cost = 6 + exclude_modes = list(/datum/game_mode/gang) /datum/uplink_item/device_tools/toolbox name = "Full Syndicate Toolbox" @@ -910,7 +915,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. and other supplies helpful for a field medic." item = /obj/item/weapon/storage/firstaid/tactical cost = 4 - include_modes = list(/datum/game_mode/nuclear) + include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang) /datum/uplink_item/device_tools/thermal name = "Thermal Imaging Glasses" @@ -1000,6 +1005,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. sends you a small beacon that will teleport the larger beacon to your location upon activation." item = /obj/item/device/sbeacondrop cost = 14 + exclude_modes = list(/datum/game_mode/gang) /datum/uplink_item/device_tools/syndicate_bomb name = "Syndicate Bomb" @@ -1045,7 +1051,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. item = /obj/item/weapon/shield/energy cost = 16 surplus = 20 - include_modes = list(/datum/game_mode/nuclear) + include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang) /datum/uplink_item/device_tools/medgun name = "Medbeam Gun" @@ -1290,7 +1296,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. you will receive." item = /obj/item/weapon/storage/box/syndicate cost = 20 - exclude_modes = list(/datum/game_mode/nuclear) + exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang) cant_discount = TRUE /datum/uplink_item/badass/surplus @@ -1300,7 +1306,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. item = /obj/structure/closet/crate cost = 20 player_minimum = 25 - exclude_modes = list(/datum/game_mode/nuclear) + exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang) cant_discount = TRUE /datum/uplink_item/badass/surplus/spawn_item(turf/loc, obj/item/device/uplink/U) diff --git a/config/game_options.txt b/config/game_options.txt index b9139a078a7..e519e9fa8c3 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -81,6 +81,7 @@ PROBABILITY TRAITORCHAN 4 PROBABILITY INTERNAL_AFFAIRS 3 PROBABILITY NUCLEAR 2 PROBABILITY REVOLUTION 2 +PROBABILITY GANG 2 PROBABILITY CULT 2 PROBABILITY CHANGELING 2 PROBABILITY WIZARD 4 @@ -105,6 +106,7 @@ CONTINUOUS TRAITORCHAN CONTINUOUS DOUBLE_AGENTS #CONTINUOUS NUCLEAR #CONTINUOUS REVOLUTION +CONTINUOUS GANG CONTINUOUS CULT CONTINUOUS CLOCKWORK_CULT CONTINUOUS CHANGELING @@ -129,6 +131,7 @@ MIDROUND_ANTAG TRAITORCHAN MIDROUND_ANTAG DOUBLE_AGENTS #MIDROUND_ANTAG NUCLEAR #MIDROUND_ANTAG REVOLUTION +#MIDROUND_ANTAG GANG MIDROUND_ANTAG CULT MIDROUND_ANTAG CLOCKWORK_CULT MIDROUND_ANTAG CHANGELING @@ -160,6 +163,9 @@ MIDROUND_ANTAG ABDUCTION #MIN_POP REVOLUTION 20 #MAX_POP REVOLUTION -1 +#MIN_POP GANG 20 +#MAX_POP GANG -1 + #MIN_POP CULT 24 #MAX_POP CULT -1 diff --git a/tgstation.dme b/tgstation.dme index b8fd2d2b6c7..be10e723d95 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -447,6 +447,12 @@ #include "code\game\gamemodes\devil\true_devil\_true_devil.dm" #include "code\game\gamemodes\devil\true_devil\inventory.dm" #include "code\game\gamemodes\extended\extended.dm" +#include "code\game\gamemodes\gang\dominator.dm" +#include "code\game\gamemodes\gang\gang.dm" +#include "code\game\gamemodes\gang\gang_datum.dm" +#include "code\game\gamemodes\gang\gang_items.dm" +#include "code\game\gamemodes\gang\gang_pen.dm" +#include "code\game\gamemodes\gang\recaller.dm" #include "code\game\gamemodes\malfunction\Malf_Modules.dm" #include "code\game\gamemodes\meteor\meteor.dm" #include "code\game\gamemodes\meteor\meteors.dm" @@ -815,6 +821,7 @@ #include "code\game\objects\items\weapons\implants\implant_exile.dm" #include "code\game\objects\items\weapons\implants\implant_explosive.dm" #include "code\game\objects\items\weapons\implants\implant_freedom.dm" +#include "code\game\objects\items\weapons\implants\implant_gang.dm" #include "code\game\objects\items\weapons\implants\implant_krav_maga.dm" #include "code\game\objects\items\weapons\implants\implant_loyality.dm" #include "code\game\objects\items\weapons\implants\implant_misc.dm" From e220f1e7e9455051798bc5c12f7c9836ac4236f9 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Thu, 4 May 2017 19:19:04 -0700 Subject: [PATCH 086/103] Automatic changelog generation for PR #26915 [ci skip] --- html/changelogs/AutoChangeLog-pr-26915.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26915.yml diff --git a/html/changelogs/AutoChangeLog-pr-26915.yml b/html/changelogs/AutoChangeLog-pr-26915.yml new file mode 100644 index 00000000000..fa85366e4cc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26915.yml @@ -0,0 +1,4 @@ +author: "PKPenguin321" +delete-after: True +changes: + - rscadd: "Undid the gang gamemode removal." From 09788c01e3b2fa07fb6b662c2fcf27ae75954ee3 Mon Sep 17 00:00:00 2001 From: Jordie Date: Fri, 5 May 2017 14:16:32 +1000 Subject: [PATCH 087/103] corrects docking port name for escape pods (#26879) --- _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 23fc961f770..c93ce6a262d 100644 --- a/_maps/map_files/Cerestation/cerestation.dmm +++ b/_maps/map_files/Cerestation/cerestation.dmm @@ -7067,8 +7067,8 @@ "anI" = ( /obj/docking_port/stationary/random{ dir = 1; - id = "pod_asteroid1"; - name = "asteroid" + id = "pod_lavaland1"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -8136,7 +8136,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{ @@ -40971,7 +40971,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{ @@ -40993,8 +40993,8 @@ "btw" = ( /obj/docking_port/stationary/random{ dir = 4; - id = "pod_asteroid3"; - name = "asteroid" + id = "pod_lavaland3"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -69378,8 +69378,8 @@ "crd" = ( /obj/docking_port/stationary/random{ dir = 8; - id = "pod_asteroid2"; - name = "asteroid" + id = "pod_lavaland2"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -69394,7 +69394,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 58c063f8f5e..34ff6f13ff5 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 f2443953904..f6fe1c8188f 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) @@ -86090,8 +86090,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) @@ -86181,7 +86181,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, @@ -86374,7 +86374,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, @@ -87168,8 +87168,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 7fbc6e734e7..5504f4d54a3 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -2509,7 +2509,7 @@ "afq" = ( /obj/machinery/computer/shuttle/pod{ pixel_y = -32; - possible_destinations = "pod_asteroid3"; + possible_destinations = "pod_lavaland3"; shuttleId = "pod3" }, /obj/structure/chair{ @@ -7825,8 +7825,8 @@ "aqG" = ( /obj/docking_port/stationary/random{ dir = 4; - id = "pod_asteroid3"; - name = "asteroid" + id = "pod_lavaland3"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -54760,8 +54760,8 @@ "cpe" = ( /obj/docking_port/stationary/random{ dir = 8; - id = "pod_asteroid2"; - name = "asteroid" + id = "pod_lavaland2"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -55061,7 +55061,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{ @@ -58604,8 +58604,8 @@ "cwV" = ( /obj/docking_port/stationary/random{ dir = 8; - id = "pod_asteroid1"; - name = "asteroid" + id = "pod_lavaland1"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -58718,7 +58718,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{ @@ -59670,7 +59670,7 @@ "czL" = ( /obj/machinery/computer/shuttle/pod{ pixel_y = -32; - possible_destinations = "pod_asteroid4"; + possible_destinations = "pod_lavaland4"; shuttleId = "pod4" }, /obj/structure/chair{ @@ -59701,8 +59701,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 79f2dac0f5df5b978cb29b4e4452b7b3bd6d3190 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Thu, 4 May 2017 22:00:22 -0700 Subject: [PATCH 088/103] 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 4080601971c..cd5b5504b18 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -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 6f32b928bb0f0343713d32499878910dc3513204 Mon Sep 17 00:00:00 2001 From: Robustin Date: Fri, 5 May 2017 07:04:52 -0400 Subject: [PATCH 089/103] Only one successful Gang Tool recall per gang (#26880) --- 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 3c54d5436b7..805cac552fe 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 0885b326122..f67bcad50af 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 b633cd6ba287258df20e893ab685533de0b12c31 Mon Sep 17 00:00:00 2001 From: coiax Date: Fri, 5 May 2017 14:12:27 +0100 Subject: [PATCH 090/103] Moves languages to a holder datum, gives mind its own language holder (#26776) * Ghosts now have a language menu :cl: coiax add: Ghosts can now modify their own understood languages with the language menu. /:cl: - Language menu is now on /atom/movable, and can be opened by any atom with the `open_language_menu` proc. - Used for testing, and simulating what various station members hear. * Language holders, I * Language holder, II * Dos line endings * MIND LANGUAGES * Fixes some mobs not having language holders in their minds * Shadow languages * How did you lose the holder? * Mob level IC->Open Language Menu verb * Gives draconic to silicons * Lazy breeki * Use of pre-initialized global lists for languages * Fixes bugs with lazy holders --- code/__DEFINES/language.dm | 3 + code/__DEFINES/subsystems.dm | 1 + code/_globalvars/lists/mobs.dm | 6 +- code/_onclick/hud/ghost.dm | 4 + code/_onclick/hud/screen_objects.dm | 7 +- code/controllers/subsystem/language.dm | 18 +++ code/datums/action.dm | 7 +- code/datums/mind.dm | 12 ++ code/game/atoms.dm | 2 +- code/game/atoms_movable.dm | 73 +++++++----- code/game/gamemodes/clock_cult/clock_mobs.dm | 3 +- .../gamemodes/miniantags/bot_swarm/swarmer.dm | 2 +- code/game/machinery/hologram.dm | 4 +- code/game/objects/objs.dm | 2 +- code/game/say.dm | 4 +- code/modules/admin/topic.dm | 10 +- code/modules/language/language.dm | 13 +-- code/modules/language/language_holder.dm | 110 ++++++++++++++++++ code/modules/language/language_menu.dm | 66 ++++++----- code/modules/mob/dead/observer/observer.dm | 4 +- code/modules/mob/living/brain/say.dm | 9 +- code/modules/mob/living/carbon/alien/alien.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 5 - .../mob/living/carbon/human/human_defines.dm | 3 +- .../mob/living/carbon/monkey/monkey.dm | 2 +- code/modules/mob/living/carbon/say.dm | 15 +-- code/modules/mob/living/living.dm | 4 - code/modules/mob/living/living_defines.dm | 1 - code/modules/mob/living/say.dm | 33 ++---- code/modules/mob/living/silicon/ai/say.dm | 8 +- code/modules/mob/living/silicon/silicon.dm | 2 +- .../mob/living/simple_animal/bot/bot.dm | 2 +- .../simple_animal/friendly/drone/_drone.dm | 3 +- .../friendly/drone/extra_drone_types.dm | 4 +- .../hostile/megafauna/colossus.dm | 3 +- .../mob/living/simple_animal/simple_animal.dm | 3 - .../mob/living/simple_animal/slime/slime.dm | 2 +- code/modules/mob/mob.dm | 8 +- code/modules/shuttle/special.dm | 6 +- code/modules/surgery/organs/tongue.dm | 2 +- code/modules/tgui/states/language_menu.dm | 2 +- tgstation.dme | 2 + tgui/assets/tgui.css | 2 +- tgui/assets/tgui.js | 32 ++--- tgui/src/interfaces/language_menu.ract | 37 +++--- 45 files changed, 349 insertions(+), 194 deletions(-) create mode 100644 code/controllers/subsystem/language.dm create mode 100644 code/modules/language/language_holder.dm diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm index e7818d7bf32..dc2ac19e657 100644 --- a/code/__DEFINES/language.dm +++ b/code/__DEFINES/language.dm @@ -2,3 +2,6 @@ #define TONGUELESS_SPEECH 2 #define LANGUAGE_HIDE_ICON_IF_UNDERSTOOD 4 #define LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD 8 + +#define LANGUAGE_KNOWN "language_known" +#define LANGUAGE_SHADOWED "language_shadowed" diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 6143022993e..79617db7bf9 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -45,6 +45,7 @@ #define INIT_ORDER_TICKER 13 #define INIT_ORDER_MAPPING 12 #define INIT_ORDER_ATOMS 11 +#define INIT_ORDER_LANGUAGE 10 #define INIT_ORDER_MACHINES 9 #define INIT_ORDER_SHUTTLE 3 #define INIT_ORDER_TIMER 1 diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index 14242963245..154879f884c 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -19,5 +19,7 @@ GLOBAL_LIST_EMPTY(silicon_mobs) //all silicon mobs GLOBAL_LIST_EMPTY(ai_list) GLOBAL_LIST_EMPTY(pai_list) GLOBAL_LIST_EMPTY(available_ai_shells) -GLOBAL_LIST_EMPTY(language_datums) -GLOBAL_LIST_EMPTY(simple_animals) \ No newline at end of file +GLOBAL_LIST_EMPTY(simple_animals) + +GLOBAL_LIST_EMPTY(language_datum_instances) +GLOBAL_LIST_EMPTY(all_languages) diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm index d000a2fe1a7..5755db27478 100644 --- a/code/_onclick/hud/ghost.dm +++ b/code/_onclick/hud/ghost.dm @@ -68,6 +68,10 @@ using.screen_loc = ui_ghost_pai static_inventory += using + using = new /obj/screen/language_menu + using.icon = ui_style + static_inventory += using + /datum/hud/ghost/show_hud(version = 0, mob/viewmob) ..() if(!mymob.client.prefs.ghost_hud) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 452bdcc0485..eea8effa8ae 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -91,10 +91,9 @@ screen_loc = ui_language_menu /obj/screen/language_menu/Click() - var/mob/living/L = usr - if(!istype(L)) - return - L.open_language_menu(usr) + var/mob/M = usr + var/datum/language_holder/H = M.get_language_holder() + H.open_language_menu(usr) /obj/screen/inventory var/slot_id // The indentifier for the slot. It has nothing to do with ID cards. diff --git a/code/controllers/subsystem/language.dm b/code/controllers/subsystem/language.dm new file mode 100644 index 00000000000..e80a7096d8c --- /dev/null +++ b/code/controllers/subsystem/language.dm @@ -0,0 +1,18 @@ +SUBSYSTEM_DEF(language) + name = "Language" + init_order = INIT_ORDER_LANGUAGE + flags = SS_NO_FIRE + +/datum/controller/subsystem/language/Initialize(timeofday) + for(var/L in subtypesof(/datum/language)) + var/datum/language/language = L + if(!initial(language.key)) + continue + + GLOB.all_languages += language + + var/datum/language/instance = new language + + GLOB.language_datum_instances[language] = instance + + return ..() diff --git a/code/datums/action.dm b/code/datums/action.dm index 08239492f33..5a397fe3bda 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -482,6 +482,7 @@ /datum/action/language_menu/Trigger() if(!..()) return FALSE - if(isliving(owner)) - var/mob/living/L = owner - L.open_language_menu(usr) + if(ismob(owner)) + var/mob/M = owner + var/datum/language_holder/H = M.get_language_holder() + H.open_language_menu(usr) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 439b178dc1e..9147d14e26d 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -63,6 +63,8 @@ var/mob/living/enslaved_to //If this mind's master is another mob (i.e. adamantine golems) + var/datum/language_holder + /datum/mind/New(var/key) src.key = key soulOwner = src @@ -75,11 +77,21 @@ antag_datums = null return ..() +/datum/mind/proc/get_language_holder() + if(!language_holder) + var/datum/language_holder/L = current.get_language_holder(shadow=FALSE) + language_holder = L.copy(src) + + return language_holder + /datum/mind/proc/transfer_to(mob/new_character, var/force_key_move = 0) if(current) // remove ourself from our old body's mind variable current.mind = null SStgui.on_transfer(current, new_character) + if(!language_holder) + language_holder = new_character.language_holder.copy(src) + if(key) if(new_character.key != key) //if we're transfering into a body with a key associated which is not ours new_character.ghostize(1) //we'll need to ghostize so that key isn't mobless. diff --git a/code/game/atoms.dm b/code/game/atoms.dm index ed496a9ac30..7761fe2365f 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -43,7 +43,7 @@ if(SSatoms.InitAtom(src, args)) //we were deleted return - + var/list/created = SSatoms.created_atoms if(created) created += src diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 4e35f820753..097e9d306de 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -14,9 +14,8 @@ var/throw_speed = 2 //How many tiles to move per ds when being thrown. Float values are fully supported var/throw_range = 7 var/mob/pulledby = null - var/list/languages - var/list/initial_languages = list(/datum/language/common) - var/only_speaks_language = null + var/initial_language_holder = /datum/language_holder + var/datum/language_holder/language_holder var/verb_say = "says" var/verb_ask = "asks" var/verb_exclaim = "exclaims" @@ -45,11 +44,6 @@ return FALSE return ..() -/atom/movable/Initialize(mapload) - . = ..() - for(var/L in initial_languages) - grant_language(L) - /atom/movable/Move(atom/newloc, direct = 0) if(!loc || !newloc) return 0 var/atom/oldloc = loc @@ -178,6 +172,7 @@ STOP_PROCESSING(SSinbounds, src) QDEL_NULL(proximity_monitor) + QDEL_NULL(language_holder) . = ..() if(loc) @@ -576,44 +571,68 @@ /* Language procs */ +/atom/movable/proc/get_language_holder(shadow=TRUE) + if(language_holder) + return language_holder + else + language_holder = new initial_language_holder(src) + return language_holder + /atom/movable/proc/grant_language(datum/language/dt) - LAZYINITLIST(languages) - languages[dt] = TRUE + var/datum/language_holder/H = get_language_holder() + H.grant_language(dt) /atom/movable/proc/grant_all_languages(omnitongue=FALSE) - for(var/la in subtypesof(/datum/language)) - grant_language(la) - - if(omnitongue) - SET_SECONDARY_FLAG(src, OMNITONGUE) + var/datum/language_holder/H = get_language_holder() + H.grant_all_languages(omnitongue) /atom/movable/proc/get_random_understood_language() - var/list/possible = list() - for(var/dt in languages) - possible += dt - . = safepick(possible) + var/datum/language_holder/H = get_language_holder() + . = H.get_random_understood_language() /atom/movable/proc/remove_language(datum/language/dt) - LAZYREMOVE(languages, dt) + var/datum/language_holder/H = get_language_holder() + H.remove_language(dt) /atom/movable/proc/remove_all_languages() - LAZYCLEARLIST(languages) + var/datum/language_holder/H = get_language_holder() + H.remove_all_languages() /atom/movable/proc/has_language(datum/language/dt) - . = is_type_in_typecache(dt, languages) + var/datum/language_holder/H = get_language_holder() + . = H.has_language(dt) + +// Whether an AM can speak in a language or not, independent of whether +// it KNOWS the language +/atom/movable/proc/could_speak_in_language(datum/language/dt) + . = TRUE /atom/movable/proc/can_speak_in_language(datum/language/dt) - . = has_language(dt) - if(only_speaks_language && !HAS_SECONDARY_FLAG(src, OMNITONGUE)) - . = . && ispath(only_speaks_language, dt) + var/datum/language_holder/H = get_language_holder() + + if(!H.has_language(dt)) + return FALSE + else if(H.omnitongue || could_speak_in_language(dt)) + return TRUE + else + return FALSE /atom/movable/proc/get_default_language() // if no language is specified, and we want to say() something, which // language do we use? + var/datum/language_holder/H = get_language_holder() + + if(H.selected_default_language) + if(H.has_language(H.selected_default_language)) + return H.selected_default_language + else + H.selected_default_language = null + + var/datum/language/chosen_langtype var/highest_priority - for(var/lt in languages) + for(var/lt in H.languages) var/datum/language/langtype = lt if(!can_speak_in_language(langtype)) continue @@ -623,8 +642,10 @@ chosen_langtype = langtype highest_priority = pri + H.selected_default_language = . . = chosen_langtype +/* End language procs */ /atom/movable/proc/ConveyorMove(movedir) set waitfor = FALSE if(!anchored && has_gravity()) diff --git a/code/game/gamemodes/clock_cult/clock_mobs.dm b/code/game/gamemodes/clock_cult/clock_mobs.dm index a86c00e4f63..2a1ec656bb9 100644 --- a/code/game/gamemodes/clock_cult/clock_mobs.dm +++ b/code/game/gamemodes/clock_cult/clock_mobs.dm @@ -15,8 +15,7 @@ verb_exclaim = "proclaims" verb_whisper = "imparts" verb_yell = "harangues" - initial_languages = list(/datum/language/common, /datum/language/ratvar) - only_speaks_language = /datum/language/ratvar + initial_language_holder = /datum/language_holder/clockmob bubble_icon = "clock" light_color = "#E42742" death_sound = 'sound/magic/clockwork/anima_fragment_death.ogg' diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index c6248b03cc2..3b315bb6682 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -62,7 +62,7 @@ icon = 'icons/mob/swarmer.dmi' desc = "A robot of unknown design, they seek only to consume materials and replicate themselves indefinitely." speak_emote = list("tones") - initial_languages = list(/datum/language/swarmer) + initial_language_holder = /datum/language_holder/swarmer bubble_icon = "swarmer" health = 40 maxHealth = 40 diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 383915c465a..bef00409e2b 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -294,7 +294,7 @@ GLOBAL_LIST_EMPTY(holopads) Hologram.add_atom_colour("#77abff", FIXED_COLOUR_PRIORITY) Hologram.Impersonation = user - Hologram.languages = user.languages + Hologram.language_holder = user.get_language_holder() 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. @@ -392,4 +392,4 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ req_components = list(/obj/item/weapon/stock_parts/capacitor = 1) #undef HOLOPAD_PASSIVE_POWER_USAGE -#undef HOLOGRAM_POWER_USAGE \ No newline at end of file +#undef HOLOGRAM_POWER_USAGE diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index a14d345e2f8..20f8e8c15c7 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -23,7 +23,7 @@ var/persistence_replacement //have something WAY too amazing to live to the next round? Set a new path here. Overuse of this var will make me upset. var/unique_rename = FALSE // can you customize the description/name of the thing? - + var/dangerous_possession = FALSE //Admin possession yes/no /obj/vv_edit_var(vname, vval) diff --git a/code/game/say.dm b/code/game/say.dm index 4bcc289be13..674f4a1b759 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -61,7 +61,7 @@ GLOBAL_LIST_INIT(freqtospan, list( var/messagepart = " [lang_treat(speaker, message_language, raw_message, spans, message_mode)]" var/languageicon = "" - var/datum/language/D = get_language_instance(message_language) + var/datum/language/D = GLOB.language_datum_instances[message_language] if(D.display_icon(src)) languageicon = "[D.get_icon()] " @@ -103,7 +103,7 @@ GLOBAL_LIST_INIT(freqtospan, list( return speaker.say_quote(raw_message, spans, message_mode) else if(language) var/atom/movable/AM = speaker.GetSource() - var/datum/language/D = get_language_instance(language) + var/datum/language/D = GLOB.language_datum_instances[language] raw_message = D.scramble(raw_message) if(AM) return AM.say_quote(raw_message, spans, message_mode) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 1f8778361fd..a126dbb225f 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1799,12 +1799,12 @@ if(!check_rights(R_ADMIN)) return - var/mob/living/L = locate(href_list["languagemenu"]) in GLOB.mob_list - if(!isliving(L)) - to_chat(usr, "This can only be used on instances of type /mob/living.") + var/mob/M = locate(href_list["languagemenu"]) in GLOB.mob_list + if(!ismob(M)) + to_chat(usr, "This can only be used on instances of type /mob.") return - - L.open_language_menu(usr) + var/datum/language_holder/H = M.get_language_holder() + H.open_language_menu(usr) else if(href_list["traitor"]) if(!check_rights(R_ADMIN)) diff --git a/code/modules/language/language.dm b/code/modules/language/language.dm index f01eb2c7006..2f01cd06e0a 100644 --- a/code/modules/language/language.dm +++ b/code/modules/language/language.dm @@ -12,7 +12,8 @@ var/exclaim_verb = "exclaims" // Used when sentence ends in a ! var/whisper_verb = "whispers" // Optional. When not specified speech_verb + quietly/softly is used instead. var/list/signlang_verb = list("signs", "gestures") // list of emotes that might be displayed if this language has NONVERBAL or SIGNLANG flags - var/key = "x" // Character used to speak in language + var/key // Character used to speak in language + // If key is null, then the language isn't real or learnable. var/flags // Various language flags. var/list/syllables // Used when scrambling text for a non-speaker. var/list/sentence_chance = 5 // Likelihood of making a new sentence after each syllable. @@ -108,13 +109,3 @@ return speech_verb #undef SCRAMBLE_CACHE_LEN - -/proc/get_language_instance(langtype) - if(!ispath(langtype, /datum/language)) - return - - if(!GLOB.language_datums[langtype]) - var/datum/language/langdatum = new langtype - GLOB.language_datums[langtype] = langdatum - - . = GLOB.language_datums[langtype] diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm new file mode 100644 index 00000000000..cd0ce23b23f --- /dev/null +++ b/code/modules/language/language_holder.dm @@ -0,0 +1,110 @@ +/datum/language_holder + var/list/languages = list(/datum/language/common) + var/list/shadow_languages = list() + var/only_speaks_language = null + var/selected_default_language = null + var/datum/language_menu/language_menu + + var/omnitongue = FALSE + var/owner + +/datum/language_holder/New(owner) + src.owner = owner + + languages = typecacheof(languages) + shadow_languages = typecacheof(shadow_languages) + +/datum/language_holder/Destroy() + owner = null + QDEL_NULL(language_menu) + +/datum/language_holder/proc/copy(newowner) + var/datum/language_holder/copy = new(newowner) + copy.languages = src.languages.Copy() + // shadow languages are not copied. + copy.only_speaks_language = src.only_speaks_language + copy.selected_default_language = src.selected_default_language + // language menu is not copied, that's tied to the holder. + copy.omnitongue = src.omnitongue + return copy + +/datum/language_holder/proc/grant_language(datum/language/dt) + languages[dt] = TRUE + +/datum/language_holder/proc/grant_all_languages(omnitongue=FALSE) + for(var/la in GLOB.all_languages) + grant_language(la) + + if(omnitongue) + src.omnitongue = TRUE + +/datum/language_holder/proc/get_random_understood_language() + var/list/possible = list() + for(var/dt in languages) + possible += dt + . = safepick(possible) + +/datum/language_holder/proc/remove_language(datum/language/dt) + languages -= dt + +/datum/language_holder/proc/remove_all_languages() + languages.Cut() + +/datum/language_holder/proc/has_language(datum/language/dt) + if(is_type_in_typecache(dt, languages)) + return LANGUAGE_KNOWN + else + var/atom/movable/AM = get_atom() + var/datum/language_holder/L = AM.get_language_holder(shadow=FALSE) + if(L != src) + if(is_type_in_typecache(dt, L.shadow_languages)) + return LANGUAGE_SHADOWED + return FALSE + +/datum/language_holder/proc/open_language_menu(mob/user) + if(!language_menu) + language_menu = new(src) + language_menu.ui_interact(user) + +/datum/language_holder/proc/get_atom() + if(istype(owner, /atom/movable)) + . = owner + else if(istype(owner, /datum/mind)) + var/datum/mind/M = owner + if(M.current) + . = M.current + +/datum/language_holder/alien + languages = list(/datum/language/xenocommon) + +/datum/language_holder/monkey + languages = list(/datum/language/monkey) + +/datum/language_holder/swarmer + languages = list(/datum/language/swarmer) + +/datum/language_holder/clockmob + languages = list(/datum/language/common, /datum/language/ratvar) + only_speaks_language = /datum/language/ratvar + +/datum/language_holder/drone + languages = list(/datum/language/common, /datum/language/drone, /datum/language/machine) + only_speaks_language = /datum/language/drone + +/datum/language_holder/drone/syndicate + only_speaks_language = null + +/datum/language_holder/slime + languages = list(/datum/language/common, /datum/language/slime) + +/datum/language_holder/lightbringer + // TODO change to a lightbringer specific sign language + languages = list(/datum/language/slime) + +/datum/language_holder/synthetic + languages = list(/datum/language/common) + shadow_languages = list(/datum/language/machine, /datum/language/draconic) + +/datum/language_holder/universal/New() + ..() + grant_all_languages(omnitongue=TRUE) diff --git a/code/modules/language/language_menu.dm b/code/modules/language/language_menu.dm index 43af26a972b..87fc1e0d528 100644 --- a/code/modules/language/language_menu.dm +++ b/code/modules/language/language_menu.dm @@ -1,11 +1,11 @@ /datum/language_menu - var/mob/living/owner + var/datum/language_holder/language_holder -/datum/language_menu/New(new_owner) - owner = new_owner +/datum/language_menu/New(language_holder) + src.language_holder = language_holder /datum/language_menu/Destroy() - owner = null + language_holder = null . = ..() /datum/language_menu/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.language_menu_state) @@ -17,28 +17,38 @@ /datum/language_menu/ui_data(mob/user) var/list/data = list() - var/datum/language/mob_default_language = owner.get_default_language() + var/atom/movable/AM = language_holder.get_atom() + if(isliving(AM)) + data["is_living"] = TRUE + else + data["is_living"] = FALSE data["languages"] = list() - for(var/ld in owner.languages) + for(var/ld in GLOB.all_languages) + var/result = language_holder.has_language(ld) + if(!result) + continue + var/shadow = result == LANGUAGE_SHADOWED var/datum/language/LD = ld var/list/L = list() L["name"] = initial(LD.name) L["desc"] = initial(LD.desc) L["key"] = initial(LD.key) - L["is_default"] = (LD == mob_default_language) - L["can_speak"] = owner.can_speak_in_language(LD) + L["is_default"] = (LD == language_holder.selected_default_language) + L["shadow"] = shadow + if(AM) + L["can_speak"] = AM.can_speak_in_language(LD) data["languages"] += list(L) - if(check_rights_for(user.client, R_ADMIN)) + if(check_rights_for(user.client, R_ADMIN) || isobserver(AM)) data["admin_mode"] = TRUE - data["omnitongue"] = HAS_SECONDARY_FLAG(owner, OMNITONGUE) + data["omnitongue"] = language_holder.omnitongue data["unknown_languages"] = list() - for(var/ld in subtypesof(/datum/language)) - if(owner.has_language(ld)) + for(var/ld in GLOB.all_languages) + if(language_holder.has_language(ld)) continue var/datum/language/LD = ld var/list/L = list() @@ -54,10 +64,11 @@ if(..()) return var/mob/user = usr + var/atom/movable/AM = language_holder.get_atom() var/language_name = params["language_name"] var/datum/language/language_datum - for(var/ld in subtypesof(/datum/language)) + for(var/ld in GLOB.all_languages) var/datum/language/LD = ld if(language_name == initial(LD.name)) language_datum = LD @@ -66,23 +77,26 @@ switch(action) if("select_default") if(language_datum) - owner.selected_default_language = language_datum + language_holder.selected_default_language = language_datum . = TRUE if("grant_language") - if(is_admin && language_datum) - owner.grant_language(language_datum) - message_admins("[key_name_admin(user)] granted the [language_name] language to [key_name_admin(owner)].") - log_admin("[key_name(user)] granted the language [language_name] to [key_name(owner)].") + if((is_admin || isobserver(AM)) && language_datum) + language_holder.grant_language(language_datum) + if(is_admin) + message_admins("[key_name_admin(user)] granted the [language_name] language to [key_name_admin(AM)].") + log_admin("[key_name(user)] granted the language [language_name] to [key_name(AM)].") . = TRUE if("remove_language") - if(is_admin && language_datum) - owner.remove_language(language_datum) - message_admins("[key_name_admin(user)] removed the [language_name] language to [key_name_admin(owner)].") - log_admin("[key_name(user)] removed the language [language_name] to [key_name(owner)].") + if((is_admin || isobserver(AM)) && language_datum) + language_holder.remove_language(language_datum) + if(is_admin) + message_admins("[key_name_admin(user)] removed the [language_name] language to [key_name_admin(AM)].") + log_admin("[key_name(user)] removed the language [language_name] to [key_name(AM)].") . = TRUE if("toggle_omnitongue") - if(is_admin) - TOGGLE_SECONDARY_FLAG(owner, OMNITONGUE) - message_admins("[key_name_admin(user)] [HAS_SECONDARY_FLAG(owner, OMNITONGUE) ? "enabled" : "disabled"] the ability to speak all languages (that they know) of [key_name_admin(owner)].") - log_admin("[key_name(user)] [HAS_SECONDARY_FLAG(owner, OMNITONGUE) ? "enabled" : "disabled"] the ability to speak all languages (that_they know) of [key_name(owner)].") + if(is_admin || isobserver(AM)) + language_holder.omnitongue = !language_holder.omnitongue + if(is_admin) + message_admins("[key_name_admin(user)] [language_holder.omnitongue ? "enabled" : "disabled"] the ability to speak all languages (that they know) of [key_name_admin(AM)].") + log_admin("[key_name(user)] [language_holder.omnitongue ? "enabled" : "disabled"] the ability to speak all languages (that_they know) of [key_name(AM)].") . = TRUE diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index fdec84bc55e..2f7f3e3b0bf 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -117,10 +117,12 @@ 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 + ..() + grant_all_languages() + /mob/dead/observer/narsie_act() var/old_color = color color = "#960000" diff --git a/code/modules/mob/living/brain/say.dm b/code/modules/mob/living/brain/say.dm index 5751c65b364..0cfbf5d1700 100644 --- a/code/modules/mob/living/brain/say.dm +++ b/code/modules/mob/living/brain/say.dm @@ -27,10 +27,9 @@ message = capitalize(message) return message -/mob/living/brain/can_speak_in_language(datum/language/dt) - if(HAS_SECONDARY_FLAG(src, OMNITONGUE)) - . = has_language(dt) - else if(istype(container, /obj/item/device/mmi/posibrain/soul_vessel)) - . = has_language(dt) && ispath(dt, /datum/language/ratvar) +/mob/living/brain/could_speak_in_language(datum/language/dt) + if(istype(container, /obj/item/device/mmi/posibrain/soul_vessel)) + // soul vessels can only speak ratvarian. + . = ispath(dt, /datum/language/ratvar) else . = ..() diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index cc4ebcda5f0..f9ff1c3018c 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -14,7 +14,7 @@ sight = SEE_MOBS see_in_dark = 4 verb_say = "hisses" - initial_languages = list(/datum/language/xenocommon) + initial_language_holder = /datum/language_holder/alien bubble_icon = "alien" type_of_meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno var/nightvision = 1 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 7ae7e4230f2..f5fd93d7b6d 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -5,11 +5,6 @@ icon = 'icons/mob/human.dmi' icon_state = "caucasian_m" - // ME TARZAN, YOU JANEBOT - initial_languages = list(/datum/language/common) - - - /mob/living/carbon/human/dummy real_name = "Test Dummy" status_flags = GODMODE|CANPUSH diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index dfebb8905e2..3122201f001 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -1,5 +1,4 @@ /mob/living/carbon/human - initial_languages = list(/datum/language/common) hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,ANTAG_HUD) possible_a_intents = list(INTENT_HELP, INTENT_DISARM, INTENT_GRAB, INTENT_HARM) pressure_resistance = 25 @@ -49,4 +48,4 @@ var/datum/personal_crafting/handcrafting can_buckle = TRUE buckle_lying = FALSE - can_ride_typecache = list(/mob/living/carbon/human, /mob/living/simple_animal/slime, /mob/living/simple_animal/parrot) \ No newline at end of file + can_ride_typecache = list(/mob/living/carbon/human, /mob/living/simple_animal/slime, /mob/living/simple_animal/parrot) diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 152f708ab57..077d85c32e2 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -2,7 +2,7 @@ name = "monkey" voice_name = "monkey" verb_say = "chimpers" - initial_languages = list(/datum/language/monkey) + initial_language_holder = /datum/language_holder/monkey icon = 'icons/mob/monkey.dmi' icon_state = "" gender = NEUTER diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm index 039b40b2341..ed1f5f08b55 100644 --- a/code/modules/mob/living/carbon/say.dm +++ b/code/modules/mob/living/carbon/say.dm @@ -29,14 +29,9 @@ if(I) . |= I.get_held_item_speechspans(src) -/mob/living/carbon/can_speak_in_language(datum/language/dt) - if(HAS_SECONDARY_FLAG(src, OMNITONGUE)) - . = has_language(dt) - else if(has_language(dt)) - var/obj/item/organ/tongue/T = getorganslot("tongue") - if(T) - . = T.can_speak_in_language(dt) - else - . = initial(dt.flags) & TONGUELESS_SPEECH +/mob/living/carbon/could_speak_in_language(datum/language/dt) + var/obj/item/organ/tongue/T = getorganslot("tongue") + if(T) + . = T.could_speak_in_language(dt) else - . = FALSE + . = initial(dt.flags) & TONGUELESS_SPEECH diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 0421ccabefd..92725d73a65 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -17,8 +17,6 @@ medhud.add_to_hud(src) faction += "\ref[src]" - language_menu = new(src) - /mob/living/prepare_huds() ..() @@ -50,8 +48,6 @@ staticOverlays.len = 0 remove_from_all_data_huds() - QDEL_NULL(language_menu) - return ..() /mob/living/ghostize(can_reenter_corpse = 1) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 7f3253ec295..3531dfc7a66 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -74,4 +74,3 @@ var/datum/riding/riding_datum var/datum/language/selected_default_language - var/datum/language_menu/language_menu diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index b0ab3b27af4..8bc21c4b41b 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -167,11 +167,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( spans += get_spans() if(language) - var/datum/language/L = GLOB.language_datums[language] - if(!istype(L)) - L = new language - GLOB.language_datums[language] = L - + var/datum/language/L = GLOB.language_datum_instances[language] spans |= L.spans //Log what we've said with an associated timestamp, using the list's len for safety/to prevent overwriting messages @@ -308,13 +304,9 @@ GLOBAL_LIST_INIT(department_radio_keys, list( return GLOB.department_radio_keys[key_symbol] /mob/living/proc/get_message_language(message) - var/static/list/langlist - if(!langlist) - langlist = subtypesof(/datum/language) - if(copytext(message, 1, 2) == ",") var/key = copytext(message, 2, 3) - for(var/ld in langlist) + for(var/ld in GLOB.all_languages) var/datum/language/LD = ld if(initial(LD.key) == key) return LD @@ -435,17 +427,14 @@ GLOBAL_LIST_INIT(department_radio_keys, list( else . = ..() -/mob/living/get_default_language() - if(selected_default_language) - if(has_language(selected_default_language)) - return selected_default_language - else - selected_default_language = null - - . = ..() - -/mob/living/proc/open_language_menu(mob/user) - language_menu.ui_interact(user) - /mob/living/whisper(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null) say("#[message]", bubble_type, spans, sanitize, language) + +/mob/living/get_language_holder(shadow=TRUE) + if(mind && shadow) + // Mind language holders shadow mob holders. + . = mind.get_language_holder() + if(.) + return . + + . = ..() diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index fe3a24cef05..f7e568aac95 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -164,11 +164,9 @@ #endif -/mob/living/silicon/ai/can_speak_in_language(datum/language/dt) - if(HAS_SECONDARY_FLAG(src, OMNITONGUE)) - . = has_language(dt) - else if(is_servant_of_ratvar(src)) +/mob/living/silicon/ai/could_speak_in_language(datum/language/dt) + if(is_servant_of_ratvar(src)) // Ratvarian AIs can only speak Ratvarian - . = ispath(dt, /datum/language/ratvar) && has_language(dt) + . = ispath(dt, /datum/language/ratvar) else . = ..() diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index ca4a15beea3..c556b1f709d 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -6,7 +6,7 @@ verb_ask = "queries" verb_exclaim = "declares" verb_yell = "alarms" - initial_languages = list(/datum/language/common, /datum/language/machine) + initial_language_holder = /datum/language_holder/synthetic see_in_dark = 8 bubble_icon = "machine" weather_immunities = list("ash") diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 856179afc01..07c5f88e1f5 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -20,7 +20,7 @@ verb_ask = "queries" verb_exclaim = "declares" verb_yell = "alarms" - initial_languages = list(/datum/language/common, /datum/language/machine) + initial_language_holder = /datum/language_holder/synthetic bubble_icon = "machine" faction = list("neutral", "silicon" , "turret") diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index e5ba358a25d..e98a57d0a63 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -37,8 +37,7 @@ voice_name = "synthesized chirp" speak_emote = list("chirps") bubble_icon = "machine" - initial_languages = list(/datum/language/common, /datum/language/machine, /datum/language/drone) - only_speaks_language = /datum/language/drone + initial_language_holder = /datum/language_holder/drone mob_size = MOB_SIZE_SMALL has_unlimited_silicon_privilege = 1 damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) 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 1507c439123..5c78995be9e 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 @@ -17,6 +17,7 @@ picked = TRUE //the appearence of syndrones is static, you don't get to change it. health = 30 maxHealth = 120 //If you murder other drones and cannibalize them you can get much stronger + initial_language_holder = /datum/language_holder/drone/syndicate faction = list("syndicate") speak_emote = list("hisses") bubble_icon = "syndibot" @@ -111,8 +112,7 @@ verb_whisper = "imparts" verb_yell = "harangues" bubble_icon = "clock" - initial_languages = list(/datum/language/common, /datum/language/ratvar) - only_speaks_language = /datum/language/ratvar + initial_language_holder = /datum/language_holder/clockmob light_color = "#E42742" heavy_emp_damage = 0 laws = "0. Purge all untruths and honor 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 ec76c2176f2..cd2f11f399e 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -647,8 +647,7 @@ Difficulty: Very Hard verb_ask = "floats inquisitively" verb_exclaim = "zaps" verb_yell = "bangs" - initial_languages = list(/datum/language/common, /datum/language/slime) - only_speaks_language = /datum/language/slime + initial_language_holder = /datum/language_holder/lightbringer damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) light_range = 4 faction = list("neutral") diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 8db43623dcf..767d869c8f0 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -7,9 +7,6 @@ status_flags = CANPUSH - // goats bray, cows go moo, and the fox says Geckers - initial_languages = list(/datum/language/common) - var/icon_living = "" var/icon_dead = "" //icon when the animal is dead. Don't use animated icons for this. var/icon_gib = null //We only try to show a gibbing animation if this exists. diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 8971d33b284..c14efe30c22 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -18,7 +18,7 @@ emote_see = list("jiggles", "bounces in place") speak_emote = list("telepathically chirps") bubble_icon = "slime" - initial_languages = list(/datum/language/common, /datum/language/slime) + initial_language_holder = /datum/language_holder/slime 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) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index cd5b5504b18..d3a002a4a56 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -742,7 +742,6 @@ client.move_delay += movement_delay() return 1 - /mob/proc/IsAdvancedToolUser()//This might need a rename but it should replace the can this mob use things check return 0 @@ -1005,3 +1004,10 @@ if("logging") return debug_variable(var_name, logging, 0, src, FALSE) . = ..() + +/mob/verb/open_language_menu() + set name = "Open Language Menu" + set category = "IC" + + var/datum/language_holder/H = get_language_holder() + H.open_language_menu(usr) diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index 78732d82e4b..aa28f2402c6 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -60,7 +60,6 @@ obj_integrity = 1000 max_integrity = 1000 verb_say = "chants" - initial_languages = list(/datum/language/common) var/obj/machinery/power/emitter/energycannon/magical/our_statue var/list/mob/living/sleepers = list() var/never_spoken = TRUE @@ -148,11 +147,11 @@ 3. Don't get messed up in their affairs." status_flags = GODMODE // Please don't punch the barkeeper unique_name = FALSE // disables the (123) number suffix + initial_language_holder = /datum/language_holder/universal /mob/living/simple_animal/drone/snowflake/bardrone/Initialize() . = ..() access_card.access |= GLOB.access_cent_bar - grant_all_languages(omnitongue=TRUE) /mob/living/simple_animal/hostile/alien/maid/barmaid gold_core_spawnable = 0 @@ -163,6 +162,7 @@ unique_name = FALSE AIStatus = AI_OFF stop_automated_movement = TRUE + initial_language_holder = /datum/language_holder/universal /mob/living/simple_animal/hostile/alien/maid/barmaid/Initialize() . = ..() @@ -172,8 +172,6 @@ access_card.access |= GLOB.access_cent_bar access_card.flags |= NODROP - grant_all_languages(omnitongue=TRUE) - /mob/living/simple_animal/hostile/alien/maid/barmaid/Destroy() qdel(access_card) . = ..() diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index e35162f89df..f3f9d7a8cd1 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -34,7 +34,7 @@ if(say_mod && M.dna && M.dna.species) M.dna.species.say_mod = initial(M.dna.species.say_mod) -/obj/item/organ/tongue/can_speak_in_language(datum/language/dt) +/obj/item/organ/tongue/could_speak_in_language(datum/language/dt) . = is_type_in_typecache(dt, languages_possible) /obj/item/organ/tongue/lizard diff --git a/code/modules/tgui/states/language_menu.dm b/code/modules/tgui/states/language_menu.dm index 4a370e82130..fedc4320e47 100644 --- a/code/modules/tgui/states/language_menu.dm +++ b/code/modules/tgui/states/language_menu.dm @@ -10,5 +10,5 @@ GLOBAL_DATUM_INIT(language_menu_state, /datum/ui_state/language_menu, new) . = UI_INTERACTIVE else if(istype(src_object, /datum/language_menu)) var/datum/language_menu/LM = src_object - if(LM.owner == user) + if(LM.language_holder.get_atom() == user) . = UI_INTERACTIVE diff --git a/tgstation.dme b/tgstation.dme index be10e723d95..a3abdd7f199 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -172,6 +172,7 @@ #include "code\controllers\subsystem\inbounds.dm" #include "code\controllers\subsystem\ipintel.dm" #include "code\controllers\subsystem\job.dm" +#include "code\controllers\subsystem\language.dm" #include "code\controllers\subsystem\lighting.dm" #include "code\controllers\subsystem\machines.dm" #include "code\controllers\subsystem\mapping.dm" @@ -1379,6 +1380,7 @@ #include "code\modules\language\draconic.dm" #include "code\modules\language\drone.dm" #include "code\modules\language\language.dm" +#include "code\modules\language\language_holder.dm" #include "code\modules\language\language_menu.dm" #include "code\modules\language\machine.dm" #include "code\modules\language\monkey.dm" diff --git a/tgui/assets/tgui.css b/tgui/assets/tgui.css index 531fb00530b..d52500b9d64 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;-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 +@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 diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index 7f024a02be8..15a0f7fb350 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -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;o2?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}},{76:76,79:79,80:80}],6:[function(t,e,n){"use strict";var a=t(80),r=t(76),i=t(79);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}},{76:76,79:79,80:80}],7:[function(t,e,n){var a=t(78),r=t(79),i=t(76);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}}},{76:76,78:78,79:79}],8:[function(t,e,n){var a=t(17),r=t(34),i=t(80),o=t(79),s=t(9);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}}},{17:17,34:34,79:79,80:80,9:9}],9:[function(t,e,n){var a=t(38),r=t(36),i=t(83)("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)}},{36:36,38:38,83:83}],10:[function(t,e,n){var a=t(11),r=t(83)("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}},{11:11,83:83}],11:[function(t,e,n){var a={}.toString;e.exports=function(t){return a.call(t).slice(8,-1)}},{}],12:[function(t,e,n){"use strict";var a=t(46),r=t(31),i=t(60),o=t(17),s=t(69),p=t(18),u=t(27),c=t(42),l=t(44),f=t(82)("id"),d=t(30),h=t(38),m=t(65),v=t(19),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)}}},{17:17,18:18,19:19,27:27,30:30,31:31,38:38,42:42,44:44,46:46,60:60,65:65,69:69,82:82}],13:[function(t,e,n){var a=t(27),r=t(10);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}}},{10:10,27:27}],14:[function(t,e,n){"use strict";var a=t(31),r=t(60),i=t(4),o=t(38),s=t(69),p=t(27),u=t(8),c=t(30),l=t(82)("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}},{27:27,30:30,31:31,38:38,4:4,60:60,69:69,8:8,82:82}],15:[function(t,e,n){"use strict";var a=t(29),r=t(22),i=t(61),o=t(60),s=t(27),p=t(69),u=t(38),c=t(24),l=t(43),f=t(66);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}},{22:22,24:24,27:27,29:29,38:38,43:43,60:60,61:61,66:66,69:69}],16:[function(t,e,n){var a=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=a)},{}],17:[function(t,e,n){var a=t(2);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)}}},{2:2}],18:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],19:[function(t,e,n){e.exports=!t(24)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{24:24}],20:[function(t,e,n){var a=t(38),r=t(29).document,i=a(r)&&a(r.createElement);e.exports=function(t){return i?r.createElement(t):{}}},{29:29,38:38}],21:[function(t,e,n){var a=t(46);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}},{46:46}],22:[function(t,e,n){var a=t(29),r=t(16),i=t(31),o=t(61),s=t(17),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},{16:16,17:17,29:29,31:31,61:61}],23:[function(t,e,n){var a=t(83)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[a]=!1,!"/./"[t](e)}catch(r){}}return!0}},{83:83}],24:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],25:[function(t,e,n){"use strict";var a=t(31),r=t(61),i=t(24),o=t(18),s=t(83);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)}))}},{18:18,24:24,31:31,61:61,83:83}],26:[function(t,e,n){"use strict";var a=t(4);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}},{4:4}],27:[function(t,e,n){var a=t(17),r=t(40),i=t(35),o=t(4),s=t(79),p=t(84);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)}},{17:17,35:35,4:4,40:40,79:79,84:84}],28:[function(t,e,n){var a=t(78),r=t(46).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))}},{46:46,78:78}],29:[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)},{}],30:[function(t,e,n){var a={}.hasOwnProperty;e.exports=function(t,e){return a.call(t,e)}},{}],31:[function(t,e,n){var a=t(46),r=t(59);e.exports=t(19)?function(t,e,n){return a.setDesc(t,e,r(1,n))}:function(t,e,n){return t[e]=n,t}},{19:19,46:46,59:59}],32:[function(t,e,n){e.exports=t(29).document&&document.documentElement},{29:29}],33:[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)}},{}],34:[function(t,e,n){var a=t(11);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==a(t)?t.split(""):Object(t)}},{11:11}],35:[function(t,e,n){var a=t(45),r=t(83)("iterator"),i=Array.prototype;e.exports=function(t){return void 0!==t&&(a.Array===t||i[r]===t)}},{45:45,83:83}],36:[function(t,e,n){var a=t(11);e.exports=Array.isArray||function(t){return"Array"==a(t)}},{11:11}],37:[function(t,e,n){var a=t(38),r=Math.floor;e.exports=function(t){return!a(t)&&isFinite(t)&&r(t)===t}},{38:38}],38:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],39:[function(t,e,n){var a=t(38),r=t(11),i=t(83)("match");e.exports=function(t){var e;return a(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==r(t))}},{11:11,38:38,83:83}],40:[function(t,e,n){var a=t(4);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}}},{4:4}],41:[function(t,e,n){"use strict";var a=t(46),r=t(59),i=t(66),o={};t(31)(o,t(83)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=a.create(o,{next:r(1,n)}),i(t,e+" Iterator")}},{31:31,46:46,59:59,66:66,83:83}],42:[function(t,e,n){"use strict";var a=t(48),r=t(22),i=t(61),o=t(31),s=t(30),p=t(45),u=t(41),c=t(66),l=t(46).getProto,f=t(83)("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}},{22:22,30:30,31:31,41:41,45:45,46:46,48:48,61:61,66:66,83:83}],43:[function(t,e,n){var a=t(83)("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(){return{done:n=!0}},i[a]=function(){return o},t(i)}catch(s){}return n}},{83:83}],44:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],45:[function(t,e,n){e.exports={}},{}],46:[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}},{}],47:[function(t,e,n){var a=t(46),r=t(78);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}},{46:46,78:78}],48:[function(t,e,n){e.exports=!1},{}],49:[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}},{}],50:[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)}},{}],51:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],52:[function(t,e,n){var a,r,i,o=t(29),s=t(75).set,p=o.MutationObserver||o.WebKitMutationObserver,u=o.process,c=o.Promise,l="process"==t(11)(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}},{11:11,29:29,75:75}],53:[function(t,e,n){var a=t(46),r=t(80),i=t(34);e.exports=t(24)(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},{24:24,34:34,46:46,80:80}],54:[function(t,e,n){var a=t(22),r=t(16),i=t(24);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)}},{16:16,22:22,24:24}],55:[function(t,e,n){var a=t(46),r=t(78),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}}},{46:46,78:78}],56:[function(t,e,n){var a=t(46),r=t(4),i=t(29).Reflect;e.exports=i&&i.ownKeys||function(t){var e=a.getNames(r(t)),n=a.getSymbols;return n?e.concat(n(t)):e}},{29:29,4:4,46:46}],57:[function(t,e,n){"use strict";var a=t(58),r=t(33),i=t(2);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)}}},{2:2,33:33,58:58}],58:[function(t,e,n){e.exports=t(29)},{29:29}],59:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],60:[function(t,e,n){var a=t(61);e.exports=function(t,e){for(var n in e)a(t,n,e[n]);return t}},{61:61}],61:[function(t,e,n){var a=t(29),r=t(31),i=t(82)("src"),o="toString",s=Function[o],p=(""+s).split(o);t(16).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)})},{16:16,29:29,31:31,82:82}],62:[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)}}},{}],63:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],64:[function(t,e,n){var a=t(46).getDesc,r=t(38),i=t(4),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(17)(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}},{17:17,38:38,4:4,46:46}],65:[function(t,e,n){"use strict";var a=t(29),r=t(46),i=t(19),o=t(83)("species");e.exports=function(t){var e=a[t];i&&e&&!e[o]&&r.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{19:19,29:29,46:46,83:83}],66:[function(t,e,n){var a=t(46).setDesc,r=t(30),i=t(83)("toStringTag");e.exports=function(t,e,n){t&&!r(t=n?t:t.prototype,i)&&a(t,i,{configurable:!0,value:e})}},{30:30,46:46,83:83}],67:[function(t,e,n){var a=t(29),r="__core-js_shared__",i=a[r]||(a[r]={});e.exports=function(t){return i[t]||(i[t]={})}},{29:29}],68:[function(t,e,n){var a=t(4),r=t(2),i=t(83)("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)}},{2:2,4:4,83:83}],69:[function(t,e,n){e.exports=function(t,e,n){if(!(t instanceof e))throw TypeError(n+": use the 'new' operator!");return t}},{}],70:[function(t,e,n){var a=t(77),r=t(18);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)}}},{18:18,77:77}],71:[function(t,e,n){var a=t(39),r=t(18);e.exports=function(t,e,n){if(a(e))throw TypeError("String#"+n+" doesn't accept regex!");return r(t)+""}},{18:18,39:39}],72:[function(t,e,n){var a=t(79),r=t(73),i=t(18);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}},{18:18,73:73,79:79}],73:[function(t,e,n){"use strict";var a=t(77),r=t(18);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}},{18:18,77:77}],74:[function(t,e,n){var a=t(22),r=t(18),i=t(24),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},{18:18,22:22,24:24}],75:[function(t,e,n){var a,r,i,o=t(17),s=t(33),p=t(32),u=t(20),c=t(29),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(11)(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}},{11:11,17:17,20:20,29:29,32:32,33:33}],76:[function(t,e,n){var a=t(77),r=Math.max,i=Math.min;e.exports=function(t,e){return t=a(t),0>t?r(t+e,0):i(t,e)}},{77:77}],77:[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)}},{}],78:[function(t,e,n){var a=t(34),r=t(18);e.exports=function(t){return a(r(t))}},{18:18,34:34}],79:[function(t,e,n){var a=t(77),r=Math.min;e.exports=function(t){return t>0?r(a(t),9007199254740991):0}},{77:77}],80:[function(t,e,n){var a=t(18);e.exports=function(t){return Object(a(t))}},{18:18}],81:[function(t,e,n){var a=t(38);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")}},{38:38}],82:[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))}},{}],83:[function(t,e,n){var a=t(67)("wks"),r=t(82),i=t(29).Symbol;e.exports=function(t){return a[t]||(a[t]=i&&i[t]||(i||r)("Symbol."+t))}},{29:29,67:67,82:82}],84:[function(t,e,n){var a=t(10),r=t(83)("iterator"),i=t(45);e.exports=t(16).getIteratorMethod=function(t){return void 0!=t?t[r]||t["@@iterator"]||i[a(t)]:void 0}},{10:10,16:16,45:45,83:83}],85:[function(t,e,n){"use strict";var a,r=t(46),i=t(22),o=t(19),s=t(59),p=t(32),u=t(20),c=t(30),l=t(11),f=t(33),d=t(24),h=t(4),m=t(2),v=t(38),g=t(80),b=t(78),y=t(77),_=t(76),x=t(79),w=t(34),k=t(82)("__proto__"),P=t(8),C=t(7)(!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("
Changelings