diff --git a/_maps/RandomRuins/SpaceRuins/crashedship.dmm b/_maps/RandomRuins/SpaceRuins/crashedship.dmm index 192657641fd..b4d65c7bd9b 100644 --- a/_maps/RandomRuins/SpaceRuins/crashedship.dmm +++ b/_maps/RandomRuins/SpaceRuins/crashedship.dmm @@ -2184,7 +2184,8 @@ /turf/open/floor/plating/airless, /area/awaymission/BMPship/Fore) "ge" = ( -/turf/closed/mineral/random, +/obj/machinery/door/airlock/silver, +/turf/open/floor/plating, /area/awaymission/BMPship/Midship) "gf" = ( /obj/machinery/light{ diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index cf8c406eb5e..d841a0f335f 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -2398,10 +2398,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, -/turf/open/floor/plating{ - tag = "icon-plating_warn_side (EAST)"; - icon_state = "plating_warn_side" - }, +/turf/open/floor/plasteel, /area/quartermaster/storage) "aea" = ( /obj/machinery/conveyor{ @@ -2415,10 +2412,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, -/turf/open/floor/plating{ - tag = "icon-plating_warn_side (EAST)"; - icon_state = "plating_warn_side" - }, +/turf/open/floor/plasteel, /area/quartermaster/storage) "aeb" = ( /obj/machinery/conveyor{ @@ -2429,10 +2423,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, -/turf/open/floor/plating{ - tag = "icon-plating_warn_side (EAST)"; - icon_state = "plating_warn_side" - }, +/turf/open/floor/plasteel, /area/quartermaster/storage) "aec" = ( /obj/machinery/conveyor{ @@ -2448,10 +2439,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, -/turf/open/floor/plating{ - tag = "icon-plating_warn_side (EAST)"; - icon_state = "plating_warn_side" - }, +/turf/open/floor/plasteel, /area/quartermaster/storage) "aed" = ( /obj/machinery/conveyor{ @@ -2461,10 +2449,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, -/turf/open/floor/plating{ - tag = "icon-plating_warn_side (EAST)"; - icon_state = "plating_warn_side" - }, +/turf/open/floor/plasteel, /area/quartermaster/storage) "aee" = ( /obj/machinery/conveyor{ @@ -2483,10 +2468,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, -/turf/open/floor/plating{ - tag = "icon-plating_warn_side (EAST)"; - icon_state = "plating_warn_side" - }, +/turf/open/floor/plasteel, /area/quartermaster/storage) "aef" = ( /obj/machinery/conveyor{ @@ -4519,9 +4501,10 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/end{ - dir = 8 +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating{ tag = "icon-plating_warn_end (WEST)"; icon_state = "plating_warn_end" @@ -4537,10 +4520,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, -/turf/open/floor/plating{ - tag = "icon-plating_warn_side (EAST)"; - icon_state = "plating_warn_side" +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, +/turf/open/floor/plasteel, /area/quartermaster/storage) "ahp" = ( /obj/machinery/conveyor{ @@ -4551,10 +4534,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, -/turf/open/floor/plating{ - tag = "icon-plating_warn_side (EAST)"; - icon_state = "plating_warn_side" +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, +/turf/open/floor/plasteel, /area/quartermaster/storage) "ahq" = ( /obj/machinery/conveyor{ @@ -4569,6 +4552,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plating{ tag = "icon-plating_warn_side (EAST)"; icon_state = "plating_warn_side" @@ -4584,6 +4570,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plating{ tag = "icon-plating_warn_side (EAST)"; icon_state = "plating_warn_side" @@ -4606,6 +4595,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plating{ tag = "icon-plating_warn_side (EAST)"; icon_state = "plating_warn_side" @@ -5036,6 +5028,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plating, /area/quartermaster/storage) "aif" = ( @@ -11429,9 +11424,7 @@ dir = 4 }, /turf/open/floor/plasteel/green/side{ - dir = 5; - initial_gas_mix = "n2=100;TEMP=80"; - tag = "SERVER" + dir = 5 }, /area/atmos) "arz" = ( @@ -12047,7 +12040,7 @@ layer = 2.9 }, /obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/shuttle/mining) "asv" = ( /turf/open/floor/engine/n2, @@ -25691,6 +25684,10 @@ tag = "icon-4-8"; icon_state = "4-8" }, +/obj/structure/cable/white{ + tag = "icon-0-8"; + icon_state = "0-8" + }, /turf/open/floor/plasteel/green/corner{ tag = "icon-greencorner (NORTH)"; icon_state = "greencorner"; @@ -26169,7 +26166,7 @@ }, /obj/structure/shuttle/engine/heater, /obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/shuttle/escape) "aPF" = ( /obj/structure/window/reinforced{ @@ -26178,7 +26175,7 @@ /obj/structure/shuttle/engine/heater, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/shuttle/escape) "aPG" = ( /obj/structure/grille, @@ -26758,7 +26755,7 @@ "aQE" = ( /obj/structure/shuttle/engine/propulsion, /obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/shuttle/escape) "aQF" = ( /obj/machinery/light{ @@ -27771,10 +27768,7 @@ /obj/effect/turf_decal/stripes/end{ dir = 8 }, -/turf/open/floor/plasteel/white{ - tag = "icon-white_warn_end (WEST)"; - icon_state = "white_warn_end" - }, +/turf/open/floor/plasteel, /area/medical/research{ name = "Research Division" }) @@ -27788,10 +27782,7 @@ /obj/effect/turf_decal/stripes/end{ dir = 4 }, -/turf/open/floor/plasteel/white{ - tag = "icon-white_warn_end (EAST)"; - icon_state = "white_warn_end" - }, +/turf/open/floor/plasteel, /area/medical/research{ name = "Research Division" }) @@ -29350,7 +29341,8 @@ }) "aVC" = ( /turf/open/floor/plasteel/vault{ - dir = 8 + dir = 8; + initial_gas_mix = "n2=100;TEMP=80" }, /area/medical/research{ name = "Research Division" @@ -29802,7 +29794,8 @@ dir = 4 }, /turf/open/floor/plasteel/vault{ - dir = 8 + dir = 8; + initial_gas_mix = "n2=100;TEMP=80" }, /area/medical/research{ name = "Research Division" @@ -35414,6 +35407,10 @@ tag = "icon-4-8"; icon_state = "4-8" }, +/obj/structure/cable/white{ + tag = "icon-0-8"; + icon_state = "0-8" + }, /turf/open/floor/plasteel/neutral, /area/hallway/primary/central) "bfN" = ( @@ -37061,10 +37058,7 @@ /obj/effect/turf_decal/stripes/end{ dir = 8 }, -/turf/open/floor/plasteel/white{ - tag = "icon-white_warn_end (WEST)"; - icon_state = "white_warn_end" - }, +/turf/open/floor/plasteel, /area/toxins/xenobiology) "biD" = ( /obj/machinery/shower{ @@ -37080,10 +37074,7 @@ /obj/effect/turf_decal/stripes/end{ dir = 4 }, -/turf/open/floor/plasteel/white{ - tag = "icon-white_warn_end (EAST)"; - icon_state = "white_warn_end" - }, +/turf/open/floor/plasteel, /area/toxins/xenobiology) "biE" = ( /obj/structure/sign/xenobio, @@ -37583,7 +37574,8 @@ "bjw" = ( /obj/machinery/atmospherics/pipe/manifold/general/hidden, /turf/open/floor/plasteel/vault{ - dir = 8 + dir = 8; + initial_gas_mix = "n2=100;TEMP=80" }, /area/toxins/xenobiology) "bjx" = ( @@ -37593,7 +37585,8 @@ dir = 9 }, /turf/open/floor/plasteel/vault{ - dir = 8 + dir = 8; + initial_gas_mix = "n2=100;TEMP=80" }, /area/toxins/xenobiology) "bjy" = ( @@ -37757,7 +37750,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/shuttle/arrival) "bjO" = ( /turf/closed/wall/mineral/plastitanium, @@ -37914,7 +37907,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/shuttle/arrival) "bjX" = ( /obj/structure/grille, @@ -38933,14 +38926,7 @@ "bmh" = ( /obj/machinery/atmospherics/components/unary/vent_pump{ dir = 1; - external_pressure_bound = 0; - frequency = 1441; - id_tag = "o2_out"; - initialize_directions = 1; - internal_pressure_bound = 4000; - on = 1; - pressure_checks = 2; - pump_direction = 0 + on = 1 }, /turf/open/floor/plasteel, /area/hallway/secondary/exit{ @@ -41743,6 +41729,197 @@ "bvf" = ( /turf/closed/wall/r_wall, /area/engine/supermatter) +"bvg" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvh" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvi" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvj" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvk" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvl" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvm" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvn" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvo" = ( +/obj/structure/girder, +/turf/open/floor/plating/airless, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvp" = ( +/obj/structure/girder, +/turf/open/floor/plating/airless, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvq" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvr" = ( +/obj/structure/girder, +/turf/open/floor/plating/airless, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvs" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvt" = ( +/obj/structure/girder, +/turf/open/floor/plating/airless, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvu" = ( +/obj/structure/girder, +/turf/open/floor/plating/airless, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvv" = ( +/obj/structure/girder, +/turf/open/floor/plating/airless, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvw" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvx" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvy" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvz" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvA" = ( +/obj/structure/girder, +/turf/open/floor/plating/airless, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvB" = ( +/obj/structure/girder, +/turf/open/floor/plating/airless, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvC" = ( +/obj/structure/girder, +/turf/open/floor/plating/airless, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvD" = ( +/obj/structure/girder, +/turf/open/floor/plating/airless, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvE" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvF" = ( +/obj/structure/girder, +/turf/open/floor/plating/airless, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvG" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvH" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvI" = ( +/obj/item/weapon/pickaxe/emergency, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvJ" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvK" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvL" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvM" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvN" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) (1,1,1) = {" aaa @@ -71389,7 +71566,7 @@ aad aad aad aad -aac +abj aaW aad aad @@ -71646,7 +71823,7 @@ aad aad aad abi -aac +abj abi abi aad @@ -71683,9 +71860,9 @@ aJp aRF aSP aEt -abi +bvo aad -abi +bvo aad abi aad @@ -71903,8 +72080,8 @@ aad abi aik aaW -aac -aac +abj +abj abu abP aad @@ -72158,11 +72335,11 @@ aac aad aad aad -aac -aac +abj +abj abS -aac -aac +abj +abj acD aad abi @@ -72201,11 +72378,11 @@ aUR aVL aUR aUQ -abi +bvo ahu aad aac -acD +bvI aad aac aad @@ -72415,9 +72592,9 @@ aac aad aad aaW -aac +abj abu -ajP +aaV aad abS aad @@ -72445,11 +72622,11 @@ aHl aIi aJs aKz -buX +buW aMR buZ -bva -bvb +buZ +buW aQL aRI aSS @@ -72458,10 +72635,10 @@ aUS aUU aWz aVL -abi +bvo ahu -abP -abu +bvh +bvg aad aad aad @@ -72676,7 +72853,7 @@ abu abu aad aad -aac +abj abi anx anx @@ -72706,7 +72883,7 @@ aLP aMS aMS aOC -bvc +buW aQM aRJ aST @@ -72715,8 +72892,8 @@ aUR aUU aWz aUQ -abP -abi +bvh +bvo aad aad aad @@ -72930,9 +73107,9 @@ aad aad aad abu -aac +abj aad -ajP +aaV abP amG anx @@ -72972,8 +73149,8 @@ aUS aUU aWz aVL -abu -abP +bvg +bvh aad aad aad @@ -73229,8 +73406,8 @@ aUT aUU aUU aUQ -abu -abi +bvg +bvo aad aad aad @@ -73486,7 +73663,7 @@ aUS aUU aWz aVL -abP +bvh aad aad aad @@ -73734,7 +73911,7 @@ aLT aMW aMW aOD -bve +buW aQQ aRN aSX @@ -73743,7 +73920,7 @@ aUR aUU aWz aUQ -abi +bvo aad aad aad @@ -73987,11 +74164,11 @@ aHr aIo aJw aKE -buY +buW aMX aMX aMX -bvf +buW aQR aRO aSY @@ -74000,7 +74177,7 @@ aUS aUU aWz aVL -abi +bvo aOH aZo baj @@ -74767,11 +74944,11 @@ aQT aRR aTa aEt -abi -abu -abP -abi -abi +bvo +bvg +bvh +bvo +bvo aOH aZr bam @@ -88596,9 +88773,9 @@ aaa aad aad aad -abu -abP -abP +bvg +bvh +bvh adn aec aeS @@ -88665,7 +88842,7 @@ bhj bhT aRz aad -abu +bvg aac aad aad @@ -88854,7 +89031,7 @@ aaa aac aac aac -abu +bvg aad adn aed @@ -88921,7 +89098,7 @@ bgv bhk bhU aRy -abu +bvg aac aaa aaa @@ -89178,7 +89355,7 @@ bgw bhl bhV aRy -abu +bvg aaa aaa aaa @@ -89387,9 +89564,9 @@ acv aph aqp abt -abP -abP -abu +bvh +bvh +bvg aac aac aae @@ -89645,7 +89822,7 @@ api amD amC amC -abu +bvg aac aae aae @@ -89692,7 +89869,7 @@ bgy bhk bhX aRy -abu +bvg aaa aaa aaa @@ -89949,7 +90126,7 @@ bgz bhk bgw aRy -abu +bvg aac aaa aaa diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 631433a5a73..e0e721840d8 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -29590,9 +29590,7 @@ pixel_x = -32 }, /turf/open/floor/plasteel/whiteblue/side{ - dir = 9; - initial_gas_mix = "n2=100;TEMP=80"; - tag = "icon-whiteblue (NORTHWEST)" + dir = 9 }, /area/medical/medbay3) "bhO" = ( @@ -29631,9 +29629,7 @@ pixel_x = -32 }, /turf/open/floor/plasteel/whiteblue/side{ - dir = 9; - initial_gas_mix = "n2=100;TEMP=80"; - tag = "icon-whiteblue (NORTHWEST)" + dir = 9 }, /area/medical/medbay) "bhS" = ( @@ -48652,17 +48648,23 @@ pixel_y = 24 }, /obj/structure/cable, -/turf/open/floor/plasteel/black, +/turf/open/floor/plasteel/black{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bTt" = ( /obj/machinery/power/terminal{ icon_state = "term"; dir = 1 }, -/turf/open/floor/plasteel/black, +/turf/open/floor/plasteel/black{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bTu" = ( -/turf/open/floor/plasteel/black, +/turf/open/floor/plasteel/black{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bTv" = ( /obj/machinery/telecomms/bus/preset_three, @@ -48726,20 +48728,28 @@ /obj/machinery/light{ dir = 8 }, -/turf/open/floor/plasteel/darkred/side, +/turf/open/floor/plasteel/darkred/side{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bTD" = ( -/turf/open/floor/plasteel/darkpurple/side, +/turf/open/floor/plasteel/darkpurple/side{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bTE" = ( -/turf/open/floor/plasteel/darkgreen/side, +/turf/open/floor/plasteel/darkgreen/side{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bTF" = ( /obj/machinery/light{ dir = 4; icon_state = "tube1" }, -/turf/open/floor/plasteel/darkgreen/side, +/turf/open/floor/plasteel/darkgreen/side{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bTG" = ( /turf/closed/indestructible{ @@ -48826,17 +48836,20 @@ dir = 8 }, /turf/open/floor/plasteel/darkblue/side{ - dir = 1 + dir = 1; + initial_gas_mix = "n2=100;TEMP=80" }, /area/tcommsat/server) "bTS" = ( /turf/open/floor/plasteel/darkblue/side{ - dir = 1 + dir = 1; + initial_gas_mix = "n2=100;TEMP=80" }, /area/tcommsat/server) "bTT" = ( /turf/open/floor/plasteel/darkyellow/side{ - dir = 1 + dir = 1; + initial_gas_mix = "n2=100;TEMP=80" }, /area/tcommsat/server) "bTU" = ( @@ -48845,7 +48858,8 @@ icon_state = "tube1" }, /turf/open/floor/plasteel/darkyellow/side{ - dir = 1 + dir = 1; + initial_gas_mix = "n2=100;TEMP=80" }, /area/tcommsat/server) "bTV" = ( @@ -48896,7 +48910,9 @@ /obj/item/weapon/stock_parts/subspace/amplifier, /obj/item/weapon/stock_parts/subspace/analyzer, /obj/item/weapon/stock_parts/subspace/analyzer, -/turf/open/floor/plasteel/black, +/turf/open/floor/plasteel/black{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bUc" = ( /obj/structure/table, @@ -48904,7 +48920,9 @@ /obj/item/weapon/stock_parts/subspace/ansible, /obj/item/weapon/stock_parts/subspace/crystal, /obj/item/weapon/stock_parts/subspace/crystal, -/turf/open/floor/plasteel/black, +/turf/open/floor/plasteel/black{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bUd" = ( /obj/structure/table, @@ -48912,7 +48930,9 @@ /obj/item/weapon/stock_parts/subspace/filter, /obj/item/weapon/stock_parts/subspace/transmitter, /obj/item/weapon/stock_parts/subspace/transmitter, -/turf/open/floor/plasteel/black, +/turf/open/floor/plasteel/black{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bUe" = ( /obj/machinery/camera/motion{ @@ -48921,7 +48941,6 @@ network = list("SS13","Telecoms") }, /turf/open/floor/plasteel/black{ - name = "Mainframe Floor"; initial_gas_mix = "n2=100;TEMP=80" }, /area/tcommsat/server) @@ -48931,7 +48950,9 @@ /obj/item/weapon/stock_parts/subspace/treatment, /obj/item/weapon/stock_parts/manipulator, /obj/item/weapon/stock_parts/manipulator, -/turf/open/floor/plasteel/black, +/turf/open/floor/plasteel/black{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bUg" = ( /obj/structure/table, @@ -48939,13 +48960,17 @@ /obj/item/weapon/stock_parts/console_screen, /obj/item/weapon/stock_parts/micro_laser, /obj/item/weapon/stock_parts/micro_laser, -/turf/open/floor/plasteel/black, +/turf/open/floor/plasteel/black{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bUh" = ( /obj/structure/table, /obj/item/weapon/stock_parts/scanning_module, /obj/item/weapon/stock_parts/scanning_module, -/turf/open/floor/plasteel/black, +/turf/open/floor/plasteel/black{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bUi" = ( /obj/machinery/camera/motion{ @@ -83827,33 +83852,33 @@ bQl bQC bQN bQZ -bRg -bRg -bRg -bRE -bRg -bRg -bRg -bRg -bRE -bRg -bRg -bRg -bRg -bRE -bRg -bRg -bRg -bRg -bRE -bRg -bRg -bRg -bRg -bRE -bRg -bRg -bRg +aeZ +aeZ +aeZ +afy +aeZ +aeZ +aeZ +aeZ +afy +aeZ +aeZ +aeZ +aeZ +afy +aeZ +aeZ +aeZ +aeZ +afy +aeZ +aeZ +aeZ +aeZ +afy +aeZ +aeZ +aeZ bSp bSu bSC @@ -97895,7 +97920,7 @@ aaa aaa aGT aOx -cii +aPw aKE aPw aSs diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index c390a0cf06b..aa5e44a5210 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -13925,7 +13925,7 @@ dir = 4; icon_state = "burst_r" }, -/turf/open/floor/plasteel/black, +/turf/open/floor/plating/airless, /area/shuttle/arrival) "aEy" = ( /obj/structure/shuttle/engine/heater{ @@ -13935,7 +13935,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/turf/open/floor/plasteel/black, +/turf/open/floor/plating/airless, /area/shuttle/arrival) "aEz" = ( /obj/machinery/power/apc{ @@ -14460,7 +14460,7 @@ dir = 4; icon_state = "propulsion" }, -/turf/open/floor/plasteel/black, +/turf/open/floor/plating/airless, /area/shuttle/arrival) "aFG" = ( /turf/open/floor/plasteel/arrival{ @@ -16630,7 +16630,7 @@ dir = 4; icon_state = "burst_l" }, -/turf/open/floor/plasteel/black, +/turf/open/floor/plating/airless, /area/shuttle/arrival) "aKj" = ( /obj/machinery/door/firedoor, @@ -58780,7 +58780,7 @@ dir = 8; icon_state = "propulsion_l" }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/shuttle/transport) "cxu" = ( /turf/closed/wall/mineral/titanium, @@ -58816,7 +58816,7 @@ dir = 8 }, /obj/structure/window/reinforced, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/shuttle/transport) "cxz" = ( /obj/machinery/computer/shuttle/ferry/request, @@ -58844,7 +58844,7 @@ dir = 4; pixel_x = 0 }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/shuttle/transport) "cxE" = ( /obj/machinery/door/airlock/titanium, @@ -60967,7 +60967,7 @@ dir = 1; pixel_y = 1 }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/shuttle/transport) "cCz" = ( /obj/machinery/door/airlock/external, @@ -63393,7 +63393,7 @@ name = "arrivals"; width = 7 }, -/turf/open/floor/plasteel/black, +/turf/open/floor/plating/airless, /area/shuttle/arrival) "cIh" = ( /obj/machinery/door/airlock/external{ diff --git a/bot/config.py b/bot/config.py index 8888753ab71..c0ffc55bed6 100644 --- a/bot/config.py +++ b/bot/config.py @@ -1,6 +1,7 @@ # Configuration for the minibot.py bot starts here server = "irc.rizon.net" port = 6667 +nudge_port = 45678 channels = ["#asdfgbus", "#botbus"] defaultchannel = "#asdfgbus" diff --git a/bot/minibot.py b/bot/minibot.py index 82e46722f83..cc5ac1a5b4d 100755 --- a/bot/minibot.py +++ b/bot/minibot.py @@ -73,7 +73,7 @@ def setup_irc_socket(): def setup_nudge_socket(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.bind(("", 45678)) # localhost:45678 + s.bind(("", nudge_port)) # localhost:nudge_port s.listen(5) logger.info("Nudge socket up and listening") return s diff --git a/bot/nudge.py b/bot/nudge.py index 1af5c928fa6..afc2cf38b09 100755 --- a/bot/nudge.py +++ b/bot/nudge.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +from config import * import sys import pickle import socket @@ -16,7 +17,7 @@ def pack(): def nudge(data): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.connect(("localhost", 45678)) + s.connect(("localhost", nudge_port)) s.send(data) s.close() diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 29b4d7411db..7edf1f5959b 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -196,6 +196,21 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache) #define BLOOD_STATE_XENO "xeno" #define BLOOD_STATE_OIL "oil" #define BLOOD_STATE_NOT_BLOODY "no blood whatsoever" + +//suit sensors: sensor_mode defines + +#define SENSOR_OFF 0 +#define SENSOR_LIVING 1 +#define SENSOR_VITALS 2 +#define SENSOR_COORDS 3 + +//suit sensors: has_sensor defines + +#define BROKEN_SENSORS -1 +#define NO_SENSORS 0 +#define HAS_SENSORS 1 +#define LOCKED_SENSORS 2 + //Turf wet states #define TURF_DRY 0 #define TURF_WET_WATER 1 diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index fb11e17b9d0..a3570d840d9 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -10,7 +10,7 @@ #define BLOOD_VOLUME_MAXIMUM 2000 #define BLOOD_VOLUME_SLIME_SPLIT 1120 #define BLOOD_VOLUME_NORMAL 560 -#define BLOOD_VOLUME_SAFE 501 +#define BLOOD_VOLUME_SAFE 475 #define BLOOD_VOLUME_OKAY 336 #define BLOOD_VOLUME_BAD 224 #define BLOOD_VOLUME_SURVIVE 122 diff --git a/code/__DEFINES/pipe_construction.dm b/code/__DEFINES/pipe_construction.dm index 84c4563bf2f..b8a83ee3fa4 100644 --- a/code/__DEFINES/pipe_construction.dm +++ b/code/__DEFINES/pipe_construction.dm @@ -16,6 +16,7 @@ Construction breaks otherwise #define PIPE_CONNECTOR /obj/machinery/atmospherics/components/unary/portables_connector #define PIPE_UVENT /obj/machinery/atmospherics/components/unary/vent_pump #define PIPE_SCRUBBER /obj/machinery/atmospherics/components/unary/vent_scrubber +#define PIPE_INJECTOR /obj/machinery/atmospherics/components/unary/outlet_injector #define PIPE_HEAT_EXCHANGE /obj/machinery/atmospherics/components/unary/heat_exchanger //Binary #define PIPE_PUMP /obj/machinery/atmospherics/components/binary/pump diff --git a/code/__DEFINES/qdel.dm b/code/__DEFINES/qdel.dm index fe19d7a5596..041a6283e7c 100644 --- a/code/__DEFINES/qdel.dm +++ b/code/__DEFINES/qdel.dm @@ -14,5 +14,6 @@ #define GC_QUEUED_FOR_HARD_DEL -2 #define GC_CURRENTLY_BEING_QDELETED -3 -#define QDELETED(X) (!X || X.gc_destroyed) +#define QDELING(X) (X.gc_destroyed) +#define QDELETED(X) (!X || QDELING(X)) #define QDESTROYING(X) (!X || X.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 4596c79ef1e..6143022993e 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -20,6 +20,23 @@ #define FLIGHTSUIT_PROCESSING_NONE 0 #define FLIGHTSUIT_PROCESSING_FULL 1 +#define INITIALIZATION_INSSATOMS 0 //New should not call Initialize +#define INITIALIZATION_INNEW_MAPLOAD 1 //New should call Initialize(TRUE) +#define INITIALIZATION_INNEW_REGULAR 2 //New should call Initialize(FALSE) + +#define INITIALIZE_HINT_NORMAL 0 //Nothing happens +#define INITIALIZE_HINT_LATELOAD 1 //Call LateInitialize +#define INITIALIZE_HINT_QDEL 2 //Call qdel on the atom + +//type and all subtypes should always call Initialize in New() +#define INITIALIZE_IMMEDIATE(X) ##X/New(loc, ...){\ + ..();\ + if(!initialized) {\ + args[1] = TRUE;\ + SSatoms.InitAtom(src, args);\ + }\ +} + // Subsystem init_order, from highest priority to lowest priority // The numbers just define the ordering, they are meaningless otherwise. diff --git a/code/__HELPERS/files.dm b/code/__HELPERS/files.dm index f457278eb0f..5983f26950d 100644 --- a/code/__HELPERS/files.dm +++ b/code/__HELPERS/files.dm @@ -1,17 +1,3 @@ -//checks if a file exists and contains text -//returns text as a string if these conditions are met -/proc/return_file_text(filename) - if(fexists(filename) == 0) - throw EXCEPTION("return_file_text(): File not found") - return - - var/text = file2text(filename) - if(!text) - throw EXCEPTION("return_file_text(): File empty") - return - - return text - //Sends resource files to client cache /client/proc/getFiles() for(var/file in args) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 6ebb70746f3..abfaec29a73 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -513,7 +513,7 @@ winset(C, "mainwindow", "flash=5") /proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank) - if(SSticker.current_state != GAME_STATE_PLAYING || !character) + if(!SSticker.IsRoundInProgress() || !character) return var/area/A = get_area(character) var/message = "\ diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index d890788c91d..de46e18fde2 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -1,7 +1,7 @@ //generic (by snowflake) tile smoothing code; smooth your icons with this! /* - Each tile is divided in 4 corners, each corner has an image associated to it; the tile is then overlayed by these 4 images + Each tile is divided in 4 corners, each corner has an appearance associated to it; the tile is then overlayed by these 4 appearances To use this, just set your atom's 'smooth' var to 1. If your atom can be moved/unanchored, set its 'can_be_unanchored' var to 1. If you don't want your atom's icon to smooth with anything but atoms of the same type, set the list 'canSmoothWith' to null; Otherwise, put all types you want the atom icon to smooth with in 'canSmoothWith' INCLUDING THE TYPE OF THE ATOM ITSELF. @@ -44,7 +44,6 @@ #define DEFAULT_UNDERLAY_ICON 'icons/turf/floors.dmi' #define DEFAULT_UNDERLAY_ICON_STATE "plating" -#define DEFAULT_UNDERLAY_IMAGE image(DEFAULT_UNDERLAY_ICON, DEFAULT_UNDERLAY_ICON_STATE) /atom/var/smooth = SMOOTH_FALSE /atom/var/top_left_corner @@ -157,14 +156,16 @@ /turf/closed/wall/diagonal_smooth(adjacencies) adjacencies = reverse_ndir(..()) if(adjacencies) - var/list/U = list() + var/mutable_appearance/underlay_appearance = mutable_appearance(layer = TURF_LAYER) + var/list/U = list(underlay_appearance) if(fixed_underlay) if(fixed_underlay["space"]) - var/image/I = image('icons/turf/space.dmi', SPACE_ICON_STATE, layer=TURF_LAYER) - I.plane = PLANE_SPACE - U += I + underlay_appearance.icon = 'icons/turf/space.dmi' + underlay_appearance.icon_state = SPACE_ICON_STATE + underlay_appearance.plane = PLANE_SPACE else - U += image(fixed_underlay["icon"], fixed_underlay["icon_state"], layer=TURF_LAYER) + underlay_appearance.icon = fixed_underlay["icon"] + underlay_appearance.icon_state = fixed_underlay["icon_state"] else var/turf/T = get_step(src, turn(adjacencies, 180)) if(T && (T.density || T.smooth)) @@ -173,15 +174,18 @@ T = get_step(src, turn(adjacencies, 225)) if(isspaceturf(T) && !istype(T, /turf/open/space/transit)) - var/image/I = image('icons/turf/space.dmi', SPACE_ICON_STATE, layer=TURF_LAYER) - I.plane = PLANE_SPACE - U += I + underlay_appearance.icon = 'icons/turf/space.dmi' + underlay_appearance.icon_state = SPACE_ICON_STATE + underlay_appearance.plane = PLANE_SPACE else if(T && !T.density && !T.smooth) - U += T + underlay_appearance.icon = T.icon + underlay_appearance.icon_state = T.icon_state else if(baseturf && !initial(baseturf.density) && !initial(baseturf.smooth)) - U += image(initial(baseturf.icon), initial(baseturf.icon_state), layer=TURF_LAYER) + underlay_appearance.icon = initial(baseturf.icon) + underlay_appearance.icon_state = initial(baseturf.icon_state) else - U += DEFAULT_UNDERLAY_IMAGE + underlay_appearance.icon = DEFAULT_UNDERLAY_ICON + underlay_appearance.icon_state = DEFAULT_UNDERLAY_ICON_STATE underlays = U diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 20e48a4f7cb..a0ce89e2b68 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -991,7 +991,7 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) SET_SECONDARY_FLAG(src, FROZEN) //Assumes already frozed -obj/proc/make_unfrozen() +/obj/proc/make_unfrozen() icon = initial(icon) name = replacetext(name, "frozen ", "") CLEAR_SECONDARY_FLAG(src, FROZEN) diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 92636ee9dc1..2444f84a6bc 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -72,9 +72,8 @@ return . //Splits the text of a file at seperator and returns them in a list. -/proc/file2list(filename, seperator="\n") - return splittext(return_file_text(filename),seperator) - +/world/proc/file2list(filename, seperator="\n") + return splittext(file2text(filename),seperator) //Turns a direction into text /proc/dir2text(direction) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 142a5cfb786..06bfc61ccb7 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -582,7 +582,7 @@ Turf and target are seperate in case you want to teleport some distance from a t return 0 //Repopulates sortedAreas list -/proc/SortAreas() +/proc/repopulate_sorted_areas() GLOB.sortedAreas = list() for(var/area/A in world) @@ -1138,13 +1138,13 @@ B --><-- A if(location == src) return 1 -/proc/flick_overlay_static(image/I, atom/A, duration) +/proc/flick_overlay_static(O, atom/A, duration) set waitfor = 0 - if(!A || !I) + if(!A || !O) return - A.add_overlay(I) + A.add_overlay(O) sleep(duration) - A.cut_overlay(I) + A.cut_overlay(O) /proc/get_areas_in_z(zlevel) . = list() diff --git a/code/_globalvars/lists/names.dm b/code/_globalvars/lists/names.dm index 7b34552e35d..0853a10aeb7 100644 --- a/code/_globalvars/lists/names.dm +++ b/code/_globalvars/lists/names.dm @@ -1,23 +1,23 @@ -GLOBAL_LIST_INIT(ai_names, file2list("config/names/ai.txt")) -GLOBAL_LIST_INIT(wizard_first, file2list("config/names/wizardfirst.txt")) -GLOBAL_LIST_INIT(wizard_second, file2list("config/names/wizardsecond.txt")) -GLOBAL_LIST_INIT(ninja_titles, file2list("config/names/ninjatitle.txt")) -GLOBAL_LIST_INIT(ninja_names, file2list("config/names/ninjaname.txt")) -GLOBAL_LIST_INIT(commando_names, file2list("config/names/death_commando.txt")) -GLOBAL_LIST_INIT(first_names_male, file2list("config/names/first_male.txt")) -GLOBAL_LIST_INIT(first_names_female, file2list("config/names/first_female.txt")) -GLOBAL_LIST_INIT(last_names, file2list("config/names/last.txt")) -GLOBAL_LIST_INIT(lizard_names_male, file2list("config/names/lizard_male.txt")) -GLOBAL_LIST_INIT(lizard_names_female, file2list("config/names/lizard_female.txt")) -GLOBAL_LIST_INIT(clown_names, file2list("config/names/clown.txt")) -GLOBAL_LIST_INIT(mime_names, file2list("config/names/mime.txt")) -GLOBAL_LIST_INIT(carp_names, file2list("config/names/carp.txt")) -GLOBAL_LIST_INIT(golem_names, file2list("config/names/golem.txt")) -GLOBAL_LIST_INIT(plasmaman_names, file2list("config/names/plasmaman.txt")) +GLOBAL_LIST_INIT(ai_names, world.file2list("config/names/ai.txt")) +GLOBAL_LIST_INIT(wizard_first, world.file2list("config/names/wizardfirst.txt")) +GLOBAL_LIST_INIT(wizard_second, world.file2list("config/names/wizardsecond.txt")) +GLOBAL_LIST_INIT(ninja_titles, world.file2list("config/names/ninjatitle.txt")) +GLOBAL_LIST_INIT(ninja_names, world.file2list("config/names/ninjaname.txt")) +GLOBAL_LIST_INIT(commando_names, world.file2list("config/names/death_commando.txt")) +GLOBAL_LIST_INIT(first_names_male, world.file2list("config/names/first_male.txt")) +GLOBAL_LIST_INIT(first_names_female, world.file2list("config/names/first_female.txt")) +GLOBAL_LIST_INIT(last_names, world.file2list("config/names/last.txt")) +GLOBAL_LIST_INIT(lizard_names_male, world.file2list("config/names/lizard_male.txt")) +GLOBAL_LIST_INIT(lizard_names_female, world.file2list("config/names/lizard_female.txt")) +GLOBAL_LIST_INIT(clown_names, world.file2list("config/names/clown.txt")) +GLOBAL_LIST_INIT(mime_names, world.file2list("config/names/mime.txt")) +GLOBAL_LIST_INIT(carp_names, world.file2list("config/names/carp.txt")) +GLOBAL_LIST_INIT(golem_names, world.file2list("config/names/golem.txt")) +GLOBAL_LIST_INIT(plasmaman_names, world.file2list("config/names/plasmaman.txt")) GLOBAL_LIST_INIT(posibrain_names, list("PBU","HIU","SINA","ARMA","OSI","HBL","MSO","RR","CHRI","CDB","HG","XSI","ORNG","GUN","KOR","MET","FRE","XIS","SLI","PKP","HOG","RZH","GOOF","MRPR","JJR","FIRC","INC","PHL","BGB","ANTR","MIW","WJ","JRD","CHOC","ANCL","JLLO","JNLG","KOS","TKRG","XAL","STLP","CBOS","DUNC","FXMC","DRSD","COI")) -GLOBAL_LIST_INIT(verbs, file2list("config/names/verbs.txt")) -GLOBAL_LIST_INIT(adjectives, file2list("config/names/adjectives.txt")) +GLOBAL_LIST_INIT(verbs, world.file2list("config/names/verbs.txt")) +GLOBAL_LIST_INIT(adjectives, world.file2list("config/names/adjectives.txt")) //loaded on startup because of " //would include in rsc if ' was used diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 407137dfcfd..96a07bad24c 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -57,8 +57,7 @@ /obj/screen/movable/action_button/hide_toggle/proc/UpdateIcon() cut_overlays() - var/image/img = image(hide_icon, src, hidden ? show_state : hide_state) - add_overlay(img) + add_overlay(mutable_appearance(hide_icon, hidden ? show_state : hide_state)) /obj/screen/movable/action_button/MouseEntered(location,control,params) diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm index df0894403c2..4bf86f414bc 100644 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax.dm @@ -261,9 +261,9 @@ for(var/y in -count to count) if(x == 0 && y == 0) continue - var/image/I = image(icon, null, icon_state) - I.transform = matrix(1, 0, x*480, 0, 1, y*480) - new_overlays += I + var/mutable_appearance/texture_overlay = mutable_appearance(icon, icon_state) + texture_overlay.transform = matrix(1, 0, x*480, 0, 1, y*480) + new_overlays += texture_overlay cut_overlays() add_overlay(new_overlays) view_sized = view diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 0c2871a26b0..af210a274c0 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -134,21 +134,16 @@ icon_state = icon_empty /obj/screen/inventory/hand - var/image/active_overlay - var/image/handcuff_overlay - var/image/blocked_overlay + var/mutable_appearance/handcuff_overlay + var/static/mutable_appearance/blocked_overlay = mutable_appearance('icons/mob/screen_gen.dmi', "blocked") var/held_index = 0 /obj/screen/inventory/hand/update_icon() ..() - if(!active_overlay) - active_overlay = image("icon"=icon, "icon_state"="hand_active") if(!handcuff_overlay) var/state = (!(held_index % 2)) ? "markus" : "gabrielle" - handcuff_overlay = image("icon"='icons/mob/screen_gen.dmi', "icon_state"=state) - if(!blocked_overlay) - blocked_overlay = image("icon"='icons/mob/screen_gen.dmi', "icon_state"="blocked") + handcuff_overlay = mutable_appearance('icons/mob/screen_gen.dmi', state) cut_overlays() @@ -163,7 +158,7 @@ add_overlay(blocked_overlay) if(held_index == hud.mymob.active_hand_index) - add_overlay(active_overlay) + add_overlay("hand_active") /obj/screen/inventory/hand/Click(location, control, params) @@ -445,7 +440,7 @@ /obj/screen/zone_sel/update_icon(mob/user) cut_overlays() - add_overlay(image('icons/mob/screen_gen.dmi', "[selecting]")) + add_overlay(mutable_appearance('icons/mob/screen_gen.dmi', "[selecting]")) user.zone_selected = selecting /obj/screen/zone_sel/alien @@ -453,7 +448,7 @@ /obj/screen/zone_sel/alien/update_icon(mob/user) cut_overlays() - add_overlay(image('icons/mob/screen_alien.dmi', "[selecting]")) + add_overlay(mutable_appearance('icons/mob/screen_alien.dmi', "[selecting]")) user.zone_selected = selecting /obj/screen/zone_sel/robot @@ -549,7 +544,7 @@ plane = SPLASHSCREEN_PLANE var/client/holder -/obj/screen/splash/New(client/C, visible, use_previous_title) +/obj/screen/splash/New(client/C, visible, use_previous_title) //TODO: Make this use INITIALIZE_IMMEDIATE holder = C if(!visible) diff --git a/code/controllers/admin.dm b/code/controllers/admin.dm index 99f6a148a48..3565620c88a 100644 --- a/code/controllers/admin.dm +++ b/code/controllers/admin.dm @@ -3,7 +3,9 @@ name = "Initializing..." var/target -/obj/effect/statclick/New(loc, text, target) //Don't port this to Initialize it's too critical +INITIALIZE_IMMEDIATE(/obj/effect/statclick) + +/obj/effect/statclick/Initialize(mapload, text, target) //Don't port this to Initialize it's too critical ..() name = text src.target = target @@ -43,9 +45,9 @@ switch(controller) if("Master") Recreate_MC() - feedback_add_details("admin_verb","Restart Master Controller") + SSblackbox.add_details("admin_verb","Restart Master Controller") if("Failsafe") new /datum/controller/failsafe() - feedback_add_details("admin_verb","Restart Failsafe Controller") + SSblackbox.add_details("admin_verb","Restart Failsafe Controller") message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.") diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 35f12e4dc51..f0f39e68255 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -293,7 +293,7 @@ GLOB.abandon_allowed = respawn /datum/configuration/proc/load(filename, type = "config") //the type can also be game_options, in which case it uses a different switch. not making it separate to not copypaste code - Urist - var/list/Lines = file2list(filename) + var/list/Lines = world.file2list(filename) for(var/t in Lines) if(!t) @@ -785,7 +785,7 @@ /datum/configuration/proc/loadmaplist(filename) - var/list/Lines = file2list(filename) + var/list/Lines = world.file2list(filename) var/datum/map_config/currentmap = null for(var/t in Lines) @@ -835,7 +835,7 @@ /datum/configuration/proc/loadsql(filename) - var/list/Lines = file2list(filename) + var/list/Lines = world.file2list(filename) for(var/t in Lines) if(!t) continue diff --git a/code/controllers/globals.dm b/code/controllers/globals.dm index b25d51bc9be..e0f114778c7 100644 --- a/code/controllers/globals.dm +++ b/code/controllers/globals.dm @@ -16,13 +16,14 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) gvars_datum_in_built_vars = exclude_these.vars + list("gvars_datum_protected_varlist", "gvars_datum_in_built_vars", "gvars_datum_init_order") qdel(exclude_these) + log_world("[vars.len - gvars_datum_in_built_vars.len] global variables") + Initialize() /datum/controller/global_vars/Destroy(force) + stack_trace("Some fucker qdel'd the global holder!") if(!force) return QDEL_HINT_LETMELIVE - - stack_trace("Some fucker deleted the global holder!") QDEL_NULL(statclick) gvars_datum_protected_varlist.Cut() @@ -36,10 +37,7 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) if(!statclick) statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) - var/static/num_globals - if(!num_globals) - num_globals = vars.len - gvars_datum_in_built_vars.len - stat("Globals:", statclick.update("Count: [num_globals]")) + stat("Globals:", statclick.update("Edit")) /datum/controller/global_vars/can_vv_get(var_name) if(var_name in gvars_datum_protected_varlist) diff --git a/code/controllers/master.dm b/code/controllers/master.dm index ab4ff43b047..01d0ac34470 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -48,7 +48,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING) var/initializations_finished_with_no_players_logged_in //I wonder what this could be? // Has round started? (So we know what subsystems to run) - var/round_started = 0 + var/local_round_started = FALSE //Don't read this var, use SSticker.HasRoundStarted() instead // The type of the last subsystem to be process()'d. var/last_type_processed @@ -189,7 +189,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING) // Notify the MC that the round has started. /datum/controller/master/proc/RoundStart() - round_started = 1 + local_round_started = TRUE var/timer = world.time for (var/datum/controller/subsystem/SS in subsystems) if (SS.flags & SS_FIRE_IN_LOBBY || SS.flags & SS_TICKER) @@ -222,7 +222,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING) // local vars rock // Schedule the first run of the Subsystems. - round_started = world.has_round_started() + local_round_started = world.has_round_started() //all this shit is here so that flag edits can be refreshed by restarting the MC. (and for speed) var/list/tickersubsystems = list() var/list/normalsubsystems = list() @@ -245,7 +245,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING) lobbysubsystems += SS timer += world.tick_lag * rand(1, 5) SS.next_fire = timer - else if (round_started) + else if (local_round_started) timer += world.tick_lag * rand(1, 5) SS.next_fire = timer normalsubsystems += SS @@ -296,7 +296,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING) if (!Failsafe || (Failsafe.processing_interval > 0 && (Failsafe.lasttick+(Failsafe.processing_interval*5)) < world.time)) new/datum/controller/failsafe() // (re)Start the failsafe. if (!queue_head || !(iteration % 3)) - if (round_started) + if (local_round_started) subsystems_to_check = normalsubsystems else subsystems_to_check = lobbysubsystems diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index 4ca35e434d2..98e3ba2330c 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -1,6 +1,7 @@ -#define INITIALIZATION_INSSATOMS 0 //New should not call Initialize -#define INITIALIZATION_INNEW_MAPLOAD 1 //New should call Initialize(TRUE) -#define INITIALIZATION_INNEW_REGULAR 2 //New should call Initialize(FALSE) +#define BAD_INIT_QDEL_BEFORE 1 +#define BAD_INIT_DIDNT_INIT 2 +#define BAD_INIT_SLEPT 4 +#define BAD_INIT_NO_HINT 8 SUBSYSTEM_DEF(atoms) name = "Atoms" @@ -11,6 +12,9 @@ SUBSYSTEM_DEF(atoms) var/old_initialized var/list/late_loaders + var/list/created_atoms + + var/list/BadInitializeCalls = list() /datum/controller/subsystem/atoms/Initialize(timeofday) GLOB.fire_overlay.appearance_flags = RESET_COLOR @@ -19,64 +23,82 @@ SUBSYSTEM_DEF(atoms) InitializeAtoms() return ..() -/datum/controller/subsystem/atoms/proc/InitializeAtoms(list/atoms = null) +/datum/controller/subsystem/atoms/proc/InitializeAtoms(list/atoms) if(initialized == INITIALIZATION_INSSATOMS) return initialized = INITIALIZATION_INNEW_MAPLOAD - var/static/list/NewQdelList = list() - + LAZYINITLIST(late_loaders) + + var/count + var/list/mapload_arg = list(TRUE) if(atoms) + created_atoms = list() + count = atoms.len for(var/I in atoms) var/atom/A = I - if(!A.initialized) //this check is to make sure we don't call it twice on an object that was created in a previous Initialize call - if(QDELETED(A)) - if(!(NewQdelList[A.type])) - WARNING("Found new qdeletion in type [A.type]!") - NewQdelList[A.type] = TRUE - continue - var/start_tick = world.time - if(A.Initialize(TRUE)) - LAZYADD(late_loaders, A) - if(start_tick != world.time) - WARNING("[A]: [A.type] slept during it's Initialize!") + if(!A.initialized) + if(InitAtom(I, mapload_arg)) + atoms -= I CHECK_TICK - testing("Initialized [atoms.len] atoms") else - #ifdef TESTING - var/count = 0 - #endif + count = 0 for(var/atom/A in world) - if(!A.initialized) //this check is to make sure we don't call it twice on an object that was created in a previous Initialize call - if(QDELETED(A)) - if(!(NewQdelList[A.type])) - WARNING("Found new qdeletion in type [A.type]!") - NewQdelList[A.type] = TRUE - continue - var/start_tick = world.time - if(A.Initialize(TRUE)) - LAZYADD(late_loaders, A) - #ifdef TESTING - else - ++count - #endif TESTING - if(start_tick != world.time) - WARNING("[A]: [A.type] slept during it's Initialize!") + if(!A.initialized) + InitAtom(A, mapload_arg) + ++count CHECK_TICK - testing("Roundstart initialized [count] atoms") + + log_world("Initialized [count] atoms") initialized = INITIALIZATION_INNEW_REGULAR - for(var/I in late_loaders) - var/atom/A = I - var/start_tick = world.time - A.Initialize(FALSE) - if(start_tick != world.time) - WARNING("[A]: [A.type] slept during it's Initialize!") - CHECK_TICK - testing("Late-initialized [LAZYLEN(late_loaders)] atoms") - LAZYCLEARLIST(late_loaders) + if(late_loaders.len) + for(var/I in late_loaders) + var/atom/A = I + A.LateInitialize() + testing("Late initialized [late_loaders.len] atoms") + late_loaders.Cut() + + if(atoms) + . = created_atoms + atoms + created_atoms = null + +/datum/controller/subsystem/atoms/proc/InitAtom(atom/A, list/arguments) + var/the_type = A.type + if(QDELING(A)) + BadInitializeCalls[the_type] |= BAD_INIT_QDEL_BEFORE + return TRUE + + var/start_tick = world.time + + var/result = A.Initialize(arglist(arguments)) + + if(start_tick != world.time) + BadInitializeCalls[the_type] |= BAD_INIT_SLEPT + + var/qdeleted = FALSE + + if(result != INITIALIZE_HINT_NORMAL) + switch(result) + if(INITIALIZE_HINT_LATELOAD) + if(arguments[1]) //mapload + late_loaders += A + else + A.LateInitialize() + if(INITIALIZE_HINT_QDEL) + qdel(A) + qdeleted = TRUE + else + BadInitializeCalls[the_type] |= BAD_INIT_NO_HINT + + if(!A) //possible harddel + qdeleted = TRUE + else if(!A.initialized) + BadInitializeCalls[the_type] |= BAD_INIT_DIDNT_INIT + + return qdeleted || QDELETED(A) /datum/controller/subsystem/atoms/proc/map_loader_begin() old_initialized = initialized @@ -90,6 +112,7 @@ SUBSYSTEM_DEF(atoms) if(initialized == INITIALIZATION_INNEW_MAPLOAD) InitializeAtoms() old_initialized = SSatoms.old_initialized + BadInitializeCalls = SSatoms.BadInitializeCalls /datum/controller/subsystem/atoms/proc/setupGenetics() var/list/avnums = new /list(DNA_STRUC_ENZYMES_BLOCKS) @@ -109,3 +132,27 @@ SUBSYSTEM_DEF(atoms) else if(B.quality == MINOR_NEGATIVE) GLOB.not_good_mutations |= B CHECK_TICK + +/datum/controller/subsystem/atoms/proc/InitLog() + . = "" + for(var/path in BadInitializeCalls) + . += "Path : [path] \n" + var/fails = BadInitializeCalls[path] + if(fails & BAD_INIT_DIDNT_INIT) + . += "- Didn't call atom/Initialize()\n" + if(fails & BAD_INIT_NO_HINT) + . += "- Didn't return an Initialize hint\n" + if(fails & BAD_INIT_QDEL_BEFORE) + . += "- Qdel'd in New()\n" + if(fails & BAD_INIT_SLEPT) + . += "- Slept during Initialize()\n" + +/datum/controller/subsystem/atoms/Shutdown() + var/initlog = InitLog() + if(initlog) + log_world(initlog) + +#undef BAD_INIT_QDEL_BEFORE +#undef BAD_INIT_DIDNT_INIT +#undef BAD_INIT_SLEPT +#undef BAD_INIT_NO_HINT \ No newline at end of file diff --git a/code/orphaned_procs/statistics.dm b/code/controllers/subsystem/blackbox.dm similarity index 57% rename from code/orphaned_procs/statistics.dm rename to code/controllers/subsystem/blackbox.dm index d6cdcda6c1c..bac949b0465 100644 --- a/code/orphaned_procs/statistics.dm +++ b/code/controllers/subsystem/blackbox.dm @@ -1,253 +1,257 @@ -GLOBAL_DATUM_INIT(blackbox, /datum/feedback, new) - -//the feedback datum; stores all feedback -/datum/feedback - var/list/messages = list() - var/list/messages_admin = list() - - var/list/msg_common = list() - var/list/msg_science = list() - var/list/msg_command = list() - var/list/msg_medical = list() - var/list/msg_engineering = list() - var/list/msg_security = list() - var/list/msg_deathsquad = list() - var/list/msg_syndicate = list() - var/list/msg_service = list() - var/list/msg_cargo = list() - - var/list/datum/feedback_variable/feedback = new() - -/datum/feedback/proc/find_feedback_datum(variable) - for (var/datum/feedback_variable/FV in feedback) - if (FV.get_variable() == variable) - return FV - var/datum/feedback_variable/FV = new(variable) - feedback += FV - return FV - -/datum/feedback/proc/get_round_feedback() - return feedback - -/datum/feedback/proc/round_end_data_gathering() - var/pda_msg_amt = 0 - var/rc_msg_amt = 0 - - for (var/obj/machinery/message_server/MS in GLOB.message_servers) - if (MS.pda_msgs.len > pda_msg_amt) - pda_msg_amt = MS.pda_msgs.len - if (MS.rc_msgs.len > rc_msg_amt) - rc_msg_amt = MS.rc_msgs.len - - feedback_set_details("radio_usage","") - - feedback_add_details("radio_usage","COM-[msg_common.len]") - feedback_add_details("radio_usage","SCI-[msg_science.len]") - feedback_add_details("radio_usage","HEA-[msg_command.len]") - feedback_add_details("radio_usage","MED-[msg_medical.len]") - feedback_add_details("radio_usage","ENG-[msg_engineering.len]") - feedback_add_details("radio_usage","SEC-[msg_security.len]") - feedback_add_details("radio_usage","DTH-[msg_deathsquad.len]") - feedback_add_details("radio_usage","SYN-[msg_syndicate.len]") - feedback_add_details("radio_usage","SRV-[msg_service.len]") - feedback_add_details("radio_usage","CAR-[msg_cargo.len]") - feedback_add_details("radio_usage","OTH-[messages.len]") - feedback_add_details("radio_usage","PDA-[pda_msg_amt]") - feedback_add_details("radio_usage","RC-[rc_msg_amt]") - - feedback_set_details("round_end","[time2text(world.realtime)]") //This one MUST be the last one that gets set. - -//This proc is only to be called at round end. -/datum/feedback/proc/save_all_data_to_sql() - if (!feedback) return - - round_end_data_gathering() //round_end time logging and some other data processing - if (!SSdbcore.Connect()) return - var/round_id - - var/datum/DBQuery/query_feedback_max_id = SSdbcore.NewQuery("SELECT MAX(round_id) AS round_id FROM [format_table_name("feedback")]") - if(!query_feedback_max_id.Execute()) - return - while (query_feedback_max_id.NextRow()) - round_id = query_feedback_max_id.item[1] - - if (!isnum(round_id)) - round_id = text2num(round_id) - round_id++ - - var/sqlrowlist = "" - - for (var/datum/feedback_variable/FV in feedback) - if (sqlrowlist != "") - sqlrowlist += ", " //a comma (,) at the start of the first row to insert will trigger a SQL error - - sqlrowlist += "(null, Now(), [round_id], \"[sanitizeSQL(FV.get_variable())]\", [FV.get_value()], \"[sanitizeSQL(FV.get_details())]\")" - - if (sqlrowlist == "") - return - - var/datum/DBQuery/query_feedback_save = SSdbcore.NewQuery("INSERT DELAYED IGNORE INTO [format_table_name("feedback")] VALUES " + sqlrowlist) - query_feedback_save.Execute() - - -/proc/feedback_set(variable,value) - if(!GLOB.blackbox) - return - - var/datum/feedback_variable/FV = GLOB.blackbox.find_feedback_datum(variable) - - if(!FV) - return - - FV.set_value(value) - -/proc/feedback_inc(variable,value) - if(!GLOB.blackbox) - return - - var/datum/feedback_variable/FV = GLOB.blackbox.find_feedback_datum(variable) - - if(!FV) - return - - FV.inc(value) - -/proc/feedback_dec(variable,value) - if(!GLOB.blackbox) - return - - var/datum/feedback_variable/FV = GLOB.blackbox.find_feedback_datum(variable) - - if(!FV) - return - - FV.dec(value) - -/proc/feedback_set_details(variable,details) - if(!GLOB.blackbox) - return - - var/datum/feedback_variable/FV = GLOB.blackbox.find_feedback_datum(variable) - - if(!FV) - return - - FV.set_details(details) - -/proc/feedback_add_details(variable,details) - if(!GLOB.blackbox) - return - - var/datum/feedback_variable/FV = GLOB.blackbox.find_feedback_datum(variable) - - if(!FV) - return - - FV.add_details(details) - -//feedback variable datum, for storing all kinds of data -/datum/feedback_variable - var/variable - var/value - var/details - -/datum/feedback_variable/New(var/param_variable,var/param_value = 0) - variable = param_variable - value = param_value - -/datum/feedback_variable/proc/inc(num = 1) - if (isnum(value)) - value += num - else - value = text2num(value) - if (isnum(value)) - value += num - else - value = num - -/datum/feedback_variable/proc/dec(num = 1) - if (isnum(value)) - value -= num - else - value = text2num(value) - if (isnum(value)) - value -= num - else - value = -num - -/datum/feedback_variable/proc/set_value(num) - if (isnum(num)) - value = num - -/datum/feedback_variable/proc/get_value() - if (!isnum(value)) - return 0 - return value - -/datum/feedback_variable/proc/get_variable() - return variable - -/datum/feedback_variable/proc/set_details(text) - if (istext(text)) - details = text - -/datum/feedback_variable/proc/add_details(text) - if (istext(text)) - text = replacetext(text, " ", "_") - if (!details) - details = text - else - details += " [text]" - -/datum/feedback_variable/proc/get_details() - return details - -/datum/feedback_variable/proc/get_parsed() - return list(variable,value,details) - -//sql reporting procs -/proc/sql_poll_population() - if(!config.sql_enabled) - return - if(!SSdbcore.Connect()) - return - var/playercount = 0 - for(var/mob/M in GLOB.player_list) - if(M.client) - playercount += 1 - var/admincount = GLOB.admins.len - var/datum/DBQuery/query_record_playercount = SSdbcore.NewQuery("INSERT INTO [format_table_name("legacy_population")] (playercount, admincount, time, server_ip, server_port) VALUES ([playercount], [admincount], '[SQLtime()]', INET_ATON('[world.internet_address]'), '[world.port]')") - query_record_playercount.Execute() - -/proc/sql_report_death(mob/living/L) - if(!config.sql_enabled) - return - if(!SSdbcore.Connect()) - return - if(!L || !L.key || !L.mind) - return - var/turf/T = get_turf(L) - var/area/placeofdeath = get_area(T.loc) - var/sqlname = sanitizeSQL(L.real_name) - var/sqlkey = sanitizeSQL(L.ckey) - var/sqljob = sanitizeSQL(L.mind.assigned_role) - var/sqlspecial = sanitizeSQL(L.mind.special_role) - var/sqlpod = sanitizeSQL(placeofdeath.name) - var/laname - var/lakey - if(L.lastattacker && ismob(L.lastattacker)) - var/mob/LA = L.lastattacker - laname = sanitizeSQL(LA.real_name) - lakey = sanitizeSQL(LA.key) - var/sqlgender = sanitizeSQL(L.gender) - var/sqlbrute = sanitizeSQL(L.getBruteLoss()) - var/sqlfire = sanitizeSQL(L.getFireLoss()) - var/sqlbrain = sanitizeSQL(L.getBrainLoss()) - var/sqloxy = sanitizeSQL(L.getOxyLoss()) - var/sqltox = sanitizeSQL(L.getStaminaLoss()) - var/sqlclone = sanitizeSQL(L.getStaminaLoss()) - var/sqlstamina = sanitizeSQL(L.getStaminaLoss()) - var/coord = sanitizeSQL("[L.x], [L.y], [L.z]") - var/map = sanitizeSQL(SSmapping.config.map_name) - var/datum/DBQuery/query_report_death = SSdbcore.NewQuery("INSERT INTO [format_table_name("death")] (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss, toxloss, cloneloss, staminaloss, coord, mapname, server_ip, server_port) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[SQLtime()]', '[laname]', '[lakey]', '[sqlgender]', [sqlbrute], [sqlfire], [sqlbrain], [sqloxy], [sqltox], [sqlclone], [sqlstamina], '[coord]', '[map]', INET_ATON('[world.internet_address]'), '[world.port]')") - query_report_death.Execute() +SUBSYSTEM_DEF(blackbox) + name = "Blackbox" + wait = 6000 + flags = SS_NO_TICK_CHECK + + var/list/msg_common = list() + var/list/msg_science = list() + var/list/msg_command = list() + var/list/msg_medical = list() + var/list/msg_engineering = list() + var/list/msg_security = list() + var/list/msg_deathsquad = list() + var/list/msg_syndicate = list() + var/list/msg_service = list() + var/list/msg_cargo = list() + var/list/msg_other = list() + + var/list/feedback = list() //list of datum/feedback_variable + +//poll population +/datum/controller/subsystem/blackbox/fire() + if(!SSdbcore.Connect()) + return + var/playercount = 0 + for(var/mob/M in GLOB.player_list) + if(M.client) + playercount += 1 + var/admincount = GLOB.admins.len + var/datum/DBQuery/query_record_playercount = SSdbcore.NewQuery("INSERT INTO [format_table_name("legacy_population")] (playercount, admincount, time, server_ip, server_port) VALUES ([playercount], [admincount], '[SQLtime()]', INET_ATON('[world.internet_address]'), '[world.port]')") + query_record_playercount.Execute() + +/datum/controller/subsystem/blackbox/Recover() + msg_common = SSblackbox.msg_common + msg_science = SSblackbox.msg_science + msg_command = SSblackbox.msg_command + msg_medical = SSblackbox.msg_medical + msg_engineering = SSblackbox.msg_engineering + msg_security = SSblackbox.msg_security + msg_deathsquad = SSblackbox.msg_deathsquad + msg_syndicate = SSblackbox.msg_syndicate + msg_service = SSblackbox.msg_service + msg_cargo = SSblackbox.msg_cargo + msg_other = SSblackbox.msg_other + + feedback = SSblackbox.feedback + +//no touchie +/datum/controller/subsystem/blackbox/can_vv_get(var_name) + if(var_name == "feedback") + return FALSE + return ..() + +/datum/controller/subsystem/blackbox/vv_edit_var(var_name, var_value) + return FALSE + +/datum/controller/subsystem/blackbox/Shutdown() + var/pda_msg_amt = 0 + var/rc_msg_amt = 0 + + for (var/obj/machinery/message_server/MS in GLOB.message_servers) + if (MS.pda_msgs.len > pda_msg_amt) + pda_msg_amt = MS.pda_msgs.len + if (MS.rc_msgs.len > rc_msg_amt) + rc_msg_amt = MS.rc_msgs.len + + set_details("radio_usage","") + + add_details("radio_usage","COM-[msg_common.len]") + add_details("radio_usage","SCI-[msg_science.len]") + add_details("radio_usage","HEA-[msg_command.len]") + add_details("radio_usage","MED-[msg_medical.len]") + add_details("radio_usage","ENG-[msg_engineering.len]") + add_details("radio_usage","SEC-[msg_security.len]") + add_details("radio_usage","DTH-[msg_deathsquad.len]") + add_details("radio_usage","SYN-[msg_syndicate.len]") + add_details("radio_usage","SRV-[msg_service.len]") + add_details("radio_usage","CAR-[msg_cargo.len]") + add_details("radio_usage","OTH-[msg_other.len]") + add_details("radio_usage","PDA-[pda_msg_amt]") + add_details("radio_usage","RC-[rc_msg_amt]") + + set_details("round_end","[time2text(world.realtime)]") //This one MUST be the last one that gets set. + + if (!SSdbcore.Connect()) + return + + var/round_id + + var/datum/DBQuery/query_feedback_max_id = SSdbcore.NewQuery("SELECT MAX(round_id) AS round_id FROM [format_table_name("feedback")]") + if(!query_feedback_max_id.Execute()) + return + while (query_feedback_max_id.NextRow()) + round_id = query_feedback_max_id.item[1] + + if (!isnum(round_id)) + round_id = text2num(round_id) + round_id++ + + var/sqlrowlist = "" + + for (var/datum/feedback_variable/FV in feedback) + if (sqlrowlist != "") + sqlrowlist += ", " //a comma (,) at the start of the first row to insert will trigger a SQL error + + sqlrowlist += "(null, Now(), [round_id], \"[sanitizeSQL(FV.get_variable())]\", [FV.get_value()], \"[sanitizeSQL(FV.get_details())]\")" + + if (sqlrowlist == "") + return + + var/datum/DBQuery/query_feedback_save = SSdbcore.NewQuery("INSERT DELAYED IGNORE INTO [format_table_name("feedback")] VALUES " + sqlrowlist) + query_feedback_save.Execute() + +/datum/controller/subsystem/blackbox/proc/LogBroadcast(blackbox_msg, freq) + switch(freq) + if(1459) + msg_common += blackbox_msg + if(1351) + msg_science += blackbox_msg + if(1353) + msg_command += blackbox_msg + if(1355) + msg_medical += blackbox_msg + if(1357) + msg_engineering += blackbox_msg + if(1359) + msg_security += blackbox_msg + if(1441) + msg_deathsquad += blackbox_msg + if(1213) + msg_syndicate += blackbox_msg + if(1349) + msg_service += blackbox_msg + if(1347) + msg_cargo += blackbox_msg + else + msg_other += blackbox_msg + +/datum/controller/subsystem/blackbox/proc/find_feedback_datum(variable) + for(var/datum/feedback_variable/FV in feedback) + if(FV.get_variable() == variable) + return FV + + var/datum/feedback_variable/FV = new(variable) + feedback += FV + return FV + +/datum/controller/subsystem/blackbox/proc/set_val(variable, value) + var/datum/feedback_variable/FV = find_feedback_datum(variable) + FV.set_value(value) + +/datum/controller/subsystem/blackbox/proc/inc(variable, value) + var/datum/feedback_variable/FV = find_feedback_datum(variable) + FV.inc(value) + +/datum/controller/subsystem/blackbox/proc/dec(variable,value) + var/datum/feedback_variable/FV = find_feedback_datum(variable) + FV.dec(value) + +/datum/controller/subsystem/blackbox/proc/set_details(variable,details) + var/datum/feedback_variable/FV = find_feedback_datum(variable) + FV.set_details(details) + +/datum/controller/subsystem/blackbox/proc/add_details(variable,details) + var/datum/feedback_variable/FV = find_feedback_datum(variable) + FV.add_details(details) + +/datum/controller/subsystem/blackbox/proc/ReportDeath(mob/living/L) + if(!SSdbcore.Connect()) + return + if(!L || !L.key || !L.mind) + return + var/turf/T = get_turf(L) + var/area/placeofdeath = get_area(T.loc) + var/sqlname = sanitizeSQL(L.real_name) + var/sqlkey = sanitizeSQL(L.ckey) + var/sqljob = sanitizeSQL(L.mind.assigned_role) + var/sqlspecial = sanitizeSQL(L.mind.special_role) + var/sqlpod = sanitizeSQL(placeofdeath.name) + var/laname + var/lakey + if(L.lastattacker && ismob(L.lastattacker)) + var/mob/LA = L.lastattacker + laname = sanitizeSQL(LA.real_name) + lakey = sanitizeSQL(LA.key) + var/sqlgender = sanitizeSQL(L.gender) + var/sqlbrute = sanitizeSQL(L.getBruteLoss()) + var/sqlfire = sanitizeSQL(L.getFireLoss()) + var/sqlbrain = sanitizeSQL(L.getBrainLoss()) + var/sqloxy = sanitizeSQL(L.getOxyLoss()) + var/sqltox = sanitizeSQL(L.getStaminaLoss()) + var/sqlclone = sanitizeSQL(L.getStaminaLoss()) + var/sqlstamina = sanitizeSQL(L.getStaminaLoss()) + var/coord = sanitizeSQL("[L.x], [L.y], [L.z]") + var/map = sanitizeSQL(SSmapping.config.map_name) + var/datum/DBQuery/query_report_death = SSdbcore.NewQuery("INSERT INTO [format_table_name("death")] (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss, toxloss, cloneloss, staminaloss, coord, mapname, server_ip, server_port) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[SQLtime()]', '[laname]', '[lakey]', '[sqlgender]', [sqlbrute], [sqlfire], [sqlbrain], [sqloxy], [sqltox], [sqlclone], [sqlstamina], '[coord]', '[map]', INET_ATON('[world.internet_address]'), '[world.port]')") + query_report_death.Execute() + + +//feedback variable datum, for storing all kinds of data +/datum/feedback_variable + var/variable + var/value + var/details + +/datum/feedback_variable/New(param_variable, param_value = 0) + variable = param_variable + value = param_value + +/datum/feedback_variable/proc/inc(num = 1) + if (isnum(value)) + value += num + else + value = text2num(value) + if (isnum(value)) + value += num + else + value = num + +/datum/feedback_variable/proc/dec(num = 1) + if (isnum(value)) + value -= num + else + value = text2num(value) + if (isnum(value)) + value -= num + else + value = -num + +/datum/feedback_variable/proc/set_value(num) + if (isnum(num)) + value = num + +/datum/feedback_variable/proc/get_value() + if (!isnum(value)) + return 0 + return value + +/datum/feedback_variable/proc/get_variable() + return variable + +/datum/feedback_variable/proc/set_details(text) + if (istext(text)) + details = text + +/datum/feedback_variable/proc/add_details(text) + if (istext(text)) + text = replacetext(text, " ", "_") + if (!details) + details = text + else + details += " [text]" + +/datum/feedback_variable/proc/get_details() + return details + +/datum/feedback_variable/proc/get_parsed() + return list(variable,value,details) diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 083127c9c35..7d3682cf5f7 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -66,6 +66,9 @@ SUBSYSTEM_DEF(garbage) HandleToBeQueued() if(state == SS_RUNNING) HandleQueue() + + if (state == SS_PAUSED) //make us wait again before the next run. + state = SS_RUNNING //If you see this proc high on the profile, what you are really seeing is the garbage collection/soft delete overhead in byond. //Don't attempt to optimize, not worth the effort. @@ -110,24 +113,9 @@ SUBSYSTEM_DEF(garbage) var/type = A.type testing("GC: -- \ref[A] | [type] was unable to be GC'd and was deleted --") didntgc["[type]"]++ - var/time = world.timeofday - var/tick = world.tick_usage - var/ticktime = world.time + HardDelete(A) - tick = (world.tick_usage-tick+((world.time-ticktime)/world.tick_lag*100)) - if (tick > highest_del_tickusage) - highest_del_tickusage = tick - time = world.timeofday - time - if (!time && TICK_DELTA_TO_MS(tick) > 1) - time = TICK_DELTA_TO_MS(tick)/100 - if (time > highest_del_time) - highest_del_time = time - if (time > 10) - log_game("Error: [type]([refID]) took longer then 1 second to delete (took [time/10] seconds to delete)") - message_admins("Error: [type]([refID]) took longer then 1 second to delete (took [time/10] seconds to delete).") - postpone(time/5) - break ++delslasttick ++totaldels else @@ -157,8 +145,28 @@ SUBSYSTEM_DEF(garbage) //this is purely to seperate things profile wise. /datum/controller/subsystem/garbage/proc/HardDelete(datum/A) + var/time = world.timeofday + var/tick = world.tick_usage + var/ticktime = world.time + + var/type = A.type + var/refID = "\ref[A]" + del(A) - + + tick = (world.tick_usage-tick+((world.time-ticktime)/world.tick_lag*100)) + if (tick > highest_del_tickusage) + highest_del_tickusage = tick + time = world.timeofday - time + if (!time && TICK_DELTA_TO_MS(tick) > 1) + time = TICK_DELTA_TO_MS(tick)/100 + if (time > highest_del_time) + highest_del_time = time + if (time > 10) + log_game("Error: [type]([refID]) took longer then 1 second to delete (took [time/10] seconds to delete)") + message_admins("Error: [type]([refID]) took longer then 1 second to delete (took [time/10] seconds to delete).") + postpone(time/5) + /datum/controller/subsystem/garbage/proc/HardQueue(datum/A) if (istype(A) && A.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) tobequeued += A @@ -211,7 +219,7 @@ SUBSYSTEM_DEF(garbage) if (QDEL_HINT_HARDDEL) //qdel should assume this object won't gc, and queue a hard delete using a hard reference to save time from the locate() SSgarbage.HardQueue(D) if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste. - del(D) + SSgarbage.HardDelete(D) if (QDEL_HINT_FINDREFERENCE)//qdel will, if TESTING is enabled, display all references to this object, then queue the object for deletion. SSgarbage.QueueForQueuing(D) #ifdef TESTING diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 68e27c9900d..a3255b73e40 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -448,7 +448,7 @@ SUBSYSTEM_DEF(job) /datum/controller/subsystem/job/proc/LoadJobs() - var/jobstext = return_file_text("config/jobs.txt") + var/jobstext = file2text("config/jobs.txt") for(var/datum/job/J in occupations) var/regex/jobs = new("[J.title]=(-1|\\d+),(-1|\\d+)") jobs.Find(jobstext) @@ -483,7 +483,7 @@ SUBSYSTEM_DEF(job) else level4++ //not selected tmp_str += "HIGH=[level1]|MEDIUM=[level2]|LOW=[level3]|NEVER=[level4]|BANNED=[level5]|YOUNG=[level6]|-" - feedback_add_details("job_preferences",tmp_str) + SSblackbox.add_details("job_preferences",tmp_str) /datum/controller/subsystem/job/proc/PopcapReached() if(config.hard_popcap || config.extreme_popcap) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 1499bc5029f..85c580f4d9b 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -18,6 +18,8 @@ SUBSYSTEM_DEF(mapping) var/list/shuttle_templates = list() var/list/shelter_templates = list() + var/loading_ruins = FALSE + /datum/controller/subsystem/mapping/PreInit() if(!config) #ifdef FORCE_MAP @@ -32,13 +34,13 @@ SUBSYSTEM_DEF(mapping) if(config.defaulted) to_chat(world, "Unable to load next map config, defaulting to Box Station") loadWorld() - SortAreas() + repopulate_sorted_areas() process_teleport_locs() //Sets up the wizard teleport locations preloadTemplates() // Pick a random away mission. createRandomZlevel() // Generate mining. - + loading_ruins = TRUE var/mining_type = config.minetype if (mining_type == "lavaland") seedRuins(list(5), global.config.lavaland_budget, /area/lavaland/surface/outdoors, lava_ruins_templates) @@ -54,7 +56,8 @@ SUBSYSTEM_DEF(mapping) space_zlevels += i seedRuins(space_zlevels, global.config.space_budget, /area/space, space_ruins_templates) - + loading_ruins = FALSE + repopulate_sorted_areas() // Set up Z-level transistions. setup_map_transitions() ..() @@ -116,7 +119,7 @@ SUBSYSTEM_DEF(mapping) INIT_ANNOUNCE("Loading [config.map_name]...") TryLoadZ(config.GetFullMapPath(), FailedZs, ZLEVEL_STATION) INIT_ANNOUNCE("Loaded station in [(REALTIMEOFDAY - start_time)/10]s!") - feedback_add_details("map_name", config.map_name) + SSblackbox.add_details("map_name", config.map_name) if(config.minetype != "lavaland") INIT_ANNOUNCE("WARNING: A map without lavaland set as it's minetype was loaded! This is being ignored! Update the maploader code!") @@ -144,31 +147,35 @@ SUBSYSTEM_DEF(mapping) mapvotes[global.config.defaultmap.map_name] += 1 continue mapvotes[vote] += 1 + else + for(var/M in global.config.maplist) + mapvotes[M] = 1 - //filter votes - for (var/map in mapvotes) - if (!map) - mapvotes.Remove(map) - if (!(map in global.config.maplist)) - mapvotes.Remove(map) - continue - var/datum/map_config/VM = global.config.maplist[map] - if (!VM) - mapvotes.Remove(map) - continue - if (VM.voteweight <= 0) - mapvotes.Remove(map) - continue - if (VM.config_min_users > 0 && players < VM.config_min_users) - mapvotes.Remove(map) - continue - if (VM.config_max_users > 0 && players > VM.config_max_users) - mapvotes.Remove(map) - continue + //filter votes + for (var/map in mapvotes) + if (!map) + mapvotes.Remove(map) + if (!(map in global.config.maplist)) + mapvotes.Remove(map) + continue + var/datum/map_config/VM = global.config.maplist[map] + if (!VM) + mapvotes.Remove(map) + continue + if (VM.voteweight <= 0) + mapvotes.Remove(map) + continue + if (VM.config_min_users > 0 && players < VM.config_min_users) + mapvotes.Remove(map) + continue + if (VM.config_max_users > 0 && players > VM.config_max_users) + mapvotes.Remove(map) + continue + if(global.config.allow_map_voting) mapvotes[map] = mapvotes[map]*VM.voteweight - var/pickedmap = global.config.allow_map_voting ? pickweight(mapvotes) : pick(global.config.maplist) + var/pickedmap = pickweight(mapvotes) if (!pickedmap) return var/datum/map_config/VM = global.config.maplist[pickedmap] diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm index abdeb0e9d35..77838e6509f 100644 --- a/code/controllers/subsystem/npcpool.dm +++ b/code/controllers/subsystem/npcpool.dm @@ -19,7 +19,7 @@ SUBSYSTEM_DEF(npcpool) /datum/controller/subsystem/npcpool/stat_entry() ..("NPCS:[processing.len]|D:[needsDelegate.len]|A:[needsAssistant.len]|U:[canBeUsed.len]") -/datum/controller/subsystem/npcpool/proc/stop_processing(mob/living/carbon/human/interactive/I) +/datum/controller/subsystem/npcpool/proc/stop_processing(mob/living/I) processing -= I currentrun -= I needsDelegate -= I diff --git a/code/controllers/subsystem/ping.dm b/code/controllers/subsystem/ping.dm deleted file mode 100644 index 0829766174d..00000000000 --- a/code/controllers/subsystem/ping.dm +++ /dev/null @@ -1,28 +0,0 @@ -#define PING_BUFFER_TIME 25 - -SUBSYSTEM_DEF(ping) - name = "Ping" - wait = 6 - flags = SS_NO_INIT|SS_POST_FIRE_TIMING|SS_FIRE_IN_LOBBY - priority = 10 - var/list/currentrun - -/datum/controller/subsystem/ping/fire(resumed = FALSE) - if (!resumed) - src.currentrun = GLOB.clients.Copy() - - var/list/currentrun = src.currentrun - while (length(currentrun)) - var/client/C = currentrun[currentrun.len] - currentrun.len-- - if (!C || world.time - C.connection_time < PING_BUFFER_TIME || C.inactivity >= (wait-1)) - if (MC_TICK_CHECK) - return - continue - winset(C, null, "command=.update_ping+[world.time+world.tick_lag*world.tick_usage/100]") - if (MC_TICK_CHECK) //one day, when ss13 has 1000 people per server, you guys are gonna be glad I added this tick check - return - - currentrun = null - -#undef PING_BUFFER_TIME diff --git a/code/controllers/subsystem/processing/overlays.dm b/code/controllers/subsystem/processing/overlays.dm index 1a42944bb5f..1aa76e6b3de 100644 --- a/code/controllers/subsystem/processing/overlays.dm +++ b/code/controllers/subsystem/processing/overlays.dm @@ -55,7 +55,7 @@ PROCESSING_SUBSYSTEM_DEF(overlays) /proc/iconstate2appearance(icon, iconstate) var/static/image/stringbro = new() - var/list/icon_states_cache = SSoverlays.overlay_icon_state_caches + var/list/icon_states_cache = SSoverlays.overlay_icon_state_caches var/list/cached_icon = icon_states_cache[icon] if (cached_icon) var/cached_appearance = cached_icon["[iconstate]"] @@ -91,7 +91,7 @@ PROCESSING_SUBSYSTEM_DEF(overlays) new_overlays[i] = iconstate2appearance(icon, cached_overlay) else if(isicon(cached_overlay)) new_overlays[i] = icon2appearance(cached_overlay) - else //image probable + else //image/mutable_appearance probable appearance_bro.appearance = cached_overlay if(!ispath(cached_overlay)) appearance_bro.dir = cached_overlay.dir @@ -99,11 +99,11 @@ PROCESSING_SUBSYSTEM_DEF(overlays) return new_overlays #define NOT_QUEUED_ALREADY (!(flags & OVERLAY_QUEUED)) -#define QUEUE_FOR_COMPILE flags |= OVERLAY_QUEUED; SSoverlays.processing += src; +#define QUEUE_FOR_COMPILE flags |= OVERLAY_QUEUED; SSoverlays.processing += src; /atom/proc/cut_overlays(priority = FALSE) var/list/cached_overlays = our_overlays var/list/cached_priority = priority_overlays - + var/need_compile = FALSE if(LAZYLEN(cached_overlays)) //don't queue empty lists, don't cut priority overlays @@ -165,7 +165,7 @@ PROCESSING_SUBSYSTEM_DEF(overlays) if(cut_old) cut_overlays() return - + var/list/cached_other = other.our_overlays if(cached_other) if(cut_old || !LAZYLEN(our_overlays)) diff --git a/code/controllers/subsystem/server_maint.dm b/code/controllers/subsystem/server_maint.dm index 3ef088b328d..c248ca0a98e 100644 --- a/code/controllers/subsystem/server_maint.dm +++ b/code/controllers/subsystem/server_maint.dm @@ -1,17 +1,28 @@ +#define PING_BUFFER_TIME 25 + SUBSYSTEM_DEF(server_maint) name = "Server Tasks" - wait = 6000 - flags = SS_NO_TICK_CHECK + wait = 6 + flags = SS_POST_FIRE_TIMING|SS_FIRE_IN_LOBBY + priority = 10 + var/list/currentrun /datum/controller/subsystem/server_maint/Initialize(timeofday) if (config.hub) world.visibility = 1 ..() -/datum/controller/subsystem/server_maint/fire() - //handle kicking inactive players - if(config.kick_inactive) - for(var/client/C in GLOB.clients) +/datum/controller/subsystem/server_maint/fire(resumed = FALSE) + if(!resumed) + src.currentrun = GLOB.clients.Copy() + + var/list/currentrun = src.currentrun + var/round_started = SSticker.HasRoundStarted() + + for(var/I in currentrun) + var/client/C = I + //handle kicking inactive players + if(round_started && config.kick_inactive) if(C.is_afk(config.afk_period)) var/cmob = C.mob if(!(istype(cmob, /mob/dead/observer) || (istype(cmob, /mob/dead) && C.holder))) @@ -19,5 +30,10 @@ SUBSYSTEM_DEF(server_maint) to_chat(C, "You have been inactive for more than [config.afk_period / 600] minutes and have been disconnected.") qdel(C) - if(config.sql_enabled) - sql_poll_population() + if (!(!C || world.time - C.connection_time < PING_BUFFER_TIME || C.inactivity >= (wait-1))) + winset(C, null, "command=.update_ping+[world.time+world.tick_lag*world.tick_usage/100]") + + if (MC_TICK_CHECK) //one day, when ss13 has 1000 people per server, you guys are gonna be glad I added this tick check + return + +#undef PING_BUFFER_TIME diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index bc8c14a74d1..dcddd37fbfe 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -208,12 +208,10 @@ SUBSYSTEM_DEF(shuttle) var/emergency_reason = "\nNature of emergency:\n\n[call_reason]" var/security_num = seclevel2num(get_security_level()) switch(security_num) - if(SEC_LEVEL_GREEN) - emergency.request(null, 2, signal_origin, html_decode(emergency_reason), 0) - if(SEC_LEVEL_BLUE) - emergency.request(null, 1, signal_origin, html_decode(emergency_reason), 0) + if(SEC_LEVEL_RED,SEC_LEVEL_DELTA) + emergency.request(null, signal_origin, html_decode(emergency_reason), 1) //There is a serious threat we gotta move no time to give them five minutes. else - emergency.request(null, 0.5, signal_origin, html_decode(emergency_reason), 1) // There is a serious threat we gotta move no time to give them five minutes. + emergency.request(null, signal_origin, html_decode(emergency_reason), 0) log_game("[key_name(user)] has called the shuttle.") message_admins("[key_name_admin(user)] has called the shuttle.") @@ -272,7 +270,7 @@ SUBSYSTEM_DEF(shuttle) if(callShuttle) if(EMERGENCY_IDLE_OR_RECALLED) - emergency.request(null, 2.5) + emergency.request(null, set_coefficient = 2.5) log_game("There is no means of calling the shuttle anymore. Shuttle automatically called.") message_admins("All the communications consoles were destroyed and all AIs are inactive. Shuttle called.") diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 0e75f5e681f..868d7d27e89 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -60,7 +60,7 @@ SUBSYSTEM_DEF(ticker) var/list/round_start_events /datum/controller/subsystem/ticker/Initialize(timeofday) - var/list/music = file2list(ROUND_START_MUSIC_LIST, "\n") + var/list/music = world.file2list(ROUND_START_MUSIC_LIST, "\n") login_music = pick(music) if(!GLOB.syndicate_code_phrase) @@ -238,7 +238,7 @@ SUBSYSTEM_DEF(ticker) send2irc("Server", "Round of [hide_mode ? "secret":"[mode.name]"] has started[allmins.len ? ".":" with no active admins online!"]") /datum/controller/subsystem/ticker/proc/OnRoundstart(datum/callback/cb) - if(current_state < GAME_STATE_PLAYING) + if(!HasRoundStarted()) LAZYADD(round_start_events, cb) else cb.InvokeAsync() @@ -604,8 +604,8 @@ SUBSYSTEM_DEF(ticker) if(selected_tip) m = selected_tip else - var/list/randomtips = file2list("config/tips.txt") - var/list/memetips = file2list("config/sillytips.txt") + var/list/randomtips = world.file2list("config/tips.txt") + var/list/memetips = world.file2list("config/sillytips.txt") if(randomtips.len && prob(95)) m = pick(randomtips) else if(memetips.len) @@ -651,11 +651,11 @@ SUBSYSTEM_DEF(ticker) return INVOKE_ASYNC(SSmapping, /datum/controller/subsystem/mapping/.proc/maprotate) +/datum/controller/subsystem/ticker/proc/HasRoundStarted() + return current_state >= GAME_STATE_PLAYING -/world/proc/has_round_started() - if (SSticker && SSticker.current_state >= GAME_STATE_PLAYING) - return TRUE - return FALSE +/datum/controller/subsystem/ticker/proc/IsRoundInProgress() + return current_state == GAME_STATE_PLAYING /datum/controller/subsystem/ticker/Recover() current_state = SSticker.current_state diff --git a/code/datums/action.dm b/code/datums/action.dm index bd18d646e2d..08239492f33 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -110,12 +110,8 @@ /datum/action/proc/ApplyIcon(obj/screen/movable/action_button/current_button) if(icon_icon && button_icon_state && current_button.button_icon_state != button_icon_state) - var/image/img - img = image(icon_icon, current_button, button_icon_state) - img.pixel_x = 0 - img.pixel_y = 0 current_button.cut_overlays(TRUE) - current_button.add_overlay(img) + current_button.add_overlay(mutable_appearance(icon_icon, button_icon_state)) current_button.button_icon_state = button_icon_state diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm index 576d1080bb7..30b839cef0e 100644 --- a/code/datums/ai_laws.dm +++ b/code/datums/ai_laws.dm @@ -190,7 +190,7 @@ /datum/ai_laws/custom/New() //This reads silicon_laws.txt and allows server hosts to set custom AI starting laws. ..() - for(var/line in file2list("config/silicon_laws.txt")) + for(var/line in world.file2list("config/silicon_laws.txt")) if(!line) continue if(findtextEx(line,"#",1,2)) diff --git a/code/datums/antagonists/datum_clockcult.dm b/code/datums/antagonists/datum_clockcult.dm index 89be685f761..0c39b5a9899 100644 --- a/code/datums/antagonists/datum_clockcult.dm +++ b/code/datums/antagonists/datum_clockcult.dm @@ -83,7 +83,7 @@ var/mob/living/silicon/ai/A = S A.can_be_carded = FALSE A.requires_power = POWER_REQ_CLOCKCULT - var/list/AI_frame = list(image('icons/mob/clockwork_mobs.dmi', A, "aiframe")) //make the AI's cool frame + var/list/AI_frame = list(mutable_appearance('icons/mob/clockwork_mobs.dmi', "aiframe")) //make the AI's cool frame for(var/d in GLOB.cardinal) AI_frame += image('icons/mob/clockwork_mobs.dmi', A, "eye[rand(1, 10)]", dir = d) //the eyes are randomly fast or slow A.add_overlay(AI_frame) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index d49b1e227a0..3ba7efb4c98 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -27,6 +27,7 @@ . += "---" .["Call Proc"] = "?_src_=vars;proc_call=\ref[src]" .["Mark Object"] = "?_src_=vars;mark_object=\ref[src]" + .["Delete"] = "?_src_=vars;delete=\ref[src]" /datum/proc/on_reagent_change() @@ -445,7 +446,7 @@ var/list/L = value var/list/items = list() - if (L.len > 0 && !(name == "underlays" || name == "overlays" || L.len > 500)) + if (L.len > 0 && !(name == "underlays" || name == "overlays" || L.len > (IS_NORMAL_LIST(L) ? 50 : 150))) for (var/i in 1 to L.len) var/key = L[i] var/val @@ -525,6 +526,16 @@ if(T) callproc_datum(T) + else if(href_list["delete"]) + if(!check_rights(R_DEBUG, 0)) + return + + var/datum/D = locate(href_list["delete"]) + if(!D) + to_chat(usr, "Unable to locate item!") + admin_delete(D) + href_list["datumrefresh"] = href_list["delete"] + else if(href_list["regenerateicons"]) if(!check_rights(0)) return diff --git a/code/datums/dog_fashion.dm b/code/datums/dog_fashion.dm index 75c8379524d..c798f352189 100644 --- a/code/datums/dog_fashion.dm +++ b/code/datums/dog_fashion.dm @@ -31,9 +31,9 @@ if(speak_emote) D.speak_emote = speak_emote -/datum/dog_fashion/proc/get_image(var/dir) +/datum/dog_fashion/proc/get_overlay(var/dir) if(icon_file && obj_icon_state) - var/image/corgI = image(icon_file, icon_state = obj_icon_state, dir = dir) + var/image/corgI = image(icon_file, obj_icon_state, dir = dir) corgI.alpha = obj_alpha corgI.color = obj_color return corgI diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index f285effc0fb..96796c54356 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -6,9 +6,9 @@ var/date /datum/getrev/New() - var/head_file = return_file_text(".git/logs/HEAD") + var/head_file = file2text(".git/logs/HEAD") if(SERVERTOOLS && fexists("..\\prtestjob.lk")) - var/list/tmp = file2list("..\\prtestjob.lk") + var/list/tmp = world.file2list("..\\prtestjob.lk") for(var/I in tmp) if(I) testmerge |= I @@ -25,7 +25,7 @@ for(var/line in testmerge) if(line) log_world("Test merge active of PR #[line]") - feedback_add_details("testmerged_prs","[line]") + SSblackbox.add_details("testmerged_prs","[line]") log_world("Based off master commit [parentcommit]") else log_world(parentcommit) @@ -89,7 +89,7 @@ to_chat(src, "Enforce Continuous Rounds: [config.continuous.len] of [config.modes.len] roundtypes") to_chat(src, "Allow Midround Antagonists: [config.midround_antag.len] of [config.modes.len] roundtypes") if(config.show_game_type_odds) - if(SSticker.current_state == GAME_STATE_PLAYING) + if(SSticker.IsRoundInProgress()) var/prob_sum = 0 var/current_odds_differ = FALSE var/list/probs = list() @@ -105,13 +105,13 @@ probs[ctag] = 1 prob_sum += config.probabilities[ctag] if(current_odds_differ) - src <<"Game Mode Odds for current round:" + to_chat(src, "Game Mode Odds for current round:") for(var/ctag in probs) if(config.probabilities[ctag] > 0) var/percentage = round(config.probabilities[ctag] / prob_sum * 100, 0.1) to_chat(src, "[ctag] [percentage]%") - src <<"All Game Mode Odds:" + to_chat(src, "All Game Mode Odds:") var/sum = 0 for(var/ctag in config.probabilities) sum += config.probabilities[ctag] diff --git a/code/datums/hud.dm b/code/datums/hud.dm index d1cbb90c27a..f9444898ceb 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -80,7 +80,7 @@ GLOBAL_LIST_INIT(huds, list( gang_huds += G.ganghud for(var/datum/atom_hud/hud in (GLOB.huds|gang_huds|GLOB.active_alternate_appearances)) - if(hud.hudusers[src]) + if(hud && hud.hudusers[src]) hud.add_hud_to(src) /mob/dead/new_player/reload_huds() diff --git a/code/datums/martial.dm b/code/datums/martial.dm index cc6fa4f2c87..b20bf556d52 100644 --- a/code/datums/martial.dm +++ b/code/datums/martial.dm @@ -657,7 +657,7 @@ /obj/item/weapon/cqc_manual/attack_self(mob/living/carbon/human/user) if(!istype(user) || !user) return - user <<"You remember the basics of CQC." + to_chat(user, "You remember the basics of CQC.") var/datum/martial_art/cqc/D = new(null) D.teach(user) user.drop_item() diff --git a/code/datums/mind.dm b/code/datums/mind.dm index b4844b32bf4..8d2b7cf0c5f 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1143,7 +1143,7 @@ log_admin("[key_name_admin(usr)] has made [current] unable to ascend as a devil.") return if(!ishuman(current) && !iscyborg(current)) - usr << "This only works on humans and cyborgs!" + to_chat(usr, "This only works on humans and cyborgs!") return SSticker.mode.devils += src special_role = "devil" @@ -1192,14 +1192,17 @@ log_admin("[key_name(usr)] turned [current] into abductor.") SSticker.mode.update_abductor_icons_added(src) if("equip") + if(!ishuman(current)) + to_chat(usr, "This only works on humans!") + return + + var/mob/living/carbon/human/H = current var/gear = alert("Agent or Scientist Gear","Gear","Agent","Scientist") if(gear) - var/datum/game_mode/abduction/temp = new - temp.equip_common(current) if(gear=="Agent") - temp.equip_agent(current) + H.equipOutfit(/datum/outfit/abductor/agent) else - temp.equip_scientist(current) + H.equipOutfit(/datum/outfit/abductor/scientist) else if (href_list["monkey"]) var/mob/living/L = current @@ -1468,11 +1471,8 @@ H.set_species(/datum/species/abductor) var/datum/species/abductor/S = H.dna.species - switch(role) - if("Agent") - S.agent = 1 - if("Scientist") - S.scientist = 1 + if(role == "Scientist") + S.scientist = TRUE S.team = team var/list/obj/effect/landmark/abductor/agent_landmarks = new @@ -1489,13 +1489,10 @@ if(teleport=="Yes") switch(role) if("Agent") - S.agent = 1 L = agent_landmarks[team] - H.loc = L.loc if("Scientist") - S.scientist = 1 - L = agent_landmarks[team] - H.loc = L.loc + L = scientist_landmarks[team] + H.forceMove(L.loc) /datum/mind/proc/AddSpell(obj/effect/proc_holder/spell/S) spell_list += S diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm new file mode 100644 index 00000000000..1cb3a97d9f7 --- /dev/null +++ b/code/datums/mutable_appearance.dm @@ -0,0 +1,18 @@ +// Mutable appearances are an inbuilt byond datastructure. Read the documentation on them by hitting F1 in DM. +// Basically use them instead of images for overlays/underlays and when changing an object's appearance if you're doing so with any regularity. +// Unless you need the overlay/underlay to have a different direction than the base object. Then you have to use an image due to a bug. + +// Mutable appearances are children of images, just so you know. + +/mutable_appearance/New() + ..() + plane = FLOAT_PLANE // No clue why this is 0 by default yet images are on FLOAT_PLANE + // And yes this does have to be in the constructor, BYOND ignores it if you set it as a normal var + +// Helper similar to image() +/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER) + var/mutable_appearance/MA = new() + MA.icon = icon + MA.icon_state = icon_state + MA.layer = layer + return MA \ No newline at end of file diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm index 55f2b03161c..caab422e8b1 100644 --- a/code/datums/mutations.dm +++ b/code/datums/mutations.dm @@ -15,7 +15,7 @@ GLOBAL_LIST_EMPTY(mutations_list) var/lowest_value = 256 * 8 var/text_gain_indication = "" var/text_lose_indication = "" - var/list/visual_indicators = list() + var/list/mutable_appearance/visual_indicators = list() var/layer_used = MUTATIONS_LAYER //which mutation layer to use var/list/species_allowed = list() //to restrict mutation to only certain species var/health_req //minimum health required to acquire the mutation @@ -161,7 +161,7 @@ GLOBAL_LIST_EMPTY(mutations_list) /datum/mutation/human/telekinesis/New() ..() - visual_indicators |= image("icon"='icons/effects/genetics.dmi', "icon_state"="telekinesishead", "layer"=-MUTATIONS_LAYER) + visual_indicators |= mutable_appearance('icons/effects/genetics.dmi', "telekinesishead", -MUTATIONS_LAYER) /datum/mutation/human/telekinesis/get_visual_indicator(mob/living/carbon/human/owner) return visual_indicators[1] @@ -180,7 +180,7 @@ GLOBAL_LIST_EMPTY(mutations_list) /datum/mutation/human/cold_resistance/New() ..() - visual_indicators |= image("icon"='icons/effects/genetics.dmi', "icon_state"="fire", "layer"=-MUTATIONS_LAYER) + visual_indicators |= mutable_appearance('icons/effects/genetics.dmi', "fire", -MUTATIONS_LAYER) /datum/mutation/human/cold_resistance/get_visual_indicator(mob/living/carbon/human/owner) return visual_indicators[1] @@ -618,7 +618,7 @@ GLOBAL_LIST_EMPTY(mutations_list) /datum/mutation/human/laser_eyes/New() ..() - visual_indicators |= image("icon"='icons/effects/genetics.dmi', "icon_state"="lasereyes", "layer"=-FRONT_MUTATIONS_LAYER) + visual_indicators |= mutable_appearance('icons/effects/genetics.dmi', "lasereyes", -FRONT_MUTATIONS_LAYER) /datum/mutation/human/laser_eyes/get_visual_indicator(mob/living/carbon/human/owner) return visual_indicators[1] @@ -640,11 +640,11 @@ GLOBAL_LIST_EMPTY(mutations_list) var/list/mut_overlay = list() if(overlays_standing[CM.layer_used]) mut_overlay = overlays_standing[CM.layer_used] - var/image/V = CM.get_visual_indicator(src) + var/mutable_appearance/V = CM.get_visual_indicator(src) if(!mut_overlay.Find(V)) //either we lack the visual indicator or we have the wrong one remove_overlay(CM.layer_used) - for(var/image/I in CM.visual_indicators) - mut_overlay.Remove(I) + for(var/mutable_appearance/MA in CM.visual_indicators) + mut_overlay.Remove(MA) mut_overlay |= V overlays_standing[CM.layer_used] = mut_overlay apply_overlay(CM.layer_used) diff --git a/code/game/alternate_appearance.dm b/code/game/alternate_appearance.dm index ac23d61e7fa..2768c793db8 100644 --- a/code/game/alternate_appearance.dm +++ b/code/game/alternate_appearance.dm @@ -29,12 +29,11 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) appearance_key = key /datum/atom_hud/alternate_appearance/Destroy() - if(!QDELETED(src)) - for(var/v in hudusers) - remove_hud_from(v) - for(var/v in hudatoms) - remove_from_hud(v) - GLOB.active_alternate_appearances -= src + for(var/v in hudusers) + remove_hud_from(v) + for(var/v in hudatoms) + remove_from_hud(v) + GLOB.active_alternate_appearances -= src return ..() /datum/atom_hud/alternate_appearance/proc/onNewMob(mob/M) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index f3e2de241ff..137229db37f 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -42,6 +42,7 @@ var/has_gravity = 0 var/noteleport = 0 //Are you forbidden from teleporting to the area? (centcomm, mobs, wizard, hand teleporter) + var/hidden = FALSE //Hides area from player Teleport function. var/safe = 0 //Is the area teleport-safe: no space / radiation / aggresive mobs / other dangers var/no_air = null diff --git a/code/game/area/areas/holodeck.dm b/code/game/area/areas/holodeck.dm index 21999a74a15..c4b4e02f7ba 100644 --- a/code/game/area/areas/holodeck.dm +++ b/code/game/area/areas/holodeck.dm @@ -3,6 +3,7 @@ icon_state = "Holodeck" dynamic_lighting = DYNAMIC_LIGHTING_DISABLED flags = 0 + hidden = TRUE var/obj/machinery/computer/holodeck/linked var/restricted = 0 // if true, program goes on emag list diff --git a/code/game/area/areas/ruins.dm b/code/game/area/areas/ruins.dm index d697c8436f7..828d165dd86 100644 --- a/code/game/area/areas/ruins.dm +++ b/code/game/area/areas/ruins.dm @@ -4,6 +4,7 @@ name = "\improper Unexplored Location" icon_state = "away" has_gravity = 1 + hidden = TRUE /area/ruin/unpowered diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 88be3237510..54abfd439ea 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -39,20 +39,21 @@ var/do_initialize = SSatoms.initialized if(do_initialize > INITIALIZATION_INSSATOMS) - if(QDELETED(src)) - CRASH("Found new qdeletion in type [type]!") - var/mapload = do_initialize == INITIALIZATION_INNEW_MAPLOAD - args[1] = mapload - if(Initialize(arglist(args)) && mapload) - LAZYADD(SSatoms.late_loaders, src) + args[1] = do_initialize == INITIALIZATION_INNEW_MAPLOAD + if(SSatoms.InitAtom(src, args)) + //we were deleted + return + + var/list/created = SSatoms.created_atoms + if(created) + created += src //Called after New if the map is being loaded. mapload = TRUE //Called from base of New if the map is being loaded. mapload = FALSE -//This base must be called or derivatives must set initialized to TRUE to prevent repeat calls -//Derivatives must not sleep -//Returning TRUE while mapload is TRUE will cause the object to be initialized again with mapload = FALSE when everything else is done -//(Useful for things that requires turfs to have air). This base may only be called once, however +//This base must be called or derivatives must set initialized to TRUE +//must not sleep //Other parameters are passed from New (excluding loc), this does not happen if mapload is TRUE +//Must return an Initialize hint. Defined in __DEFINES/subsystems.dm //Note: the following functions don't call the base for optimization and must copypasta: // /turf/Initialize @@ -75,7 +76,16 @@ if (opacity && isturf(loc)) var/turf/T = loc T.has_opaque_atom = TRUE // No need to recalculate it in this case, it's guaranteed to be on afterwards anyways. + return INITIALIZE_HINT_NORMAL +//called if Initialize returns INITIALIZE_HINT_LATELOAD +//This version shouldn't be called +/atom/proc/LateInitialize() + var/static/list/warned_types = list() + if(!warned_types[type]) + WARNING("Old style LateInitialize behaviour detected in [type]!") + warned_types[type] = TRUE + Initialize(FALSE) /atom/Destroy() if(alternate_appearances) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index f96d6eb8a23..d694d2477ca 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -46,7 +46,7 @@ return ..() /atom/movable/Initialize(mapload) - ..() + . = ..() for(var/L in initial_languages) grant_language(L) @@ -562,7 +562,7 @@ return else var/turf/currentturf = get_turf(src) - get(src, /mob) << "You can't help but feel that you just lost something back there..." + to_chat(get(src, /mob), "You can't help but feel that you just lost something back there...") var/turf/targetturf = relocate() log_game("[src] has been moved out of bounds in [COORD(currentturf)]. Moving it to [COORD(targetturf)].") if(HAS_SECONDARY_FLAG(src, INFORM_ADMINS_ON_RELOCATE)) @@ -628,4 +628,4 @@ /atom/movable/proc/ConveyorMove(movedir) set waitfor = FALSE if(!anchored && has_gravity()) - step(src, movedir) + step(src, movedir) diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index de830c856ba..2e5854509aa 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -24,7 +24,7 @@ if(!istype(H)) return 0 var/obj/item/clothing/under/U = H.w_uniform if(!istype(U)) return 0 - if(U.sensor_mode <= 2) return 0 + if(U.sensor_mode <= SENSOR_VITALS) return 0 return 1 /datum/atom_hud/data/human/medical/basic/add_to_single_hud(mob/M, mob/living/carbon/H) diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm index 4d1e06d997d..ab94f94afd2 100644 --- a/code/game/gamemodes/blob/blob_finish.dm +++ b/code/game/gamemodes/blob/blob_finish.dm @@ -20,7 +20,7 @@ if(round_converted) //So badmin blobs later don't step on the dead natural blobs metaphorical toes ..() if(blobwincount <= GLOB.blobs_legit.len) - feedback_set_details("round_end_result","win - blob took over") + SSblackbox.set_details("round_end_result","win - blob took over") to_chat(world, "The blob has taken over the station!") to_chat(world, "The entire station was eaten by the Blob!") log_game("Blob mode completed with a blob victory.") @@ -28,7 +28,7 @@ SSticker.news_report = BLOB_WIN else if(station_was_nuked) - feedback_set_details("round_end_result","halfwin - nuke") + SSblackbox.set_details("round_end_result","halfwin - nuke") to_chat(world, "Partial Win: The station has been destroyed!") to_chat(world, "Directive 7-12 has been successfully carried out, preventing the Blob from spreading.") log_game("Blob mode completed with a tie (station destroyed).") @@ -36,7 +36,7 @@ SSticker.news_report = BLOB_NUKE else if(!GLOB.blob_cores.len) - feedback_set_details("round_end_result","loss - blob eliminated") + SSblackbox.set_details("round_end_result","loss - blob eliminated") to_chat(world, "The staff has won!") to_chat(world, "The alien organism has been eradicated from the station!") log_game("Blob mode completed with a crew victory.") diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index 7a8bc7f517f..46853995cb3 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -179,11 +179,11 @@ remove_atom_colour(FIXED_COLOUR_PRIORITY) if(is_zombie) copy_overlays(oldguy, TRUE) - var/image/I = image('icons/mob/blob.dmi', icon_state = "blob_head") + var/mutable_appearance/blob_head_overlay = mutable_appearance('icons/mob/blob.dmi', "blob_head") if(overmind) - I.color = overmind.blob_reagent_datum.complementary_color + blob_head_overlay.color = overmind.blob_reagent_datum.complementary_color color = initial(color)//looks better. - add_overlay(I) + add_overlay(blob_head_overlay) /mob/living/simple_animal/hostile/blob/blobspore/weak name = "fragile blob spore" diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm index 7ae47f4c0e6..6ee0a56ceec 100644 --- a/code/game/gamemodes/blob/blobs/core.dm +++ b/code/game/gamemodes/blob/blobs/core.dm @@ -33,12 +33,11 @@ /obj/structure/blob/core/update_icon() cut_overlays() color = null - var/image/I = new('icons/mob/blob.dmi', "blob") + var/mutable_appearance/blob_overlay = mutable_appearance('icons/mob/blob.dmi', "blob") if(overmind) - I.color = overmind.blob_reagent_datum.color - add_overlay(I) - var/image/C = new('icons/mob/blob.dmi', "blob_core_overlay") - add_overlay(C) + blob_overlay.color = overmind.blob_reagent_datum.color + add_overlay(blob_overlay) + add_overlay(mutable_appearance('icons/mob/blob.dmi', "blob_core_overlay")) /obj/structure/blob/core/Destroy() GLOB.blob_cores -= src diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm index d778323ac23..ba92b7e03f5 100644 --- a/code/game/gamemodes/blob/blobs/node.dm +++ b/code/game/gamemodes/blob/blobs/node.dm @@ -21,12 +21,11 @@ /obj/structure/blob/node/update_icon() cut_overlays() color = null - var/image/I = new('icons/mob/blob.dmi', "blob") + var/mutable_appearance/blob_overlay = mutable_appearance('icons/mob/blob.dmi', "blob") if(overmind) - I.color = overmind.blob_reagent_datum.color - add_overlay(I) - var/image/C = new('icons/mob/blob.dmi', "blob_node_overlay") - add_overlay(C) + blob_overlay.color = overmind.blob_reagent_datum.color + add_overlay(blob_overlay) + add_overlay(mutable_appearance('icons/mob/blob.dmi', "blob_node_overlay")) /obj/structure/blob/node/Destroy() GLOB.blob_nodes -= src diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 7228f61eb2f..5e41372f6a6 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -254,19 +254,19 @@ GLOBAL_LIST_INIT(slot2type, list("head" = /obj/item/clothing/head/changeling, "w for(var/datum/objective/objective in changeling.objectives) if(objective.check_completion()) text += "
Objective #[count]: [objective.explanation_text] Success!" - feedback_add_details("changeling_objective","[objective.type]|SUCCESS") + SSblackbox.add_details("changeling_objective","[objective.type]|SUCCESS") else text += "
Objective #[count]: [objective.explanation_text] Fail." - feedback_add_details("changeling_objective","[objective.type]|FAIL") + SSblackbox.add_details("changeling_objective","[objective.type]|FAIL") changelingwin = 0 count++ if(changelingwin) text += "
The changeling was successful!" - feedback_add_details("changeling_success","SUCCESS") + SSblackbox.add_details("changeling_success","SUCCESS") else text += "
The changeling has failed." - feedback_add_details("changeling_success","FAIL") + SSblackbox.add_details("changeling_success","FAIL") text += "
" to_chat(world, text) diff --git a/code/game/gamemodes/changeling/changeling_power.dm b/code/game/gamemodes/changeling/changeling_power.dm index d58e603b420..cdb69516bf4 100644 --- a/code/game/gamemodes/changeling/changeling_power.dm +++ b/code/game/gamemodes/changeling/changeling_power.dm @@ -21,7 +21,7 @@ /obj/effect/proc_holder/changeling/proc/on_purchase(mob/user, is_respec) if(!is_respec) - feedback_add_details("changeling_power_purchase",name) + SSblackbox.add_details("changeling_power_purchase",name) /obj/effect/proc_holder/changeling/proc/on_refund(mob/user) return @@ -37,7 +37,7 @@ return var/datum/changeling/c = user.mind.changeling if(sting_action(user, target)) - feedback_add_details("changeling_powers",name) + SSblackbox.add_details("changeling_powers",name) sting_feedback(user, target) take_chemical_cost(c) diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm index 838210eb586..59ed4ab2e86 100644 --- a/code/game/gamemodes/changeling/evolution_menu.dm +++ b/code/game/gamemodes/changeling/evolution_menu.dm @@ -68,7 +68,7 @@ mind.changeling.purchasedpowers+=S S.on_purchase(src, is_respec) if(is_respec) - feedback_add_details("changeling_power_purchase","Readapt") + SSblackbox.add_details("changeling_power_purchase","Readapt") var/mob/living/carbon/C = src //only carbons have dna now, so we have to typecaste if(ishuman(C)) diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm index 8668b53713a..de31e575897 100644 --- a/code/game/gamemodes/changeling/powers/absorb.dm +++ b/code/game/gamemodes/changeling/powers/absorb.dm @@ -42,13 +42,13 @@ to_chat(target, "You feel a sharp stabbing pain!") target.take_overall_damage(40) - feedback_add_details("changeling_powers","Absorb DNA|[i]") + SSblackbox.add_details("changeling_powers","Absorb DNA|[i]") if(!do_mob(user, target, 150)) to_chat(user, "Our absorption of [target] has been interrupted!") changeling.isabsorbing = 0 return - feedback_add_details("changeling_powers","Absorb DNA|4") + SSblackbox.add_details("changeling_powers","Absorb DNA|4") user.visible_message("[user] sucks the fluids from [target]!", "We have absorbed [target].") to_chat(target, "You are absorbed by the changeling!") diff --git a/code/game/gamemodes/changeling/powers/linglink.dm b/code/game/gamemodes/changeling/powers/linglink.dm index 5a64d551b55..fc4b91b6503 100644 --- a/code/game/gamemodes/changeling/powers/linglink.dm +++ b/code/game/gamemodes/changeling/powers/linglink.dm @@ -56,7 +56,7 @@ to_chat(target, "You can now communicate in the changeling hivemind, say \":g message\" to communicate!") target.reagents.add_reagent("salbutamol", 40) // So they don't choke to death while you interrogate them sleep(1800) - feedback_add_details("changeling_powers","Hivemind Link|[i]") + SSblackbox.add_details("changeling_powers","Hivemind Link|[i]") if(!do_mob(user, target, 20)) to_chat(user, "Our link with [target] has ended!") changeling.islinking = 0 diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 670e08e7a23..deb5ad7e1a1 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -194,7 +194,7 @@ Credit where due: var/datum/game_mode/clockwork_cult/C = SSticker.mode if(C.check_clockwork_victory()) text += "Ratvar's servants have succeeded in fulfilling His goals!" - feedback_set_details("round_end_result", "win - servants completed their objective (summon ratvar)") + SSblackbox.set_details("round_end_result", "win - servants completed their objective (summon ratvar)") else var/half_victory = FALSE var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = locate() in GLOB.all_clockwork_objects @@ -203,10 +203,10 @@ Credit where due: if(half_victory) text += "The crew escaped before Ratvar could rise, but the gateway \ was successfully constructed!" - feedback_set_details("round_end_result", "halfwin - servants constructed the gateway but their objective was not completed (summon ratvar)") + SSblackbox.set_details("round_end_result", "halfwin - servants constructed the gateway but their objective was not completed (summon ratvar)") else text += "Ratvar's servants have failed!" - feedback_set_details("round_end_result", "loss - servants failed their objective (summon ratvar)") + SSblackbox.set_details("round_end_result", "loss - servants failed their objective (summon ratvar)") text += "
The servants' objective was:
[CLOCKCULT_OBJECTIVE]" text += "
Ratvar's servants had [GLOB.clockwork_caches] Tinkerer's Caches." text += "
Construction Value(CV) was: [GLOB.clockwork_construction_value]" diff --git a/code/game/gamemodes/clock_cult/clock_scripture.dm b/code/game/gamemodes/clock_cult/clock_scripture.dm index 8e688f30aa6..e8f1e8dbbc2 100644 --- a/code/game/gamemodes/clock_cult/clock_scripture.dm +++ b/code/game/gamemodes/clock_cult/clock_scripture.dm @@ -86,7 +86,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or else successful = TRUE if(slab && !slab.no_cost && !GLOB.ratvar_awakens) //if the slab exists and isn't debug and ratvar isn't up, log the scripture as being used - feedback_add_details("clockcult_scripture_recited", name) + SSblackbox.add_details("clockcult_scripture_recited", name) if(slab) slab.busy = null qdel(src) diff --git a/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm b/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm index 31b88010281..1203c7119a7 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm @@ -42,8 +42,7 @@ icon_state = "geisbinding" mob_layer = M.layer layer = M.layer - 0.01 - var/image/GB = new('icons/effects/clockwork_effects.dmi', src, "geisbinding_top", M.layer + 0.01) - add_overlay(GB) + add_overlay(mutable_appearance('icons/effects/clockwork_effects.dmi', "geisbinding_top", M.layer + 0.01)) for(var/obj/item/I in M.held_items) M.dropItemToGround(I) for(var/i in M.get_empty_held_indexes()) diff --git a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm index ffc3d5e1a14..9b2d868730e 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm @@ -25,7 +25,7 @@ START_PROCESSING(SSobj, src) send_to_playing_players("\"[text2ratvar("ONCE AGAIN MY LIGHT SHALL SHINE ACROSS THIS PATHETIC REALM")]!!\"") send_to_playing_players('sound/effects/ratvar_reveal.ogg') - var/image/alert_overlay = image('icons/effects/clockwork_effects.dmi', "ratvar_alert") + var/mutable_appearance/alert_overlay = mutable_appearance('icons/effects/clockwork_effects.dmi', "ratvar_alert") var/area/A = get_area(src) notify_ghosts("The Justiciar's light calls to you! Reach out to Ratvar in [A.name] to be granted a shell to spread his glory!", null, source = src, alert_overlay = alert_overlay) INVOKE_ASYNC(SSshuttle.emergency, /obj/docking_port/mobile/emergency..proc/request, null, 0) 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 727f13fea4a..22ea9e2ce50 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/tinkerers_daemon.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/tinkerers_daemon.dm @@ -14,8 +14,8 @@ debris = list(/obj/item/clockwork/alloy_shards/medium = 1, \ /obj/item/clockwork/alloy_shards/small = 6, \ /obj/item/clockwork/component/replicant_alloy/replication_plate = 1) - var/image/daemon_glow - var/image/component_glow + var/static/mutable_appearance/daemon_glow = mutable_appearance('icons/obj/clockwork_objects.dmi', "tinkerglow") + 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 @@ -119,14 +119,9 @@ . = ..() if(active) var/component_color = get_component_color(component_id_to_produce) - if(!daemon_glow) - daemon_glow = new('icons/obj/clockwork_objects.dmi', "tinkerglow") daemon_glow.color = component_color add_overlay(daemon_glow) - if(!component_glow) - component_glow = new('icons/obj/clockwork_objects.dmi', "t_[component_id_to_produce ? component_id_to_produce :"random_component"]") - else - component_glow.icon_state = "t_[component_id_to_produce ? component_id_to_produce :"random_component"]" + component_glow.icon_state = "t_[component_id_to_produce ? component_id_to_produce :"random_component"]" component_glow.color = component_color add_overlay(component_glow) production_time = world.time + production_cooldown //don't immediately produce when turned on after being off diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 65dcb863eb5..f3832a830bc 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -218,12 +218,12 @@ /datum/game_mode/cult/declare_completion() if(!check_cult_victory()) - feedback_set_details("round_end_result","win - cult win") - feedback_set("round_end_result",acolytes_survived) + SSblackbox.set_details("round_end_result","win - cult win") + SSblackbox.set_val("round_end_result",acolytes_survived) to_chat(world, "The cult has succeeded! Nar-sie has snuffed out another torch in the void!") else - feedback_set_details("round_end_result","loss - staff stopped the cult") - feedback_set("round_end_result",acolytes_survived) + SSblackbox.set_details("round_end_result","loss - staff stopped the cult") + SSblackbox.set_val("round_end_result",acolytes_survived) to_chat(world, "The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!") var/text = "" @@ -236,31 +236,31 @@ if("survive") if(!check_survive()) explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) Success!" - feedback_add_details("cult_objective","cult_survive|SUCCESS|[acolytes_needed]") + SSblackbox.add_details("cult_objective","cult_survive|SUCCESS|[acolytes_needed]") SSticker.news_report = CULT_ESCAPE else explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) Fail." - feedback_add_details("cult_objective","cult_survive|FAIL|[acolytes_needed]") + SSblackbox.add_details("cult_objective","cult_survive|FAIL|[acolytes_needed]") SSticker.news_report = CULT_FAILURE if("sacrifice") if(sacrifice_target) if(sacrifice_target in GLOB.sacrificed) explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Success!" - feedback_add_details("cult_objective","cult_sacrifice|SUCCESS") + SSblackbox.add_details("cult_objective","cult_sacrifice|SUCCESS") else if(sacrifice_target && sacrifice_target.current) explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Fail." - feedback_add_details("cult_objective","cult_sacrifice|FAIL") + SSblackbox.add_details("cult_objective","cult_sacrifice|FAIL") else explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Fail (Gibbed)." - feedback_add_details("cult_objective","cult_sacrifice|FAIL|GIBBED") + SSblackbox.add_details("cult_objective","cult_sacrifice|FAIL|GIBBED") if("eldergod") if(!eldergod) explanation = "Summon Nar-Sie. Success!" - feedback_add_details("cult_objective","cult_narsie|SUCCESS") + SSblackbox.add_details("cult_objective","cult_narsie|SUCCESS") SSticker.news_report = CULT_SUMMON else explanation = "Summon Nar-Sie. Fail." - feedback_add_details("cult_objective","cult_narsie|FAIL") + SSblackbox.add_details("cult_objective","cult_narsie|FAIL") SSticker.news_report = CULT_FAILURE text += "
Objective #[obj_count]: [explanation]" diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 8d87eeb4fcd..a90aeb78bc2 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -201,9 +201,9 @@ return 0 /obj/item/clothing/suit/hooded/cultrobes/cult_shield/worn_overlays(isinhands) - . = list() - if(!isinhands && current_charges) - . += image(layer = MOB_LAYER+0.01, icon = 'icons/effects/effects.dmi', icon_state = "shield-cult") + . = list() + if(!isinhands && current_charges) + . += mutable_appearance('icons/effects/effects.dmi', "shield-cult", MOB_LAYER + 0.01) /obj/item/clothing/suit/hooded/cultrobes/berserker name = "flagellant's robes" diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 2ed6840c917..843d16592a9 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -247,7 +247,7 @@ This file contains the arcane tome files. var/obj/effect/rune/R = new rune_to_scribe(Turf, chosen_keyword) R.add_mob_blood(user) to_chat(user, "The [lowertext(R.cultist_name)] rune [R.cultist_desc]") - feedback_add_details("cult_runes_scribed", R.cultist_name) + SSblackbox.add_details("cult_runes_scribed", R.cultist_name) /obj/item/weapon/tome/proc/check_rune_turf(turf/T, mob/user) var/area/A = get_area(T) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 2e2ff9c46bc..296b248938f 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -775,11 +775,11 @@ structure_check() searches for nearby cultist structures required for the invoca deltimer(density_timer) air_update_turf(1) if(density) - var/image/I = image(layer = ABOVE_MOB_LAYER, icon = 'icons/effects/effects.dmi', icon_state = "barriershimmer") - I.appearance_flags = RESET_COLOR - I.alpha = 60 - I.color = "#701414" - add_overlay(I) + var/mutable_appearance/shimmer = mutable_appearance('icons/effects/effects.dmi', "barriershimmer", ABOVE_MOB_LAYER) + shimmer.appearance_flags |= RESET_COLOR + shimmer.alpha = 60 + shimmer.color = "#701414" + add_overlay(shimmer) add_atom_colour("#FF0000", FIXED_COLOUR_PRIORITY) else cut_overlays() diff --git a/code/game/gamemodes/devil/devilinfo.dm b/code/game/gamemodes/devil/devilinfo.dm index ef9091891f0..01437cdf2ea 100644 --- a/code/game/gamemodes/devil/devilinfo.dm +++ b/code/game/gamemodes/devil/devilinfo.dm @@ -287,7 +287,7 @@ GLOBAL_LIST_INIT(lawlorify, list ( notify_ghosts("An arch devil has ascended in \the [A.name]. Reach out to the devil to be given a new shell for your soul.", source = owner.current, action=NOTIFY_ATTACK) sleep(50) if(!SSticker.mode.devil_ascended) - SSshuttle.emergency.request(null, 0.3) + SSshuttle.emergency.request(null, set_coefficient = 0.3) SSticker.mode.devil_ascended++ form = ARCH_DEVIL @@ -449,7 +449,7 @@ GLOBAL_LIST_INIT(lawlorify, list ( A.convert_to_archdevil() else throw EXCEPTION("Unable to find a blobstart landmark for hellish resurrection") - + /datum/devilinfo/proc/update_hud() if(istype(owner.current, /mob/living/carbon)) diff --git a/code/game/gamemodes/devil/true_devil/inventory.dm b/code/game/gamemodes/devil/true_devil/inventory.dm index c474eaf1161..778c4216160 100644 --- a/code/game/gamemodes/devil/true_devil/inventory.dm +++ b/code/game/gamemodes/devil/true_devil/inventory.dm @@ -5,7 +5,7 @@ return 0 /mob/living/carbon/true_devil/update_inv_hands() - //TODO LORDPIDEY: Figure out how to make the hands line up properly. the l/r_hand_image should use the down sprite when facing down, left, or right, and the up sprite when facing up. + //TODO LORDPIDEY: Figure out how to make the hands line up properly. the l/r_hand_overlay should use the down sprite when facing down, left, or right, and the up sprite when facing up. remove_overlay(DEVIL_HANDS_LAYER) var/list/hands_overlays = list() var/obj/item/l_hand = get_item_for_held_index(1) //hardcoded 2-hands only, for now. @@ -17,9 +17,9 @@ if(!r_state) r_state = r_hand.icon_state - var/image/r_hand_image = r_hand.build_worn_icon(state = r_state, default_layer = DEVIL_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE) + var/mutable_appearance/r_hand_overlay = r_hand.build_worn_icon(state = r_state, default_layer = DEVIL_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE) - hands_overlays += r_hand_image + hands_overlays += r_hand_overlay if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) r_hand.layer = ABOVE_HUD_LAYER @@ -33,9 +33,9 @@ if(!l_state) l_state = l_hand.icon_state - var/image/l_hand_image = l_hand.build_worn_icon(state = l_state, default_layer = DEVIL_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE) + var/mutable_appearance/l_hand_overlay = l_hand.build_worn_icon(state = l_state, default_layer = DEVIL_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE) - hands_overlays += l_hand_image + hands_overlays += l_hand_overlay if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) l_hand.layer = ABOVE_HUD_LAYER @@ -54,6 +54,5 @@ /mob/living/carbon/true_devil/apply_overlay(cache_index) - var/image/I = devil_overlays[cache_index] - if(I) - add_overlay(I) + if((. = devil_overlays[cache_index])) + add_overlay(.) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 53bd92f6c2d..f1144afc13d 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -80,12 +80,12 @@ report = config.intercept addtimer(CALLBACK(GLOBAL_PROC, .proc/display_roundstart_logout_report), ROUNDSTART_LOGOUT_REPORT_TIME) - feedback_set_details("round_start","[time2text(world.realtime)]") + SSblackbox.set_details("round_start","[time2text(world.realtime)]") if(SSticker && SSticker.mode) - feedback_set_details("game_mode","[SSticker.mode]") + SSblackbox.set_details("game_mode","[SSticker.mode]") if(GLOB.revdata.commit) - feedback_set_details("revision","[GLOB.revdata.commit]") - feedback_set_details("server_ip","[world.internet_address]:[world.port]") + SSblackbox.set_details("revision","[GLOB.revdata.commit]") + SSblackbox.set_details("server_ip","[world.internet_address]:[world.port]") if(report) addtimer(CALLBACK(src, .proc/send_intercept, 0), rand(waittime_l, waittime_h)) generate_station_goals() @@ -246,17 +246,17 @@ ghosts++ if(clients > 0) - feedback_set("round_end_clients",clients) + SSblackbox.set_val("round_end_clients",clients) if(ghosts > 0) - feedback_set("round_end_ghosts",ghosts) + SSblackbox.set_val("round_end_ghosts",ghosts) if(surviving_humans > 0) - feedback_set("survived_human",surviving_humans) + SSblackbox.set_val("survived_human",surviving_humans) if(surviving_total > 0) - feedback_set("survived_total",surviving_total) + SSblackbox.set_val("survived_total",surviving_total) if(escaped_humans > 0) - feedback_set("escaped_human",escaped_humans) + SSblackbox.set_val("escaped_human",escaped_humans) if(escaped_total > 0) - feedback_set("escaped_total",escaped_total) + SSblackbox.set_val("escaped_total",escaped_total) send2irc("Server", "Round just ended.") return 0 diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm index 22ca4b22987..9c31edf55fb 100644 --- a/code/game/gamemodes/gang/gang.dm +++ b/code/game/gamemodes/gang/gang.dm @@ -260,12 +260,12 @@ GLOBAL_LIST_INIT(gang_colors_pool, list("red","orange","yellow","green","blue"," return if(!winner) to_chat(world, "The station was [station_was_nuked ? "destroyed!" : "evacuated before a gang could claim it! The station wins!"]
") - feedback_set_details("round_end_result","loss - gangs failed takeover") + 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!
") - feedback_set_details("round_end_result","win - gang domination complete") + SSblackbox.set_details("round_end_result","win - gang domination complete") SSticker.news_report = GANG_TAKEOVER diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index a7c466e746b..4f09f2e3621 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -556,7 +556,7 @@ var/mob/living/silicon/ai/A = usr if(A.stat == DEAD) - A <<"You are already dead!" //Omae Wa Mou Shindeiru + to_chat(A, "You are already dead!") //Omae Wa Mou Shindeiru return for(var/datum/AI_Module/AM in possible_modules) diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index 7897e86a026..d0cd7c05203 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -50,8 +50,8 @@ else to_chat(world, "Nobody survived the meteor storm!") - feedback_set_details("round_end_result","end - evacuation") - feedback_set("round_end_result",survivors) + SSblackbox.set_details("round_end_result","end - evacuation") + SSblackbox.set_val("round_end_result",survivors) ..() return 1 diff --git a/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm b/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm new file mode 100644 index 00000000000..aa633e1ef59 --- /dev/null +++ b/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm @@ -0,0 +1,148 @@ +/datum/objective/abductee + dangerrating = 5 + completed = 1 + +/datum/objective/abductee/steal + explanation_text = "Steal all" + +/datum/objective/abductee/steal/New() + var/target = pick(list("pets","lights","monkeys","fruits","shoes","bars of soap", "weapons", "computers", "organs")) + explanation_text+=" [target]." + +/datum/objective/abductee/paint + explanation_text = "The station is hideous. You must color it all" + +/datum/objective/abductee/paint/New() + var/color = pick(list("red", "blue", "green", "yellow", "orange", "purple", "black", "in rainbows", "in blood")) + explanation_text+= " [color]!" + +/datum/objective/abductee/speech + explanation_text = "Your brain is broken... you can only communicate in" + +/datum/objective/abductee/speech/New() + var/style = pick(list("pantomime", "rhyme", "haiku", "extended metaphors", "riddles", "extremely literal terms", "sound effects", "military jargon")) + explanation_text+= " [style]." + +/datum/objective/abductee/capture + explanation_text = "Capture" + +/datum/objective/abductee/capture/New() + var/list/jobs = SSjob.occupations.Copy() + for(var/datum/job/J in jobs) + if(J.current_positions < 1) + jobs -= J + if(jobs.len > 0) + var/datum/job/target = pick(jobs) + explanation_text += " a [target.title]." + else + explanation_text += " someone." + +/datum/objective/abductee/shuttle + explanation_text = "You must escape the station! Get the shuttle called!" + +/datum/objective/abductee/noclone + explanation_text = "Don't allow anyone to be cloned." + +/datum/objective/abductee/oxygen + explanation_text = "The oxygen is killing them all and they don't even know it. Make sure no oxygen is on the station." + +/datum/objective/abductee/blazeit + explanation_text = "Your body must be improved. Ingest as many drugs as you can." + +/datum/objective/abductee/yumyum + explanation_text = "You are hungry. Eat as much food as you can find." + +/datum/objective/abductee/insane + explanation_text = "You see you see what they cannot you see the open door you seeE you SEeEe you SEe yOU seEee SHOW THEM ALL" + +/datum/objective/abductee/cannotmove + explanation_text = "Convince the crew that you are a paraplegic." + +/datum/objective/abductee/deadbodies + explanation_text = "Start a collection of corpses. Don't kill people to get these corpses." + +/datum/objective/abductee/floors + explanation_text = "Replace all the floor tiles with wood, carpeting, grass or bling." + +/datum/objective/abductee/POWERUNLIMITED + explanation_text = "Flood the station's powernet with as much electricity as you can." + +/datum/objective/abductee/pristine + explanation_text = "The CEO of Nanotrasen is coming! Ensure the station is in absolutely pristine condition." + +/datum/objective/abductee/nowalls + explanation_text = "The crew must get to know one another better. Break down the walls inside the station!" + +/datum/objective/abductee/nations + explanation_text = "Ensure your department prospers over all else." + +/datum/objective/abductee/abductception + explanation_text = "You have been changed forever. Find the ones that did this to you and give them a taste of their own medicine." + +/datum/objective/abductee/summon + explanation_text = "The elder gods hunger. Gather a cult and conduct a ritual to summon one." + +/datum/objective/abductee/machine + explanation_text = "You are secretly an android. Interface with as many machines as you can to boost your own power so the AI may acknowledge you at last." + +/datum/objective/abductee/calling + explanation_text = "Call forth a spirit from the other side." + +/datum/objective/abductee/calling/New() + var/mob/dead/D = pick(GLOB.dead_mob_list) + if(D) + explanation_text = "You know that [D] has perished. Hold a seance to call them from the spirit realm." + +/datum/objective/abductee/social_experiment + explanation_text = "This is a secret social experiment conducted by Nanotrasen. Convince the crew that this is the truth." + +/datum/objective/abductee/vr + explanation_text = "It's all an entirely virtual simulation within an underground vault. Convince the crew to escape the shackles of VR." + +/datum/objective/abductee/pets + explanation_text = "Nanotrasen is abusing the animals! Save as many as you can!" + +/datum/objective/abductee/defect + explanation_text = "Fuck the system! Defect from the station and start an independent colony in space, Lavaland or the derelict. Recruit crewmates if you can." + +/datum/objective/abductee/promote + explanation_text = "Climb the corporate ladder all the way to the top!" + +/datum/objective/abductee/science + explanation_text = "So much lies undiscovered. Look deeper into the machinations of the universe." + +/datum/objective/abductee/build + explanation_text = "Expand the station." + +/datum/objective/abductee/pragnant + explanation_text = "You are pregnant and soon due. Find a safe place to deliver your baby." + +/datum/objective/abductee/engine + explanation_text = "Go have a good conversation with the singularity/tesla/supermatter crystal. Bonus points if it responds." + +/datum/objective/abductee/music + explanation_text = "You burn with passion for music. Share your vision. If anyone hates it, beat them on the head with your instrument!" + +/datum/objective/abductee/clown + explanation_text = "The clown is not funny. You can do better! Steal his audience and make the crew laugh!" + +/datum/objective/abductee/party + explanation_text = "You're throwing a huge rager. Make it as awesome as possible so the whole crew comes... OR ELSE!" + +/datum/objective/abductee/pets + explanation_text = "All the pets around here suck. You need to make them cooler. Replace them with exotic beasts!" + +/datum/objective/abductee/conspiracy + explanation_text = "The leaders of this station are hiding a grand, evil conspiracy. Only you can learn what it is, and expose it to the people!" + +/datum/objective/abductee/stalker + explanation_text = "The Syndicate has hired you to compile dossiers on all important members of the crew. Be sure they don't know you're doing it." + +/datum/objective/abductee/narrator + explanation_text = "You're the narrator of this tale. Follow around the protagonists to tell their story." + +/datum/objective/abductee/lurve + explanation_text = "You are doomed to feel woefully incomplete forever... until you find your true love on this station. They're waiting for you!" + +/datum/objective/abductee/sixthsense + explanation_text = "You died back there and went to heaven... or is it hell? No one here seems to know they're dead. Convince them, and maybe you can escape this limbo." diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm index aa5a688596e..0e4a11f8ab3 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction.dm @@ -85,56 +85,14 @@ return 1 /datum/game_mode/abduction/post_setup() - //Spawn Team - var/list/obj/effect/landmark/abductor/agent_landmarks = new - var/list/obj/effect/landmark/abductor/scientist_landmarks = new - agent_landmarks.len = max_teams - scientist_landmarks.len = max_teams - for(var/obj/effect/landmark/abductor/A in GLOB.landmarks_list) - if(istype(A,/obj/effect/landmark/abductor/agent)) - agent_landmarks[text2num(A.team)] = A - else if(istype(A,/obj/effect/landmark/abductor/scientist)) - scientist_landmarks[text2num(A.team)] = A - - var/datum/mind/agent - var/obj/effect/landmark/L - var/datum/mind/scientist - var/team_name - var/mob/living/carbon/human/H - var/datum/species/abductor/S for(var/team_number=1,team_number<=abductor_teams,team_number++) - team_name = team_names[team_number] - agent = agents[team_number] - H = agent.current - L = agent_landmarks[team_number] - H.loc = L.loc - H.set_species(/datum/species/abductor) - S = H.dna.species - S.agent = 1 - S.team = team_number - H.real_name = team_name + " Agent" - equip_common(H,team_number) - equip_agent(H,team_number) - greet_agent(agent,team_number) - - scientist = scientists[team_number] - H = scientist.current - L = scientist_landmarks[team_number] - H.loc = L.loc - H.set_species(/datum/species/abductor) - S = H.dna.species - S.scientist = 1 - S.team = team_number - H.real_name = team_name + " Scientist" - equip_common(H,team_number) - equip_scientist(H,team_number) - greet_scientist(scientist,team_number) + post_setup_team(team_number) return ..() //Used for create antag buttons /datum/game_mode/abduction/proc/post_setup_team(team_number) - var/list/obj/effect/landmark/abductor/agent_landmarks = new - var/list/obj/effect/landmark/abductor/scientist_landmarks = new + var/list/obj/effect/landmark/abductor/agent_landmarks = list() + var/list/obj/effect/landmark/abductor/scientist_landmarks = list() agent_landmarks.len = max_teams scientist_landmarks.len = max_teams for(var/obj/effect/landmark/abductor/A in GLOB.landmarks_list) @@ -143,39 +101,36 @@ else if(istype(A,/obj/effect/landmark/abductor/scientist)) scientist_landmarks[text2num(A.team)] = A + var/team_name = team_names[team_number] + var/datum/mind/agent var/obj/effect/landmark/L var/datum/mind/scientist - var/team_name var/mob/living/carbon/human/H var/datum/species/abductor/S - team_name = team_names[team_number] agent = agents[team_number] H = agent.current L = agent_landmarks[team_number] - H.loc = L.loc + H.forceMove(L.loc) H.set_species(/datum/species/abductor) S = H.dna.species - S.agent = 1 S.team = team_number H.real_name = team_name + " Agent" - equip_common(H,team_number) - equip_agent(H,team_number) + H.equipOutfit(/datum/outfit/abductor/agent) greet_agent(agent,team_number) scientist = scientists[team_number] H = scientist.current L = scientist_landmarks[team_number] - H.loc = L.loc + H.forceMove(L.loc) H.set_species(/datum/species/abductor) S = H.dna.species - S.scientist = 1 + S.scientist = TRUE S.team = team_number H.real_name = team_name + " Scientist" - equip_common(H,team_number) - equip_scientist(H,team_number) + H.equipOutfit(/datum/outfit/abductor/scientist) greet_scientist(scientist,team_number) @@ -200,57 +155,10 @@ abductor.announce_objectives() -/datum/game_mode/abduction/proc/equip_common(mob/living/carbon/human/agent,team_number) - var/radio_freq = GLOB.SYND_FREQ - - var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate/alt(agent) - R.set_frequency(radio_freq) - agent.equip_to_slot_or_del(R, slot_ears) - agent.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(agent), slot_shoes) - agent.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(agent), slot_w_uniform) //they're greys gettit - agent.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(agent), slot_back) - -/datum/game_mode/abduction/proc/get_team_console(team) - var/obj/machinery/abductor/console/console - for(var/obj/machinery/abductor/console/c in GLOB.machines) - if(c.team == team) - console = c - break - return console - -/datum/game_mode/abduction/proc/equip_agent(mob/living/carbon/human/agent,team_number) - if(!team_number) - var/datum/species/abductor/S = agent.dna.species - team_number = S.team - - var/obj/machinery/abductor/console/console = get_team_console(team_number) - var/obj/item/clothing/suit/armor/abductor/vest/V = new /obj/item/clothing/suit/armor/abductor/vest(agent) - if(console!=null) - console.vest = V - V.flags |= NODROP - agent.equip_to_slot_or_del(V, slot_wear_suit) - agent.equip_to_slot_or_del(new /obj/item/weapon/abductor_baton(agent), slot_in_backpack) - agent.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/alien(agent), slot_in_backpack) - agent.equip_to_slot_or_del(new /obj/item/device/abductor/silencer(agent), slot_in_backpack) - agent.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/abductor(agent), slot_head) - agent.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/military/abductor/full(agent), slot_belt) - - -/datum/game_mode/abduction/proc/equip_scientist(var/mob/living/carbon/human/scientist,var/team_number) - if(!team_number) - var/datum/species/abductor/S = scientist.dna.species - team_number = S.team - - var/obj/machinery/abductor/console/console = get_team_console(team_number) - var/obj/item/device/abductor/gizmo/G = new /obj/item/device/abductor/gizmo(scientist) - if(console!=null) - console.gizmo = G - G.console = console - scientist.equip_to_slot_or_del(G, slot_in_backpack) - - var/obj/item/weapon/implant/abductor/beamplant = new /obj/item/weapon/implant/abductor(scientist) - beamplant.implant(scientist) - +/datum/game_mode/abduction/proc/get_team_console(team_number) + for(var/obj/machinery/abductor/console/C in GLOB.machines) + if(C.team == team_number) + return C /datum/game_mode/abduction/check_finished() if(!finished) @@ -258,7 +166,7 @@ var/obj/machinery/abductor/console/con = get_team_console(team_number) var/datum/objective/objective = team_objectives[team_number] if (con.experiment.points >= objective.target_amount) - SSshuttle.emergency.request(null, 0.5) + SSshuttle.emergency.request(null, set_coefficient = 0.5) finished = 1 return ..() return ..() @@ -336,152 +244,3 @@ var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_ABDUCTOR] hud.leave_hud(alien_mind.current) set_antag_hud(alien_mind.current, null) - -/datum/objective/abductee - dangerrating = 5 - completed = 1 - -/datum/objective/abductee/steal - explanation_text = "Steal all" - -/datum/objective/abductee/steal/New() - var/target = pick(list("pets","lights","monkeys","fruits","shoes","bars of soap", "weapons", "computers", "organs")) - explanation_text+=" [target]." - -/datum/objective/abductee/paint - explanation_text = "The station is hideous. You must color it all" - -/datum/objective/abductee/paint/New() - var/color = pick(list("red", "blue", "green", "yellow", "orange", "purple", "black", "in rainbows", "in blood")) - explanation_text+= " [color]!" - -/datum/objective/abductee/speech - explanation_text = "Your brain is broken... you can only communicate in" - -/datum/objective/abductee/speech/New() - var/style = pick(list("pantomime", "rhyme", "haiku", "extended metaphors", "riddles", "extremely literal terms", "sound effects", "military jargon")) - explanation_text+= " [style]." - -/datum/objective/abductee/capture - explanation_text = "Capture" - -/datum/objective/abductee/capture/New() - var/list/jobs = SSjob.occupations.Copy() - for(var/datum/job/J in jobs) - if(J.current_positions < 1) - jobs -= J - if(jobs.len > 0) - var/datum/job/target = pick(jobs) - explanation_text += " a [target.title]." - else - explanation_text += " someone." - -/datum/objective/abductee/shuttle - explanation_text = "You must escape the station! Get the shuttle called!" - -/datum/objective/abductee/noclone - explanation_text = "Don't allow anyone to be cloned." - -/datum/objective/abductee/oxygen - explanation_text = "The oxygen is killing them all and they don't even know it. Make sure no oxygen is on the station." - -/datum/objective/abductee/blazeit - explanation_text = "Your body must be improved. Ingest as many drugs as you can." - -/datum/objective/abductee/yumyum - explanation_text = "You are hungry. Eat as much food as you can find." - -/datum/objective/abductee/insane - explanation_text = "You see you see what they cannot you see the open door you seeE you SEeEe you SEe yOU seEee SHOW THEM ALL" - -/datum/objective/abductee/cannotmove - explanation_text = "Convince the crew that you are a paraplegic." - -/datum/objective/abductee/deadbodies - explanation_text = "Start a collection of corpses. Don't kill people to get these corpses." - -/datum/objective/abductee/floors - explanation_text = "Replace all the floor tiles with wood, carpeting, grass or bling." - -/datum/objective/abductee/POWERUNLIMITED - explanation_text = "Flood the station's powernet with as much electricity as you can." - -/datum/objective/abductee/pristine - explanation_text = "The CEO of Nanotrasen is coming! Ensure the station is in absolutely pristine condition." - -/datum/objective/abductee/nowalls - explanation_text = "The crew must get to know one another better. Break down the walls inside the station!" - -/datum/objective/abductee/nations - explanation_text = "Ensure your department prospers over all else." - -/datum/objective/abductee/abductception - explanation_text = "You have been changed forever. Find the ones that did this to you and give them a taste of their own medicine." - -/datum/objective/abductee/summon - explanation_text = "The elder gods hunger. Gather a cult and conduct a ritual to summon one." - -/datum/objective/abductee/machine - explanation_text = "You are secretly an android. Interface with as many machines as you can to boost your own power so the AI may acknowledge you at last." - -/datum/objective/abductee/calling - explanation_text = "Call forth a spirit from the other side." - -/datum/objective/abductee/calling/New() - var/mob/dead/D = pick(GLOB.dead_mob_list) - if(D) - explanation_text = "You know that [D] has perished. Hold a seance to call them from the spirit realm." - -/datum/objective/abductee/social_experiment - explanation_text = "This is a secret social experiment conducted by Nanotrasen. Convince the crew that this is the truth." - -/datum/objective/abductee/vr - explanation_text = "It's all an entirely virtual simulation within an underground vault. Convince the crew to escape the shackles of VR." - -/datum/objective/abductee/pets - explanation_text = "Nanotrasen is abusing the animals! Save as many as you can!" - -/datum/objective/abductee/defect - explanation_text = "Fuck the system! Defect from the station and start an independent colony in space, Lavaland or the derelict. Recruit crewmates if you can." - -/datum/objective/abductee/promote - explanation_text = "Climb the corporate ladder all the way to the top!" - -/datum/objective/abductee/science - explanation_text = "So much lies undiscovered. Look deeper into the machinations of the universe." - -/datum/objective/abductee/build - explanation_text = "Expand the station." - -/datum/objective/abductee/pragnant - explanation_text = "You are pregnant and soon due. Find a safe place to deliver your baby." - -/datum/objective/abductee/engine - explanation_text = "Go have a good conversation with the singularity/tesla/supermatter crystal. Bonus points if it responds." - -/datum/objective/abductee/music - explanation_text = "You burn with passion for music. Share your vision. If anyone hates it, beat them on the head with your instrument!" - -/datum/objective/abductee/clown - explanation_text = "The clown is not funny. You can do better! Steal his audience and make the crew laugh!" - -/datum/objective/abductee/party - explanation_text = "You're throwing a huge rager. Make it as awesome as possible so the whole crew comes... OR ELSE!" - -/datum/objective/abductee/pets - explanation_text = "All the pets around here suck. You need to make them cooler. Replace them with exotic beasts!" - -/datum/objective/abductee/conspiracy - explanation_text = "The leaders of this station are hiding a grand, evil conspiracy. Only you can learn what it is, and expose it to the people!" - -/datum/objective/abductee/stalker - explanation_text = "The Syndicate has hired you to compile dossiers on all important members of the crew. Be sure they don't know you're doing it." - -/datum/objective/abductee/narrator - explanation_text = "You're the narrator of this tale. Follow around the protagonists to tell their story." - -/datum/objective/abductee/lurve - explanation_text = "You are doomed to feel woefully incomplete forever... until you find your true love on this station. They're waiting for you!" - -/datum/objective/abductee/sixthsense - explanation_text = "You died back there and went to heaven... or is it hell? No one here seems to know they're dead. Convince them, and maybe you can escape this limbo." \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index f735bf253ca..d7ab46cb9cd 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -14,6 +14,13 @@ origin_tech = "magnets=7;biotech=4;powerstorage=4;abductor=4" armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15, fire = 70, acid = 70) actions_types = list(/datum/action/item_action/hands_free/activate) + allowed = list( + /obj/item/device/abductor, + /obj/item/weapon/abductor_baton, + /obj/item/weapon/melee/baton, + /obj/item/weapon/gun/energy, + /obj/item/weapon/restraints/handcuffs + ) var/mode = VEST_STEALTH var/stealth_active = 0 var/combat_cooldown = 10 @@ -21,6 +28,11 @@ var/stealth_armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15, fire = 70, acid = 70) var/combat_armor = list(melee = 50, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 50, rad = 50, fire = 90, acid = 90) +/obj/item/clothing/suit/armor/abductor/vest/proc/toggle_nodrop() + flags ^= NODROP + if(ismob(loc)) + to_chat(loc, "Your vest is now [flags & NODROP ? "locked" : "unlocked"].") + /obj/item/clothing/suit/armor/abductor/vest/proc/flip_mode() switch(mode) if(VEST_STEALTH) @@ -107,6 +119,18 @@ if(combat_cooldown==initial(combat_cooldown)) STOP_PROCESSING(SSobj, src) +/obj/item/clothing/suit/armor/abductor/Destroy() + STOP_PROCESSING(SSobj, src) + for(var/obj/machinery/abductor/console/C in GLOB.machines) + if(C.vest == src) + C.vest = null + break + . = ..() + + +/obj/item/device/abductor + icon = 'icons/obj/abductor.dmi' + /obj/item/device/abductor/proc/AbductorCheck(user) if(isabductor(user)) return TRUE @@ -114,14 +138,19 @@ return FALSE /obj/item/device/abductor/proc/ScientistCheck(user) + if(!AbductorCheck(user)) + return FALSE + var/mob/living/carbon/human/H = user var/datum/species/abductor/S = H.dna.species - return S.scientist + if(S.scientist) + return TRUE + to_chat(user, "You're not trained to use this!") + return FALSE /obj/item/device/abductor/gizmo name = "science tool" desc = "A dual-mode tool for retrieving specimens and scanning appearances. Scanning can be done through cameras." - icon = 'icons/obj/abductor.dmi' icon_state = "gizmo_scan" item_state = "silencer" origin_tech = "engineering=7;magnets=4;bluespace=4;abductor=3" @@ -130,11 +159,12 @@ var/obj/machinery/abductor/console/console /obj/item/device/abductor/gizmo/attack_self(mob/user) - if(!AbductorCheck(user)) - return if(!ScientistCheck(user)) - to_chat(user, "You're not trained to use this!") return + if(!console) + to_chat(user, "The device is not linked to console!") + return + if(mode == GIZMO_SCAN) mode = GIZMO_MARK icon_state = "gizmo_mark" @@ -144,11 +174,12 @@ to_chat(user, "You switch the device to [mode==GIZMO_SCAN? "SCAN": "MARK"] MODE") /obj/item/device/abductor/gizmo/attack(mob/living/M, mob/user) - if(!AbductorCheck(user)) - return if(!ScientistCheck(user)) - to_chat(user, "You're not trained to use this") return + if(!console) + to_chat(user, "The device is not linked to console!") + return + switch(mode) if(GIZMO_SCAN) scan(M, user) @@ -159,11 +190,12 @@ /obj/item/device/abductor/gizmo/afterattack(atom/target, mob/living/user, flag, params) if(flag) return - if(!AbductorCheck(user)) - return if(!ScientistCheck(user)) - to_chat(user, "You're not trained to use this") return + if(!console) + to_chat(user, "The device is not linked to console!") + return + switch(mode) if(GIZMO_SCAN) scan(target, user) @@ -172,9 +204,8 @@ /obj/item/device/abductor/gizmo/proc/scan(atom/target, mob/living/user) if(ishuman(target)) - if(console!=null) - console.AddSnapshot(target) - to_chat(user, "You scan [target] and add them to the database.") + console.AddSnapshot(target) + to_chat(user, "You scan [target] and add them to the database.") /obj/item/device/abductor/gizmo/proc/mark(atom/target, mob/living/user) if(marked == target) @@ -198,11 +229,15 @@ marked = target to_chat(user, "You finish preparing [target] for transport.") +/obj/item/device/abductor/gizmo/Destroy() + if(console) + console.gizmo = null + . = ..() + /obj/item/device/abductor/silencer name = "abductor silencer" desc = "A compact device used to shut down communications equipment." - icon = 'icons/obj/abductor.dmi' icon_state = "silencer" item_state = "gizmo" origin_tech = "materials=4;programming=7;abductor=3" @@ -419,10 +454,10 @@ Congratulations! You are now trained for invasive xenobiology research!"} if(!C.handcuffed) C.handcuffed = new /obj/item/weapon/restraints/handcuffs/energy/used(C) C.update_handcuffed() - to_chat(user, "You handcuff [C].") + to_chat(user, "You restrain [C].") add_logs(user, C, "handcuffed") else - to_chat(user, "You fail to handcuff [C].") + to_chat(user, "You fail to restrain [C].") else to_chat(user, "[C] doesn't have two hands...") @@ -471,14 +506,33 @@ Congratulations! You are now trained for invasive xenobiology research!"} ..() switch(mode) if(BATON_STUN) - user <<"The baton is in stun mode." + to_chat(user, "The baton is in stun mode.") if(BATON_SLEEP) - user <<"The baton is in sleep inducement mode." + to_chat(user, "The baton is in sleep inducement mode.") if(BATON_CUFF) - user <<"The baton is in restraining mode." + to_chat(user, "The baton is in restraining mode.") if(BATON_PROBE) to_chat(user, "The baton is in probing mode.") +/obj/item/device/radio/headset/abductor + name = "alien headset" + desc = "An advanced alien headset designed to monitor communications of human space stations. Why does it have a microphone? No one knows." + origin_tech = "magnets=2;abductor=3" + icon = 'icons/obj/abductor.dmi' + icon_state = "abductor_headset" + item_state = "abductor_headset" + keyslot2 = new /obj/item/device/encryptionkey/heads/captain + +/obj/item/device/radio/headset/abductor/Initialize(mapload) + ..() + SET_SECONDARY_FLAG(src, BANG_PROTECT) + make_syndie() + +/obj/item/device/radio/headset/abductor/attackby(obj/item/weapon/W, mob/user, params) + if(istype(W, /obj/item/weapon/screwdriver)) + return // Stops humans from disassembling abductor headsets. + return ..() + /obj/item/weapon/scalpel/alien name = "alien scalpel" diff --git a/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm b/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm new file mode 100644 index 00000000000..c92fdddf26a --- /dev/null +++ b/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm @@ -0,0 +1,62 @@ +/datum/outfit/abductor + name = "Abductor Basic" + uniform = /obj/item/clothing/under/color/grey //they're greys gettit + shoes = /obj/item/clothing/shoes/combat + back = /obj/item/weapon/storage/backpack + ears = /obj/item/device/radio/headset/abductor + +/datum/outfit/abductor/proc/get_team_console(team_number) + for(var/obj/machinery/abductor/console/C in GLOB.machines) + if(C.team == team_number) + return C + +/datum/outfit/abductor/proc/link_to_console(mob/living/carbon/human/H, team_number) + if(!team_number && isabductor(H)) + var/datum/species/abductor/S = H.dna.species + team_number = S.team + + if(!team_number) + team_number = 1 + + var/obj/machinery/abductor/console/console = get_team_console(team_number) + if(console) + var/obj/item/clothing/suit/armor/abductor/vest/V = locate() in H + if(V) + console.AddVest(V) + V.flags |= NODROP + + var/obj/item/weapon/storage/backpack/B = locate() in H + if(B) + for(var/obj/item/device/abductor/gizmo/G in B.contents) + console.AddGizmo(G) + +/datum/outfit/abductor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + ..() + if(!visualsOnly) + link_to_console(H) + + +/datum/outfit/abductor/agent + name = "Abductor Agent" + head = /obj/item/clothing/head/helmet/abductor + suit = /obj/item/clothing/suit/armor/abductor/vest + suit_store = /obj/item/weapon/abductor_baton + belt = /obj/item/weapon/storage/belt/military/abductor/full + + backpack_contents = list( + /obj/item/weapon/gun/energy/alien = 1, + /obj/item/device/abductor/silencer = 1 + ) + +/datum/outfit/abductor/scientist + name = "Abductor Scientist" + + backpack_contents = list( + /obj/item/device/abductor/gizmo = 1 + ) + +/datum/outfit/abductor/scientist/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + ..() + if(!visualsOnly) + var/obj/item/weapon/implant/abductor/beamplant = new /obj/item/weapon/implant/abductor(H) + beamplant.implant(H) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/console.dm b/code/game/gamemodes/miniantags/abduction/machinery/console.dm index 2a23c374447..8ad8cc84747 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/console.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/console.dm @@ -7,7 +7,7 @@ //Console /obj/machinery/abductor/console - name = "Abductor console" + name = "abductor console" desc = "Ship command center." icon = 'icons/obj/abductor.dmi' icon_state = "console" @@ -32,7 +32,7 @@ var/dat = "" dat += "

Abductsoft 3000

" - if(experiment != null) + if(experiment) var/points = experiment.points var/credits = experiment.credits dat += "Collected Samples : [points]
" @@ -46,18 +46,18 @@ else dat += "NO EXPERIMENT MACHINE DETECTED
" - if(pad!=null) + if(pad) dat += "Emergency Teleporter System." dat += "Consider using primary observation console first." dat += "Activate Teleporter
" - if(gizmo!=null && gizmo.marked!=null) + if(gizmo && gizmo.marked) dat += "Retrieve Mark
" else dat += "Retrieve Mark
" else dat += "NO TELEPAD DETECTED
" - if(vest!=null) + if(vest) dat += "

Agent Vest Mode


" var/mode = vest.mode if(mode == VEST_STEALTH) @@ -88,7 +88,8 @@ else if(href_list["flip_vest"]) FlipVest() else if(href_list["toggle_vest"]) - toggle_vest() + if(vest) + vest.toggle_nodrop() else if(href_list["select_disguise"]) SelectDisguise() else if(href_list["dispense"]) @@ -105,23 +106,22 @@ Dispense(/obj/item/clothing/suit/armor/abductor/vest) updateUsrDialog() - /obj/machinery/abductor/console/proc/TeleporterRetrieve() - if(gizmo!=null && pad!=null && gizmo.marked) + if(pad && gizmo && gizmo.marked) pad.Retrieve(gizmo.marked) /obj/machinery/abductor/console/proc/TeleporterSend() - if(pad!=null) + if(pad) pad.Send() /obj/machinery/abductor/console/proc/FlipVest() - if(vest!=null) + if(vest) vest.flip_mode() /obj/machinery/abductor/console/proc/SelectDisguise(remote = 0) var/entry_name = input( "Choose Disguise", "Disguise") as null|anything in disguises var/datum/icon_snapshot/chosen = disguises[entry_name] - if(chosen && (remote || in_range(usr,src))) + if(chosen && vest && (remote || in_range(usr,src))) vest.SetDisguise(chosen) /obj/machinery/abductor/console/proc/SetDroppoint(turf/open/location,user) @@ -135,10 +135,10 @@ /obj/machinery/abductor/console/Initialize(mapload) - if(mapload) - return TRUE //wait for machines list ..() + return INITIALIZE_HINT_LATELOAD +/obj/machinery/abductor/console/LateInitialize() if(!team) return @@ -169,36 +169,48 @@ return disguises[entry.name] = entry +/obj/machinery/abductor/console/proc/AddGizmo(obj/item/device/abductor/gizmo/G) + if(G == gizmo && G.console == src) + return FALSE + + if(G.console) + G.console.gizmo = null + + gizmo = G + G.console = src + return TRUE + +/obj/machinery/abductor/console/proc/AddVest(obj/item/clothing/suit/armor/abductor/vest/V) + if(vest == V) + return FALSE + + for(var/obj/machinery/abductor/console/C in GLOB.machines) + if(C.vest == V) + C.vest = null + break + + vest = V + return TRUE + /obj/machinery/abductor/console/attackby(obj/O, mob/user, params) - if(istype(O, /obj/item/device/abductor/gizmo)) - var/obj/item/device/abductor/gizmo/G = O + if(istype(O, /obj/item/device/abductor/gizmo) && AddGizmo(O)) to_chat(user, "You link the tool to the console.") - gizmo = G - G.console = src - else if(istype(O, /obj/item/clothing/suit/armor/abductor/vest)) - var/obj/item/clothing/suit/armor/abductor/vest/V = O + else if(istype(O, /obj/item/clothing/suit/armor/abductor/vest) && AddVest(O)) to_chat(user, "You link the vest to the console.") - if(istype(vest)) - if(vest.flags & NODROP) - toggle_vest() - vest = V else return ..() + + /obj/machinery/abductor/console/proc/Dispense(item,cost=1) if(experiment && experiment.credits >= cost) experiment.credits -=cost say("Incoming supply!") + var/drop_location = loc if(pad) flick("alien-pad", pad) - new item(pad.loc) - else - new item(loc) + drop_location = pad.loc + new item(drop_location) + else say("Insufficent data!") - -/obj/machinery/abductor/console/proc/toggle_vest() - vest.flags ^= NODROP - var/mob/M = vest.loc - if(istype(M)) - to_chat(M, "[src] is now [vest.flags & NODROP ? "locked" : "unlocked"].") diff --git a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm index d006ba0f687..8cf9acac0ba 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm @@ -1,5 +1,5 @@ /obj/machinery/abductor/gland_dispenser - name = "Replacement Organ Storage" + name = "replacement organ storage" desc = "A tank filled with replacement organs." icon = 'icons/obj/abductor.dmi' icon_state = "dispenser" @@ -49,7 +49,7 @@ var/g_color = gland_colors[i] var/amount = amounts[i] dat += "[amount]" - if(item_count == 3) // Three boxes per line + if(item_count == 4) // Four boxes per line dat +="

" item_count = 0 var/datum/browser/popup = new(user, "glands", "Gland Dispenser", 200, 200) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm index 5f8ad3de9d6..083e610587a 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm @@ -47,8 +47,8 @@ icon_state = "teleport" duration = 80 -/obj/effect/overlay/temp/teleport_abductor/New() +/obj/effect/overlay/temp/teleport_abductor/Initialize() + . = ..() var/datum/effect_system/spark_spread/S = new S.set_up(10,0,loc) - S.start() - ..() \ No newline at end of file + S.start() \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index c6e6534667b..dbc12094d38 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -623,7 +623,7 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 10) chemicals -= 250 to_chat(src, "You send a jolt of energy to your host, reviving them!") victim.grab_ghost(force = TRUE) //brings the host back, no eggscape - victim <<"You bolt upright, gasping for breath!" + to_chat(victim, "You bolt upright, gasping for breath!") /mob/living/simple_animal/borer/verb/bond_brain() set category = "Borer" @@ -667,7 +667,7 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 10) if(!bonding) return if(docile) - src <<"You are feeling far too docile to do that." + to_chat(src, "You are feeling far too docile to do that.") return if(is_servant_of_ratvar(victim) || iscultist(victim) || victim.isloyal()) to_chat(src, "[victim]'s mind seems to be blocked by some unknown force!") diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 6ce04bed141..c6248b03cc2 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -527,9 +527,9 @@ icon_state = "disintegrate" duration = 10 -/obj/effect/overlay/temp/swarmer/disintegration/New() - playsound(src.loc, "sparks", 100, 1) - ..() +/obj/effect/overlay/temp/swarmer/disintegration/Initialize() + . = ..() + playsound(loc, "sparks", 100, 1) /obj/effect/overlay/temp/swarmer/dismantle icon_state = "dismantle" diff --git a/code/game/gamemodes/miniantags/monkey/monkey.dm b/code/game/gamemodes/miniantags/monkey/monkey.dm index ecb15bc2210..f9ea8dcc2cb 100644 --- a/code/game/gamemodes/miniantags/monkey/monkey.dm +++ b/code/game/gamemodes/miniantags/monkey/monkey.dm @@ -107,10 +107,10 @@ /datum/game_mode/monkey/declare_completion() if(check_monkey_victory()) - feedback_set_details("round_end_result","win - monkey win") - feedback_set("round_end_result",escaped_monkeys) + SSblackbox.set_details("round_end_result","win - monkey win") + SSblackbox.set_val("round_end_result",escaped_monkeys) to_chat(world, "The monkeys have overthrown their captors! Eeek eeeek!!") else - feedback_set_details("round_end_result","loss - staff stopped the monkeys") - feedback_set("round_end_result",escaped_monkeys) + SSblackbox.set_details("round_end_result","loss - staff stopped the monkeys") + SSblackbox.set_val("round_end_result",escaped_monkeys) to_chat(world, "The staff managed to contain the monkey infestation!") diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm index c3d06bfe2c5..53e92c639d6 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm @@ -92,7 +92,7 @@ playsound(user, 'sound/magic/Demon_consume.ogg', 50, 1) for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list) if(knownspell.type == /obj/effect/proc_holder/spell/bloodcrawl) - user <<"...and you don't feel any different." + to_chat(user, "...and you don't feel any different.") qdel(src) return user.visible_message("[user]'s eyes flare a deep crimson!", \ diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index d4d788e0490..b12dcc3bcc5 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -199,70 +199,70 @@ if(nuke_off_station == NUKE_SYNDICATE_BASE) - feedback_set_details("round_end_result","loss - syndicate nuked - disk secured") + SSblackbox.set_details("round_end_result","loss - syndicate nuked - disk secured") to_chat(world, "Humiliating Syndicate Defeat") to_chat(world, "The crew of [station_name()] gave [syndicate_name()] operatives back their bomb! The syndicate base was destroyed! Next time, don't lose the nuke!") SSticker.news_report = NUKE_SYNDICATE_BASE else if(!disk_rescued && station_was_nuked && !syndies_didnt_escape) - feedback_set_details("round_end_result","win - syndicate nuke") + SSblackbox.set_details("round_end_result","win - syndicate nuke") to_chat(world, "Syndicate Major Victory!") to_chat(world, "[syndicate_name()] operatives have destroyed [station_name()]!") SSticker.news_report = STATION_NUKED else if (!disk_rescued && station_was_nuked && syndies_didnt_escape) - feedback_set_details("round_end_result","halfwin - syndicate nuke - did not evacuate in time") + SSblackbox.set_details("round_end_result","halfwin - syndicate nuke - did not evacuate in time") to_chat(world, "Total Annihilation") to_chat(world, "[syndicate_name()] operatives destroyed [station_name()] but did not leave the area in time and got caught in the explosion. Next time, don't lose the disk!") SSticker.news_report = STATION_NUKED else if (!disk_rescued && !station_was_nuked && nuke_off_station && !syndies_didnt_escape) - feedback_set_details("round_end_result","halfwin - blew wrong station") + SSblackbox.set_details("round_end_result","halfwin - blew wrong station") to_chat(world, "Crew Minor Victory") to_chat(world, "[syndicate_name()] operatives secured the authentication disk but blew up something that wasn't [station_name()]. Next time, don't do that!") SSticker.news_report = NUKE_MISS else if (!disk_rescued && !station_was_nuked && nuke_off_station && syndies_didnt_escape) - feedback_set_details("round_end_result","halfwin - blew wrong station - did not evacuate in time") + SSblackbox.set_details("round_end_result","halfwin - blew wrong station - did not evacuate in time") to_chat(world, "[syndicate_name()] operatives have earned Darwin Award!") to_chat(world, "[syndicate_name()] operatives blew up something that wasn't [station_name()] and got caught in the explosion. Next time, don't do that!") SSticker.news_report = NUKE_MISS else if ((disk_rescued || SSshuttle.emergency.mode != SHUTTLE_ENDGAME) && are_operatives_dead()) - feedback_set_details("round_end_result","loss - evacuation - disk secured - syndi team dead") + SSblackbox.set_details("round_end_result","loss - evacuation - disk secured - syndi team dead") to_chat(world, "Crew Major Victory!") to_chat(world, "The Research Staff has saved the disk and killed the [syndicate_name()] Operatives") SSticker.news_report = OPERATIVES_KILLED else if (disk_rescued) - feedback_set_details("round_end_result","loss - evacuation - disk secured") + SSblackbox.set_details("round_end_result","loss - evacuation - disk secured") to_chat(world, "Crew Major Victory") to_chat(world, "The Research Staff has saved the disk and stopped the [syndicate_name()] Operatives!") SSticker.news_report = OPERATIVES_KILLED else if (!disk_rescued && are_operatives_dead()) - feedback_set_details("round_end_result","halfwin - evacuation - disk not secured") + SSblackbox.set_details("round_end_result","halfwin - evacuation - disk not secured") to_chat(world, "Neutral Victory!") to_chat(world, "The Research Staff failed to secure the authentication disk but did manage to kill most of the [syndicate_name()] Operatives!") SSticker.news_report = OPERATIVE_SKIRMISH else if (!disk_rescued && crew_evacuated) - feedback_set_details("round_end_result","halfwin - detonation averted") + SSblackbox.set_details("round_end_result","halfwin - detonation averted") to_chat(world, "Syndicate Minor Victory!") to_chat(world, "[syndicate_name()] operatives survived the assault but did not achieve the destruction of [station_name()]. Next time, don't lose the disk!") SSticker.news_report = OPERATIVE_SKIRMISH else if (!disk_rescued && !crew_evacuated) - feedback_set_details("round_end_result","halfwin - interrupted") + SSblackbox.set_details("round_end_result","halfwin - interrupted") to_chat(world, "Neutral Victory") to_chat(world, "Round was mysteriously interrupted!") diff --git a/code/game/gamemodes/nuclear/nuclear_challenge.dm b/code/game/gamemodes/nuclear/nuclear_challenge.dm index 3e47aa517de..cad958ee64e 100644 --- a/code/game/gamemodes/nuclear/nuclear_challenge.dm +++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm @@ -57,7 +57,7 @@ U.hidden_uplink.telecrystals = CHALLENGE_TELECRYSTALS U.hidden_uplink.set_gamemode(/datum/game_mode/nuclear) config.shuttle_refuel_delay = max(config.shuttle_refuel_delay, CHALLENGE_SHUTTLE_DELAY) - feedback_set("nuclear_challenge_mode",1) + SSblackbox.set_val("nuclear_challenge_mode",1) qdel(src) /obj/item/device/nuclear_challenge/proc/check_allowed(mob/living/user) diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 575db19f5ce..1f01b38860d 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -37,8 +37,8 @@ var/previous_level = "" var/obj/item/nuke_core/core = null var/deconstruction_state = NUKESTATE_INTACT - var/image/lights = null - var/image/interior = null + var/lights = "" + var/interior = "" var/obj/effect/countdown/nuclearbomb/countdown var/static/bomb_set @@ -201,30 +201,32 @@ cut_overlay(interior) switch(deconstruction_state) if(NUKESTATE_UNSCREWED) - interior = image(icon,"panel-unscrewed") + interior = "panel-unscrewed" if(NUKESTATE_PANEL_REMOVED) - interior = image(icon,"panel-removed") + interior = "panel-removed" if(NUKESTATE_WELDED) - interior = image(icon,"plate-welded") + interior = "plate-welded" if(NUKESTATE_CORE_EXPOSED) - interior = image(icon,"plate-removed") + interior = "plate-removed" if(NUKESTATE_CORE_REMOVED) - interior = image(icon,"core-removed") + interior = "core-removed" if(NUKESTATE_INTACT) - interior = null + return add_overlay(interior) /obj/machinery/nuclearbomb/proc/update_icon_lights() - cut_overlay(lights) + if(lights) + cut_overlay(lights) switch(get_nuke_state()) if(NUKE_OFF_LOCKED) - lights = null + lights = "" + return if(NUKE_OFF_UNLOCKED) - lights = image(icon,"lights-safety") + lights = "lights-safety" if(NUKE_ON_TIMING) - lights = image(icon,"lights-timing") + lights = "lights-timing" if(NUKE_ON_EXPLODING) - lights = image(icon,"lights-exploding") + lights = "lights-exploding" add_overlay(lights) /obj/machinery/nuclearbomb/process() diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index c082a482247..6ac0ab8c7c6 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -654,7 +654,7 @@ GLOBAL_LIST_EMPTY(possible_items_special) for(var/mob/dead/new_player/P in GLOB.player_list) if(P.client && P.ready && P.mind!=owner) n_p ++ - else if (SSticker.current_state == GAME_STATE_PLAYING) + else if (SSticker.IsRoundInProgress()) for(var/mob/living/carbon/human/P in GLOB.player_list) if(P.client && !(P.mind in SSticker.mode.changelings) && P.mind!=owner) n_p ++ diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 634c68e89ad..7a31d1f3cdf 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -345,13 +345,13 @@ ////////////////////////////////////////////////////////////////////// /datum/game_mode/revolution/declare_completion() if(finished == 1) - feedback_set_details("round_end_result","win - heads killed") + SSblackbox.set_details("round_end_result","win - heads killed") to_chat(world, "The heads of staff were killed or exiled! The revolutionaries win!") SSticker.news_report = REVS_WIN else if(finished == 2) - feedback_set_details("round_end_result","loss - rev heads killed") + SSblackbox.set_details("round_end_result","loss - rev heads killed") to_chat(world, "The heads of staff managed to stop the revolution!") SSticker.news_report = REVS_LOSE diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 579ca3a7138..196a08ba9f0 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -260,10 +260,10 @@ for(var/datum/objective/objective in traitor.objectives) if(objective.check_completion()) objectives += "
Objective #[count]: [objective.explanation_text] Success!" - feedback_add_details("traitor_objective","[objective.type]|SUCCESS") + SSblackbox.add_details("traitor_objective","[objective.type]|SUCCESS") else objectives += "
Objective #[count]: [objective.explanation_text] Fail." - feedback_add_details("traitor_objective","[objective.type]|FAIL") + SSblackbox.add_details("traitor_objective","[objective.type]|FAIL") traitorwin = 0 count++ @@ -283,10 +283,10 @@ if(traitorwin) text += "
The [special_role_text] was successful!" - feedback_add_details("traitor_success","SUCCESS") + SSblackbox.add_details("traitor_success","SUCCESS") else text += "
The [special_role_text] has failed!" - feedback_add_details("traitor_success","FAIL") + SSblackbox.add_details("traitor_success","FAIL") text += "
" diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index ada94fb26f5..dde67fb664e 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -630,6 +630,6 @@ duration = 40 pixel_x = 500 -/obj/effect/overlay/temp/tornado/New(loc) - ..() +/obj/effect/overlay/temp/tornado/Initialize() + . = ..() animate(src, pixel_x = -500, time = 40) diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm index 01eb8a52c49..1eb51a95b46 100644 --- a/code/game/gamemodes/wizard/raginmages.dm +++ b/code/game/gamemodes/wizard/raginmages.dm @@ -132,7 +132,7 @@ /datum/game_mode/wizard/raginmages/declare_completion() if(finished) - feedback_set_details("round_end_result","loss - wizard killed") + SSblackbox.set_details("round_end_result","loss - wizard killed") to_chat(world, "The crew has managed to hold off the wizard attack! The Space Wizards Federation has been taught a lesson they will not soon forget!") ..(1) diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index fbd9130594c..d13671885c7 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -57,10 +57,10 @@ aspell.name = "Instant [aspell.name]" if(aspell.spell_level >= aspell.level_max) to_chat(user, "This spell cannot be strengthened any further.") - feedback_add_details("wizard_spell_improved", "[name]|[aspell.level]") + SSblackbox.add_details("wizard_spell_improved", "[name]|[aspell.level]") return 1 //No same spell found - just learn it - feedback_add_details("wizard_spell_learned", name) + SSblackbox.add_details("wizard_spell_learned", name) user.mind.AddSpell(S) to_chat(user, "You have learned [S.name].") return 1 @@ -109,6 +109,7 @@ /datum/spellbook_entry/rod_form name = "Rod Form" spell_type = /obj/effect/proc_holder/spell/targeted/rod_form + cost = 3 /datum/spellbook_entry/magicm name = "Magic Missile" @@ -265,7 +266,7 @@ /datum/spellbook_entry/item/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book) new item_path(get_turf(user)) - feedback_add_details("wizard_spell_learned", name) + SSblackbox.add_details("wizard_spell_learned", name) return 1 /datum/spellbook_entry/item/GetInfo() @@ -464,7 +465,7 @@ return TRUE /datum/spellbook_entry/summon/ghosts/Buy(mob/living/carbon/human/user, obj/item/weapon/spellbook/book) - feedback_add_details("wizard_spell_learned", name) + SSblackbox.add_details("wizard_spell_learned", name) new /datum/round_event/wizard/ghost() active = TRUE to_chat(user, "You have cast summon ghosts!") @@ -481,7 +482,7 @@ return (SSticker.mode.name != "ragin' mages" && !config.no_summon_guns) /datum/spellbook_entry/summon/guns/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book) - feedback_add_details("wizard_spell_learned", name) + SSblackbox.add_details("wizard_spell_learned", name) rightandwrong(0, user, 25) active = 1 playsound(get_turf(user), 'sound/magic/CastSummon.ogg', 50, 1) @@ -498,7 +499,7 @@ return (SSticker.mode.name != "ragin' mages" && !config.no_summon_magic) /datum/spellbook_entry/summon/magic/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book) - feedback_add_details("wizard_spell_learned", name) + SSblackbox.add_details("wizard_spell_learned", name) rightandwrong(1, user, 25) active = 1 playsound(get_turf(user), 'sound/magic/CastSummon.ogg', 50, 1) @@ -516,7 +517,7 @@ return (SSticker.mode.name != "ragin' mages" && !config.no_summon_events) /datum/spellbook_entry/summon/events/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book) - feedback_add_details("wizard_spell_learned", name) + SSblackbox.add_details("wizard_spell_learned", name) summonevents() times++ playsound(get_turf(user), 'sound/magic/CastSummon.ogg', 50, 1) diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 28921be6727..4ff888fa900 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -176,7 +176,7 @@ /datum/game_mode/wizard/declare_completion() if(finished) - feedback_set_details("round_end_result","loss - wizard killed") + SSblackbox.set_details("round_end_result","loss - wizard killed") to_chat(world, "The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!") SSticker.news_report = WIZARD_KILLED @@ -208,19 +208,19 @@ for(var/datum/objective/objective in wizard.objectives) if(objective.check_completion()) text += "
Objective #[count]: [objective.explanation_text] Success!" - feedback_add_details("wizard_objective","[objective.type]|SUCCESS") + SSblackbox.add_details("wizard_objective","[objective.type]|SUCCESS") else text += "
Objective #[count]: [objective.explanation_text] Fail." - feedback_add_details("wizard_objective","[objective.type]|FAIL") + SSblackbox.add_details("wizard_objective","[objective.type]|FAIL") wizardwin = 0 count++ if(wizard.current && wizard.current.stat!=2 && wizardwin) text += "
The wizard was successful!" - feedback_add_details("wizard_success","SUCCESS") + SSblackbox.add_details("wizard_success","SUCCESS") else text += "
The wizard has failed!" - feedback_add_details("wizard_success","FAIL") + SSblackbox.add_details("wizard_success","FAIL") if(wizard.spell_list.len>0) text += "
[wizard.name] used the following spells: " var/i = 1 diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 3391267f26d..2eb3f18af81 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -204,11 +204,13 @@ clonemind.transfer_to(H) - H.grab_ghost() - to_chat(H, "Consciousness slowly creeps over you as your body regenerates.
So this is what cloning feels like?
") + if(grab_ghost_when == CLONER_FRESH_CLONE) + H.grab_ghost() + to_chat(H, "Consciousness slowly creeps over you as your body regenerates.
So this is what cloning feels like?
") if(grab_ghost_when == CLONER_MATURE_CLONE) - addtimer(CALLBACK(src, .proc/occupant_dreams), 100) + H.ghostize(TRUE) //Only does anything if they were still in their old body and not already a ghost + to_chat(H.get_ghost(TRUE), "Your body is beginning to regenerate in a cloning pod. You will become conscious when it is complete.") if(H) H.faction |= factions @@ -219,11 +221,6 @@ attempting = FALSE return TRUE -/obj/machinery/clonepod/proc/occupant_dreams() - if(occupant) - to_chat(occupant, "While your body grows, you have the strangest dream, like you can see yourself from the outside.") - occupant.ghostize(TRUE) - //Grow clones to maturity then kick them out. FREELOADERS /obj/machinery/clonepod/process() @@ -317,7 +314,7 @@ return else connected_message("Authorized Ejection") - SPEAK("An authorized ejection of [occupant.real_name] has occurred.") + SPEAK("An authorized ejection of [clonemind.name] has occurred.") to_chat(user, "You force an emergency ejection. ") go_out() else @@ -370,6 +367,8 @@ SPEAK("Critical error! Please contact a Thinktronic Systems \ technician, as your warranty may be affected.") mess = TRUE + for(var/obj/item/O in unattached_flesh) + qdel(O) icon_state = "pod_g" if(occupant.mind != clonemind) clonemind.transfer_to(occupant) @@ -385,9 +384,9 @@ go_out() /obj/machinery/clonepod/emp_act(severity) - if(prob(100/(severity*efficiency))) + if((occupant || mess) && prob(100/(severity*efficiency))) connected_message(Gibberish("EMP-caused Accidental Ejection", 0)) - SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of [occupant.real_name] prematurely." ,0)) + SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of [clonemind.name] prematurely." ,0)) go_out() ..() diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index 39bd31bdb7b..0c1b870771b 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -96,7 +96,6 @@ return if(!usr || !usr.canUseTopic(src) || usr.incapacitated() || stat || QDELETED(src)) return - var/image/I = image(src) //For feedback message flavor if(href_list["authenticate"]) var/obj/item/weapon/card/id/ID = usr.get_active_held_item() if(!istype(ID)) @@ -109,7 +108,7 @@ if(!authenticated) //Check for emags var/obj/item/weapon/card/emag/E = usr.get_active_held_item() if(E && istype(E) && usr.Adjacent(src)) - usr << "You bypass [src]'s access requirements using your emag." + to_chat(usr, "You bypass [src]'s access requirements using your emag.") authenticated = TRUE log_activity("logged in") //Auth ID doesn't change, hinting that it was illicit if(href_list["log_out"]) @@ -117,24 +116,24 @@ authenticated = FALSE auth_id = "\[NULL\]" if(href_list["restore_logging"]) - to_chat(usr, "\icon[I] Logging functionality restored from backup data.") + to_chat(usr, "\icon[src] Logging functionality restored from backup data.") emagged = FALSE LAZYADD(logs, "-=- Logging restored to full functionality at this point -=-") if(href_list["access_apc"]) playsound(src, "terminal_type", 50, 0) var/obj/machinery/power/apc/APC = locate(href_list["access_apc"]) in GLOB.apcs_list if(!APC || APC.aidisabled || APC.panel_open || QDELETED(APC)) - to_chat(usr, "\icon[I] APC does not return interface request. Remote access may be disabled.") + to_chat(usr, "\icon[src] APC does not return interface request. Remote access may be disabled.") return if(active_apc) - to_chat(usr, "\icon[I] Disconnected from [active_apc].") + to_chat(usr, "\icon[src] Disconnected from [active_apc].") active_apc.say("Remote access canceled. Interface locked.") playsound(active_apc, 'sound/machines/BoltsDown.ogg', 25, 0) playsound(active_apc, 'sound/machines/terminal_alert.ogg', 50, 0) active_apc.locked = TRUE active_apc.update_icon() active_apc = null - to_chat(usr, "\icon[I] Connected to APC in [get_area(APC)]. Interface request sent.") + to_chat(usr, "\icon[src] Connected to APC in [get_area(APC)]. Interface request sent.") log_activity("remotely accessed APC in [get_area(APC)]") APC.interact(usr, GLOB.not_incapacitated_state) playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 514cf590aff..643282ab4a6 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -234,7 +234,7 @@ playsound(loc, 'sound/arcade/Win.ogg', 50, 1, extrarange = -3, falloff = 10) if(emagged) - feedback_inc("arcade_win_emagged") + SSblackbox.inc("arcade_win_emagged") new /obj/effect/spawner/newbomb/timer/syndicate(loc) new /obj/item/clothing/head/collectable/petehat(loc) message_admins("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.") @@ -242,7 +242,7 @@ Reset() emagged = 0 else - feedback_inc("arcade_win_normal") + SSblackbox.inc("arcade_win_normal") prizevend() else if (emagged && (turtle >= 4)) @@ -264,10 +264,10 @@ temp = "You have been drained! GAME OVER" playsound(loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -3, falloff = 10) if(emagged) - feedback_inc("arcade_loss_mana_emagged") + SSblackbox.inc("arcade_loss_mana_emagged") usr.gib() else - feedback_inc("arcade_loss_mana_normal") + SSblackbox.inc("arcade_loss_mana_normal") else if ((enemy_hp <= 10) && (enemy_mp > 4)) temp = "[enemy_name] heals for 4 health!" @@ -286,10 +286,10 @@ temp = "You have been crushed! GAME OVER" playsound(loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -3, falloff = 10) if(emagged) - feedback_inc("arcade_loss_hp_emagged") + SSblackbox.inc("arcade_loss_hp_emagged") usr.gib() else - feedback_inc("arcade_loss_hp_normal") + SSblackbox.inc("arcade_loss_hp_normal") blocked = FALSE return diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 0f18a68bf89..21fe22ee58a 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -304,17 +304,17 @@ build_path = /obj/machinery/computer/gulag_teleporter_computer /obj/item/weapon/circuitboard/computer/rdconsole - name = "RD Console (Computer Board)" + name = "R&D Console (Computer Board)" build_path = /obj/machinery/computer/rdconsole/core /obj/item/weapon/circuitboard/computer/rdconsole/attackby(obj/item/I, mob/user, params) if(istype(I,/obj/item/weapon/screwdriver)) if(build_path == /obj/machinery/computer/rdconsole/core) - name = "RD Console - Robotics (Computer Board)" + name = "R&D Console - Robotics (Computer Board)" build_path = /obj/machinery/computer/rdconsole/robotics to_chat(user, "Access protocols successfully updated.") else - name = "RD Console (Computer Board)" + name = "R&D Console (Computer Board)" build_path = /obj/machinery/computer/rdconsole/core to_chat(user, "Defaulting access protocols.") else diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 5f0299be0ea..a65c30a4e6a 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -532,7 +532,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) else SSjob.prioritized_jobs += j prioritycount++ - usr << "[j.title] has been successfully [priority ? "prioritized" : "unprioritized"]. Potential employees will notice your request." + to_chat(usr, "[j.title] has been successfully [priority ? "prioritized" : "unprioritized"]. Potential employees will notice your request.") playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) if ("print") diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index f4d13c029b8..193d7f8b276 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -115,9 +115,9 @@ message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].") switch(GLOB.security_level) if(SEC_LEVEL_GREEN) - feedback_inc("alert_comms_green",1) + SSblackbox.inc("alert_comms_green",1) if(SEC_LEVEL_BLUE) - feedback_inc("alert_comms_blue",1) + SSblackbox.inc("alert_comms_blue",1) tmp_alertlevel = 0 else to_chat(usr, "You are not authorized to do this!") @@ -176,7 +176,7 @@ SSshuttle.points -= S.credit_cost minor_announce("[usr.name] has purchased [S.name] for [S.credit_cost] credits." , "Shuttle Purchase") message_admins("[key_name_admin(usr)] purchased [S.name].") - feedback_add_details("shuttle_purchase", S.name) + SSblackbox.add_details("shuttle_purchase", S.name) else to_chat(usr, "Something went wrong! The shuttle exchange system seems to be down.") else @@ -368,9 +368,9 @@ message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].") switch(GLOB.security_level) if(SEC_LEVEL_GREEN) - feedback_inc("alert_comms_green",1) + SSblackbox.inc("alert_comms_green",1) if(SEC_LEVEL_BLUE) - feedback_inc("alert_comms_blue",1) + SSblackbox.inc("alert_comms_blue",1) tmp_alertlevel = 0 src.aistate = STATE_DEFAULT if("ai-changeseclevel") diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 27ef955ccc5..7bc41bacc66 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -153,8 +153,8 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) U = H.w_uniform // Are the suit sensors on? - if (U.has_sensor && U.sensor_mode) - pos = H.z == 0 || U.sensor_mode == 3 ? get_turf(H) : null + if ((U.has_sensor > 0) && U.sensor_mode) + pos = H.z == 0 || U.sensor_mode == SENSOR_COORDS ? get_turf(H) : null // Special case: If the mob is inside an object confirm the z-level on turf level. if (H.z == 0 && (!pos || pos.z != z)) continue @@ -170,10 +170,10 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) assignment = "" ijob = 80 - if (U.sensor_mode >= 1) life_status = (!H.stat ? "true" : "false") + if (U.sensor_mode >= SENSOR_LIVING) life_status = (!H.stat ? "true" : "false") else life_status = null - if (U.sensor_mode >= 2) + if (U.sensor_mode >= SENSOR_VITALS) dam1 = round(H.getOxyLoss(),1) dam2 = round(H.getToxLoss(),1) dam3 = round(H.getFireLoss(),1) @@ -184,7 +184,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) dam3 = null dam4 = null - if (U.sensor_mode >= 3) + if (U.sensor_mode >= SENSOR_COORDS) if (!pos) pos = get_turf(H) var/area/player_area = get_area(H) diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 325243acbda..de27f4fbb4b 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -419,7 +419,7 @@ to_chat(H, "[bicon(customrecepient)] Message from [customsender] ([customjob]), \"[custommessage]\" (Reply)") log_pda("[usr]/([usr.ckey]) (PDA: [customsender]) sent \"[custommessage]\" to [customrecepient.owner]") customrecepient.cut_overlays() - customrecepient.add_overlay(image('icons/obj/pda.dmi', "pda-r")) + customrecepient.add_overlay(mutable_appearance('icons/obj/pda.dmi', "pda-r")) //Sender is faking as someone who exists else src.linkedServer.send_pda_message("[customrecepient.owner]", "[PDARec.owner]","[custommessage]") @@ -432,7 +432,7 @@ to_chat(H, "[bicon(customrecepient)] Message from [PDARec.owner] ([customjob]), \"[custommessage]\" (Reply)") log_pda("[usr]/([usr.ckey]) (PDA: [PDARec.owner]) sent \"[custommessage]\" to [customrecepient.owner]") customrecepient.cut_overlays() - customrecepient.add_overlay(image('icons/obj/pda.dmi', "pda-r")) + customrecepient.add_overlay(mutable_appearance('icons/obj/pda.dmi', "pda-r")) //Finally.. ResetMessage() diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 685b97614ca..8c935419a5b 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -11,7 +11,6 @@ req_access = list(GLOB.access_engine) var/active = FALSE var/list/rangers = list() - var/list/listeners = list() var/charge = 35 var/stop = 0 var/list/available = list() @@ -66,7 +65,7 @@ else icon_state = "disco0" ..() - + /obj/machinery/disco/interact(mob/user) if (!anchored) @@ -74,7 +73,7 @@ return if(!allowed(user)) to_chat(user,"Error: Access Denied - Message: Only the engineering department can be trusted with this kind of power.") - playsound(src, 'sound/misc/compiler-failure.ogg', 50, 1) + playsound_local(src,'sound/misc/compiler-failure.ogg', 25, 1) return if(!Adjacent(user) && !isAI(user)) return @@ -121,11 +120,7 @@ lights_spin() updateUsrDialog() else if(active) - active = FALSE - STOP_PROCESSING(SSobj, src) - update_icon() - dance_over() - stop = world.time + 300 + stop = 0 updateUsrDialog() if("select") if(active) @@ -316,7 +311,7 @@ sleep(selection.song_beat) -/obj/machinery/disco/proc/dance(var/mob/living/carbon/M) //Show your moves +/obj/machinery/disco/proc/dance(var/mob/living/M) //Show your moves switch(rand(0,9)) if(0 to 1) @@ -328,55 +323,64 @@ if(7 to 9) dance5(M) -/obj/machinery/disco/proc/dance2(var/mob/living/carbon/M) - set waitfor = 0 +/obj/machinery/disco/proc/dance2(var/mob/living/M) for(var/i = 1, i < 10, i++) - M.SpinAnimation(15,1) - M.setDir(pick(GLOB.cardinal)) - sleep(8) + for(var/d in list(NORTH,SOUTH,EAST,WEST,EAST,SOUTH,NORTH,SOUTH,EAST,WEST,EAST,SOUTH)) + M.setDir(d) + if(i == WEST) + M.emote("flip") + sleep(1) + sleep(20) -/obj/machinery/disco/proc/dance3(var/mob/living/carbon/M) +/obj/machinery/disco/proc/dance3(var/mob/living/M) var/matrix/initial_matrix = matrix(M.transform) - for(var/i in 1 to 6) + for (var/i in 1 to 75) if (!M) return - M.SpinAnimation(7,1) - M.setDir(pick(GLOB.cardinal)) - for (var/x in 1 to 12) - sleep(1) - if (!M) - return - if (i<5) + switch(i) + if (1 to 15) initial_matrix = matrix(M.transform) initial_matrix.Translate(0,1) animate(M, transform = initial_matrix, time = 1, loop = 0) - if (i>4) + if (16 to 30) initial_matrix = matrix(M.transform) - initial_matrix.Translate(0,-2) + initial_matrix.Translate(1,-1) animate(M, transform = initial_matrix, time = 1, loop = 0) - M.setDir(turn(M.dir, 90)) - switch (M.dir) - if (NORTH) - initial_matrix = matrix(M.transform) - initial_matrix.Translate(0,3) - animate(M, transform = initial_matrix, time = 1, loop = 0) - if (SOUTH) - initial_matrix = matrix(M.transform) - initial_matrix.Translate(0,-3) - animate(M, transform = initial_matrix, time = 1, loop = 0) - if (EAST) - initial_matrix = matrix(M.transform) - initial_matrix.Translate(3,0) - animate(M, transform = initial_matrix, time = 1, loop = 0) - if (WEST) - initial_matrix = matrix(M.transform) - initial_matrix.Translate(-3,0) - animate(M, transform = initial_matrix, time = 1, loop = 0) - sleep(10) - animate(M, transform = null, time = 1, loop = 0) + if (31 to 45) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(-1,-1) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if (46 to 60) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(-1,1) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if (61 to 75) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(1,0) + animate(M, transform = initial_matrix, time = 1, loop = 0) + M.setDir(turn(M.dir, 90)) + switch (M.dir) + if (NORTH) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(0,3) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if (SOUTH) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(0,-3) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if (EAST) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(3,0) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if (WEST) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(-3,0) + animate(M, transform = initial_matrix, time = 1, loop = 0) + sleep (1) + M.lying_fix() -/obj/machinery/disco/proc/dance4(var/mob/living/carbon/M) +/obj/machinery/disco/proc/dance4(var/mob/living/M) var/speed = rand(1,3) set waitfor = 0 var/time = 30 @@ -387,8 +391,8 @@ M.lay_down(TRUE) time-- -/obj/machinery/disco/proc/dance5(var/mob/living/carbon/M) - INVOKE_ASYNC(M, .proc/dance5helper) +/obj/machinery/disco/proc/dance5(var/mob/living/M) + animate(M, transform = matrix(180, MATRIX_ROTATE), time = 1, loop = 0) var/matrix/initial_matrix = matrix(M.transform) for (var/i in 1 to 60) if (!M) @@ -420,59 +424,13 @@ initial_matrix.Translate(-3,0) animate(M, transform = initial_matrix, time = 1, loop = 0) sleep (1) - animate(M, transform = null, time = 1, loop = 0) + M.lying_fix() -/obj/machinery/disco/proc/dance5helper(var/mob/living/carbon/M) - if (M) - animate(M, transform = matrix(180, MATRIX_ROTATE), time = 1, loop = 0) - sleep (70) - if (M) - animate(M, transform = null, time = 1, loop = 0) -/mob/living/carbon/proc/dancey() // Dance5 except independent of the machine if admins want to meme it up - INVOKE_ASYNC(src, .proc/danceyhelper) - var/matrix/initial_matrix = matrix(transform) - for (var/i in 1 to 60) - if (!src) - return - if (i<31) - initial_matrix = matrix(transform) - initial_matrix.Translate(0,1) - transform = initial_matrix - animate(src, transform, time = 1, loop = 0) - if (i>30) - initial_matrix = matrix(transform) - initial_matrix.Translate(0,-1) - transform = initial_matrix - animate(src, transform, time = 1, loop = 0) - setDir(turn(src.dir, 90)) - switch (dir) - if (NORTH) - initial_matrix = matrix(transform) - initial_matrix.Translate(0,3) - animate(src, transform, time = 1, loop = 0) - if (SOUTH) - initial_matrix = matrix(transform) - initial_matrix.Translate(0,-3) - animate(src, transform, time = 1, loop = 0) - if (EAST) - initial_matrix = matrix(transform) - initial_matrix.Translate(3,0) - animate(src, transform, time = 1, loop = 0) - if (WEST) - initial_matrix = matrix(transform) - initial_matrix.Translate(-3,0) - animate(src, transform, time = 1, loop = 0) - sleep (1) + +/mob/living/proc/lying_fix() animate(src, transform = null, time = 1, loop = 0) - -/mob/living/carbon/proc/danceyhelper() - if (src) - animate(src, transform = matrix(180, MATRIX_ROTATE), time = 1, loop = 0) - sleep (70) - if (src) - animate(src, transform = null, time = 1, loop = 0) - + lying_prev = 0 /obj/machinery/disco/proc/dance_over() for(var/obj/item/device/flashlight/spotlight/SL in spotlights) @@ -481,35 +439,34 @@ for(var/obj/effect/overlay/sparkles/SP in sparkles) qdel(SP) sparkles.Cut() - rangers.Cut() - for(var/mob/living/L in listeners) + for(var/mob/living/L in rangers) if(!L || !L.client) continue L.stop_sound_channel(CHANNEL_JUKEBOX) - listeners.Cut() + rangers = list() + /obj/machinery/disco/process() if(charge<35) charge += 1 if(world.time < stop && active) - rangers = list() - for(var/mob/living/M in range(9,src)) - rangers += M - if(!(listeners[M])) + for(var/mob/M in range(10,src)) + if(!(M in rangers)) + rangers[M] = TRUE M.playsound_local(get_turf(M), selection.song_path, 100, channel = CHANNEL_JUKEBOX) - listeners[M] = TRUE - if(prob(5+(allowed(M)*4))) + if(prob(5+(allowed(M)*4)) && M.canmove) dance(M) - for(var/mob/living/L in listeners) - if(!(L in rangers)) - listeners -= L + for(var/mob/L in rangers) + if(get_dist(src,L) > 10) + rangers -= L if(!L || !L.client) continue L.stop_sound_channel(CHANNEL_JUKEBOX) else if(active) + active = FALSE STOP_PROCESSING(SSobj, src) dance_over() playsound(src,'sound/machines/terminal_off.ogg',50,1) - active = FALSE icon_state = "disco0" + stop = world.time + 100 diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index c8555e47ad2..a9331cd142f 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -366,13 +366,13 @@ set_airlock_overlays(state) /obj/machinery/door/airlock/proc/set_airlock_overlays(state) - var/image/frame_overlay - var/image/filling_overlay - var/image/lights_overlay - var/image/panel_overlay - var/image/weld_overlay - var/image/damag_overlay - var/image/sparks_overlay + var/mutable_appearance/frame_overlay + var/mutable_appearance/filling_overlay + var/mutable_appearance/lights_overlay + var/mutable_appearance/panel_overlay + var/mutable_appearance/weld_overlay + var/mutable_appearance/damag_overlay + var/mutable_appearance/sparks_overlay switch(state) if(AIRLOCK_CLOSED) @@ -494,10 +494,8 @@ pass(A) //suppress unused warning var/list/airlock_overlays = A.airlock_overlays var/iconkey = "[icon_state][icon_file]" - if(airlock_overlays[iconkey]) - return airlock_overlays[iconkey] - airlock_overlays[iconkey] = image(icon_file, icon_state) - return airlock_overlays[iconkey] + if((!(. = airlock_overlays[iconkey]))) + . = airlock_overlays[iconkey] = mutable_appearance(icon_file, icon_state) /obj/machinery/door/airlock/do_animate(animation) switch(animation) diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 607c6870ce3..18dde20df2d 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -184,7 +184,7 @@ if(maptext) maptext = "" cut_overlays() - add_overlay(image('icons/obj/status_display.dmi', icon_state=state)) + add_overlay(mutable_appearance('icons/obj/status_display.dmi', state)) //Checks to see if there's 1 line or 2, adds text-icons-numbers/letters over display diff --git a/code/game/machinery/embedded_controller/access_controller.dm b/code/game/machinery/embedded_controller/access_controller.dm index 8fcdc7c4a3a..c10cd5f6c8e 100644 --- a/code/game/machinery/embedded_controller/access_controller.dm +++ b/code/game/machinery/embedded_controller/access_controller.dm @@ -19,12 +19,12 @@ /obj/machinery/doorButtons/proc/findObjsByTag() return -/obj/machinery/doorButtons/Initialize(mapload) - if(mapload) - ..() - return TRUE - else - findObjsByTag() +/obj/machinery/doorButtons/Initialize() + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/doorButtons/LateInitialize() + findObjsByTag() /obj/machinery/doorButtons/emag_act(mob/user) if(!emagged) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index e4e1f7e75d8..0da04fbaa2d 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -36,27 +36,27 @@ else add_overlay("beakeridle") if(beaker.reagents.total_volume) - var/image/filling = image('icons/obj/iv_drip.dmi', src, "reagent") + var/mutable_appearance/filling_overlay = mutable_appearance('icons/obj/iv_drip.dmi', "reagent") var/percent = round((beaker.reagents.total_volume / beaker.volume) * 100) switch(percent) if(0 to 9) - filling.icon_state = "reagent0" + filling_overlay.icon_state = "reagent0" if(10 to 24) - filling.icon_state = "reagent10" + filling_overlay.icon_state = "reagent10" if(25 to 49) - filling.icon_state = "reagent25" + filling_overlay.icon_state = "reagent25" if(50 to 74) - filling.icon_state = "reagent50" + filling_overlay.icon_state = "reagent50" if(75 to 79) - filling.icon_state = "reagent75" + filling_overlay.icon_state = "reagent75" if(80 to 90) - filling.icon_state = "reagent80" + filling_overlay.icon_state = "reagent80" if(91 to INFINITY) - filling.icon_state = "reagent100" + filling_overlay.icon_state = "reagent100" - filling.icon += mix_color_from_reagents(beaker.reagents.reagent_list) - add_overlay(filling) + filling_overlay.color = list("#0000", "#0000", "#0000", "#000f", mix_color_from_reagents(beaker.reagents.reagent_list)) + add_overlay(filling_overlay) /obj/machinery/iv_drip/MouseDrop(mob/living/target) if(!ishuman(usr) || !usr.canUseTopic(src,BE_CLOSE) || !isliving(target)) @@ -200,7 +200,7 @@ if(beaker.reagents && beaker.reagents.reagent_list.len) to_chat(usr, "Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.") else - to_chat(usr, "Attached is an empty [beaker].") + to_chat(usr, "Attached is an empty [beaker.name].") else to_chat(usr, "No chemicals are attached.") diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index a50a2973fca..7c3251a1bec 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -535,7 +535,7 @@ GLOBAL_LIST_EMPTY(allCasters) if(choice=="Confirm") scan_user(usr) GLOB.news_network.CreateFeedChannel(channel_name, scanned_user, c_locked) - feedback_inc("newscaster_channels",1) + SSblackbox.inc("newscaster_channels",1) screen=5 updateUsrDialog() else if(href_list["set_channel_receiving"]) @@ -558,7 +558,7 @@ GLOBAL_LIST_EMPTY(allCasters) screen=6 else GLOB.news_network.SubmitArticle("[parsepencode(msg, usr, SIGNFONT)]", scanned_user, channel_name, photo, 0, allow_comments) - feedback_inc("newscaster_stories",1) + SSblackbox.inc("newscaster_stories",1) screen=4 msg = "" updateUsrDialog() @@ -850,7 +850,7 @@ GLOBAL_LIST_EMPTY(allCasters) return /obj/machinery/newscaster/proc/print_paper() - feedback_inc("newscaster_newspapers_printed",1) + SSblackbox.inc("newscaster_newspapers_printed",1) var/obj/item/weapon/newspaper/NEWSPAPER = new /obj/item/weapon/newspaper for(var/datum/newscaster/feed_channel/FC in GLOB.news_network.network_channels) NEWSPAPER.news_content += FC diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 11b21d275d3..74506b0c0f2 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -34,6 +34,7 @@ Buildable meters PIPE_CONNECTOR, \ PIPE_UVENT, \ PIPE_SCRUBBER, \ + PIPE_INJECTOR, \ PIPE_HEAT_EXCHANGE, \ \ PIPE_PUMP, \ @@ -93,6 +94,7 @@ GLOBAL_LIST_INIT(pipeID2State, list( "[PIPE_CONNECTOR]" = "connector", \ "[PIPE_UVENT]" = "uvent", \ "[PIPE_SCRUBBER]" = "scrubber", \ + "[PIPE_INJECTOR]" = "injector", \ "[PIPE_HEAT_EXCHANGE]" = "heunary", \ \ "[PIPE_PUMP]" = "pump", \ @@ -120,6 +122,7 @@ GLOBAL_LIST_INIT(pipeID2State, list( "[PIPE_CONNECTOR]" = "connector", \ "[PIPE_UVENT]" = "vent", \ "[PIPE_SCRUBBER]" = "scrubber", \ + "[PIPE_INJECTOR]" = "injector", \ "[PIPE_HEAT_EXCHANGE]" = "heat exchanger", \ \ "[PIPE_PUMP]" = "pump", \ diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 24ac822ad08..a91b1fbf0ec 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -146,7 +146,7 @@ /obj/machinery/status_display/proc/set_picture(state) picture_state = state remove_display() - add_overlay(image('icons/obj/status_display.dmi', icon_state=picture_state)) + add_overlay(picture_state) /obj/machinery/status_display/proc/update_display(line1, line2) var/new_text = {"
[line1]
[line2]
"} @@ -278,7 +278,7 @@ /obj/machinery/ai_status_display/proc/set_picture(state) picture_state = state cut_overlays() - add_overlay(image('icons/obj/status_display.dmi', icon_state=picture_state)) + add_overlay(picture_state) #undef CHARS_PER_LINE #undef FOND_SIZE diff --git a/code/game/machinery/telecomms/broadcasting.dm b/code/game/machinery/telecomms/broadcasting.dm index e7e3d67c375..f9d0fd6a9d9 100644 --- a/code/game/machinery/telecomms/broadcasting.dm +++ b/code/game/machinery/telecomms/broadcasting.dm @@ -144,30 +144,7 @@ // --- This following recording is intended for research and feedback in the use of department radio channels --- var/blackbox_msg = "[AM] [AM.say_quote(message, spans)]" - if(istype(GLOB.blackbox)) - switch(freq) - if(1459) - GLOB.blackbox.msg_common += blackbox_msg - if(1351) - GLOB.blackbox.msg_science += blackbox_msg - if(1353) - GLOB.blackbox.msg_command += blackbox_msg - if(1355) - GLOB.blackbox.msg_medical += blackbox_msg - if(1357) - GLOB.blackbox.msg_engineering += blackbox_msg - if(1359) - GLOB.blackbox.msg_security += blackbox_msg - if(1441) - GLOB.blackbox.msg_deathsquad += blackbox_msg - if(1213) - GLOB.blackbox.msg_syndicate += blackbox_msg - if(1349) - GLOB.blackbox.msg_service += blackbox_msg - if(1347) - GLOB.blackbox.msg_cargo += blackbox_msg - else - GLOB.blackbox.messages += blackbox_msg + SSblackbox.LogBroadcast(blackbox_msg, freq) sleep(50) if(!QDELETED(virt)) //It could happen to YOU diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index a05a5af3755..fea3b90390b 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -297,7 +297,7 @@ to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.") cut_overlays() if(panel_open) - add_overlay(image(icon, "[initial(icon_state)]-panel")) + add_overlay("[initial(icon_state)]-panel") playsound(src.loc, W.usesound, 50, 1) updateUsrDialog() else @@ -528,7 +528,7 @@ if(icon_vend) //Show the vending animation if needed flick(icon_vend,src) new R.product_path(get_turf(src)) - feedback_add_details("vending_machine_usage","[src.type]|[R.product_path]") + SSblackbox.add_details("vending_machine_usage","[src.type]|[R.product_path]") vend_ready = 1 return diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 46ae55e9b82..40b973c5969 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -186,7 +186,7 @@ var/full = contents.len ? 1 : 0 icon_state = "wm_[state_open]_[full]" if(panel_open) - add_overlay(image(icon, icon_state = "wm_panel")) + add_overlay("wm_panel") /obj/machinery/washing_machine/attackby(obj/item/weapon/W, mob/user, params) if(default_deconstruction_screwdriver(user, null, null, W)) diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index def75d510e4..5b67cbf0182 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -277,7 +277,7 @@ /datum/construction/reversible/mecha/ripley/spawn_result() ..() - feedback_inc("mecha_ripley_created",1) + SSblackbox.inc("mecha_ripley_created",1) return @@ -564,7 +564,7 @@ var/obj/mecha/combat/gygax/M = new result(get_turf(holder)) M.CheckParts(holder.contents) qdel(holder) - feedback_inc("mecha_gygax_created",1) + SSblackbox.inc("mecha_gygax_created",1) return /datum/construction/mecha/firefighter_chassis @@ -786,7 +786,7 @@ /datum/construction/reversible/mecha/firefighter/spawn_result() ..() - feedback_inc("mecha_firefighter_created",1) + SSblackbox.inc("mecha_firefighter_created",1) return @@ -864,7 +864,7 @@ /datum/construction/mecha/honker/spawn_result() ..() - feedback_inc("mecha_honker_created",1) + SSblackbox.inc("mecha_honker_created",1) return /datum/construction/mecha/durand_chassis @@ -1149,7 +1149,7 @@ var/obj/mecha/combat/gygax/M = new result(get_turf(holder)) M.CheckParts(holder.contents) qdel(holder) - feedback_inc("mecha_durand_created",1) + SSblackbox.inc("mecha_durand_created",1) return //PHAZON @@ -1481,7 +1481,7 @@ var/obj/mecha/combat/gygax/M = new result(get_turf(holder)) M.CheckParts(holder.contents) qdel(holder) - feedback_inc("mecha_phazon_created",1) + SSblackbox.inc("mecha_phazon_created",1) return //ODYSSEUS @@ -1692,5 +1692,5 @@ /datum/construction/reversible/mecha/odysseus/spawn_result() ..() - feedback_inc("mecha_odysseus_created",1) + SSblackbox.inc("mecha_odysseus_created",1) return diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index 667f5896406..950f6eaafbc 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -23,7 +23,7 @@ AI.apply_damage(150, BURN) //Give the AI a bit of damage from the "shock" of being suddenly shut down AI.death() //The damage is not enough to kill the AI, but to be 'corrupted files' in need of repair. AI.forceMove(src) //Put the dead AI inside the wreckage for recovery - add_overlay(image('icons/obj/projectiles.dmi', icon_state = "green_laser")) //Overlay for the recovery beacon + add_overlay(mutable_appearance('icons/obj/projectiles.dmi', "green_laser")) //Overlay for the recovery beacon AI.controlled_mech = null AI.remote_control = null diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 8b855c7c3d2..6539ab64563 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -48,9 +48,9 @@ if (hides) cut_overlays() if(hides < 3) - add_overlay(image("icon" = "mecha.dmi", "icon_state" = occupant ? "ripley-g" : "ripley-g-open")) + add_overlay(occupant ? "ripley-g" : "ripley-g-open") else - add_overlay(image("icon" = "mecha.dmi", "icon_state" = occupant ? "ripley-g-full" : "ripley-g-full-open")) + add_overlay(occupant ? "ripley-g-full" : "ripley-g-full-open") /obj/mecha/working/ripley/firefighter diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index d367bf7be15..2d2e5fff397 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -161,23 +161,15 @@ for(var/Ddir in GLOB.cardinal) if(entered_dirs & Ddir) - var/image/I - if(GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"]) - I = GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"] - else - I = image(icon,"[blood_state]1",dir = Ddir) - GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"] = I - if(I) - add_overlay(I) + var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"] + if(!bloodstep_overlay) + GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[blood_state]1", dir = Ddir) + add_overlay(bloodstep_overlay) if(exited_dirs & Ddir) - var/image/I - if(GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"]) - I = GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"] - else - I = image(icon,"[blood_state]2",dir = Ddir) - GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"] = I - if(I) - add_overlay(I) + var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"] + if(!bloodstep_overlay) + GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[blood_state]2", dir = Ddir) + add_overlay(bloodstep_overlay) alpha = BLOODY_FOOTPRINT_BASE_ALPHA+bloodiness diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 3d62e850e84..3935b86c92c 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -31,11 +31,10 @@ . = ..() deltimer(timerid) -/obj/effect/overlay/temp/New() - ..() +/obj/effect/overlay/temp/Initialize() + . = ..() if(randomdir) setDir(pick(GLOB.cardinal)) - flick("[icon_state]", src) //Because we might be pulling it from a pool, flick whatever icon it uses so it starts at the start of the icon's animation. timerid = QDEL_IN(src, duration) @@ -45,10 +44,10 @@ /obj/effect/overlay/temp/dir_setting randomdir = FALSE -/obj/effect/overlay/temp/dir_setting/New(loc, set_dir) +/obj/effect/overlay/temp/dir_setting/Initialize(mapload, set_dir) if(set_dir) setDir(set_dir) - ..() + . = ..() /obj/effect/overlay/temp/dir_setting/bloodsplatter icon = 'icons/effects/blood.dmi' @@ -57,12 +56,12 @@ layer = BELOW_MOB_LAYER var/splatter_type = "splatter" -/obj/effect/overlay/temp/dir_setting/bloodsplatter/New(loc, set_dir) +/obj/effect/overlay/temp/dir_setting/bloodsplatter/Initialize(mapload, set_dir) if(set_dir in GLOB.diagonals) icon_state = "[splatter_type][pick(1, 2, 6)]" else icon_state = "[splatter_type][pick(3, 4, 5)]" - ..() + . = ..() var/target_pixel_x = 0 var/target_pixel_y = 0 switch(set_dir) @@ -94,6 +93,13 @@ /obj/effect/overlay/temp/dir_setting/bloodsplatter/xenosplatter splatter_type = "xsplatter" +/obj/effect/overlay/temp/dir_setting/speedbike_trail + name = "speedbike trails" + icon_state = "ion_fade" + layer = BELOW_MOB_LAYER + duration = 10 + randomdir = 0 + /obj/effect/overlay/temp/dir_setting/firing_effect icon = 'icons/effects/effects.dmi' icon_state = "firing_effect" @@ -190,8 +196,8 @@ desc = "It's a decoy!" duration = 15 -/obj/effect/overlay/temp/decoy/New(loc, atom/mimiced_atom) - ..() +/obj/effect/overlay/temp/decoy/Initialize(mapload, atom/mimiced_atom) + . = ..() alpha = initial(alpha) if(mimiced_atom) name = mimiced_atom.name @@ -199,8 +205,8 @@ setDir(mimiced_atom.dir) mouse_opacity = 0 -/obj/effect/overlay/temp/decoy/fading/New(loc, atom/mimiced_atom) - ..() +/obj/effect/overlay/temp/decoy/fading/Initialize(mapload, atom/mimiced_atom) + . = ..() animate(src, alpha = 0, time = duration) /obj/effect/overlay/temp/decoy/fading/fivesecond @@ -214,7 +220,7 @@ icon = 'icons/effects/fire.dmi' icon_state = "3" duration = 20 - + /obj/effect/overlay/temp/cult randomdir = 0 duration = 10 @@ -325,15 +331,15 @@ var/mob/user var/damage = 20 -/obj/effect/overlay/temp/ratvar/volt_hit/New(loc, caster, multiplier) +/obj/effect/overlay/temp/ratvar/volt_hit/Initialize(mapload, caster, multiplier) if(multiplier) damage *= multiplier duration = max(round(damage * 0.2), 1) - ..() + . = ..() set_light(1.5, 2, LIGHT_COLOR_ORANGE) -/obj/effect/overlay/temp/ratvar/volt_hit/true/New(loc, caster, multiplier) - ..() +/obj/effect/overlay/temp/ratvar/volt_hit/true/Initialize(mapload, caster, multiplier) + . = ..() user = caster if(user) var/matrix/M = new @@ -377,8 +383,8 @@ icon_state = "warden_gaze" duration = 3 -/obj/effect/overlay/temp/ratvar/ocular_warden/New() - ..() +/obj/effect/overlay/temp/ratvar/ocular_warden/Initialize() + . = ..() pixel_x = rand(-8, 8) pixel_y = rand(-10, 10) animate(src, alpha = 0, time = 3, easing = EASE_OUT) @@ -402,8 +408,8 @@ layer = ABOVE_MOB_LAYER duration = 10 -/obj/effect/overlay/temp/ratvar/component/New() - ..() +/obj/effect/overlay/temp/ratvar/component/Initialize() + . = ..() transform = matrix()*0.75 pixel_x = rand(-10, 10) pixel_y = rand(-10, -2) @@ -433,9 +439,8 @@ light_power = 2 light_color = "#FAE48C" -/obj/effect/overlay/temp/ratvar/sigil/transgression/New() - ..() - update_light() +/obj/effect/overlay/temp/ratvar/sigil/transgression/Initialize() + . = ..() var/oldtransform = transform animate(src, transform = matrix()*2, time = 5) animate(transform = oldtransform, alpha = 0, time = 65) @@ -448,10 +453,6 @@ light_power = 0.5 light_color = "#1E8CE1" -/obj/effect/overlay/temp/ratvar/sigil/vitality/New() - ..() - update_light() - /obj/effect/overlay/temp/ratvar/sigil/accession color = "#AF0AAF" layer = ABOVE_MOB_LAYER @@ -494,9 +495,9 @@ icon = 'icons/mob/mob.dmi' duration = 15 -/obj/effect/overlay/temp/gib_animation/New(loc, gib_icon) +/obj/effect/overlay/temp/gib_animation/Initialize(mapload, gib_icon) icon_state = gib_icon // Needs to be before ..() so icon is correct - ..() + . = ..() /obj/effect/overlay/temp/gib_animation/ex_act(severity) return //so the overlay isn't deleted by the explosion that gibbed the mob. @@ -508,9 +509,9 @@ icon = 'icons/mob/mob.dmi' duration = 15 -/obj/effect/overlay/temp/dust_animation/New(loc, dust_icon) +/obj/effect/overlay/temp/dust_animation/Initialize(mapload, dust_icon) icon_state = dust_icon // Before ..() so the correct icon is flick()'d - ..() + . = ..() /obj/effect/overlay/temp/mummy_animation icon = 'icons/mob/mob.dmi' @@ -522,12 +523,12 @@ icon_state = "heal" duration = 15 -/obj/effect/overlay/temp/heal/New(loc, colour) - ..() - pixel_x = rand(-12, 12) - pixel_y = rand(-9, 0) +/obj/effect/overlay/temp/heal/Initialize(mapload, colour) if(colour) color = colour + . = ..() + pixel_x = rand(-12, 12) + pixel_y = rand(-9, 0) /obj/effect/overlay/temp/kinetic_blast name = "kinetic explosion" @@ -559,14 +560,14 @@ icon_state = "impact_bullet" duration = 5 -/obj/effect/overlay/temp/impact_effect/New(loc, atom/target, obj/item/projectile/P) +/obj/effect/overlay/temp/impact_effect/Initialize(mapload, atom/target, obj/item/projectile/P) if(target == P.original) //the projectile hit the target originally clicked pixel_x = P.p_x + target.pixel_x - 16 + rand(-4,4) pixel_y = P.p_y + target.pixel_y - 16 + rand(-4,4) else pixel_x = target.pixel_x + rand(-4,4) pixel_y = target.pixel_y + rand(-4,4) - ..() + . = ..() /obj/effect/overlay/temp/impact_effect/red_laser icon_state = "impact_laser" diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index d1f7522e216..28388d656d3 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1,4 +1,4 @@ -GLOBAL_DATUM_INIT(fire_overlay, /image, image("icon" = 'icons/effects/fire.dmi', "icon_state" = "fire")) +GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/effects/fire.dmi', "fire")) GLOBAL_VAR_INIT(rpg_loot_items, FALSE) // if true, everyone item when created will have its name changed to be diff --git a/code/game/objects/items/charter.dm b/code/game/objects/items/charter.dm index 41a793df301..0cf73fd9ff6 100644 --- a/code/game/objects/items/charter.dm +++ b/code/game/objects/items/charter.dm @@ -86,7 +86,7 @@ name = "station charter for [station_name()]" desc = "An official document entrusting the governance of \ [station_name()] and surrounding space to Captain [uname]." - feedback_set_details("station_renames","[station_name()]") + SSblackbox.set_details("station_renames","[station_name()]") if(!unlimited_uses) used = TRUE diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 098d3371233..af8b9341f94 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -465,11 +465,13 @@ icon_state = "crayonblack" paint_color = "#1C1C1C" //Not completely black because total black looks bad. So Mostly Black. item_color = "black" + reagent_contents = list("nutriment" = 1, "blackcrayonpowder" = 1) /obj/item/toy/crayon/white icon_state = "crayonwhite" paint_color = "#FFFFFF" item_color = "white" + reagent_contents = list("nutriment" = 1, "whitecrayonpowder" = 1) /obj/item/toy/crayon/mime icon_state = "crayonmime" @@ -521,7 +523,7 @@ /obj/item/weapon/storage/crayons/update_icon() cut_overlays() for(var/obj/item/toy/crayon/crayon in contents) - add_overlay(image('icons/obj/crayons.dmi',crayon.item_color)) + add_overlay(mutable_appearance('icons/obj/crayons.dmi', crayon.item_color)) /obj/item/weapon/storage/crayons/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/toy/crayon)) @@ -667,10 +669,9 @@ icon_state = is_capped ? icon_capped : icon_uncapped if(use_overlays) cut_overlays() - var/image/I = image('icons/obj/crayons.dmi', - icon_state = "[is_capped ? "spraycan_cap_colors" : "spraycan_colors"]") - I.color = paint_color - add_overlay(I) + var/mutable_appearance/spray_overlay = mutable_appearance('icons/obj/crayons.dmi', "[is_capped ? "spraycan_cap_colors" : "spraycan_colors"]") + spray_overlay.color = paint_color + add_overlay(spray_overlay) /obj/item/toy/crayon/spraycan/gang //desc = "A modified container containing suspicious paint." diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index e3dc3f140f8..6245ded26b4 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -51,7 +51,7 @@ GLOBAL_LIST_EMPTY(PDAs) var/obj/item/device/paicard/pai = null // A slot for a personal AI device - var/image/photo = null //Scanned photo + var/icon/photo //Scanned photo var/list/contained_item = list(/obj/item/weapon/pen, /obj/item/toy/crayon, /obj/item/weapon/lipstick, /obj/item/device/flashlight/pen, /obj/item/clothing/mask/cigarette) var/obj/item/inserted_item //Used for pen, crayon, and lipstick insertion or removal. Same as above. @@ -82,22 +82,24 @@ GLOBAL_LIST_EMPTY(PDAs) /obj/item/device/pda/update_icon() cut_overlays() + var/mutable_appearance/overlay = new() + overlay.pixel_x = overlays_x_offset if(id) - var/image/I = image(icon_state = "id_overlay", pixel_x = overlays_x_offset) - add_overlay(I) + overlay.icon_state = "id_overlay" + add_overlay(new /mutable_appearance(overlay)) if(inserted_item) - var/image/I = image(icon_state = "insert_overlay", pixel_x = overlays_x_offset) - add_overlay(I) + overlay.icon_state = "insert_overlay" + add_overlay(new /mutable_appearance(overlay)) if(fon) - var/image/I = image(icon_state = "light_overlay", pixel_x = overlays_x_offset) - add_overlay(I) + overlay.icon_state = "light_overlay" + add_overlay(new /mutable_appearance(overlay)) if(pai) if(pai.pai) - var/image/I = image(icon_state = "pai_overlay", pixel_x = overlays_x_offset) - add_overlay(I) + overlay.icon_state = "pai_overlay" + add_overlay(new /mutable_appearance(overlay)) else - var/image/I = image(icon_state = "pai_off_overlay", pixel_x = overlays_x_offset) - add_overlay(I) + overlay.icon_state = "pai_off_overlay" + add_overlay(new /mutable_appearance(overlay)) /obj/item/device/pda/MouseDrop(obj/over_object, src_location, over_location) var/mob/M = usr @@ -633,7 +635,7 @@ GLOBAL_LIST_EMPTY(PDAs) to_chat(L, "[bicon(src)] Message from [source.owner] ([source.ownjob]), \"[msg.message]\"[msg.get_photo_ref()] (Reply)") update_icon() - add_overlay(image(icon, icon_alert)) + add_overlay(icon_alert) /obj/item/device/pda/proc/show_to_ghosts(mob/living/user, datum/data_pda_msg/msg,multiple = 0) for(var/mob/M in GLOB.player_list) diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 86104f7b941..5c8dd2fe805 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -23,6 +23,7 @@ update_icon() //Whatever happened, update the card's state (icon, name) to match. /obj/item/device/aicard/update_icon() + cut_overlays() if(AI) name = "[initial(name)]- [AI.name]" if(AI.stat == DEAD) @@ -30,12 +31,11 @@ else icon_state = "aicard-full" if(!AI.control_disabled) - add_overlay(image('icons/obj/aicards.dmi', "aicard-on")) + add_overlay("aicard-on") AI.cancel_camera() else name = initial(name) icon_state = initial(icon_state) - cut_overlays() /obj/item/device/aicard/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.hands_state) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 62e0667f149..d8d673ce0b8 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -100,8 +100,8 @@ icon_state = "medi_holo" duration = 30 -/obj/effect/overlay/temp/medical_holosign/New(loc, creator) - ..() +/obj/effect/overlay/temp/medical_holosign/Initialize(mapload, creator) + . = ..() playsound(loc, 'sound/machines/ping.ogg', 50, 0) //make some noise! if(creator) visible_message("[creator] created a medical hologram!") @@ -344,8 +344,9 @@ cut_overlays() set_light(0) else if(on) - var/image/I = image(icon,"glowstick-glow",color) - add_overlay(I) + var/mutable_appearance/glowstick_overlay = mutable_appearance(icon, "glowstick-glow") + glowstick_overlay.color = color + add_overlay(glowstick_overlay) item_state = "glowstick-on" set_light(brightness_on) else @@ -408,7 +409,8 @@ . = ..() /obj/item/device/flashlight/spotlight //invisible lighting source - name = "disco lighting" + name = "disco light" + desc = "Groovy..." icon_state = null light_color = null brightness_on = 0 @@ -428,3 +430,11 @@ item_state = "flashdark" brightness_on = 2.5 flashlight_power = -3 + +/obj/item/device/flashlight/eyelight + name = "eyelight" + desc = "This shouldn't exist outside of someone's head, how are you seeing this?" + brightness_on = 15 + flashlight_power = 1 + flags = CONDUCT | DROPDEL + actions_types = list() diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index b35697d802a..669438f7ee9 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -11,6 +11,9 @@ GLOBAL_LIST_EMPTY(GPS_list) var/emped = FALSE var/turf/locked_location var/tracking = TRUE + var/updating = TRUE //Automatic updating of GPS list. Can be set to manual by user. + var/global_mode = TRUE //If disabled, only GPS signals of the same Z level are shown + /obj/item/device/gps/Initialize() ..() @@ -27,6 +30,7 @@ GLOBAL_LIST_EMPTY(GPS_list) cut_overlay("working") add_overlay("emp") addtimer(CALLBACK(src, .proc/reboot), 300, TIMER_OVERRIDE) //if a new EMP happens, remove the old timer so it doesn't reactivate early + SStgui.close_uis(src) //Close the UI control if it is open. /obj/item/device/gps/proc/reboot() emped = FALSE @@ -34,6 +38,9 @@ GLOBAL_LIST_EMPTY(GPS_list) add_overlay("working") /obj/item/device/gps/AltClick(mob/user) + toggletracking(user) + +/obj/item/device/gps/proc/toggletracking(mob/user) if(!user.canUseTopic(src, be_close=TRUE)) return //user not valid to use gps if(emped) @@ -48,36 +55,81 @@ GLOBAL_LIST_EMPTY(GPS_list) to_chat(user, "[src] is now tracking, and visible to other GPS devices.") tracking = TRUE -/obj/item/device/gps/attack_self(mob/user) - if(!tracking) - to_chat(user, "[src] is turned off. Use alt+click to toggle it back on.") - return - var/obj/item/device/gps/t = "" - var/gps_window_height = 110 + GLOB.GPS_list.len * 20 // Variable window height, depending on how many GPS units there are to show +/obj/item/device/gps/ui_interact(mob/user, ui_key = "gps", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) // Remember to use the appropriate state. if(emped) - t += "ERROR" - else - t += "
Set Tag " - t += "
Tag: [gpstag]" - if(locked_location && locked_location.loc) - t += "
Bluespace coordinates saved: [locked_location.loc]" - gps_window_height += 20 + to_chat(user, "[src] fizzles weakly.") + return + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + var/gps_window_height = 300 + GLOB.GPS_list.len * 20 // Variable window height, depending on how many GPS units there are to show + ui = new(user, src, ui_key, "gps", "Global Positioning System", 600, gps_window_height, master_ui, state) //width, height + ui.open() - for(var/obj/item/device/gps/G in GLOB.GPS_list) - var/turf/pos = get_turf(G) - var/area/gps_area = get_area(G) - var/tracked_gpstag = G.gpstag - if(G.emped == 1) - t += "
[tracked_gpstag]: ERROR" - else if(G.tracking) - t += "
[tracked_gpstag]: [format_text(gps_area.name)] ([pos.x], [pos.y], [pos.z])" - else - continue - var/datum/browser/popup = new(user, "GPS", name, 360, min(gps_window_height, 800)) - popup.set_content(t) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() + ui.set_autoupdate(state = updating) + + +/obj/item/device/gps/ui_data(mob/user) + var/list/data = list() + data["power"] = tracking + data["tag"] = gpstag + data["updating"] = updating + data["globalmode"] = global_mode + if(!tracking || emped) //Do not bother scanning if the GPS is off or EMPed + return data + + var/turf/curr = get_turf(src) + data["current"] = "[get_area_name(curr)] ([curr.x], [curr.y], [curr.z])" + + var/list/signals = list() + data["signals"] = list() + + for(var/gps in GLOB.GPS_list) + var/obj/item/device/gps/G = gps + if(G.emped || !G.tracking || G == src) + continue + var/turf/pos = get_turf(G) + if(!global_mode && pos.z != curr.z) + continue + var/area/gps_area = get_area_name(G) + var/list/signal = list() + signal["entrytag"] = G.gpstag //Name or 'tag' of the GPS + signal["area"] = format_text(gps_area) + signal["coord"] = "[pos.x], [pos.y], [pos.z]" + if(pos.z == curr.z) //Distance/Direction calculations for same z-level only + signal["dist"] = max(get_dist(curr, pos), 0) //Distance between the src and remote GPS turfs + signal["degrees"] = round(Get_Angle(curr, pos)) //0-360 degree directional bearing, for more precision. + var/direction = uppertext(dir2text(get_dir(curr, pos))) //Direction text (East, etc). Not as precise, but still helpful. + if(!direction) + direction = "CENTER" + signal["degrees"] = "N/A" + signal["direction"] = direction + + signals += list(signal) //Add this signal to the list of signals + data["signals"] = signals + return data + + + +/obj/item/device/gps/ui_act(action, params) + if(..()) + return + switch(action) + if("rename") + var/a = input("Please enter desired tag.", name, gpstag) as text + a = uppertext(copytext(sanitize(a), 1, 5)) + gpstag = a + name = "global positioning system ([gpstag])" + . = TRUE + if("power") + toggletracking(usr) + . = TRUE + if("updating") + updating = !updating + . = TRUE + if("globalmode") + global_mode = !global_mode + . = TRUE /obj/item/device/gps/Topic(href, href_list) ..() @@ -157,4 +209,4 @@ GLOBAL_LIST_EMPTY(GPS_list) clear() tagged = null STOP_PROCESSING(SSfastprocess, src) - . = ..() + . = ..() \ No newline at end of file diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 4c19700a786..5d7cf915cac 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -28,9 +28,14 @@ MASS SPECTROMETER START_PROCESSING(SSobj, src) /obj/item/device/t_scanner/proc/flick_sonar(obj/pipe) - var/image/I = image('icons/effects/effects.dmi', pipe, "blip", pipe.layer+1) - I.alpha = 128 - flick_overlay_view(I, pipe, 8) + if(ismob(loc)) + var/mob/M = loc + var/image/I = new(loc = get_turf(pipe)) + var/mutable_appearance/MA = new(pipe) + MA.alpha = 128 + I.appearance = MA + if(M.client) + flick_overlay(I, list(M.client), 8) /obj/item/device/t_scanner/process() if(!on) @@ -46,21 +51,8 @@ MASS SPECTROMETER if(O.level != 1) continue - var/mob/living/L = locate() in O - if(O.invisibility == INVISIBILITY_MAXIMUM) - O.invisibility = 0 - if(L) - flick_sonar(O) - spawn(10) - if(O && O.loc) - var/turf/U = O.loc - if(U.intact) - O.invisibility = INVISIBILITY_MAXIMUM - else - if(L) - flick_sonar(O) - + flick_sonar(O) /obj/item/device/healthanalyzer name = "health analyzer" diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index f17b5adbbdd..73581f9269d 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -493,7 +493,7 @@ /obj/item/projectile/bullet/reusable/lollipop/New() var/obj/item/weapon/reagent_containers/food/snacks/lollipop/S = new ammo_type(src) color2 = S.headcolor - var/image/head = image(icon = 'icons/obj/projectiles.dmi', icon_state = "lollipop_2") + var/mutable_appearance/head = mutable_appearance('icons/obj/projectiles.dmi', "lollipop_2") head.color = color2 add_overlay(head) diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 030370dbc84..0b2e81a9da9 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -58,7 +58,7 @@ if(src.l_arm && src.r_arm) if(src.l_leg && src.r_leg) if(src.chest && src.head) - feedback_inc("cyborg_frames_built",1) + SSblackbox.inc("cyborg_frames_built",1) return 1 return 0 @@ -235,7 +235,7 @@ O.mmi = W //and give the real mmi to the borg. O.updatename() - feedback_inc("cyborg_birth",1) + SSblackbox.inc("cyborg_birth",1) forceMove(O) O.robot_suit = src diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index 673c1a56006..2e31e597144 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -73,18 +73,18 @@ if(hp <= 0) visible_message("[src] breaks into tiny pieces and collapses!") qdel(src) - var/image/I = image("icon"='icons/effects/effects.dmi', "icon_state"="scorch", "layer"=OBJ_LAYER+0.5) - I.pixel_x = p_x - 1 //offset correction - I.pixel_y = p_y - 1 + var/image/bullet_hole = image('icons/effects/effects.dmi', "scorch", OBJ_LAYER + 0.5) + bullet_hole.pixel_x = p_x - 1 //offset correction + bullet_hole.pixel_y = p_y - 1 if(decaltype == DECALTYPE_SCORCH) - I.setDir(pick(NORTH,SOUTH,EAST,WEST))// random scorch design + bullet_hole.setDir(pick(NORTH,SOUTH,EAST,WEST))// random scorch design if(P.damage >= 20 || istype(P, /obj/item/projectile/beam/practice)) - I.setDir(pick(NORTH,SOUTH,EAST,WEST)) + bullet_hole.setDir(pick(NORTH,SOUTH,EAST,WEST)) else - I.icon_state = "light_scorch" + bullet_hole.icon_state = "light_scorch" else - I.icon_state = "dent" - add_overlay(I) + bullet_hole.icon_state = "dent" + add_overlay(bullet_hole) return return -1 diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index dca8014f703..b880cf43af8 100644 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -409,7 +409,7 @@ AI MODULES /obj/item/weapon/aiModule/core/full/custom/New() ..() - for(var/line in file2list("config/silicon_laws.txt")) + for(var/line in world.file2list("config/silicon_laws.txt")) if(!line) continue if(findtextEx(line,"#",1,2)) diff --git a/code/game/objects/items/weapons/RPD.dm b/code/game/objects/items/weapons/RPD.dm index c0065b77514..bff92ea9c68 100644 --- a/code/game/objects/items/weapons/RPD.dm +++ b/code/game/objects/items/weapons/RPD.dm @@ -94,10 +94,10 @@ GLOBAL_LIST_INIT(RPD_recipes, list( "Passive Gate" = new /datum/pipe_info(PIPE_PASSIVE_GATE, 1, PIPE_UNARY), "Volume Pump" = new /datum/pipe_info(PIPE_VOLUME_PUMP, 1, PIPE_UNARY), "Scrubber" = new /datum/pipe_info(PIPE_SCRUBBER, 1, PIPE_UNARY), + "Injector" = new /datum/pipe_info(PIPE_INJECTOR, 1, PIPE_UNARY), "Meter" = new /datum/pipe_info/meter(), "Gas Filter" = new /datum/pipe_info(PIPE_GAS_FILTER, 1, PIPE_TRIN_M), "Gas Mixer" = new /datum/pipe_info(PIPE_GAS_MIXER, 1, PIPE_TRIN_M), -// "Injector" = new /datum/pipe_info(PIPE_INJECTOR, 1, PIPE_UNARY), ), "Heat Exchange" = list( "Pipe" = new /datum/pipe_info(PIPE_HE, 1, PIPE_BENDABLE), diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 50bd14323a6..935a377d4bb 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -83,7 +83,6 @@ var/list/access = list() var/registered_name = null // The name registered_name on the card var/assignment = null - var/dorm = 0 // determines if this ID has claimed a dorm already /obj/item/weapon/card/id/attack_self(mob/user) user.visible_message("[user] shows you: [bicon(src)] [src.name].", \ diff --git a/code/game/objects/items/weapons/chrono_eraser.dm b/code/game/objects/items/weapons/chrono_eraser.dm index 5613891326c..e32d365298a 100644 --- a/code/game/objects/items/weapons/chrono_eraser.dm +++ b/code/game/objects/items/weapons/chrono_eraser.dm @@ -155,7 +155,7 @@ var/mob/living/captured = null var/obj/item/weapon/gun/energy/chrono_gun/gun = null var/tickstokill = 15 - var/image/mob_underlay = null + var/mutable_appearance/mob_underlay var/preloaded = 0 var/RPpos = null @@ -172,7 +172,7 @@ mob_icon.Blend(removing_frame, ICON_MULTIPLY) cached_icon.Insert(mob_icon, "frame[i]") - mob_underlay = new(cached_icon, "frame1") + mob_underlay = mutable_appearance(cached_icon, "frame1") update_icon() desc = initial(desc) + "
It appears to contain [target.name]." diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index d4e19865029..f53c9f66976 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -496,11 +496,11 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/weapon/lighter/greyscale/update_icon() cut_overlays() - var/image/I = image(icon,"[initial(icon_state)]_base") - I.appearance_flags = RESET_COLOR //the edging doesn't change color + var/mutable_appearance/base_overlay = mutable_appearance(icon,"[initial(icon_state)]_base") + base_overlay.appearance_flags = RESET_COLOR //the edging doesn't change color if(lit) - I.icon_state = "[initial(icon_state)]_on" - add_overlay(I) + base_overlay.icon_state = "[initial(icon_state)]_on" + add_overlay(base_overlay) /obj/item/weapon/lighter/greyscale/ignition_effect(atom/A, mob/user) . = "After some fiddling, [user] manages to light [A] with [src]." @@ -651,9 +651,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM screw = 1 to_chat(user, "You open the cap on the [src]") if(super) - add_overlay(image(icon, "vapeopen_med")) + add_overlay("vapeopen_med") else - add_overlay(image(icon, "vapeopen_low")) + add_overlay("vapeopen_low") else screw = 0 to_chat(user, "You close the cap on the [src]") @@ -665,12 +665,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM cut_overlays() super = 1 to_chat(user, "You increase the voltage in the [src]") - add_overlay(image(icon, "vapeopen_med")) + add_overlay("vapeopen_med") else cut_overlays() super = 0 to_chat(user, "You decrease the voltage in the [src]") - add_overlay(image(icon, "vapeopen_low")) + add_overlay("vapeopen_low") if(screw && emagged) to_chat(user, "The [name] can't be modified!") @@ -683,7 +683,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM emagged = 1 super = 0 to_chat(user, "You maximize the voltage in the [src]") - add_overlay(image(icon, "vapeopen_high")) + add_overlay("vapeopen_high") var/datum/effect_system/spark_spread/sp = new /datum/effect_system/spark_spread //for effect sp.set_up(5, 1, src) sp.start() diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index 31d700a7b69..fd586c815b7 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -38,10 +38,10 @@ to_chat(user, "You twist \the [src] [open ? "closed" : "open"].") open = !open if(open) - var/image/colored = image("icon"='icons/obj/items.dmi', "icon_state"="lipstick_uncap_color") - colored.color = colour + var/mutable_appearance/colored_overlay = mutable_appearance(icon, "lipstick_uncap_color") + colored_overlay.color = colour icon_state = "lipstick_uncap" - add_overlay(colored) + add_overlay(colored_overlay) else icon_state = "lipstick" diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 65d191927e2..404c40c4b6a 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -16,7 +16,7 @@ /obj/item/weapon/c4/New() wires = new /datum/wires/explosive/c4(src) - image_overlay = image('icons/obj/grenade.dmi', "plastic-explosive2") + plastic_overlay = mutable_appearance(icon, "plastic-explosive2") ..() /obj/item/weapon/c4/Destroy() @@ -92,7 +92,7 @@ message_admins(message,0,1) log_game("[key_name(user)] planted [name] on [target.name] at [COORD(target)] with [timer] second fuse") - target.add_overlay(image_overlay, 1) + target.add_overlay(plastic_overlay, 1) to_chat(user, "You plant the bomb. Timer counting down from [timer].") addtimer(CALLBACK(src, .proc/explode), timer * 10) @@ -103,7 +103,7 @@ if(target) if(!QDELETED(target)) location = get_turf(target) - target.cut_overlay(image_overlay, TRUE) + target.cut_overlay(plastic_overlay, TRUE) else location = get_turf(src) if(location) diff --git a/code/game/objects/items/weapons/grenades/ghettobomb.dm b/code/game/objects/items/weapons/grenades/ghettobomb.dm index d461ae6dcda..9bcbbfe0720 100644 --- a/code/game/objects/items/weapons/grenades/ghettobomb.dm +++ b/code/game/objects/items/weapons/grenades/ghettobomb.dm @@ -19,8 +19,8 @@ /obj/item/weapon/grenade/iedcasing/New(loc) ..() - add_overlay(image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled")) - add_overlay(image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_wired")) + add_overlay("improvised_grenade_filled") + add_overlay("improvised_grenade_wired") times = list("5" = 10, "-1" = 20, "[rand(30,80)]" = 50, "[rand(65,180)]" = 20)// "Premature, Dud, Short Fuse, Long Fuse"=[weighting value] det_time = text2num(pickweight(times)) if(det_time < 0) //checking for 'duds' @@ -33,13 +33,10 @@ ..() var/obj/item/weapon/reagent_containers/food/drinks/soda_cans/can = locate() in contents if(can) - var/muh_layer = can.layer - var/muh_plane = can.plane - can.layer = FLOAT_LAYER - can.plane = FLOAT_PLANE - underlays += can - can.layer = muh_layer - can.plane = muh_plane + var/mutable_appearance/can_underlay = new(can) + can_underlay.layer = FLOAT_LAYER + can_underlay.plane = FLOAT_PLANE + underlays += can_underlay /obj/item/weapon/grenade/iedcasing/attack_self(mob/user) // @@ -47,7 +44,7 @@ if(clown_check(user)) to_chat(user, "You light the [name]!") active = 1 - cut_overlay(image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled"), TRUE) //this line make no sense + cut_overlay("improvised_grenade_filled") icon_state = initial(icon_state) + "_active" add_fingerprint(user) var/turf/bombturf = get_turf(src) diff --git a/code/game/objects/items/weapons/grenades/plastic.dm b/code/game/objects/items/weapons/grenades/plastic.dm index 477a50330ed..aedf0954c2a 100644 --- a/code/game/objects/items/weapons/grenades/plastic.dm +++ b/code/game/objects/items/weapons/grenades/plastic.dm @@ -7,7 +7,7 @@ det_time = 10 display_timer = 0 var/atom/target = null - var/image_overlay = null + var/mutable_appearance/plastic_overlay var/obj/item/device/assembly_holder/nadeassembly = null var/assemblyattacher var/directional = FALSE @@ -15,7 +15,7 @@ var/boom_sizes = list(0, 0, 3) /obj/item/weapon/grenade/plastic/New() - image_overlay = image('icons/obj/grenade.dmi', "[item_state]2") + plastic_overlay = mutable_appearance(icon, "[item_state]2") ..() /obj/item/weapon/grenade/plastic/Destroy() @@ -50,7 +50,7 @@ if(target) if(!QDELETED(target)) location = get_turf(target) - target.cut_overlay(image_overlay, TRUE) + target.cut_overlay(plastic_overlay, TRUE) else location = get_turf(src) if(location) @@ -111,7 +111,7 @@ message_admins("[ADMIN_LOOKUPFLW(user)] planted [name] on [target.name] at [ADMIN_COORDJMP(target)] with [det_time] second fuse",0,1) log_game("[key_name(user)] planted [name] on [target.name] at [COORD(src)] with [det_time] second fuse") - target.add_overlay(image_overlay, 1) + target.add_overlay(plastic_overlay, 1) if(!nadeassembly) to_chat(user, "You plant the bomb. Timer counting down from [det_time].") addtimer(CALLBACK(src, .proc/prime), det_time*10) diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index d35ef4c163b..b94658545ed 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -45,7 +45,7 @@ if(do_mob(user, C, 30) && (C.get_num_arms() >= 2 || C.get_arm_ignore())) apply_cuffs(C,user) to_chat(user, "You handcuff [C].") - feedback_add_details("handcuffs","[type]") + SSblackbox.add_details("handcuffs","[type]") add_logs(user, C, "handcuffed") else @@ -275,7 +275,7 @@ C.legcuffed = src src.loc = C C.update_inv_legcuffed() - feedback_add_details("handcuffs","[type]") + SSblackbox.add_details("handcuffs","[type]") else if(isanimal(L)) var/mob/living/simple_animal/SA = L if(SA.mob_size > MOB_SIZE_TINY) @@ -336,7 +336,7 @@ C.legcuffed = src src.loc = C C.update_inv_legcuffed() - feedback_add_details("handcuffs","[type]") + SSblackbox.add_details("handcuffs","[type]") to_chat(C, "\The [src] ensnares you!") C.Weaken(weaken) diff --git a/code/game/objects/items/weapons/holosign_creator.dm b/code/game/objects/items/weapons/holosign_creator.dm index fb68e33f458..3b611883e68 100644 --- a/code/game/objects/items/weapons/holosign_creator.dm +++ b/code/game/objects/items/weapons/holosign_creator.dm @@ -87,7 +87,7 @@ var/mob/living/silicon/robot/R = user if(shock) - user <<"You clear all active holograms, and reset your projector to normal." + to_chat(user, "You clear all active holograms, and reset your projector to normal.") holosign_type = /obj/structure/holosign/barrier/cyborg creation_time = 5 if(signs.len) @@ -96,7 +96,7 @@ shock = 0 return else if(R.emagged&&!shock) - user <<"You clear all active holograms, and overload your energy projector!" + to_chat(user, "You clear all active holograms, and overload your energy projector!") holosign_type = /obj/structure/holosign/barrier/cyborg/hacked creation_time = 30 if(signs.len) diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index d42e135aebf..aa720f19795 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -39,7 +39,7 @@ SSreligion.holy_weapon_type = holy_weapon.type - feedback_set_details("chaplain_weapon","[choice]") + SSblackbox.set_details("chaplain_weapon","[choice]") if(holy_weapon) holy_weapon.reskinned = TRUE @@ -71,7 +71,7 @@ /obj/item/weapon/nullrod/staff/worn_overlays(isinhands) . = list() if(isinhands) - . += image(layer = MOB_LAYER+0.01, icon = 'icons/effects/effects.dmi', icon_state = "[shield_icon]") + . += mutable_appearance('icons/effects/effects.dmi', shield_icon, MOB_LAYER + 0.01) /obj/item/weapon/nullrod/staff/blue name = "blue holy staff" diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm index c053b6ed470..61e68934b92 100644 --- a/code/game/objects/items/weapons/pneumaticCannon.dm +++ b/code/game/objects/items/weapons/pneumaticCannon.dm @@ -162,5 +162,5 @@ src.cut_overlays() if(!tank) return - src.add_overlay(image('icons/obj/pneumaticCannon.dmi', "[tank.icon_state]")) + add_overlay(tank.icon_state) src.update_icon() diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index ddf6dc1c172..266fe875792 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -334,14 +334,14 @@ /obj/item/weapon/storage/bag/tray/proc/rebuild_overlays() cut_overlays() for(var/obj/item/I in contents) - add_overlay(image("icon" = I.icon, "icon_state" = I.icon_state, "layer" = -1)) + add_overlay(mutable_appearance(I.icon, I.icon_state)) /obj/item/weapon/storage/bag/tray/remove_from_storage(obj/item/W as obj, atom/new_location) ..() rebuild_overlays() /obj/item/weapon/storage/bag/tray/handle_item_insertion(obj/item/I, prevent_warning = 0) - add_overlay(image("icon" = I.icon, "icon_state" = I.icon_state, "layer" = -1)) + add_overlay(mutable_appearance(I.icon, I.icon_state)) . = ..() diff --git a/code/game/objects/items/weapons/storage/book.dm b/code/game/objects/items/weapons/storage/book.dm index 83805d969a1..7775b3692a4 100644 --- a/code/game/objects/items/weapons/storage/book.dm +++ b/code/game/objects/items/weapons/storage/book.dm @@ -62,7 +62,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible", SSreligion.bible_icon_state = B.icon_state SSreligion.bible_item_state = B.item_state - feedback_set_details("religion_book","[biblename]") + SSblackbox.set_details("religion_book","[biblename]") usr << browse(null, "window=editicon") /obj/item/weapon/storage/book/bible/proc/bless(mob/living/carbon/human/H, mob/living/user) diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 91810c5a13b..5c53db06cf2 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -38,7 +38,7 @@ . = ..() if(illustration) cut_overlays() - add_overlay(image('icons/obj/storage.dmi', "[illustration]")) + add_overlay(illustration) /obj/item/weapon/storage/box/attack_self(mob/user) ..() diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index e3975843c8f..14938b92262 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -141,12 +141,15 @@ add_overlay("[icon_state]_open") var/i = contents.len for(var/C in contents) + var/mutable_appearance/inserted_overlay = mutable_appearance(icon) + inserted_overlay.pixel_x = 1 * (i - 1) if(istype(C, /obj/item/weapon/lighter/greyscale)) - add_overlay(image(icon = src.icon, icon_state = "lighter_in", pixel_x = 1 * (i -1))) + inserted_overlay.icon_state = "lighter_in" else if(istype(C, /obj/item/weapon/lighter)) - add_overlay(image(icon = src.icon, icon_state = "zippo_in", pixel_x = 1 * (i -1))) + inserted_overlay.icon_state = "zippo_in" else - add_overlay(image(icon = src.icon, icon_state = "cigarette", pixel_x = 1 * (i -1))) + inserted_overlay.icon_state = "cigarette" + add_overlay(inserted_overlay) i-- else cut_overlays() @@ -247,13 +250,14 @@ spawn_type = /obj/item/clothing/mask/cigarette/cigar /obj/item/weapon/storage/fancy/cigarettes/cigars/update_icon() + cut_overlays() if(fancy_open) - cut_overlays() add_overlay("[icon_state]_open") + var/mutable_appearance/cigar_overlay = mutable_appearance(icon, icon_type) for(var/c = contents.len, c >= 1, c--) - add_overlay(image(icon = src.icon, icon_state = icon_type, pixel_x = 4 * (c -1))) + cigar_overlay.pixel_x = 4 * (c - 1) + add_overlay(cigar_overlay) else - cut_overlays() icon_state = "cigarcase" /obj/item/weapon/storage/fancy/cigarettes/cigars/cohiba diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index 68c7c74363f..e455a0277c1 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -94,7 +94,7 @@ else if ((src.code == src.l_code) && (src.l_set == 1)) src.locked = 0 cut_overlays() - add_overlay(image('icons/obj/storage.dmi', icon_opened)) + add_overlay(icon_opened) src.code = null else src.code = "ERROR" diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index 66cb97d3a56..94b0709ae20 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -29,7 +29,7 @@ ..() cut_overlays() if(has_latches) - add_overlay(image('icons/obj/storage.dmi', "[latches]")) + add_overlay(latches) /obj/item/weapon/storage/toolbox/suicide_act(mob/user) diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 078cb97025f..1a3b4ff4faf 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -60,9 +60,9 @@ /obj/item/weapon/melee/baton/examine(mob/user) ..() if(bcell) - user <<"The baton is [round(bcell.percent())]% charged." + to_chat(user, "The baton is [round(bcell.percent())]% charged.") else - user <<"The baton does not have a power source installed." + to_chat(user, "The baton does not have a power source installed.") /obj/item/weapon/melee/baton/attackby(obj/item/weapon/W, mob/user, params) if(istype(W, /obj/item/weapon/stock_parts/cell)) diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index ecca6aabfcd..3a637571570 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -370,7 +370,7 @@ cut_overlays() if(reagents.total_volume) - var/image/filling = image('icons/obj/reagentfillings.dmi',icon_state = "backpack-10") + var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "backpack-10") var/percent = round((reagents.total_volume / volume) * 100) switch(percent) @@ -388,7 +388,7 @@ . = list() //inhands + reagent_filling if(!isinhands && reagents.total_volume) - var/image/filling = image('icons/obj/reagentfillings.dmi',icon_state = "backpackmob-10") + var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "backpackmob-10") var/percent = round((reagents.total_volume / volume) * 100) switch(percent) @@ -432,11 +432,6 @@ update_filling() user.update_inv_back() //for overlays update -/obj/item/weapon/reagent_containers/chemtank/stim/New() - ..() - reagents.add_reagent("stimulants_longterm", 300) - update_filling() - //Operator backpack spray /obj/item/weapon/watertank/operator name = "backpack water tank" @@ -468,4 +463,4 @@ possible_transfer_amounts = list(75,100,150) /obj/item/weapon/watertank/operator/make_noz() - return new /obj/item/weapon/reagent_containers/spray/mister/operator(src) \ No newline at end of file + return new /obj/item/weapon/reagent_containers/spray/mister/operator(src) diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 45f082f72c5..702e72842f6 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -148,7 +148,7 @@ ///// ACID -GLOBAL_DATUM_INIT(acid_overlay, /image, image("icon" = 'icons/effects/effects.dmi', "icon_state" = "acid")) +GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/effects/effects.dmi', "acid")) //the obj's reaction when touched by acid /obj/acid_act(acidpwr, acid_volume) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 4b20f12bf82..a14d345e2f8 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -37,7 +37,7 @@ ..() /obj/Initialize() - ..() + . = ..() if (!armor) armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0) if(on_blueprints && isturf(loc)) diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index 31676a4f0ab..f3680bc8bd6 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -180,7 +180,7 @@ var/mob/living/silicon/ai/A = new /mob/living/silicon/ai(loc, laws, brain.brainmob) if(brain.force_replace_ai_name) A.fully_replace_character_name(A.name, brain.replacement_ai_name()) - feedback_inc("cyborg_ais_created",1) + SSblackbox.inc("cyborg_ais_created",1) qdel(src) else state = AI_READY_CORE diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm index f79e06e92d5..ce3d0882ce6 100644 --- a/code/game/objects/structures/beds_chairs/alien_nest.dm +++ b/code/game/objects/structures/beds_chairs/alien_nest.dm @@ -12,11 +12,7 @@ canSmoothWith = null buildstacktype = null flags = NODECONSTRUCT - var/image/nest_overlay - -/obj/structure/bed/nest/New() - nest_overlay = image('icons/mob/alien.dmi', "nestoverlay", layer=LYING_MOB_LAYER) - return ..() + var/static/mutable_appearance/nest_overlay = mutable_appearance('icons/mob/alien.dmi', "nestoverlay", LYING_MOB_LAYER) /obj/structure/bed/nest/user_unbuckle_mob(mob/living/buckled_mob, mob/living/user) if(has_buckled_mobs()) diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index fdded787bd6..87560f426fd 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -145,11 +145,11 @@ obj_integrity = 70 max_integrity = 70 buildstackamount = 2 - var/image/armrest = null + var/mutable_appearance/armrest item_chair = null /obj/structure/chair/comfy/Initialize() - armrest = image("icons/obj/chairs.dmi", "comfychair_armrest") + armrest = mutable_appearance('icons/obj/chairs.dmi', "comfychair_armrest") armrest.layer = ABOVE_MOB_LAYER return ..() diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm index c44181f9719..6d3f4197607 100644 --- a/code/game/objects/structures/electricchair.dm +++ b/code/game/objects/structures/electricchair.dm @@ -8,7 +8,7 @@ /obj/structure/chair/e_chair/New() ..() - add_overlay(image('icons/obj/chairs.dmi', src, "echair_over", MOB_LAYER + 1)) + add_overlay(mutable_appearance('icons/obj/chairs.dmi', "echair_over", MOB_LAYER + 1)) /obj/structure/chair/e_chair/attackby(obj/item/weapon/W, mob/user, params) if(istype(W, /obj/item/weapon/wrench)) @@ -42,6 +42,5 @@ var/mob/living/buckled_mob = m buckled_mob.electrocute_act(85, src, 1) to_chat(buckled_mob, "You feel a deep shock course through your body!") - spawn(1) - buckled_mob.electrocute_act(85, src, 1) + addtimer(CALLBACK(buckled_mob, /mob/living.proc/electrocute_act, 85, src, 1), 1) visible_message("The electric chair went off!", "You hear a deep sharp shock!") diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index 970f1d594b4..8d9c6685428 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -19,8 +19,7 @@ /obj/structure/fireaxecabinet/Destroy() if(fireaxe) - qdel(fireaxe) - fireaxe = null + QDEL_NULL(fireaxe) return ..() /obj/structure/fireaxecabinet/attackby(obj/item/I, mob/user, params) @@ -116,7 +115,7 @@ update_icon() return if(locked) - user <<" The [name] won't budge!" + to_chat(user, "The [name] won't budge!") return else open = !open @@ -132,7 +131,7 @@ /obj/structure/fireaxecabinet/attack_tk(mob/user) if(locked) - user <<" The [name] won't budge!" + to_chat(user, "The [name] won't budge!") return else open = !open @@ -178,7 +177,7 @@ set src in oview(1) if(locked) - usr <<" The [name] won't budge!" + to_chat(usr, "The [name] won't budge!") return else open = !open diff --git a/code/game/objects/structures/guncase.dm b/code/game/objects/structures/guncase.dm index 077e4056161..be8c336c066 100644 --- a/code/game/objects/structures/guncase.dm +++ b/code/game/objects/structures/guncase.dm @@ -7,7 +7,7 @@ anchored = 0 density = 1 opacity = 0 - var/case_type = null + var/case_type = "" var/gun_category = /obj/item/weapon/gun var/open = 1 var/capacity = 4 @@ -25,8 +25,10 @@ /obj/structure/guncase/update_icon() cut_overlays() if(case_type && LAZYLEN(contents)) + var/mutable_appearance/gun_overlay = mutable_appearance(icon, case_type) for(var/i in 1 to contents.len) - add_overlay(image(icon = src.icon, icon_state = "[case_type]", pixel_x = 3 * (i - 1) )) + gun_overlay.pixel_x = 3 * (i - 1) + add_overlay(gun_overlay) if(open) add_overlay("[icon_state]_open") else diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index e38bc936e2d..405c2d22253 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -14,18 +14,15 @@ /obj/structure/ladder/Initialize(mapload) - if(!initialized) - GLOB.ladders += src - ..() - if(mapload) - return TRUE - update_link() + GLOB.ladders += src + ..() + return INITIALIZE_HINT_LATELOAD /obj/structure/ladder/Destroy() GLOB.ladders -= src . = ..() -/obj/structure/ladder/proc/update_link() +/obj/structure/ladder/LateInitialize() for(var/obj/structure/ladder/L in GLOB.ladders) if(L.id == id) if(L.height == (height - 1)) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index ba859d5952b..ba9e5f8a338 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -18,7 +18,7 @@ // flags = CONDUCT /obj/structure/lattice/Initialize(mapload) - ..() + . = ..() for(var/obj/structure/lattice/LAT in loc) if(LAT != src) QDEL_IN(LAT, 0) diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm index eae2041a315..730b9e057c4 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube.dm @@ -143,21 +143,21 @@ /obj/structure/transit_tube/proc/create_tube_overlay(direction, shift_dir) - var/image/I + var/image/tube_overlay = new(dir = direction) if(shift_dir) - I = image(loc = src, icon_state = "decorative_diag", dir = direction) + tube_overlay.icon_state = "decorative_diag" switch(shift_dir) if(NORTH) - I.pixel_y = 32 + tube_overlay.pixel_y = 32 if(SOUTH) - I.pixel_y = -32 + tube_overlay.pixel_y = -32 if(EAST) - I.pixel_x = 32 + tube_overlay.pixel_x = 32 if(WEST) - I.pixel_x = -32 + tube_overlay.pixel_x = -32 else - I = image(loc = src, icon_state = "decorative", dir = direction) - add_overlay(I) + tube_overlay.icon_state = "decorative" + add_overlay(tube_overlay) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 56a8d0410c0..3db570db83d 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -239,7 +239,7 @@ qdel(mymist) if(on) - add_overlay(image('icons/obj/watercloset.dmi', src, "water", MOB_LAYER + 1, dir)) + add_overlay(mutable_appearance('icons/obj/watercloset.dmi', "water", MOB_LAYER + 1)) if(watertemp == "freezing") return if(!ismist) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index c6c2ef358bc..d5027a0c754 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -18,7 +18,7 @@ var/fulltile = 0 var/glass_type = /obj/item/stack/sheet/glass var/glass_amount = 1 - var/image/crack_overlay + var/mutable_appearance/crack_overlay var/list/debris = list() can_be_unanchored = 1 resistance_flags = ACID_PROOF @@ -27,7 +27,23 @@ /obj/structure/window/examine(mob/user) ..() - to_chat(user, "Alt-click to rotate it clockwise.") + if(reinf) + if(anchored && state == WINDOW_SCREWED_TO_FRAME) + to_chat(user, "The window is screwed to the frame.") + else if(anchored && state == WINDOW_IN_FRAME) + to_chat(user, "The window is unscrewed but pried into the frame.") + else if(anchored && state == WINDOW_OUT_OF_FRAME) + to_chat(user, "The window is out of the frame, but could be pried in. It is screwed to the floor.") + else if(!anchored) + to_chat(user, "The window is unscrewed from the floor, and could be deconstructed by wrenching.") + else + if(anchored) + to_chat(user, "The window is screwed to the floor.") + else + to_chat(user, "The window is unscrewed from the floor, and could be deconstructed by wrenching.") + + if(!anchored) + to_chat(user, "Alt-click to rotate it clockwise.") /obj/structure/window/Initialize(mapload, direct) ..() @@ -364,7 +380,7 @@ cut_overlay(crack_overlay) if(ratio > 75) return - crack_overlay = image('icons/obj/structures.dmi',"damage[ratio]",-(layer+0.1)) + crack_overlay = mutable_appearance('icons/obj/structures.dmi', "damage[ratio]", -(layer+0.1)) add_overlay(crack_overlay) /obj/structure/window/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) @@ -389,6 +405,7 @@ /obj/structure/window/reinforced name = "reinforced window" + desc = "A window that is reinforced with metal rods." icon_state = "rwindow" reinf = 1 heat_resistance = 1600 diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index f8cb0d1be3b..741d4f29587 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -71,10 +71,8 @@ /turf/closed/indestructible/fakeglass/Initialize() ..() icon_state = null //set the icon state to null, so our base state isn't visible - var/image/I = image('icons/obj/structures.dmi', loc = src, icon_state = "grille") - underlays += I //add a grille underlay - I = image('icons/turf/floors.dmi', loc = src, icon_state = "plating") - underlays += I //add the plating underlay, below the grille + underlays += mutable_appearance('icons/obj/structures.dmi', "grille") //add a grille underlay + underlays += mutable_appearance('icons/turf/floors.dmi', "plating") //add the plating underlay, below the grille /turf/closed/indestructible/fakedoor name = "Centcom Access" diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index ee5527c0f59..7183d33ef9d 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -3,7 +3,7 @@ var/wet = 0 var/wet_time = 0 // Time in seconds that this floor will be wet for. - var/image/wet_overlay = null + var/mutable_appearance/wet_overlay /turf/open/indestructible name = "floor" @@ -183,17 +183,22 @@ if(wet_setting != TURF_DRY) if(wet_overlay) cut_overlay(wet_overlay) - wet_overlay = null + else + wet_overlay = mutable_appearance() var/turf/open/floor/F = src if(istype(F)) if(wet_setting == TURF_WET_PERMAFROST) - wet_overlay = image('icons/effects/water.dmi', src, "ice_floor") + wet_overlay.icon = 'icons/effects/water.dmi' + wet_overlay.icon_state = "ice_floor" else if(wet_setting == TURF_WET_ICE) - wet_overlay = image('icons/turf/overlays.dmi', src, "snowfloor") + wet_overlay.icon = 'icons/turf/overlays.dmi' + wet_overlay.icon_state = "snowfloor" else - wet_overlay = image('icons/effects/water.dmi', src, "wet_floor_static") + wet_overlay.icon = 'icons/effects/water.dmi' + wet_overlay.icon_state = "wet_floor_static" else - wet_overlay = image('icons/effects/water.dmi', src, "wet_static") + wet_overlay.icon = 'icons/effects/water.dmi' + wet_overlay.icon_state = "wet_static" add_overlay(wet_overlay) HandleWet() diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm index a17fcf2ca8b..f4a3403ee5b 100644 --- a/code/game/turfs/simulated/floor/plating/asteroid.dm +++ b/code/game/turfs/simulated/floor/plating/asteroid.dm @@ -63,7 +63,7 @@ if(istype(src, /turf/open/floor/plating/asteroid)) to_chat(user, "You dig a hole.") gets_dug() - feedback_add_details("pick_used_mining","[W.type]") + SSblackbox.add_details("pick_used_mining","[W.type]") if(istype(W,/obj/item/weapon/storage/bag/ore)) var/obj/item/weapon/storage/bag/ore/S = W diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index d418c0a48a5..398ff190f2f 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -21,7 +21,7 @@ var/spread = 0 //will the seam spread? var/spreadChance = 0 //the percentual chance of an ore spreading to the neighbouring tiles var/last_act = 0 - var/scan_state = null //Holder for the image we display when we're pinged by a mining scanner + var/scan_state = "" //Holder for the image we display when we're pinged by a mining scanner var/defer_change = 0 /turf/closed/mineral/Initialize() @@ -63,7 +63,7 @@ if(ismineralturf(src)) to_chat(user, "You finish cutting into the rock.") gets_drilled(user) - feedback_add_details("pick_used_mining","[P.type]") + SSblackbox.add_details("pick_used_mining","[P.type]") else return attack_hand(user) @@ -72,7 +72,7 @@ var/i for(i in 1 to mineralAmt) new mineralType(src) - feedback_add_details("ore_mined",mineralType) + SSblackbox.add_details("ore_mined",mineralType) ChangeTurf(turf_type, defer_change) addtimer(CALLBACK(src, .proc/AfterChange), 1, TIMER_UNIQUE) playsound(src, 'sound/effects/break_stone.ogg', 50, 1) //beautiful destruction @@ -380,7 +380,7 @@ var/stage = 0 //How far into the lifecycle of gibtonite we are, 0 is untouched, 1 is active and attempting to detonate, 2 is benign and ready for extraction var/activated_ckey = null //These are to track who triggered the gibtonite deposit for logging purposes var/activated_name = null - var/activated_image = null + var/mutable_appearance/activated_overlay /turf/closed/mineral/gibtonite/Initialize() det_time = rand(8,10) //So you don't know exactly when the hot potato will explode @@ -394,9 +394,8 @@ /turf/closed/mineral/gibtonite/proc/explosive_reaction(mob/user = null, triggered_by_explosion = 0) if(stage == 0) - var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_active", layer = ON_EDGED_TURF_LAYER) - add_overlay(I) - activated_image = I + activated_overlay = mutable_appearance('icons/turf/smoothrocks.dmi', "rock_Gibtonite_active", ON_EDGED_TURF_LAYER) + add_overlay(activated_overlay) name = "gibtonite deposit" desc = "An active gibtonite reserve. Run!" stage = 1 @@ -433,9 +432,9 @@ /turf/closed/mineral/gibtonite/proc/defuse() if(stage == 1) - cut_overlay(activated_image) - var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_inactive", layer = ON_EDGED_TURF_LAYER) - add_overlay(I) + cut_overlay(activated_overlay) + activated_overlay.icon_state = "rock_Gibtonite_inactive" + add_overlay(activated_overlay) desc = "An inactive gibtonite reserve. The ore can be extracted." stage = 2 if(det_time < 0) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 6c1e2743cd5..a0940eded1f 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -42,6 +42,8 @@ if (opacity) has_opaque_atom = TRUE + + return INITIALIZE_HINT_NORMAL /turf/open/space/attack_ghost(mob/dead/observer/user) if(destination_z) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 10eefc4b14e..4c29d87dfa8 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -56,6 +56,7 @@ if (opacity) has_opaque_atom = TRUE + return INITIALIZE_HINT_NORMAL /turf/proc/Initalize_Atmos(times_fired) CalculateAdjacentTurfs() @@ -397,7 +398,7 @@ /turf/proc/add_blueprints_preround(atom/movable/AM) - if(!SSticker || SSticker.current_state != GAME_STATE_PLAYING) + if(!SSticker.HasRoundStarted()) add_blueprints(AM) /turf/proc/empty(turf_type=/turf/open/space) diff --git a/code/modules/VR/vr_human.dm b/code/modules/VR/vr_human.dm index f8d59e060bb..1b83b323c83 100644 --- a/code/modules/VR/vr_human.dm +++ b/code/modules/VR/vr_human.dm @@ -7,7 +7,7 @@ /mob/living/carbon/human/virtual_reality/Initialize() - ..() + . = ..() quit_action = new() quit_action.Grant(src) diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm index 41f3bbc0019..9411917c39a 100644 --- a/code/modules/VR/vr_sleeper.dm +++ b/code/modules/VR/vr_sleeper.dm @@ -17,8 +17,8 @@ var/allow_creating_vr_humans = TRUE //So you can have vr_sleepers that always spawn you as a specific person or 1 life/chance vr games var/outfit = /datum/outfit/vr_basic -/obj/machinery/vr_sleeper/New() - ..() +/obj/machinery/vr_sleeper/Initialize() + . = ..() sparks = new /datum/effect_system/spark_spread() sparks.set_up(2,0) sparks.attach(src) diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index 1e5a1826dad..1ff23609233 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -141,7 +141,7 @@ GLOBAL_PROTECT(Banlist) ban_unban_log_save("[key_name(usr)] unbanned [key]") log_admin_private("[key_name(usr)] unbanned [key]") message_admins("[key_name_admin(usr)] unbanned: [key]") - feedback_inc("ban_unban",1) + SSblackbox.inc("ban_unban",1) usr.client.holder.DB_ban_unban( ckey(key), BANTYPE_ANY_FULLBAN) for (var/A in GLOB.Banlist.dir) GLOB.Banlist.cd = "/base/[A]" diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index dc6c7332f0f..e8803868fef 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -166,7 +166,7 @@ body += "" usr << browse(body, "window=adminplayeropts-\ref[M];size=550x515") - feedback_add_details("admin_verb","Player Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Player Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/access_news_network() //MARKER @@ -419,7 +419,7 @@ return if(confirm == "Yes") SSticker.delay_end = 0 - feedback_add_details("admin_verb","Reboot World") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Reboot World") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! world.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "end_error", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", 10) /datum/admins/proc/end_round() @@ -434,7 +434,7 @@ return if(confirm == "Yes") SSticker.force_ending = 1 - feedback_add_details("admin_verb","End Round") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","End Round") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/announce() @@ -450,7 +450,7 @@ message = adminscrub(message,500) to_chat(world, "[usr.client.holder.fakekey ? "Administrator" : usr.key] Announces:\n \t [message]") log_admin("Announce: [key_name(usr)] : [message]") - feedback_add_details("admin_verb","Announce") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Announce") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/set_admin_notice() set category = "Special Verbs" @@ -471,7 +471,7 @@ message_admins("[key_name(usr)] set the admin notice.") log_admin("[key_name(usr)] set the admin notice:\n[new_admin_notice]") to_chat(world, "Admin Notice:\n \t [new_admin_notice]") - feedback_add_details("admin_verb","Set Admin Notice") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Set Admin Notice") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! GLOB.admin_notice = new_admin_notice return @@ -482,7 +482,7 @@ toggle_ooc() log_admin("[key_name(usr)] toggled OOC.") message_admins("[key_name_admin(usr)] toggled OOC.") - feedback_add_details("admin_toggle","Toggle OOC|[GLOB.ooc_allowed]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle OOC|[GLOB.ooc_allowed]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggleoocdead() set category = "Server" @@ -492,7 +492,7 @@ log_admin("[key_name(usr)] toggled OOC.") message_admins("[key_name_admin(usr)] toggled Dead OOC.") - feedback_add_details("admin_toggle","Toggle Dead OOC|[GLOB.dooc_allowed]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Dead OOC|[GLOB.dooc_allowed]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/startnow() set category = "Server" @@ -507,7 +507,7 @@ started as soon as possible.)" message_admins("\ [usr.key] has started the game.[msg]") - feedback_add_details("admin_verb","Start Now") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Start Now") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return 1 else to_chat(usr, "Error: Start Now: Game has already started.") @@ -526,7 +526,7 @@ log_admin("[key_name(usr)] toggled new player game entering.") message_admins("[key_name_admin(usr)] toggled new player game entering.") world.update_status() - feedback_add_details("admin_toggle","Toggle Entering|[GLOB.enter_allowed]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Entering|[GLOB.enter_allowed]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggleAI() set category = "Server" @@ -539,7 +539,7 @@ to_chat(world, "The AI job is chooseable now.") log_admin("[key_name(usr)] toggled AI allowed.") world.update_status() - feedback_add_details("admin_toggle","Toggle AI|[config.allow_ai]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle AI|[config.allow_ai]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggleaban() set category = "Server" @@ -553,7 +553,7 @@ message_admins("[key_name_admin(usr)] toggled respawn to [GLOB.abandon_allowed ? "On" : "Off"].") log_admin("[key_name(usr)] toggled respawn to [GLOB.abandon_allowed ? "On" : "Off"].") world.update_status() - feedback_add_details("admin_toggle","Toggle Respawn|[GLOB.abandon_allowed]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Respawn|[GLOB.abandon_allowed]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/delay() set category = "Server" @@ -572,7 +572,7 @@ to_chat(world, "The game will start in [newtime] seconds.") world << 'sound/ai/attention.ogg' log_admin("[key_name(usr)] set the pre-game delay to [newtime] seconds.") - feedback_add_details("admin_verb","Delay Game Start") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Delay Game Start") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/unprison(mob/M in GLOB.mob_list) set category = "Admin" @@ -583,7 +583,7 @@ log_admin("[key_name(usr)] has unprisoned [key_name(M)]") else alert("[M.name] is not prisoned.") - feedback_add_details("admin_verb","Unprison") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Unprison") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! ////////////////////////////////////////////////////////////////////////////////////////////////ADMIN HELPER PROCS @@ -624,7 +624,7 @@ A.admin_spawned = TRUE log_admin("[key_name(usr)] spawned [chosen] at ([usr.x],[usr.y],[usr.z])") - feedback_add_details("admin_verb","Spawn Atom") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Spawn Atom") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/show_traitor_panel(mob/M in GLOB.mob_list) @@ -640,7 +640,7 @@ return M.mind.edit_memory() - feedback_add_details("admin_verb","Traitor Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Traitor Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggletintedweldhelmets() @@ -654,7 +654,7 @@ to_chat(world, "The tinted_weldhelh has been disabled!") log_admin("[key_name(usr)] toggled tinted_weldhelh.") message_admins("[key_name_admin(usr)] toggled tinted_weldhelh.") - feedback_add_details("admin_toggle","Toggle Tinted Welding Helmets|[GLOB.tinted_weldhelh]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Tinted Welding Helmets|[GLOB.tinted_weldhelh]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggleguests() set category = "Server" @@ -667,7 +667,7 @@ to_chat(world, "Guests may now enter the game.") log_admin("[key_name(usr)] toggled guests game entering [GLOB.guests_allowed?"":"dis"]allowed.") message_admins("[key_name_admin(usr)] toggled guests game entering [GLOB.guests_allowed?"":"dis"]allowed.") - feedback_add_details("admin_toggle","Toggle Guests|[GLOB.guests_allowed]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Guests|[GLOB.guests_allowed]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/output_ai_laws() var/ai_number = 0 @@ -796,7 +796,7 @@ message_admins("[key_name_admin(usr)] has put [frommob.ckey] in control of [tomob.name].") log_admin("[key_name(usr)] stuffed [frommob.ckey] into [tomob.name].") - feedback_add_details("admin_verb","Ghost Drag Control") + SSblackbox.add_details("admin_verb","Ghost Drag Control") tomob.ckey = frommob.ckey qdel(frommob) @@ -804,7 +804,7 @@ return 1 /client/proc/adminGreet(logout) - if(SSticker && SSticker.current_state == GAME_STATE_PLAYING) + if(SSticker.HasRoundStarted()) var/string if(logout && config && config.announce_admin_logout) string = pick( diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index 6c1eecda767..bf7b9dcb1ae 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -105,7 +105,7 @@ GLOBAL_PROTECT(admin_ranks) if(config.admin_legacy_system) var/previous_rights = 0 //load text from file and process each line seperately - for(var/line in file2list("config/admin_ranks.txt")) + for(var/line in world.file2list("config/admin_ranks.txt")) if(!line) continue if(findtextEx(line,"#",1,2)) @@ -175,7 +175,7 @@ GLOBAL_PROTECT(admin_ranks) if(config.admin_legacy_system) //load text from file - var/list/lines = file2list("config/admins.txt") + var/list/lines = world.file2list("config/admins.txt") //process each line seperately for(var/line in lines) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 607b402f1d4..a32a37b046d 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -160,7 +160,8 @@ GLOBAL_LIST_INIT(admin_verbs_debug, AVerbsDebug()) /client/proc/clear_dynamic_transit, /client/proc/toggle_medal_disable, /client/proc/view_runtimes, - /client/proc/pump_random_event + /client/proc/pump_random_event, + /client/proc/cmd_display_init_log ) GLOBAL_PROTECT(admin_verbs_possess) GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess,/proc/release)) @@ -325,7 +326,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) verbs += /client/proc/show_verbs to_chat(src, "Most of your adminverbs have been hidden.") - feedback_add_details("admin_verb","Hide Most Adminverbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Hide Most Adminverbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return /client/proc/hide_verbs() @@ -336,7 +337,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) verbs += /client/proc/show_verbs to_chat(src, "Almost all of your adminverbs have been hidden.") - feedback_add_details("admin_verb","Hide All Adminverbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Hide All Adminverbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return /client/proc/show_verbs() @@ -347,7 +348,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) add_admin_verbs() to_chat(src, "All of your adminverbs are now visible.") - feedback_add_details("admin_verb","Show Adminverbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Show Adminverbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -367,7 +368,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) message_admins("[key_name_admin(usr)] re-entered corpse") ghost.can_reenter_corpse = 1 //force re-entering even when otherwise not possible ghost.reenter_corpse() - feedback_add_details("admin_verb","Admin Reenter") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Admin Reenter") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! else if(isnewplayer(mob)) to_chat(src, "Error: Aghost: Can't admin-ghost whilst in the lobby. Join or Observe first.") else @@ -378,7 +379,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) body.ghostize(1) if(body && !body.key) body.key = "@[key]" //Haaaaaaaack. But the people have spoken. If it breaks; blame adminbus - feedback_add_details("admin_verb","Admin Ghost") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Admin Ghost") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/invisimin() @@ -398,7 +399,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) set category = "Admin" if(holder) holder.player_panel_new() - feedback_add_details("admin_verb","Player Panel New") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Player Panel New") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/check_antagonists() set name = "Check Antagonists" @@ -408,7 +409,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) log_admin("[key_name(usr)] checked antagonists.") //for tsar~ if(!isobserver(usr)) message_admins("[key_name_admin(usr)] checked antagonists.") - feedback_add_details("admin_verb","Check Antagonists") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Check Antagonists") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/unban_panel() set name = "Unban Panel" @@ -418,21 +419,21 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) holder.unbanpanel() else holder.DB_ban_panel() - feedback_add_details("admin_verb","Unban Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Unban Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/game_panel() set name = "Game Panel" set category = "Admin" if(holder) holder.Game() - feedback_add_details("admin_verb","Game Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Game Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/secrets() set name = "Secrets" set category = "Admin" if (holder) holder.Secrets() - feedback_add_details("admin_verb","Secrets Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Secrets Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/findStealthKey(txt) @@ -480,7 +481,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) mob.mouse_opacity = 0 log_admin("[key_name(usr)] has turned stealth mode [holder.fakekey ? "ON" : "OFF"]") message_admins("[key_name_admin(usr)] has turned stealth mode [holder.fakekey ? "ON" : "OFF"]") - feedback_add_details("admin_verb","Stealth Mode") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Stealth Mode") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/drop_bomb() set category = "Special Verbs" @@ -522,7 +523,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) explosion(epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, TRUE, TRUE) message_admins("[ADMIN_LOOKUPFLW(usr)] creating an admin explosion at [epicenter.loc].") log_admin("[key_name(usr)] created an admin explosion at [epicenter.loc].") - feedback_add_details("admin_verb","Drop Bomb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Drop Bomb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/drop_dynex_bomb() set category = "Special Verbs" @@ -535,7 +536,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) dyn_explosion(epicenter, ex_power) message_admins("[ADMIN_LOOKUPFLW(usr)] creating an admin explosion at [epicenter.loc].") log_admin("[key_name(usr)] created an admin explosion at [epicenter.loc].") - feedback_add_details("admin_verb","Drop Dynamic Bomb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Drop Dynamic Bomb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/get_dynex_range() set category = "Debug" @@ -580,7 +581,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) if(!S) return - feedback_add_details("admin_verb","Give Spell") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Give Spell") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] gave [key_name(T)] the spell [S].") message_admins("[key_name_admin(usr)] gave [key_name(T)] the spell [S].") @@ -602,7 +603,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) T.mind.RemoveSpell(S) log_admin("[key_name(usr)] removed the spell [S] from [key_name(T)].") message_admins("[key_name_admin(usr)] removed the spell [S] from [key_name(T)].") - feedback_add_details("admin_verb","Remove Spell") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Remove Spell") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/give_disease(mob/T in GLOB.mob_list) set category = "Fun" @@ -611,7 +612,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) var/datum/disease/D = input("Choose the disease to give to that guy", "ACHOO") as null|anything in SSdisease.diseases if(!D) return T.ForceContractDisease(new D) - feedback_add_details("admin_verb","Give Disease") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Give Disease") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] gave [key_name(T)] the disease [D].") message_admins("[key_name_admin(usr)] gave [key_name(T)] the disease [D].") @@ -625,13 +626,13 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) O.say(message) log_admin("[key_name(usr)] made [O] at [O.x], [O.y], [O.z] say \"[message]\"") message_admins("[key_name_admin(usr)] made [O] at [O.x], [O.y], [O.z]. say \"[message]\"") - feedback_add_details("admin_verb","Object Say") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Object Say") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/togglebuildmodeself() set name = "Toggle Build Mode Self" set category = "Special Verbs" if(src.mob) togglebuildmode(src.mob) - feedback_add_details("admin_verb","Toggle Build Mode") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Toggle Build Mode") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggle_log_hrefs() set name = "Toggle href logging" @@ -673,7 +674,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) to_chat(src, "You are now a normal player.") log_admin("[src] deadmined themself.") message_admins("[src] deadmined themself.") - feedback_add_details("admin_verb","Deadmin") + SSblackbox.add_details("admin_verb","Deadmin") /client/proc/readmin() set name = "Readmin" @@ -691,7 +692,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) to_chat(src, "You are now an admin.") message_admins("[src] re-adminned themselves.") log_admin("[src] re-adminned themselves.") - feedback_add_details("admin_verb","Readmin") + SSblackbox.add_details("admin_verb","Readmin") /client/proc/populate_world(amount = 50 as num) set name = "Populate World" diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 1edaea3e728..396d7d93fa0 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -310,7 +310,7 @@ usr << browse(dat, "window=players;size=600x480") /datum/admins/proc/check_antagonists() - if (SSticker && SSticker.current_state >= GAME_STATE_PLAYING) + if (SSticker.HasRoundStarted()) var/dat = "Round Status

Round Status

" if(SSticker.mode.replacementmode) dat += "Former Game Mode: [SSticker.mode.name]
" diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index 7f0479eac91..aea7d3521a0 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -198,7 +198,7 @@ if("moveminingshuttle") if(!check_rights(R_ADMIN)) return - feedback_add_details("admin_secrets_fun_used","Send Mining Shuttle") + SSblackbox.add_details("admin_secrets_fun_used","Send Mining Shuttle") if(!SSshuttle.toggleShuttle("mining","mining_home","mining_away")) message_admins("[key_name_admin(usr)] moved mining shuttle") log_admin("[key_name(usr)] moved the mining shuttle") @@ -206,7 +206,7 @@ if("movelaborshuttle") if(!check_rights(R_ADMIN)) return - feedback_add_details("admin_secrets_fun_used","Send Labor Shuttle") + SSblackbox.add_details("admin_secrets_fun_used","Send Labor Shuttle") if(!SSshuttle.toggleShuttle("laborcamp","laborcamp_home","laborcamp_away")) message_admins("[key_name_admin(usr)] moved labor shuttle") log_admin("[key_name(usr)] moved the labor shuttle") @@ -214,7 +214,7 @@ if("moveferry") if(!check_rights(R_ADMIN)) return - feedback_add_details("admin_secrets_fun_used","Send Centcom Ferry") + SSblackbox.add_details("admin_secrets_fun_used","Send Centcom Ferry") if(!SSshuttle.toggleShuttle("ferry","ferry_home","ferry_away")) message_admins("[key_name_admin(usr)] moved the centcom ferry") log_admin("[key_name(usr)] moved the centcom ferry") @@ -226,7 +226,7 @@ if(A) var/new_perma = !A.perma_docked A.perma_docked = new_perma - feedback_add_details("admin_toggle","Permadock Arrivals Shuttle|[new_perma]") + SSblackbox.add_details("admin_toggle","Permadock Arrivals Shuttle|[new_perma]") message_admins("[key_name_admin(usr)] [new_perma ? "stopped" : "started"] the arrivals shuttle") log_admin("[key_name(usr)] [new_perma ? "stopped" : "started"] the arrivals shuttle") else @@ -276,7 +276,7 @@ if("monkey") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Monkeyize All Humans") + SSblackbox.add_details("admin_secrets_fun_used","Monkeyize All Humans") for(var/mob/living/carbon/human/H in GLOB.mob_list) spawn(0) H.monkeyize() @@ -287,7 +287,7 @@ return var/result = input(usr, "Please choose a new species","Species") as null|anything in GLOB.species_list if(result) - feedback_add_details("admin_secrets_fun_used","Mass Species Change([result])") + SSblackbox.add_details("admin_secrets_fun_used","Mass Species Change([result])") log_admin("[key_name(usr)] turned all humans into [result]", 1) message_admins("\blue [key_name_admin(usr)] turned all humans into [result]") var/newtype = GLOB.species_list[result] @@ -298,12 +298,12 @@ if(!check_rights(R_FUN)) return usr.client.triple_ai() - feedback_add_details("admin_secrets_fun_used","Triple AI") + SSblackbox.add_details("admin_secrets_fun_used","Triple AI") if("power") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Power All APCs") + SSblackbox.add_details("admin_secrets_fun_used","Power All APCs") log_admin("[key_name(usr)] made all areas powered", 1) message_admins("[key_name_admin(usr)] made all areas powered") power_restore() @@ -311,7 +311,7 @@ if("unpower") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Depower All APCs") + SSblackbox.add_details("admin_secrets_fun_used","Depower All APCs") log_admin("[key_name(usr)] made all areas unpowered", 1) message_admins("[key_name_admin(usr)] made all areas unpowered") power_failure() @@ -319,7 +319,7 @@ if("quickpower") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Power All SMESs") + SSblackbox.add_details("admin_secrets_fun_used","Power All SMESs") log_admin("[key_name(usr)] made all SMESs powered", 1) message_admins("[key_name_admin(usr)] made all SMESs powered") power_restore_quick() @@ -333,7 +333,7 @@ var/objective = copytext(sanitize(input("Enter an objective")),1,MAX_MESSAGE_LEN) if(!objective) return - feedback_add_details("admin_secrets_fun_used","Traitor All ([objective])") + SSblackbox.add_details("admin_secrets_fun_used","Traitor All ([objective])") for(var/mob/living/carbon/human/H in GLOB.player_list) if(H.stat == 2 || !H.client || !H.mind) continue if(is_special_character(H)) continue @@ -365,7 +365,7 @@ if("changebombcap") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Bomb Cap") + SSblackbox.add_details("admin_secrets_fun_used","Bomb Cap") var/newBombCap = input(usr,"What would you like the new bomb cap to be. (entered as the light damage range (the 3rd number in common (1,2,3) notation)) Must be above 4)", "New Bomb Cap", GLOB.MAX_EX_LIGHT_RANGE) as num|null if (newBombCap < 4) @@ -384,7 +384,7 @@ if("blackout") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Break All Lights") + SSblackbox.add_details("admin_secrets_fun_used","Break All Lights") message_admins("[key_name_admin(usr)] broke all lights") for(var/obj/machinery/light/L in GLOB.machines) L.break_light_tube() @@ -400,7 +400,7 @@ if(animetype == "Cancel" || droptype == "Cancel") return - feedback_add_details("admin_secrets_fun_used","Chinese Cartoons") + SSblackbox.add_details("admin_secrets_fun_used","Chinese Cartoons") message_admins("[key_name_admin(usr)] made everything kawaii.") for(var/mob/living/carbon/human/H in GLOB.mob_list) H << sound('sound/AI/animes.ogg') @@ -430,7 +430,7 @@ if("whiteout") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Fix All Lights") + SSblackbox.add_details("admin_secrets_fun_used","Fix All Lights") message_admins("[key_name_admin(usr)] fixed all lights") for(var/obj/machinery/light/L in GLOB.machines) L.fix() @@ -441,7 +441,7 @@ if("virus") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Virus Outbreak") + SSblackbox.add_details("admin_secrets_fun_used","Virus Outbreak") switch(alert("Do you want this to be a random disease or do you have something in mind?",,"Make Your Own","Random","Choose")) if("Make Your Own") AdminCreateVirus(usr.client) @@ -456,7 +456,7 @@ if("retardify") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Mass Braindamage") + SSblackbox.add_details("admin_secrets_fun_used","Mass Braindamage") for(var/mob/living/carbon/human/H in GLOB.player_list) to_chat(H, "You suddenly feel stupid.") H.setBrainLoss(60) @@ -465,7 +465,7 @@ if("eagles")//SCRAW if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Egalitarian Station") + SSblackbox.add_details("admin_secrets_fun_used","Egalitarian Station") for(var/obj/machinery/door/airlock/W in GLOB.machines) if(W.z == ZLEVEL_STATION && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison)) W.req_access = list() @@ -475,7 +475,7 @@ if("guns") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Summon Guns") + SSblackbox.add_details("admin_secrets_fun_used","Summon Guns") var/survivor_probability = 0 switch(alert("Do you want this to create survivors antagonists?",,"No Antags","Some Antags","All Antags!")) if("Some Antags") @@ -488,7 +488,7 @@ if("magic") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Summon Magic") + SSblackbox.add_details("admin_secrets_fun_used","Summon Magic") var/survivor_probability = 0 switch(alert("Do you want this to create survivors antagonists?",,"No Antags","Some Antags","All Antags!")) if("Some Antags") @@ -504,22 +504,22 @@ if(!SSevents.wizardmode) if(alert("Do you want to toggle summon events on?",,"Yes","No") == "Yes") summonevents() - feedback_add_details("admin_secrets_fun_used","Activate Summon Events") + SSblackbox.add_details("admin_secrets_fun_used","Activate Summon Events") else switch(alert("What would you like to do?",,"Intensify Summon Events","Turn Off Summon Events","Nothing")) if("Intensify Summon Events") summonevents() - feedback_add_details("admin_secrets_fun_used","Intensify Summon Events") + SSblackbox.add_details("admin_secrets_fun_used","Intensify Summon Events") if("Turn Off Summon Events") SSevents.toggleWizardmode() SSevents.resetFrequency() - feedback_add_details("admin_secrets_fun_used","Disable Summon Events") + SSblackbox.add_details("admin_secrets_fun_used","Disable Summon Events") if("dorf") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Dwarf Beards") + SSblackbox.add_details("admin_secrets_fun_used","Dwarf Beards") for(var/mob/living/carbon/human/B in GLOB.mob_list) B.facial_hair_style = "Dward Beard" B.update_hair() @@ -528,21 +528,21 @@ if("onlyone") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","There Can Be Only One") + SSblackbox.add_details("admin_secrets_fun_used","There Can Be Only One") usr.client.only_one() send_to_playing_players('sound/misc/highlander.ogg') if("delayed_onlyone") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","There Can Be Only One") + SSblackbox.add_details("admin_secrets_fun_used","There Can Be Only One") usr.client.only_one_delayed() send_to_playing_players('sound/misc/highlander_delayed.ogg') if("onlyme") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","There Can Be Only Me") + SSblackbox.add_details("admin_secrets_fun_used","There Can Be Only Me") only_me() if("maint_access_brig") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index c59f947c341..6b77a705457 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -498,7 +498,7 @@ GLOB.Banlist["minutes"] << minutes GLOB.Banlist["bannedby"] << usr.ckey GLOB.Banlist.cd = "/base" - feedback_inc("ban_edit",1) + SSblackbox.inc("ban_edit",1) unbanpanel() /////////////////////////////////////new ban stuff @@ -520,7 +520,7 @@ if("Yes") ban_unban_log_save("[key_name(usr)] removed [key_name(M)]'s appearance ban.") log_admin_private("[key_name(usr)] removed [key_name(M)]'s appearance ban.") - feedback_inc("ban_appearance_unban", 1) + SSblackbox.inc("ban_appearance_unban", 1) DB_ban_unban(M.ckey, BANTYPE_ANY_JOB, "appearance") if(M.client) jobban_buildcache(M.client) @@ -539,7 +539,7 @@ jobban_buildcache(M.client) ban_unban_log_save("[key_name(usr)] appearance banned [key_name(M)]. reason: [reason]") log_admin_private("[key_name(usr)] appearance banned [key_name(M)]. \nReason: [reason]") - feedback_inc("ban_appearance",1) + SSblackbox.inc("ban_appearance",1) create_message("note", M.ckey, null, "Appearance banned - [reason]", null, null, 0, 0) message_admins("[key_name_admin(usr)] appearance banned [key_name_admin(M)].") to_chat(M, "You have been appearance banned by [usr.client.ckey].") @@ -924,8 +924,8 @@ jobban_buildcache(M.client) ban_unban_log_save("[key_name(usr)] temp-jobbanned [key_name(M)] from [job] for [mins] minutes. reason: [reason]") log_admin_private("[key_name(usr)] temp-jobbanned [key_name(M)] from [job] for [mins] minutes.") - feedback_inc("ban_job_tmp",1) - feedback_add_details("ban_job_tmp","- [job]") + SSblackbox.inc("ban_job_tmp",1) + SSblackbox.add_details("ban_job_tmp","- [job]") if(!msg) msg = job else @@ -949,8 +949,8 @@ jobban_buildcache(M.client) ban_unban_log_save("[key_name(usr)] perma-jobbanned [key_name(M)] from [job]. reason: [reason]") log_admin_private("[key_name(usr)] perma-banned [key_name(M)] from [job]") - feedback_inc("ban_job",1) - feedback_add_details("ban_job","- [job]") + SSblackbox.inc("ban_job",1) + SSblackbox.add_details("ban_job","- [job]") if(!msg) msg = job else @@ -980,8 +980,8 @@ DB_ban_unban(M.ckey, BANTYPE_ANY_JOB, job) if(M.client) jobban_buildcache(M.client) - feedback_inc("ban_job_unban",1) - feedback_add_details("ban_job_unban","- [job]") + SSblackbox.inc("ban_job_unban",1) + SSblackbox.add_details("ban_job_unban","- [job]") if(!msg) msg = job else @@ -1116,8 +1116,8 @@ ban_unban_log_save("[key_name(usr)] has banned [key_name(M)]. - Reason: [reason] - This will be removed in [mins] minutes.") to_chat(M, "You have been banned by [usr.client.ckey].\nReason: [reason]") to_chat(M, "This is a temporary ban, it will be removed in [mins] minutes.") - feedback_inc("ban_tmp",1) - feedback_inc("ban_tmp_mins",mins) + SSblackbox.inc("ban_tmp",1) + SSblackbox.inc("ban_tmp_mins",mins) if(config.banappeals) to_chat(M, "To try to resolve this matter head to [config.banappeals]") else @@ -1156,7 +1156,7 @@ var/datum/admin_help/AH = M.client ? M.client.current_ticket : null if(AH) AH.Resolve() - feedback_inc("ban_perma",1) + SSblackbox.inc("ban_perma",1) qdel(M.client) if("Cancel") return @@ -1687,7 +1687,7 @@ log_admin("[key_name(H)] got their cookie, spawned by [key_name(src.owner)].") message_admins("[key_name(H)] got their cookie, spawned by [key_name(src.owner)].") - feedback_inc("admin_cookies_spawned",1) + SSblackbox.inc("admin_cookies_spawned",1) to_chat(H, "Your prayers have been answered!! You received the best cookie!") H << 'sound/effects/pray_chaplain.ogg' @@ -1987,7 +1987,7 @@ var/choice = alert("Please confirm Feed channel creation.","Network Channel Handler","Confirm","Cancel") if(choice=="Confirm") GLOB.news_network.CreateFeedChannel(src.admincaster_feed_channel.channel_name, src.admin_signature, src.admincaster_feed_channel.locked, 1) - feedback_inc("newscaster_channels",1) + SSblackbox.inc("newscaster_channels",1) log_admin("[key_name(usr)] created command feed channel: [src.admincaster_feed_channel.channel_name]!") src.admincaster_screen=5 src.access_news_network() @@ -2010,7 +2010,7 @@ src.admincaster_screen = 6 else GLOB.news_network.SubmitArticle(src.admincaster_feed_message.returnBody(-1), src.admin_signature, src.admincaster_feed_channel.channel_name, null, 1) - feedback_inc("newscaster_stories",1) + SSblackbox.inc("newscaster_stories",1) src.admincaster_screen=4 for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.allCasters) @@ -2161,7 +2161,7 @@ else if(href_list["kick_all_from_lobby"]) if(!check_rights(R_ADMIN)) return - if(SSticker && SSticker.current_state == GAME_STATE_PLAYING) + if(SSticker.IsRoundInProgress()) var/afkonly = text2num(href_list["afkonly"]) if(alert("Are you sure you want to kick all [afkonly ? "AFK" : ""] clients from the lobby??","Message","Yes","Cancel") != "Yes") to_chat(usr, "Kick clients from lobby aborted") diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 7375fac4664..bda6354f930 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -477,7 +477,7 @@ var/list/new_args = list() for(var/arg in arguments) new_args += SDQL_expression(source, arg) - if(object == world) // Global proc. + if(object == GLOB) // Global proc. procname = "/proc/[procname]" return WrapAdminProcCall(GLOBAL_PROC, procname, new_args) return WrapAdminProcCall(object, procname, new_args) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 976912ca77d..235a9fd2961 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -264,9 +264,9 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) GLOB.ahelp_tickets.resolved_tickets -= src switch(state) if(AHELP_CLOSED) - feedback_dec("ahelp_close") + SSblackbox.dec("ahelp_close") if(AHELP_RESOLVED) - feedback_dec("ahelp_resolve") + SSblackbox.dec("ahelp_resolve") state = AHELP_ACTIVE closed_at = null if(initiator) @@ -276,7 +276,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) var/msg = "Ticket [TicketHref("#[id]")] reopened by [key_name_admin(usr)]." message_admins(msg) log_admin_private(msg) - feedback_inc("ahelp_reopen") + SSblackbox.inc("ahelp_reopen") TicketPanel() //can only be done from here, so refresh it //private @@ -298,7 +298,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) GLOB.ahelp_tickets.ListInsert(src) AddInteraction("Closed by [key_name].") if(!silent) - feedback_inc("ahelp_close") + SSblackbox.inc("ahelp_close") var/msg = "Ticket [TicketHref("#[id]")] closed by [key_name]." message_admins(msg) log_admin_private(msg) @@ -316,7 +316,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) AddInteraction("Resolved by [key_name].") if(!silent) - feedback_inc("ahelp_resolve") + SSblackbox.inc("ahelp_resolve") var/msg = "Ticket [TicketHref("#[id]")] resolved by [key_name]" message_admins(msg) log_admin_private(msg) @@ -335,7 +335,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) to_chat(initiator, "Your admin help was rejected. The adminhelp verb has been returned to you so that you may try again.") to_chat(initiator, "Please try to be calm, clear, and descriptive in admin helps, do not assume the admin has seen any related events, and clearly state the names of anybody you are reporting.") - feedback_inc("ahelp_reject") + SSblackbox.inc("ahelp_reject") var/msg = "Ticket [TicketHref("#[id]")] rejected by [key_name]" message_admins(msg) log_admin_private(msg) @@ -354,7 +354,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if(initiator) to_chat(initiator, msg) - feedback_inc("ahelp_icissue") + SSblackbox.inc("ahelp_icissue") msg = "Ticket [TicketHref("#[id]")] marked as IC by [key_name]" message_admins(msg) log_admin_private(msg) @@ -472,7 +472,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if(!msg) return - feedback_add_details("admin_verb","Adminhelp") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Adminhelp") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! if(current_ticket) if(alert(usr, "You already have a ticket open. Is this for the same issue?",,"Yes","No") != "No") if(current_ticket) @@ -591,7 +591,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) admin_keys += "[C][C.holder.fakekey ? "(Stealth)" : ""][C.is_afk() ? "(AFK)" : ""]" for(var/admin in admin_keys) - if(LAZYLEN(admin_keys) > 1) + if(LAZYLEN(message) > 1) message += ", [admin]" else message += "[admin]" diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index ccc0b15509e..f8f16684541 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -23,7 +23,7 @@ usr.forceMove(T) log_admin("[key_name(usr)] jumped to [A]") message_admins("[key_name_admin(usr)] jumped to [A]") - feedback_add_details("admin_verb","Jump To Area") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Jump To Area") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/jumptoturf(turf/T in world) set name = "Jump to Turf" @@ -35,7 +35,7 @@ log_admin("[key_name(usr)] jumped to [T.x],[T.y],[T.z] in [T.loc]") message_admins("[key_name_admin(usr)] jumped to [T.x],[T.y],[T.z] in [T.loc]") usr.loc = T - feedback_add_details("admin_verb","Jump To Turf") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Jump To Turf") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return /client/proc/jumptomob(mob/M in GLOB.mob_list) @@ -52,7 +52,7 @@ var/mob/A = src.mob var/turf/T = get_turf(M) if(T && isturf(T)) - feedback_add_details("admin_verb","Jump To Mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Jump To Mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! A.forceMove(M.loc) else to_chat(A, "This mob is not located in the game world.") @@ -70,7 +70,7 @@ A.x = tx A.y = ty A.z = tz - feedback_add_details("admin_verb","Jump To Coordiate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Jump To Coordiate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! message_admins("[key_name_admin(usr)] jumped to coordinates [tx], [ty], [tz]") /client/proc/jumptokey() @@ -94,7 +94,7 @@ usr.forceMove(M.loc) - feedback_add_details("admin_verb","Jump To Key") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Jump To Key") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/Getmob(mob/M in GLOB.mob_list) set category = "Admin" @@ -110,7 +110,7 @@ message_admins(msg) admin_ticket_log(M, msg) M.forceMove(loc) - feedback_add_details("admin_verb","Get Mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Get Mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/Getkey() set category = "Admin" @@ -138,7 +138,7 @@ if(M) M.forceMove(get_turf(usr)) usr.loc = M.loc - feedback_add_details("admin_verb","Get Key") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Get Key") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/sendmob(mob/M in sortmobs()) set category = "Admin" @@ -156,4 +156,4 @@ admin_ticket_log(M, msg) else to_chat(src, "Failed to move mob to a valid location.") - feedback_add_details("admin_verb","Send Mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Send Mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 3e16b5785fb..489441ee97a 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -11,7 +11,7 @@ if( !ismob(M) || !M.client ) return cmd_admin_pm(M.client,null) - feedback_add_details("admin_verb","Admin PM Mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Admin PM Mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //shows a list of clients we could send PMs to, then forwards our choice to cmd_admin_pm /client/proc/cmd_admin_pm_panel() @@ -33,7 +33,7 @@ targets["(No Mob) - [T]"] = T var/target = input(src,"To whom shall we send a message?","Admin PM",null) as null|anything in sortList(targets) cmd_admin_pm(targets[target],null) - feedback_add_details("admin_verb","Admin PM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Admin PM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_ahelp_reply(whom) if(prefs.muted & MUTE_ADMINHELP) diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index 3e23bbba1ac..53fb5b206e9 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -18,5 +18,5 @@ msg = "ADMIN: [key_name(usr, 1)]: [msg]" to_chat(GLOB.admins, msg) - feedback_add_details("admin_verb","Asay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Asay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/atmosdebug.dm b/code/modules/admin/verbs/atmosdebug.dm index bccdb0fb9f9..730cd689870 100644 --- a/code/modules/admin/verbs/atmosdebug.dm +++ b/code/modules/admin/verbs/atmosdebug.dm @@ -4,7 +4,7 @@ if(!src.holder) to_chat(src, "Only administrators may use this command.") return - feedback_add_details("admin_verb","Check Plumbing") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Check Plumbing") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //all plumbing - yes, some things might get stated twice, doesn't matter. for (var/obj/machinery/atmospherics/plumbing in GLOB.machines) @@ -27,7 +27,7 @@ if(!src.holder) to_chat(src, "Only administrators may use this command.") return - feedback_add_details("admin_verb","Check Power") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Check Power") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! for (var/datum/powernet/PN in GLOB.powernets) if (!PN.nodes || !PN.nodes.len) diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index 14abaf9dcb5..c8edb35ec91 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -19,7 +19,7 @@ if (!msg) return - var/nicknames = file2list("config/admin_nicknames.txt") + var/nicknames = world.file2list("config/admin_nicknames.txt") var/rendered = "DEAD: ADMIN([src.holder.fakekey ? pick(nicknames) : src.key]) says, \"[msg]\"" @@ -29,4 +29,4 @@ if (M.stat == DEAD || (M.client && M.client.holder && (M.client.prefs.chat_toggles & CHAT_DEAD))) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above M.show_message(rendered, 2) - feedback_add_details("admin_verb","Dsay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! \ No newline at end of file + SSblackbox.add_details("admin_verb","Dsay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! \ No newline at end of file diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 51a80223e0f..9fb18c86599 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -13,7 +13,7 @@ message_admins("[key_name(src)] toggled debugging on.") log_admin("[key_name(src)] toggled debugging on.") - feedback_add_details("admin_verb","Toggle Debug Two") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Toggle Debug Two") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -81,19 +81,25 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that . = get_callproc_returnval(returnval, procname) if(.) to_chat(usr, .) - feedback_add_details("admin_verb","Advanced ProcCall") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Advanced ProcCall") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -GLOBAL_VAR_INIT(AdminProcCall, null) -GLOBAL_PROTECT(AdminProcCall) +GLOBAL_VAR_INIT(AdminProcCaller, null) +GLOBAL_PROTECT(AdminProcCaller) +GLOBAL_VAR_INIT(AdminProcCallCount, 0) +GLOBAL_PROTECT(AdminProcCallCount) /proc/WrapAdminProcCall(target, procname, list/arguments) - if(GLOB.AdminProcCall) - to_chat(usr, "Another admin called proc is still running, your proc will be run after theirs finishes") - UNTIL(!GLOB.AdminProcCall) + var/current_caller = GLOB.AdminProcCaller + var/ckey = usr.client.ckey + if(current_caller && current_caller != ckey) + to_chat(usr, "Another set of admin called procs are still running, your proc will be run after theirs finish.") + UNTIL(!GLOB.AdminProcCaller) to_chat(usr, "Running your proc") - GLOB.AdminProcCall = usr.client.ckey //if this runtimes, too bad for you + GLOB.AdminProcCaller = ckey //if this runtimes, too bad for you + ++GLOB.AdminProcCallCount . = world.WrapAdminProcCall(target, procname, arguments) - GLOB.AdminProcCall = null + if(--GLOB.AdminProcCallCount == 0) + GLOB.AdminProcCaller = null //adv proc call this, ya nerds /world/proc/WrapAdminProcCall(target, procname, list/arguments) @@ -103,7 +109,7 @@ GLOBAL_PROTECT(AdminProcCall) return call(target, procname)(arglist(arguments)) /proc/IsAdminAdvancedProcCall() - return usr && usr.client && GLOB.AdminProcCall == usr.client.ckey + return usr && usr.client && GLOB.AdminProcCaller == usr.client.ckey /client/proc/callproc_datum(datum/A as null|area|mob|obj|turf) set category = "Debug" @@ -130,7 +136,7 @@ GLOBAL_PROTECT(AdminProcCall) var/msg = "[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]." message_admins(msg) admin_ticket_log(A, msg) - feedback_add_details("admin_verb","Atom ProcCall") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Atom ProcCall") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! var/returnval = WrapAdminProcCall(A, procname, lst) // Pass the lst as an argument list to the proc . = get_callproc_returnval(returnval,procname) @@ -201,7 +207,7 @@ GLOBAL_PROTECT(AdminProcCall) t+= "[env_gases[id][GAS_META][META_GAS_NAME]] : [env_gases[id][MOLES]]\n" to_chat(usr, t) - feedback_add_details("admin_verb","Air Status In Location") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Air Status In Location") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_robotize(mob/M in GLOB.mob_list) set category = "Fun" @@ -283,7 +289,7 @@ GLOBAL_PROTECT(AdminProcCall) for(var/datum/paiCandidate/candidate in SSpai.candidates) if(candidate.key == choice.key) SSpai.candidates.Remove(candidate) - feedback_add_details("admin_verb","Make pAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Make pAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_alienize(mob/M in GLOB.mob_list) set category = "Fun" @@ -296,7 +302,7 @@ GLOBAL_PROTECT(AdminProcCall) log_admin("[key_name(src)] has alienized [M.key].") spawn(0) M:Alienize() - feedback_add_details("admin_verb","Make Alien") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Make Alien") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] made [key_name(M)] into an alien.") message_admins("[key_name_admin(usr)] made [key_name(M)] into an alien.") else @@ -313,7 +319,7 @@ GLOBAL_PROTECT(AdminProcCall) log_admin("[key_name(src)] has slimeized [M.key].") spawn(0) M:slimeize() - feedback_add_details("admin_verb","Make Slime") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Make Slime") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] made [key_name(M)] into a slime.") message_admins("[key_name_admin(usr)] made [key_name(M)] into a slime.") else @@ -402,7 +408,7 @@ GLOBAL_PROTECT(AdminProcCall) CHECK_TICK log_admin("[key_name(src)] has deleted all ([counter]) instances of [hsbitem].") message_admins("[key_name_admin(src)] has deleted all ([counter]) instances of [hsbitem].", 0) - feedback_add_details("admin_verb","Delete All") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Delete All") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_debug_make_powernets() @@ -411,7 +417,7 @@ GLOBAL_PROTECT(AdminProcCall) SSmachines.makepowernets() log_admin("[key_name(src)] has remade the powernet. makepowernets() called.") message_admins("[key_name_admin(src)] has remade the powernets. makepowernets() called.", 0) - feedback_add_details("admin_verb","Make Powernets") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Make Powernets") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_grantfullaccess(mob/M in GLOB.mob_list) set category = "Admin" @@ -449,7 +455,7 @@ GLOBAL_PROTECT(AdminProcCall) else alert("Invalid mob") - feedback_add_details("admin_verb","Grant Full Access") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Grant Full Access") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(src)] has granted [M.key] full access.") message_admins("[key_name_admin(usr)] has granted [M.key] full access.") @@ -470,7 +476,7 @@ GLOBAL_PROTECT(AdminProcCall) M.ckey = src.ckey if( isobserver(adminmob) ) qdel(adminmob) - feedback_add_details("admin_verb","Assume Direct Control") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Assume Direct Control") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_areatest() set category = "Mapping" @@ -605,7 +611,7 @@ GLOBAL_PROTECT(AdminProcCall) if(isnull(custom)) return - feedback_add_details("admin_verb","Select Equipment") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Select Equipment") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! for (var/obj/item/I in M.get_equipped_items()) qdel(I) switch(dresscode) @@ -721,6 +727,13 @@ GLOBAL_PROTECT(AdminProcCall) usr << browse(dat, "window=dellog") +/client/proc/cmd_display_init_log() + set category = "Debug" + set name = "Display Initialzie() Log" + set desc = "Displays a list of things that didn't handle Initialize() properly" + + usr << browse(replacetext(SSatoms.InitLog(), "\n", "
"), "window=initlog") + /client/proc/debug_huds(i as num) set category = "Debug" set name = "Debug HUDs" @@ -770,7 +783,7 @@ GLOBAL_PROTECT(AdminProcCall) return SSshuttle.clear_transit = TRUE message_admins("[key_name_admin(src)] cleared dynamic transit space.") - feedback_add_details("admin_verb","Clear Dynamic Transit") // If... + SSblackbox.add_details("admin_verb","Clear Dynamic Transit") // If... log_admin("[key_name(src)] cleared dynamic transit space.") @@ -784,7 +797,7 @@ GLOBAL_PROTECT(AdminProcCall) global.medals_enabled = !global.medals_enabled message_admins("[key_name_admin(src)] [global.medals_enabled ? "disabled" : "enabled"] the medal hub lockout.") - feedback_add_details("admin_verb","Toggle Medal Disable") // If... + SSblackbox.add_details("admin_verb","Toggle Medal Disable") // If... log_admin("[key_name(src)] [global.medals_enabled ? "disabled" : "enabled"] the medal hub lockout.") /client/proc/view_runtimes() @@ -807,5 +820,5 @@ GLOBAL_PROTECT(AdminProcCall) SSevents.scheduled = world.time message_admins("[key_name_admin(src)] pumped a random event.") - feedback_add_details("admin_verb","Pump Random Event") + SSblackbox.add_details("admin_verb","Pump Random Event") log_admin("[key_name(src)] pumped a random event.") diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index 26bfe6883b4..15b619f6536 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -16,7 +16,7 @@ to_chat(usr, "@[target.x],[target.y]: [GM.temperature] Kelvin, [GM.return_pressure()] kPa [(burning)?("\red BURNING"):(null)]") for(var/id in GM_gases) to_chat(usr, "[GM_gases[id][GAS_META][META_GAS_NAME]]: [GM_gases[id][MOLES]]") - feedback_add_details("admin_verb","Show Air Status") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Show Air Status") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/fix_next_move() set category = "Debug" @@ -46,7 +46,7 @@ message_admins("[key_name_admin(largest_move_mob)] had the largest move delay with [largest_move_time] frames / [largest_move_time/10] seconds!") message_admins("[key_name_admin(largest_click_mob)] had the largest click delay with [largest_click_time] frames / [largest_click_time/10] seconds!") message_admins("world.time = [world.time]") - feedback_add_details("admin_verb","Unfreeze Everyone") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Unfreeze Everyone") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return /client/proc/radio_report() @@ -84,7 +84,7 @@ output += "    [device]
" usr << browse(output,"window=radioreport") - feedback_add_details("admin_verb","Show Radio Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Show Radio Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/reload_admins() set name = "Reload Admins" @@ -98,5 +98,5 @@ return load_admins() - feedback_add_details("admin_verb","Reload All Admins") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Reload All Admins") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! message_admins("[key_name_admin(usr)] manually reloaded admins") diff --git a/code/modules/admin/verbs/fps.dm b/code/modules/admin/verbs/fps.dm index 5aac2cad39b..bedcd0a6e51 100644 --- a/code/modules/admin/verbs/fps.dm +++ b/code/modules/admin/verbs/fps.dm @@ -19,6 +19,6 @@ var/msg = "[key_name(src)] has modified world.fps to [new_fps]" log_admin(msg, 0) message_admins(msg, 0) - feedback_add_details("admin_toggle","Set Server FPS|[new_fps]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Set Server FPS|[new_fps]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! world.fps = new_fps diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm index fda73e17530..c3438f15564 100644 --- a/code/modules/admin/verbs/getlogs.dm +++ b/code/modules/admin/verbs/getlogs.dm @@ -90,7 +90,7 @@ else to_chat(src, "Server log not found, try using .getserverlog.") return - feedback_add_details("admin_verb","Show Server Log") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Show Server Log") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return //Shows today's attack log @@ -104,5 +104,5 @@ else to_chat(src, "Server attack log not found, try using .getserverlog.") return - feedback_add_details("admin_verb","Show Server Attack log") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Show Server Attack log") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return diff --git a/code/modules/admin/verbs/machine_upgrade.dm b/code/modules/admin/verbs/machine_upgrade.dm index 340130bb75c..9a22623bfe0 100644 --- a/code/modules/admin/verbs/machine_upgrade.dm +++ b/code/modules/admin/verbs/machine_upgrade.dm @@ -7,4 +7,4 @@ P.rating = new_rating M.RefreshParts() - feedback_add_details("admin_toggle","Machine Upgrade|[new_rating]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Machine Upgrade|[new_rating]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 591ebfa01f3..8a8d18d5fd4 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -81,7 +81,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( seen[T]++ for(var/turf/T in seen) T.maptext = "[seen[T]]" - feedback_add_details("admin_verb","Show Camera Range") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Show Camera Range") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -123,7 +123,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( output += "" usr << browse(output,"window=airreport;size=1000x500") - feedback_add_details("admin_verb","Show Camera Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Show Camera Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/intercom_view() set category = "Mapping" @@ -144,7 +144,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( var/obj/effect/debugging/marker/F = new/obj/effect/debugging/marker(T) if (!(F in view(7,I.loc))) qdel(F) - feedback_add_details("admin_verb","Show Intercom Range") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Show Intercom Range") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_show_at_list() set category = "Mapping" @@ -160,7 +160,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( usr << browse(dat, "window=at_list") - feedback_add_details("admin_verb","Show Roundstart Active Turfs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Show Roundstart Active Turfs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/enable_debug_verbs() set category = "Debug" @@ -169,14 +169,14 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( return verbs -= /client/proc/enable_debug_verbs verbs.Add(/client/proc/disable_debug_verbs, GLOB.admin_verbs_debug_mapping) - feedback_add_details("admin_verb","Enable Debug Verbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Enable Debug Verbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/disable_debug_verbs() set category = "Debug" set name = "Debug verbs - Disable" verbs.Remove(/client/proc/disable_debug_verbs, GLOB.admin_verbs_debug_mapping) verbs += /client/proc/enable_debug_verbs - feedback_add_details("admin_verb", "Disable Debug Verbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb", "Disable Debug Verbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/count_objects_on_z_level() set category = "Mapping" @@ -219,7 +219,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( to_chat(world, line)*/ to_chat(world, "There are [count] objects of type [type_path] on z-level [num_level]") - feedback_add_details("admin_verb","Count Objects Zlevel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Count Objects Zlevel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/count_objects_all() set category = "Mapping" @@ -246,7 +246,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( to_chat(world, line)*/ to_chat(world, "There are [count] objects of type [type_path] in the game world") - feedback_add_details("admin_verb","Count Objects All") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Count Objects All") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //This proc is intended to detect lag problems relating to communication procs diff --git a/code/modules/admin/verbs/massmodvar.dm b/code/modules/admin/verbs/massmodvar.dm index 05f662fb163..e17cbbbf86d 100644 --- a/code/modules/admin/verbs/massmodvar.dm +++ b/code/modules/admin/verbs/massmodvar.dm @@ -12,7 +12,7 @@ method = vv_subtype_prompt(A.type) src.massmodify_variables(A, var_name, method) - feedback_add_details("admin_verb","Mass Edit Variables") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Mass Edit Variables") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/massmodify_variables(datum/O, var_name = "", method = 0) if(!check_rights(R_VAREDIT)) diff --git a/code/modules/admin/verbs/panicbunker.dm b/code/modules/admin/verbs/panicbunker.dm index b0c1aac982c..3da486be78d 100644 --- a/code/modules/admin/verbs/panicbunker.dm +++ b/code/modules/admin/verbs/panicbunker.dm @@ -11,5 +11,5 @@ message_admins("[key_name_admin(usr)] has toggled the Panic Bunker, it is now [(config.panic_bunker?"enabled":"disabled")].") if (config.panic_bunker && (!SSdbcore || !SSdbcore.IsConnected())) message_admins("The Database is not connected! Panic bunker will not work until the connection is reestablished.") - feedback_add_details("admin_toggle","Toggle Panic Bunker|[config.panic_bunker]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Panic Bunker|[config.panic_bunker]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 56d95289c5c..c49009daabd 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -25,7 +25,7 @@ if(M.client.prefs.toggles & SOUND_MIDI) M << admin_sound - feedback_add_details("admin_verb","Play Global Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Play Global Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/play_local_sound(S as sound) @@ -37,7 +37,7 @@ log_admin("[key_name(src)] played a local sound [S]") message_admins("[key_name_admin(src)] played a local sound [S]") playsound(get_turf(src.mob), S, 50, 0, 0) - feedback_add_details("admin_verb","Play Local Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Play Local Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/set_round_end_sound(S as sound) set category = "Fun" @@ -52,7 +52,7 @@ log_admin("[key_name(src)] set the round end sound to [S]") message_admins("[key_name_admin(src)] set the round end sound to [S]") - feedback_add_details("admin_verb","Set Round End Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Set Round End Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/stop_sounds() set category = "Debug" @@ -65,4 +65,4 @@ for(var/mob/M in GLOB.player_list) if(M.client) M << sound(null) - feedback_add_details("admin_verb","Stop All Playing Sounds") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Stop All Playing Sounds") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/possess.dm b/code/modules/admin/verbs/possess.dm index 0b077427518..e271cdb3a79 100644 --- a/code/modules/admin/verbs/possess.dm +++ b/code/modules/admin/verbs/possess.dm @@ -23,7 +23,7 @@ usr.name = O.name usr.client.eye = O usr.control_object = O - feedback_add_details("admin_verb","Possess Object") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Possess Object") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /proc/release(obj/O in world) set name = "Release Obj" @@ -41,7 +41,7 @@ usr.loc = O.loc usr.client.eye = usr usr.control_object = null - feedback_add_details("admin_verb","Release Object") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Release Object") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /proc/givetestverbs(mob/M in GLOB.mob_list) set desc = "Give this guy possess/release verbs" @@ -49,4 +49,4 @@ set name = "Give Possessing Verbs" M.verbs += /proc/possess M.verbs += /proc/release - feedback_add_details("admin_verb","Give Possessing Verbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Give Possessing Verbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 6671feae633..8a44fc97742 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -17,18 +17,18 @@ if(src.client.handle_spam_prevention(msg,MUTE_PRAY)) return - var/image/cross = image('icons/obj/storage.dmi',"bible") + var/mutable_appearance/cross = mutable_appearance('icons/obj/storage.dmi', "bible") var/font_color = "purple" var/prayer_type = "PRAYER" var/deity if(usr.job == "Chaplain") - cross = image('icons/obj/storage.dmi',"kingyellow") + cross.icon_state = "kingyellow" font_color = "blue" prayer_type = "CHAPLAIN PRAYER" if(SSreligion.deity) deity = SSreligion.deity else if(iscultist(usr)) - cross = image('icons/obj/storage.dmi',"tome") + cross.icon_state = "tome" font_color = "red" prayer_type = "CULTIST PRAYER" deity = "Nar-Sie" @@ -43,7 +43,7 @@ C << 'sound/effects/pray.ogg' to_chat(usr, "Your prayers have been received by the gods.") - feedback_add_details("admin_verb","Prayer") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Prayer") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //log_admin("HELP: [key_name(src)]: [msg]") /proc/Centcomm_announce(text , mob/Sender) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index afd69e02382..eccf8a253ac 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -18,7 +18,7 @@ var/msg = "[key_name_admin(usr)] made [key_name_admin(M)] drop everything!" message_admins(msg) admin_ticket_log(M, msg) - feedback_add_details("admin_verb","Drop Everything") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Drop Everything") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_subtle_message(mob/M in GLOB.mob_list) set category = "Special Verbs" @@ -45,7 +45,7 @@ msg = " SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]" message_admins(msg) admin_ticket_log(M, msg) - feedback_add_details("admin_verb","Subtle Message") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Subtle Message") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_world_narrate() set category = "Special Verbs" @@ -62,7 +62,7 @@ to_chat(world, "[msg]") log_admin("GlobalNarrate: [key_name(usr)] : [msg]") message_admins("[key_name_admin(usr)] Sent a global narrate") - feedback_add_details("admin_verb","Global Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Global Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_direct_narrate(mob/M) set category = "Special Verbs" @@ -88,7 +88,7 @@ msg = " DirectNarrate: [key_name(usr)] to ([M.name]/[M.key]): [msg]
" message_admins(msg) admin_ticket_log(M, msg) - feedback_add_details("admin_verb","Direct Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Direct Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_local_narrate(atom/A) set category = "Special Verbs" @@ -110,7 +110,7 @@ log_admin("LocalNarrate: [key_name(usr)] at ([get_area(A)]): [msg]") message_admins(" LocalNarrate: [key_name_admin(usr)] at ([get_area(A)]): [msg]
") - feedback_add_details("admin_verb","Local Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Local Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_godmode(mob/M in GLOB.mob_list) set category = "Special Verbs" @@ -125,7 +125,7 @@ var/msg = "[key_name_admin(usr)] has toggled [key_name_admin(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]" message_admins(msg) admin_ticket_log(M, msg) - feedback_add_details("admin_toggle","Godmode|[M.status_flags & GODMODE]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Godmode|[M.status_flags & GODMODE]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /proc/cmd_admin_mute(whom, mute_type, automute = 0) @@ -187,7 +187,7 @@ message_admins("SPAM AUTOMUTE: [muteunmute] [key_name_admin(whom)] from [mute_string].") if(C) to_chat(C, "You have been [muteunmute] from [mute_string] by the SPAM AUTOMUTE system. Contact an admin.") - feedback_add_details("admin_toggle","Auto Mute [feedback_string]|1") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Auto Mute [feedback_string]|1") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return if(P.muted & mute_type) @@ -201,7 +201,7 @@ message_admins("[key_name_admin(usr)] has [muteunmute] [key_name_admin(whom)] from [mute_string].") if(C) to_chat(C, "You have been [muteunmute] from [mute_string] by [key_name(usr, include_name = FALSE)].") - feedback_add_details("admin_toggle","Mute [feedback_string]|[P.muted & mute_type]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Mute [feedback_string]|[P.muted & mute_type]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //I use this proc for respawn character too. /N @@ -423,7 +423,7 @@ Traitors and the like can also be revived with the previous role mostly intact. to_chat(new_character, "You have been fully respawned. Enjoy the game.") - feedback_add_details("admin_verb","Respawn Character") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Respawn Character") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return new_character /client/proc/cmd_admin_add_freeform_ai_law() @@ -446,7 +446,7 @@ Traitors and the like can also be revived with the previous role mostly intact. ion.announceEvent = announce_ion_laws ion.ionMessage = input - feedback_add_details("admin_verb","Add Custom AI Law") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Add Custom AI Law") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_rejuvenate(mob/living/M in GLOB.mob_list) set category = "Special Verbs" @@ -465,7 +465,7 @@ Traitors and the like can also be revived with the previous role mostly intact. var/msg = "Admin [key_name_admin(usr)] healed / revived [key_name_admin(M)]!" message_admins(msg) admin_ticket_log(M, msg) - feedback_add_details("admin_verb","Rejuvinate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Rejuvinate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_create_centcom_report() set category = "Special Verbs" @@ -490,7 +490,7 @@ Traitors and the like can also be revived with the previous role mostly intact. log_admin("[key_name(src)] has created a command report: [input]") message_admins("[key_name_admin(src)] has created a command report") - feedback_add_details("admin_verb","Create Command Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Create Command Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_change_command_name() set category = "Special Verbs" @@ -505,7 +505,7 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("[key_name_admin(src)] has changed Central Command's name to [input]") log_admin("[key_name(src)] has changed the Central Command name to: [input]") -/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in world) +/client/proc/cmd_admin_delete(atom/A as obj|mob|turf in world) set category = "Admin" set name = "Delete" @@ -513,15 +513,20 @@ Traitors and the like can also be revived with the previous role mostly intact. to_chat(src, "Only administrators may use this command.") return - if (alert(src, "Are you sure you want to delete:\n[O]\nat ([O.x], [O.y], [O.z])?", "Confirmation", "Yes", "No") == "Yes") - log_admin("[key_name(usr)] deleted [O] at ([O.x],[O.y],[O.z])") - message_admins("[key_name_admin(usr)] deleted [O] at ([O.x],[O.y],[O.z])") - feedback_add_details("admin_verb","Delete") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - if(isturf(O)) - var/turf/T = O + admin_delete(A) + +/client/proc/admin_delete(datum/D) + var/atom/A = D + var/coords = istype(A) ? " at ([A.x], [A.y], [A.z])" : "" + if (alert(src, "Are you sure you want to delete:\n[D]\nat[coords]?", "Confirmation", "Yes", "No") == "Yes") + log_admin("[key_name(usr)] deleted [D][coords]") + message_admins("[key_name_admin(usr)] deleted [D][coords]") + SSblackbox.add_details("admin_verb","Delete") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + if(isturf(D)) + var/turf/T = D T.ChangeTurf(T.baseturf) else - qdel(O) + qdel(D) /client/proc/cmd_admin_list_open_jobs() set category = "Admin" @@ -531,7 +536,7 @@ Traitors and the like can also be revived with the previous role mostly intact. to_chat(src, "Only administrators may use this command.") return holder.manage_free_slots() - feedback_add_details("admin_verb","Manage Job Slots") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Manage Job Slots") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in world) set category = "Special Verbs" @@ -560,7 +565,7 @@ Traitors and the like can also be revived with the previous role mostly intact. explosion(O, devastation, heavy, light, flash, null, null,flames) log_admin("[key_name(usr)] created an explosion ([devastation],[heavy],[light],[flames]) at ([O.x],[O.y],[O.z])") message_admins("[key_name_admin(usr)] created an explosion ([devastation],[heavy],[light],[flames]) at ([O.x],[O.y],[O.z])") - feedback_add_details("admin_verb","Explosion") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Explosion") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return else return @@ -583,7 +588,7 @@ Traitors and the like can also be revived with the previous role mostly intact. empulse(O, heavy, light) log_admin("[key_name(usr)] created an EM Pulse ([heavy],[light]) at ([O.x],[O.y],[O.z])") message_admins("[key_name_admin(usr)] created an EM PUlse ([heavy],[light]) at ([O.x],[O.y],[O.z])") - feedback_add_details("admin_verb","EM Pulse") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","EM Pulse") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return else @@ -614,7 +619,7 @@ Traitors and the like can also be revived with the previous role mostly intact. M.gib() else M.gib(1) - feedback_add_details("admin_verb","Gib") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Gib") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_gib_self() set name = "Gibself" @@ -624,7 +629,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if(confirm == "Yes") log_admin("[key_name(usr)] used gibself.") message_admins("[key_name_admin(usr)] used gibself.") - feedback_add_details("admin_verb","Gib Self") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Gib Self") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! mob.gib(1, 1, 1) /client/proc/cmd_admin_check_contents(mob/living/M in GLOB.mob_list) @@ -634,7 +639,7 @@ Traitors and the like can also be revived with the previous role mostly intact. var/list/L = M.get_contents() for(var/t in L) to_chat(usr, "[t]") - feedback_add_details("admin_verb","Check Contents") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Check Contents") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggle_view_range() set category = "Special Verbs" @@ -649,7 +654,7 @@ Traitors and the like can also be revived with the previous role mostly intact. log_admin("[key_name(usr)] changed their view range to [view].") //message_admins("\blue [key_name_admin(usr)] changed their view range to [view].") //why? removed by order of XSI - feedback_add_details("admin_toggle","Change View Range|[view]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Change View Range|[view]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/admin_call_shuttle() @@ -668,7 +673,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return SSshuttle.emergency.request() - feedback_add_details("admin_verb","Call Shuttle") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Call Shuttle") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] admin-called the emergency shuttle.") message_admins("[key_name_admin(usr)] admin-called the emergency shuttle.") return @@ -685,7 +690,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return SSshuttle.emergency.cancel() - feedback_add_details("admin_verb","Cancel Shuttle") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Cancel Shuttle") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] admin-recalled the emergency shuttle.") message_admins("[key_name_admin(usr)] admin-recalled the emergency shuttle.") @@ -720,7 +725,7 @@ Traitors and the like can also be revived with the previous role mostly intact. to_chat(usr, "Remember: you can always disable the randomness by using the verb again, assuming the round hasn't started yet.") config.force_random_names = 1 - feedback_add_details("admin_verb","Make Everyone Random") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Make Everyone Random") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggle_random_events() @@ -735,7 +740,7 @@ Traitors and the like can also be revived with the previous role mostly intact. config.allow_random_events = 0 to_chat(usr, "Random events disabled") message_admins("Admin [key_name_admin(usr)] has disabled random events.") - feedback_add_details("admin_toggle","Toggle Random Events|[config.allow_random_events]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Random Events|[config.allow_random_events]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/admin_change_sec_level() @@ -753,7 +758,7 @@ Traitors and the like can also be revived with the previous role mostly intact. log_admin("[key_name(usr)] changed the security level to [level]") message_admins("[key_name_admin(usr)] changed the security level to [level]") - feedback_add_details("admin_verb","Set Security Level [capitalize(level)]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Set Security Level [capitalize(level)]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggle_nuke(obj/machinery/nuclearbomb/N in GLOB.nuke_list) set name = "Toggle Nuke" @@ -772,7 +777,7 @@ Traitors and the like can also be revived with the previous role mostly intact. log_admin("[key_name(usr)] [N.timing ? "activated" : "deactivated"] a nuke at ([N.x],[N.y],[N.z]).") message_admins("[ADMIN_LOOKUPFLW(usr)] [N.timing ? "activated" : "deactivated"] a nuke at [ADMIN_COORDJMP(N)].") - feedback_add_details("admin_toggle","Toggle Nuke|[N.timing]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Nuke|[N.timing]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits @@ -970,7 +975,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits 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"].") - feedback_add_details("admin_toggle","Toggle Antag HUD|[adding_hud]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Antag HUD|[adding_hud]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/has_antag_hud() var/datum/atom_hud/A = GLOB.huds[ANTAG_HUD_TRAITOR] @@ -1002,7 +1007,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits message_admins("[key_name_admin(usr)] added a latent zombie infection to all humans.") log_admin("[key_name(usr)] added a latent zombie infection to all humans.") - feedback_add_details("admin_verb","Mass Zombie Infection") + SSblackbox.add_details("admin_verb","Mass Zombie Infection") /client/proc/mass_zombie_cure() set category = "Fun" @@ -1020,7 +1025,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits message_admins("[key_name_admin(usr)] cured all zombies.") log_admin("[key_name(usr)] cured all zombies.") - feedback_add_details("admin_verb","Mass Zombie Cure") + SSblackbox.add_details("admin_verb","Mass Zombie Cure") /client/proc/polymorph_all() set category = "Fun" @@ -1039,7 +1044,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits message_admins("[key_name_admin(usr)] started polymorphed all living mobs.") log_admin("[key_name(usr)] polymorphed all living mobs.") - feedback_add_details("admin_verb","Polymorph All") + SSblackbox.add_details("admin_verb","Polymorph All") for(var/mob/living/M in mobs) CHECK_TICK @@ -1080,7 +1085,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits message_admins("[key_name_admin(usr)] sent a tip of the round.") log_admin("[key_name(usr)] sent \"[input]\" as the Tip of the Round.") - feedback_add_details("admin_verb","Show Tip") + SSblackbox.add_details("admin_verb","Show Tip") #define ON_PURRBATION(H) (!(H.dna.features["tail_human"] == "None" && H.dna.features["ears"] == "None")) @@ -1157,7 +1162,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits if (world.visibility && !world.reachable) message_admins("WARNING: The server will not show up on the hub because byond is detecting that a filewall is blocking incoming connections.") - feedback_add_details("admin_toggle","Toggled Hub Visibility|[world.visibility]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggled Hub Visibility|[world.visibility]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/smite(mob/living/carbon/human/target as mob) set name = "Smite" diff --git a/code/modules/admin/verbs/reestablish_db_connection.dm b/code/modules/admin/verbs/reestablish_db_connection.dm index 3b134eaff03..133a39185e6 100644 --- a/code/modules/admin/verbs/reestablish_db_connection.dm +++ b/code/modules/admin/verbs/reestablish_db_connection.dm @@ -17,11 +17,11 @@ SSdbcore.Disconnect() log_admin("[key_name(usr)] has forced the database to disconnect") message_admins("[key_name_admin(usr)] has forced the database to disconnect!") - feedback_add_details("admin_verb","Force Reestablished Database Connection") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Force Reestablished Database Connection") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] is attempting to re-established the DB Connection") message_admins("[key_name_admin(usr)] is attempting to re-established the DB Connection") - feedback_add_details("admin_verb","Reestablished Database Connection") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Reestablished Database Connection") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! SSdbcore.failed_connections = 0 if(!SSdbcore.Connect()) diff --git a/code/modules/admin/whitelist.dm b/code/modules/admin/whitelist.dm index b922518812c..095e3dceac0 100644 --- a/code/modules/admin/whitelist.dm +++ b/code/modules/admin/whitelist.dm @@ -5,7 +5,7 @@ GLOBAL_PROTECT(whitelist) /proc/load_whitelist() GLOB.whitelist = list() - for(var/line in file2list(WHITELISTFILE)) + for(var/line in world.file2list(WHITELISTFILE)) if(!line) continue if(findtextEx(line,"#",1,2)) diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index f2e6b451200..8a434a6f81c 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -21,7 +21,7 @@ attach(A2,user) name = "[A.name]-[A2.name] assembly" update_icon() - feedback_add_details("assembly_made","[initial(A.name)]-[initial(A2.name)]") + SSblackbox.add_details("assembly_made","[initial(A.name)]-[initial(A2.name)]") /obj/item/device/assembly_holder/proc/attach(obj/item/device/assembly/A, mob/user) if(!A.remove_item_from_storage(src)) @@ -44,14 +44,11 @@ add_overlay("[O]_l") if(a_right) - var/list/images = list() - images += image(icon, icon_state = "[a_right.icon_state]_left") + var/mutable_appearance/right = mutable_appearance(icon, "[a_right.icon_state]_left") + right.transform = matrix(-1, 0, 0, 0, 1, 0) for(var/O in a_right.attached_overlays) - images += image(icon, icon_state = "[O]_l") - var/matrix = matrix(-1, 0, 0, 0, 1, 0) - for(var/image/I in images) - I.transform = matrix - add_overlay(I) + right.add_overlay("[O]_l") + add_overlay(right) if(master) master.update_icon() diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 5c197332d12..a8a998e3495 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -662,7 +662,7 @@ playsound(src.loc, W.usesound, 50, 1) if (do_after(user, 20*W.toolspeed, target = src)) if (buildstage == 1) - user <<"You remove the air alarm electronics." + to_chat(user, "You remove the air alarm electronics.") new /obj/item/weapon/electronics/airalarm( src.loc ) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) buildstage = 0 diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index c003c1b1021..a4c0641be09 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -201,17 +201,10 @@ Pipelines + Other Objects -> Pipe network //Generate a unique identifier for this image combination var/identifier = iconsetids[iconset] + "_[iconstate]_[direction]_[col]" - var/image/img - if(pipeimages[identifier] == null) - img = image(iconset, icon_state=iconstate, dir=direction) - img.color = col - - pipeimages[identifier] = img - - else - img = pipeimages[identifier] - - return img + if((!(. = pipeimages[identifier]))) + var/image/pipe_overlay + pipe_overlay = . = pipeimages[identifier] = image(iconset, iconstate, dir = direction) + pipe_overlay.color = col /obj/machinery/atmospherics/on_construction(pipe_type, obj_color) if(can_unwrench) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm index 6ddeca63787..e67db7fcd71 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm @@ -169,7 +169,7 @@ Passive gate is similar to the regular pump except: /obj/machinery/atmospherics/components/binary/passive_gate/can_unwrench(mob/user) if(..()) if(on) - to_chat(user, "You cannot unwrench this [src], turn it off first!") + to_chat(user, "You cannot unwrench [src], turn it off first!") else return 1 diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 319c9895317..9307f1ec231 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -176,7 +176,7 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/components/binary/pump/can_unwrench(mob/user) if(..()) if(!(stat & NOPOWER) && on) - to_chat(user, "You cannot unwrench this [src], turn it off first!") + to_chat(user, "You cannot unwrench [src], turn it off first!") else return 1 diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm index 6b5c0c18db0..750ffbdedf7 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm @@ -172,7 +172,7 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/components/binary/volume_pump/can_unwrench(mob/user) if(..()) if(!(stat & NOPOWER) && on) - to_chat(user, "You cannot unwrench this [src], turn it off first!") + to_chat(user, "You cannot unwrench [src], turn it off first!") else return 1 diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm index 14d15192db1..ca90604ee71 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm @@ -1,9 +1,10 @@ /obj/machinery/atmospherics/components/unary/outlet_injector - icon_state = "inje_map" - use_power = 1 - name = "air injector" desc = "Has a valve and pump attached to it" + icon_state = "inje_map" + use_power = 1 + can_unwrench = TRUE + resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF //really helpful in building gas chambers for xenomorphs var/on = 0 var/injecting = 0 @@ -22,9 +23,13 @@ return ..() /obj/machinery/atmospherics/components/unary/outlet_injector/on - on = 1 + on = TRUE /obj/machinery/atmospherics/components/unary/outlet_injector/update_icon_nopipes() + cut_overlays() + if(showpipe) + add_overlay(getpipeimage(icon, "inje_cap", initialize_directions)) + if(!NODE1 || !on || stat & (NOPOWER|BROKEN)) icon_state = "inje_off" return @@ -42,7 +47,7 @@ ..() injecting = 0 - if(!on || stat & NOPOWER) + if(!on || stat & (NOPOWER|BROKEN)) return 0 var/datum/gas_mixture/air_contents = AIR1 @@ -60,7 +65,7 @@ return 1 /obj/machinery/atmospherics/components/unary/outlet_injector/proc/inject() - if(on || injecting) + if(on || injecting || stat & (NOPOWER|BROKEN)) return 0 var/datum/gas_mixture/air_contents = AIR1 @@ -139,3 +144,53 @@ spawn(2) broadcast_status() update_icon() + + +/obj/machinery/atmospherics/components/unary/outlet_injector/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "atmos_pump", name, 310, 115, master_ui, state) + ui.open() + +/obj/machinery/atmospherics/components/unary/outlet_injector/ui_data() + var/data = list() + data["on"] = on + data["rate"] = round(volume_rate) + data["max_rate"] = round(MAX_TRANSFER_RATE) + return data + +/obj/machinery/atmospherics/components/unary/outlet_injector/ui_act(action, params) + if(..()) + return + + switch(action) + if("power") + on = !on + investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos") + . = TRUE + if("rate") + var/rate = params["rate"] + if(rate == "max") + rate = MAX_TRANSFER_RATE + . = TRUE + else if(rate == "input") + rate = input("New transfer rate (0-[MAX_TRANSFER_RATE] L/s):", name, volume_rate) as num|null + if(!isnull(rate) && !..()) + . = TRUE + else if(text2num(rate) != null) + rate = text2num(rate) + . = TRUE + if(.) + volume_rate = Clamp(rate, 0, MAX_TRANSFER_RATE) + investigate_log("was set to [volume_rate] L/s by [key_name(usr)]", "atmos") + update_icon() + broadcast_status() + +/obj/machinery/atmospherics/components/unary/outlet_injector/can_unwrench(mob/user) + if(..()) + if (!(stat & NOPOWER|BROKEN) && on) + to_chat(user, "You cannot unwrench [src], turn it off first!") + else + return 1 + diff --git a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm index 99e59e08911..4b4122c6547 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm @@ -30,7 +30,7 @@ /obj/machinery/atmospherics/components/unary/portables_connector/can_unwrench(mob/user) if(..()) if(connected_device) - to_chat(user, "You cannot unwrench this [src], detach [connected_device] first!") + to_chat(user, "You cannot unwrench [src], detach [connected_device] first!") else return 1 diff --git a/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm b/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm index 807980318e1..32076d82e1f 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm @@ -10,6 +10,9 @@ /* Iconnery */ +/obj/machinery/atmospherics/components/unary/on_construction() + ..() + update_icon() /obj/machinery/atmospherics/components/unary/hide(intact) update_icon() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 8c43a28da4e..8edf06fbdf7 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -70,7 +70,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/update_icon_nopipes() cut_overlays() if(showpipe) - add_overlay(getpipeimage('icons/obj/atmospherics/components/unary_devices.dmi', "vent_cap", initialize_directions)) + add_overlay(getpipeimage(icon, "vent_cap", initialize_directions)) if(welded) icon_state = "vent_welded" @@ -268,7 +268,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/can_unwrench(mob/user) if(..()) if(!(stat & NOPOWER) && on) - to_chat(user, "You cannot unwrench this [src], turn it off first!") + to_chat(user, "You cannot unwrench [src], turn it off first!") else return 1 diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index baa3a2e85f3..87800e0b37d 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -87,7 +87,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/update_icon_nopipes() cut_overlays() if(showpipe) - add_overlay(getpipeimage('icons/obj/atmospherics/components/unary_devices.dmi', "scrub_cap", initialize_directions)) + add_overlay(getpipeimage(icon, "scrub_cap", initialize_directions)) if(welded) icon_state = "scrub_welded" @@ -361,7 +361,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/can_unwrench(mob/user) if(..()) if (!(stat & NOPOWER) && on) - to_chat(user, "You cannot unwrench this [src], turn it off first!") + to_chat(user, "You cannot unwrench [src], turn it off first!") else return 1 diff --git a/code/modules/atmospherics/machinery/other/miner.dm b/code/modules/atmospherics/machinery/other/miner.dm index 8b55ce14fc5..d12204d8ad3 100644 --- a/code/modules/atmospherics/machinery/other/miner.dm +++ b/code/modules/atmospherics/machinery/other/miner.dm @@ -98,12 +98,11 @@ /obj/machinery/atmospherics/miner/update_icon() overlays.Cut() if(broken) - var/image/A = image(icon, "broken") - add_overlay(A) + add_overlay("broken") else if(active) - var/image/A = image(icon, "on") - A.color = overlay_color - add_overlay(A) + var/mutable_appearance/on_overlay = mutable_appearance(icon, "on") + on_overlay.color = overlay_color + add_overlay(on_overlay) /obj/machinery/atmospherics/miner/process() update_power() diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 996b4a700b0..93b9b6b3f96 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -206,7 +206,7 @@ toggle_all_ctf(user) return - if(SSticker.current_state < GAME_STATE_PLAYING) + if(!SSticker.HasRoundStarted()) return if(user.ckey in team_members) if(user.ckey in recently_dead_ckeys) diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index d9663f97c95..96c0bc35deb 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -22,7 +22,7 @@ anchored = 1 /obj/effect/mob_spawn/attack_ghost(mob/user) - if(SSticker.current_state != GAME_STATE_PLAYING || !loc) + if(!SSticker.HasRoundStarted() || !loc) return if(!uses) to_chat(user, "This spawner is out of charges!") diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index 382be07fbe6..bea67c994f7 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -32,7 +32,7 @@ GLOBAL_LIST_INIT(potentialRandomZlevels, generateMapList(filename = "config/away /proc/generateMapList(filename) var/list/potentialMaps = list() - var/list/Lines = file2list(filename) + var/list/Lines = world.file2list(filename) if(!Lines.len) return diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index dda86e52573..6f81d884e05 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -103,8 +103,8 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they var/amount = get_amount(O) total_cost += cost total_amount += amount - feedback_add_details("export_sold_amount","[O.type]|[amount]") - feedback_add_details("export_sold_cost","[O.type]|[cost]") + SSblackbox.add_details("export_sold_amount","[O.type]|[amount]") + SSblackbox.add_details("export_sold_cost","[O.type]|[cost]") // Total printout for the cargo console. // Called before the end of current export cycle. diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 2e55c494005..6199274798d 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -172,7 +172,6 @@ GLOBAL_LIST_EMPTY(asset_datums) //DEFINITIONS FOR ASSET DATUMS START HERE. - /datum/asset/simple/tgui assets = list( "tgui.css" = 'tgui/assets/tgui.css', @@ -208,13 +207,6 @@ GLOBAL_LIST_EMPTY(asset_datums) "sig_none.gif" = 'icons/program_icons/sig_none.gif', ) - - - - - - - /datum/asset/simple/pda assets = list( "pda_atmos.png" = 'icons/pda_icons/pda_atmos.png', @@ -267,17 +259,37 @@ GLOBAL_LIST_EMPTY(asset_datums) "jquery-1.10.2.min.js" = 'html/IRV/jquery-1.10.2.min.js' ) +/datum/asset/simple/changelog + assets = list( + "88x31.png" = 'html/88x31.png', + "bug-minus.png" = 'html/bug-minus.png', + "cross-circle.png" = 'html/cross-circle.png', + "hard-hat-exclamation.png" = 'html/hard-hat-exclamation.png', + "image-minus.png" = 'html/image-minus.png', + "image-plus.png" = 'html/image-plus.png', + "music-minus.png" = 'html/music-minus.png', + "music-plus.png" = 'html/music-plus.png', + "tick-circle.png" = 'html/tick-circle.png', + "wrench-screwdriver.png" = 'html/wrench-screwdriver.png', + "spell-check.png" = 'html/spell-check.png', + "burn-exclamation.png" = 'html/burn-exclamation.png', + "chevron.png" = 'html/chevron.png', + "chevron-expand.png" = 'html/chevron-expand.png', + "scales.png" = 'html/scales.png', + "changelog.css" = 'html/changelog.css' + ) + /datum/asset/simple/chat assets = list( - "jquery.min.js" = 'code/modules/html_interface/js/jquery.min.js', - "json2.min.js" = 'goon/browserassets/js/json2.min.js', - "browserOutput.js" = 'goon/browserassets/js/browserOutput.js', - "fontawesome-webfont.eot" = 'tgui/assets/fonts/fontawesome-webfont.eot', - "fontawesome-webfont.svg" = 'tgui/assets/fonts/fontawesome-webfont.svg', - "fontawesome-webfont.ttf" = 'tgui/assets/fonts/fontawesome-webfont.ttf', - "fontawesome-webfont.woff" = 'tgui/assets/fonts/fontawesome-webfont.woff', - "font-awesome.css" = 'goon/browserassets/css/font-awesome.css', - "browserOutput.css" = 'goon/browserassets/css/browserOutput.css' + "jquery.min.js" = 'code/modules/html_interface/js/jquery.min.js', + "json2.min.js" = 'goon/browserassets/js/json2.min.js', + "browserOutput.js" = 'goon/browserassets/js/browserOutput.js', + "fontawesome-webfont.eot" = 'tgui/assets/fonts/fontawesome-webfont.eot', + "fontawesome-webfont.svg" = 'tgui/assets/fonts/fontawesome-webfont.svg', + "fontawesome-webfont.ttf" = 'tgui/assets/fonts/fontawesome-webfont.ttf', + "fontawesome-webfont.woff" = 'tgui/assets/fonts/fontawesome-webfont.woff', + "font-awesome.css" = 'goon/browserassets/css/font-awesome.css', + "browserOutput.css" = 'goon/browserassets/css/browserOutput.css' ) //Registers HTML Interface assets. diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index f64ffe026b4..d15f6e62235 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -349,8 +349,7 @@ GLOBAL_LIST(external_rsc_urls) adminGreet(1) holder.owner = null GLOB.admins -= src - - if (!GLOB.admins.len && SSticker.current_state == GAME_STATE_PLAYING) //Only report this stuff if we are currently playing. + if (!GLOB.admins.len && SSticker.IsRoundInProgress()) //Only report this stuff if we are currently playing. if(!GLOB.admins.len) //Apparently the admin logging out is no longer an admin at this point, so we have to check this towards 0 and not towards 1. Awell. var/cheesy_message = pick( "I have no admins online!",\ diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index a3231b8d902..22155a02039 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -6,7 +6,7 @@ prefs.chat_toggles ^= CHAT_GHOSTEARS to_chat(src, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTEARS) ? "see all speech in the world" : "only see speech from nearby mobs"].") prefs.save_preferences() - feedback_add_details("preferences_verb","Toggle Ghost Ears|[prefs.chat_toggles & CHAT_GHOSTEARS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Toggle Ghost Ears|[prefs.chat_toggles & CHAT_GHOSTEARS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/toggle_ghost_sight() set name = "Show/Hide GhostSight" @@ -15,7 +15,7 @@ prefs.chat_toggles ^= CHAT_GHOSTSIGHT to_chat(src, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTSIGHT) ? "see all emotes in the world" : "only see emotes from nearby mobs"].") prefs.save_preferences() - feedback_add_details("preferences_verb","Toggle Ghost Sight|[prefs.chat_toggles & CHAT_GHOSTSIGHT]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Toggle Ghost Sight|[prefs.chat_toggles & CHAT_GHOSTSIGHT]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/toggle_ghost_whispers() set name = "Show/Hide GhostWhispers" @@ -24,7 +24,7 @@ prefs.chat_toggles ^= CHAT_GHOSTWHISPER to_chat(src, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTWHISPER) ? "see all whispers in the world" : "only see whispers from nearby mobs"].") prefs.save_preferences() - feedback_add_details("preferences_verb","Toggle Ghost Whispers|[prefs.chat_toggles & CHAT_GHOSTWHISPER]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Toggle Ghost Whispers|[prefs.chat_toggles & CHAT_GHOSTWHISPER]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/toggle_ghost_radio() set name = "Show/Hide GhostRadio" @@ -33,7 +33,7 @@ prefs.chat_toggles ^= CHAT_GHOSTRADIO to_chat(src, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTRADIO) ? "see radio chatter" : "not see radio chatter"].") prefs.save_preferences() - feedback_add_details("preferences_verb","Toggle Ghost Radio|[prefs.chat_toggles & CHAT_GHOSTRADIO]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //social experiment, increase the generation whenever you copypaste this shamelessly GENERATION 1 + SSblackbox.add_details("preferences_verb","Toggle Ghost Radio|[prefs.chat_toggles & CHAT_GHOSTRADIO]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //social experiment, increase the generation whenever you copypaste this shamelessly GENERATION 1 /client/verb/toggle_ghost_pda() set name = "Show/Hide GhostPDA" @@ -42,7 +42,7 @@ prefs.chat_toggles ^= CHAT_GHOSTPDA to_chat(src, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTPDA) ? "see all pda messages in the world" : "only see pda messages from nearby mobs"].") prefs.save_preferences() - feedback_add_details("preferences_verb","Toggle Ghost PDA|[prefs.chat_toggles & CHAT_GHOSTPDA]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Toggle Ghost PDA|[prefs.chat_toggles & CHAT_GHOSTPDA]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //please be aware that the following two verbs have inverted stat output, so that "Toggle Deathrattle|1" still means you activated it /client/verb/toggle_deathrattle() @@ -52,7 +52,7 @@ prefs.toggles ^= DISABLE_DEATHRATTLE prefs.save_preferences() to_chat(usr, "You will [(prefs.toggles & DISABLE_DEATHRATTLE) ? "no longer" : "now"] get messages when a sentient mob dies.") - feedback_add_details("preferences_verb", "Toggle Deathrattle|[!(prefs.toggles & DISABLE_DEATHRATTLE)]") //If you are copy-pasting this, maybe you should spend some time reading the comments. + SSblackbox.add_details("preferences_verb", "Toggle Deathrattle|[!(prefs.toggles & DISABLE_DEATHRATTLE)]") //If you are copy-pasting this, maybe you should spend some time reading the comments. /client/verb/toggle_arrivalrattle() set name = "Toggle Arrivalrattle" @@ -61,7 +61,7 @@ prefs.toggles ^= DISABLE_ARRIVALRATTLE to_chat(usr, "You will [(prefs.toggles & DISABLE_ARRIVALRATTLE) ? "no longer" : "now"] get messages when someone joins the station.") prefs.save_preferences() - feedback_add_details("preferences_verb", "Toggle Arrivalrattle|[!(prefs.toggles & DISABLE_ARRIVALRATTLE)]") //If you are copy-pasting this, maybe you should rethink where your life went so wrong. + SSblackbox.add_details("preferences_verb", "Toggle Arrivalrattle|[!(prefs.toggles & DISABLE_ARRIVALRATTLE)]") //If you are copy-pasting this, maybe you should rethink where your life went so wrong. /client/verb/togglemidroundantag() set name = "Toggle Midround Antagonist" @@ -70,7 +70,7 @@ prefs.toggles ^= MIDROUND_ANTAG prefs.save_preferences() to_chat(src, "You will [(prefs.toggles & MIDROUND_ANTAG) ? "now" : "no longer"] be considered for midround antagonist positions.") - feedback_add_details("preferences_verb","Toggle Midround Antag|[prefs.toggles & MIDROUND_ANTAG]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Toggle Midround Antag|[prefs.toggles & MIDROUND_ANTAG]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/toggletitlemusic() set name = "Hear/Silence LobbyMusic" @@ -85,7 +85,7 @@ else to_chat(src, "You will no longer hear music in the game lobby.") mob.stop_sound_channel(CHANNEL_LOBBYMUSIC) - feedback_add_details("preferences_verb","Toggle Lobby Music|[prefs.toggles & SOUND_LOBBY]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Toggle Lobby Music|[prefs.toggles & SOUND_LOBBY]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/togglemidis() set name = "Hear/Silence Midis" @@ -98,14 +98,14 @@ else to_chat(src, "You will no longer hear sounds uploaded by admins") mob.stop_sound_channel(CHANNEL_ADMIN) - feedback_add_details("preferences_verb","Toggle Hearing Midis|[prefs.toggles & SOUND_MIDI]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Toggle Hearing Midis|[prefs.toggles & SOUND_MIDI]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/stop_client_sounds() set name = "Stop Sounds" set category = "Preferences" set desc = "Kills all currently playing sounds, use if admin taste in midis a shite" src << sound(null) - feedback_add_details("preferences_verb","Stop Self Sounds") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Stop Self Sounds") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/listen_ooc() set name = "Show/Hide OOC" @@ -114,7 +114,7 @@ prefs.chat_toggles ^= CHAT_OOC prefs.save_preferences() to_chat(src, "You will [(prefs.chat_toggles & CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel.") - feedback_add_details("preferences_verb","Toggle Seeing OOC|[prefs.chat_toggles & CHAT_OOC]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Toggle Seeing OOC|[prefs.chat_toggles & CHAT_OOC]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/Toggle_Soundscape() //All new ambience should be added here so it works with this verb until someone better at things comes up with a fix that isn't awful set name = "Hear/Silence Ambience" @@ -128,7 +128,7 @@ to_chat(src, "You will no longer hear ambient sounds.") src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1) src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2) - feedback_add_details("preferences_verb","Toggle Ambience|[prefs.toggles & SOUND_AMBIENCE]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Toggle Ambience|[prefs.toggles & SOUND_AMBIENCE]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! // This needs a toggle because you people are awful and spammed terrible music /client/verb/toggle_instruments() @@ -141,7 +141,7 @@ to_chat(src, "You will now hear people playing musical instruments.") else to_chat(src, "You will no longer hear musical instruments.") - feedback_add_details("preferences_verb","Toggle Instruments|[prefs.toggles & SOUND_INSTRUMENTS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Toggle Instruments|[prefs.toggles & SOUND_INSTRUMENTS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //Lots of people get headaches from the normal ship ambience, this is to prevent that /client/verb/toggle_ship_ambience() @@ -156,7 +156,7 @@ to_chat(src, "You will no longer hear ship ambience.") src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2) src.ambience_playing = 0 - feedback_add_details("preferences_verb", "Toggle Ship Ambience|[prefs.toggles & SOUND_SHIP_AMBIENCE]") //If you are copy-pasting this, I bet you read this comment expecting to see the same thing :^) + SSblackbox.add_details("preferences_verb", "Toggle Ship Ambience|[prefs.toggles & SOUND_SHIP_AMBIENCE]") //If you are copy-pasting this, I bet you read this comment expecting to see the same thing :^) GLOBAL_LIST_INIT(ghost_forms, list("ghost","ghostking","ghostian2","skeleghost","ghost_red","ghost_black", \ "ghost_blue","ghost_yellow","ghost_green","ghost_pink", \ @@ -244,7 +244,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.toggles ^= INTENT_STYLE to_chat(src, "[(prefs.toggles & INTENT_STYLE) ? "Clicking directly on intents selects them." : "Clicking on intents rotates selection clockwise."]") prefs.save_preferences() - feedback_add_details("preferences_verb","Toggle Intent Selection|[prefs.toggles & INTENT_STYLE]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Toggle Intent Selection|[prefs.toggles & INTENT_STYLE]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/setup_character() set name = "Game Preferences" @@ -263,7 +263,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.save_preferences() if(isobserver(mob)) mob.hud_used.show_hud() - feedback_add_details("preferences_verb","Toggle Ghost HUD|[prefs.ghost_hud]") + SSblackbox.add_details("preferences_verb","Toggle Ghost HUD|[prefs.ghost_hud]") /client/verb/toggle_inquisition() // warning: unexpected inquisition set name = "Toggle Inquisitiveness" @@ -276,7 +276,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS to_chat(src, "You will now examine everything you click on.") else to_chat(src, "You will no longer examine things you click on.") - feedback_add_details("preferences_verb","Toggle Ghost Inquisitiveness|[prefs.inquisitive_ghost]") + SSblackbox.add_details("preferences_verb","Toggle Ghost Inquisitiveness|[prefs.inquisitive_ghost]") /client/verb/toggle_announcement_sound() set name = "Hear/Silence Announcements" @@ -285,7 +285,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.toggles ^= SOUND_ANNOUNCEMENTS to_chat(src, "You will now [(prefs.toggles & SOUND_ANNOUNCEMENTS) ? "hear announcement sounds" : "no longer hear announcements"].") prefs.save_preferences() - feedback_add_details("preferences_verb","Toggle Announcement Sound|[prefs.toggles & SOUND_ANNOUNCEMENTS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Toggle Announcement Sound|[prefs.toggles & SOUND_ANNOUNCEMENTS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //Admin Preferences /client/proc/toggleadminhelpsound() @@ -297,7 +297,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.toggles ^= SOUND_ADMINHELP prefs.save_preferences() to_chat(usr, "You will [(prefs.toggles & SOUND_ADMINHELP) ? "now" : "no longer"] hear a sound when adminhelps arrive.") - feedback_add_details("admin_toggle","Toggle Adminhelp Sound|[prefs.toggles & SOUND_ADMINHELP]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Adminhelp Sound|[prefs.toggles & SOUND_ADMINHELP]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggleannouncelogin() set name = "Do/Don't Announce Login" @@ -308,7 +308,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.toggles ^= ANNOUNCE_LOGIN prefs.save_preferences() to_chat(usr, "You will [(prefs.toggles & ANNOUNCE_LOGIN) ? "now" : "no longer"] have an announcement to other admins when you login.") - feedback_add_details("admin_toggle","Toggle Login Announcement|[prefs.toggles & ANNOUNCE_LOGIN]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Login Announcement|[prefs.toggles & ANNOUNCE_LOGIN]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggle_hear_radio() set name = "Show/Hide Radio Chatter" @@ -318,7 +318,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.chat_toggles ^= CHAT_RADIO prefs.save_preferences() to_chat(usr, "You will [(prefs.chat_toggles & CHAT_RADIO) ? "now" : "no longer"] see radio chatter from nearby radios or speakers") - feedback_add_details("admin_toggle","Toggle Radio Chatter|[prefs.chat_toggles & CHAT_RADIO]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Radio Chatter|[prefs.chat_toggles & CHAT_RADIO]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/deadchat() set name = "Show/Hide Deadchat" @@ -327,7 +327,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.chat_toggles ^= CHAT_DEAD prefs.save_preferences() to_chat(src, "You will [(prefs.chat_toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat.") - feedback_add_details("admin_toggle","Toggle Deadchat Visibility|[prefs.chat_toggles & CHAT_DEAD]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Deadchat Visibility|[prefs.chat_toggles & CHAT_DEAD]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggleprayers() set name = "Show/Hide Prayers" @@ -336,7 +336,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.chat_toggles ^= CHAT_PRAYER prefs.save_preferences() to_chat(src, "You will [(prefs.chat_toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat.") - feedback_add_details("admin_toggle","Toggle Prayer Visibility|[prefs.chat_toggles & CHAT_PRAYER]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Prayer Visibility|[prefs.chat_toggles & CHAT_PRAYER]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/toggleprayersounds() set name = "Hear/Silence Prayer Sounds" @@ -348,4 +348,4 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS to_chat(src, "You will now hear prayer sounds.") else to_chat(src, "You will no longer prayer sounds.") - feedback_add_details("admin_toggle", "Toggle Prayer Sounds|[prefs.toggles & SOUND_PRAYERS]") + SSblackbox.add_details("admin_toggle", "Toggle Prayer Sounds|[prefs.toggles & SOUND_PRAYERS]") diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index 61452d8a351..93c5e50da8f 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -108,7 +108,7 @@ GLOBAL_VAR_INIT(normal_ooc_colour, OOC_COLOR) if(new_ooccolor) prefs.ooccolor = sanitize_ooccolor(new_ooccolor) prefs.save_preferences() - feedback_add_details("admin_verb","Set OOC Color") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Set OOC Color") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return /client/verb/resetcolorooc() diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index b15378c3b30..81037bd0374 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -202,7 +202,7 @@ item_color = "black" desc = "It's a plain jumpsuit. It has a small dial on the wrist." origin_tech = "syndicate=2" - sensor_mode = 0 //Hey who's this guy on the Syndicate Shuttle?? + sensor_mode = SENSOR_OFF //Hey who's this guy on the Syndicate Shuttle?? random_sensor = 0 resistance_flags = 0 armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50) @@ -455,8 +455,7 @@ if(v in blacklisted_vars) continue vars[v] = initial(vars[v]) - if(chambered.BB) - qdel(chambered.BB) + QDEL_NULL(chambered.BB) chambered.newshot() /obj/item/weapon/gun/energy/laser/chameleon/proc/set_chameleon_ammo(obj/item/ammo_casing/AC, passthrough = TRUE, reset = FALSE) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 9a21f3c4a4e..0994c2f1777 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -83,7 +83,7 @@ C.use(1) update_clothes_damaged_state(FALSE) obj_integrity = max_integrity - to_chat(user, "You fix the damages on [src] with [C].") + to_chat(user, "You fix the damage on [src] with [C].") return 1 if(pockets) var/i = pockets.attackby(W, user, params) @@ -161,7 +161,7 @@ /obj/item/clothing/obj_break(damage_flag) if(!damaged_clothes) update_clothes_damaged_state(TRUE) - + to_chat(usr, "Your [src] starts to fall apart!") /obj/item/clothing/proc/update_clothes_damaged_state(damaging = TRUE) var/index = "\ref[initial(icon)]-[initial(icon_state)]" @@ -251,9 +251,9 @@ BLIND // can't see anything . = list() if(!isinhands) if(damaged_clothes) - . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damagedgloves") + . += mutable_appearance('icons/effects/item_damage.dmi', "damagedgloves") if(blood_DNA) - . += image("icon"='icons/effects/blood.dmi', "icon_state"="bloodyhands") + . += mutable_appearance('icons/effects/blood.dmi', "bloodyhands") /obj/item/clothing/gloves/update_clothes_damaged_state(damaging = TRUE) ..() @@ -279,9 +279,9 @@ BLIND // can't see anything . = list() if(!isinhands) if(damaged_clothes) - . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damagedhelmet") + . += mutable_appearance('icons/effects/item_damage.dmi', "damagedhelmet") if(blood_DNA) - . += image("icon"='icons/effects/blood.dmi', "icon_state"="helmetblood") + . += mutable_appearance('icons/effects/blood.dmi', "helmetblood") /obj/item/clothing/head/update_clothes_damaged_state(damaging = TRUE) ..() @@ -304,9 +304,9 @@ BLIND // can't see anything if(!isinhands) if(body_parts_covered & HEAD) if(damaged_clothes) - . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damagedmask") + . += mutable_appearance('icons/effects/item_damage.dmi', "damagedmask") if(blood_DNA) - . += image("icon"='icons/effects/blood.dmi', "icon_state"="maskblood") + . += mutable_appearance('icons/effects/blood.dmi', "maskblood") //Mask @@ -326,9 +326,9 @@ BLIND // can't see anything if(!isinhands) if(body_parts_covered & HEAD) if(damaged_clothes) - . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damagedmask") + . += mutable_appearance('icons/effects/item_damage.dmi', "damagedmask") if(blood_DNA) - . += image("icon"='icons/effects/blood.dmi', "icon_state"="maskblood") + . += mutable_appearance('icons/effects/blood.dmi', "maskblood") /obj/item/clothing/mask/update_clothes_damaged_state(damaging = TRUE) ..() @@ -400,9 +400,9 @@ BLIND // can't see anything bloody = bloody_shoes[BLOOD_STATE_HUMAN] if(damaged_clothes) - . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damagedshoe") + . += mutable_appearance('icons/effects/item_damage.dmi', "damagedshoe") if(bloody) - . += image("icon"='icons/effects/blood.dmi', "icon_state"="shoeblood") + . += mutable_appearance('icons/effects/blood.dmi', "shoeblood") /obj/item/clothing/shoes/equipped(mob/user, slot) . = ..() @@ -455,9 +455,9 @@ BLIND // can't see anything . = list() if(!isinhands) if(damaged_clothes) - . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damaged[blood_overlay_type]") + . += mutable_appearance('icons/effects/item_damage.dmi', "damaged[blood_overlay_type]") if(blood_DNA) - . += image("icon"='icons/effects/blood.dmi', "icon_state"="[blood_overlay_type]blood") + . += mutable_appearance('icons/effects/blood.dmi', "[blood_overlay_type]blood") /obj/item/clothing/suit/update_clothes_damaged_state(damaging = TRUE) ..() @@ -519,9 +519,9 @@ BLIND // can't see anything slot_flags = SLOT_ICLOTHING armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0) var/fitted = FEMALE_UNIFORM_FULL // For use in alternate clothing styles for women - var/has_sensor = 1//For the crew computer 2 = unable to change mode + var/has_sensor = HAS_SENSORS // For the crew computer var/random_sensor = 1 - var/sensor_mode = 0 /* 1 = Report living/dead, 2 = Report detailed damages, 3 = Report location */ + var/sensor_mode = NO_SENSORS var/can_adjust = 1 var/adjusted = NORMAL_STYLE var/alt_covers_chest = 0 // for adjusted/rolled-down jumpsuits, 0 = exposes chest and arms, 1 = exposes arms only @@ -534,28 +534,38 @@ BLIND // can't see anything if(!isinhands) if(damaged_clothes) - . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damageduniform") + . += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform") if(blood_DNA) - . += image("icon"='icons/effects/blood.dmi', "icon_state"="uniformblood") + . += mutable_appearance('icons/effects/blood.dmi', "uniformblood") if(hastie) var/tie_color = hastie.item_color if(!tie_color) tie_color = hastie.icon_state - var/image/tI = image("icon"='icons/mob/ties.dmi', "icon_state"="[tie_color]") - tI.alpha = hastie.alpha - tI.color = hastie.color - . += tI + var/mutable_appearance/tie = mutable_appearance('icons/mob/ties.dmi', "[tie_color]") + tie.alpha = hastie.alpha + tie.color = hastie.color + . += tie + +/obj/item/clothing/under/attackby(obj/item/W, mob/user, params) + if((has_sensor == BROKEN_SENSORS) && istype(W, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/C = W + C.use(1) + has_sensor = HAS_SENSORS + to_chat(user,"You repair the suit sensors on [src] with [C].") + return 1 /obj/item/clothing/under/update_clothes_damaged_state(damaging = TRUE) ..() if(ismob(loc)) var/mob/M = loc M.update_inv_w_uniform() + if(has_sensor > NO_SENSORS) + has_sensor = BROKEN_SENSORS /obj/item/clothing/under/New() if(random_sensor) //make the sensor mode favor higher levels, except coords. - sensor_mode = pick(0, 1, 1, 2, 2, 2, 3, 3) + sensor_mode = pick(SENSOR_OFF, SENSOR_LIVING, SENSOR_LIVING, SENSOR_VITALS, SENSOR_VITALS, SENSOR_VITALS, SENSOR_COORDS, SENSOR_COORDS) adjusted = NORMAL_STYLE ..() @@ -633,15 +643,18 @@ BLIND // can't see anything to_chat(user, "Alt-click on [src] to wear it normally.") else to_chat(user, "Alt-click on [src] to wear it casually.") - switch(sensor_mode) - if(0) - to_chat(user, "Its sensors appear to be disabled.") - if(1) - to_chat(user, "Its binary life sensors appear to be enabled.") - if(2) - to_chat(user, "Its vital tracker appears to be enabled.") - if(3) - to_chat(user, "Its vital tracker and tracking beacon appear to be enabled.") + if (has_sensor == BROKEN_SENSORS) + to_chat(user, "Its sensors appear to be shorted out.") + else if(has_sensor > NO_SENSORS) + switch(sensor_mode) + if(SENSOR_OFF) + to_chat(user, "Its sensors appear to be disabled.") + if(SENSOR_LIVING) + to_chat(user, "Its binary life sensors appear to be enabled.") + if(SENSOR_VITALS) + to_chat(user, "Its vital tracker appears to be enabled.") + if(SENSOR_COORDS) + to_chat(user, "Its vital tracker and tracking beacon appear to be enabled.") if(hastie) to_chat(user, "\A [hastie] is attached to it.") @@ -661,10 +674,13 @@ BLIND // can't see anything return if (!can_use(M)) return - if(src.has_sensor >= 2) + if(src.has_sensor == LOCKED_SENSORS) to_chat(usr, "The controls are locked.") return 0 - if(src.has_sensor <= 0) + if(src.has_sensor == BROKEN_SENSORS) + to_chat(usr, "The sensors have shorted out!") + return 0 + if(src.has_sensor <= NO_SENSORS) to_chat(usr, "This suit does not have any sensors.") return 0 diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm index 9c6c960448e..6720663fb73 100644 --- a/code/modules/clothing/glasses/engine_goggles.dm +++ b/code/modules/clothing/glasses/engine_goggles.dm @@ -8,7 +8,6 @@ origin_tech = "materials=3;magnets=3;engineering=3;plasmatech=3" var/mode = 0 //0 - regular mesons mode 1 - t-ray mode - var/invis_objects = list() var/range = 1 /obj/item/clothing/glasses/meson/engine/attack_self(mob/user) @@ -26,7 +25,6 @@ darkness_view = 1 lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE to_chat(loc, "You toggle the goggles' scanning mode to \[Meson].") - invis_update() if(ishuman(user)) var/mob/living/carbon/human/H = user @@ -43,39 +41,32 @@ return if(!ishuman(loc)) - invis_update() return var/mob/living/carbon/human/user = loc if(user.glasses != src) - invis_update() return scan() /obj/item/clothing/glasses/meson/engine/proc/scan() for(var/turf/T in range(range, loc)) - - if(!T.intact) - continue - for(var/obj/O in T.contents) if(O.level != 1) continue if(O.invisibility == INVISIBILITY_MAXIMUM) - O.invisibility = 0 - invis_objects += O + flick_sonar(O) - addtimer(CALLBACK(src, .proc/invis_update), 5) - -/obj/item/clothing/glasses/meson/engine/proc/invis_update() - for(var/obj/O in invis_objects) - if(!t_ray_on() || !(O in range(range, loc))) - invis_objects -= O - var/turf/T = O.loc - if(T && T.intact) - O.invisibility = INVISIBILITY_MAXIMUM +/obj/item/clothing/glasses/meson/engine/proc/flick_sonar(obj/pipe) + if(ismob(loc)) + var/mob/M = loc + var/image/I = new(loc = get_turf(pipe)) + var/mutable_appearance/MA = new(pipe) + MA.alpha = 128 + I.appearance = MA + if(M.client) + flick_overlay(I, list(M.client), 8) /obj/item/clothing/glasses/meson/engine/proc/t_ray_on() if(!ishuman(loc)) @@ -125,7 +116,6 @@ else STOP_PROCESSING(SSobj, src) to_chat(user, "You turn the goggles off.") - invis_update() update_icon() for(var/X in actions) diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 15e4d3f885a..10924c233ae 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -30,7 +30,6 @@ var/list/hands_nodrop = list() var/obj/item/clothing/head/helmet/space/chronos/helmet = null var/obj/effect/chronos_cam/camera = null - var/image/phase_underlay = null var/datum/action/innate/chrono_teleport/teleport_now = new var/activating = 0 var/activated = 0 @@ -97,10 +96,6 @@ for(var/obj/item/I in user.held_items) if(I in hands_nodrop) I.flags &= ~NODROP - if(phase_underlay && !QDELETED(phase_underlay)) - user.underlays -= phase_underlay - qdel(phase_underlay) - phase_underlay = null if(camera) camera.remove_target_ui() camera.loc = user @@ -133,8 +128,6 @@ user.ExtinguishMob() - phase_underlay = create_phase_underlay(user) - hands_nodrop = list() for(var/obj/item/I in user.held_items) if(!(I.flags & NODROP)) @@ -171,15 +164,6 @@ else finish_chronowalk(user, to_turf) - -/obj/item/clothing/suit/space/chronos/proc/create_phase_underlay(var/mob/user) - var/icon/user_icon = icon('icons/effects/alphacolors.dmi', "") - user_icon.AddAlphaMask(getFlatIcon(user)) - var/image/phase = new(user_icon) - phase.appearance_flags = RESET_COLOR|RESET_ALPHA - user.underlays += phase - return phase - /obj/item/clothing/suit/space/chronos/process() if(activated) var/mob/living/carbon/human/user = src.loc diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index f28c3c7249a..92ee80d2c16 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -597,9 +597,9 @@ C.update_inv_wear_suit() /obj/item/clothing/suit/space/hardsuit/shielded/worn_overlays(isinhands) - . = list() - if(!isinhands) - . += image(layer = MOB_LAYER+0.01, icon = 'icons/effects/effects.dmi', icon_state = "[shield_state]") + . = list() + if(!isinhands) + . += mutable_appearance('icons/effects/effects.dmi', shield_state, MOB_LAYER + 0.01) /obj/item/clothing/head/helmet/space/hardsuit/shielded resistance_flags = FIRE_PROOF | ACID_PROOF diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index f05923f8998..91a54b0b7a7 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -13,7 +13,7 @@ armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 50, acid = 50) /obj/item/clothing/suit/armor/vest - name = "armor" + name = "armor vest" desc = "A slim armored vest that protects against most types of damage." icon_state = "armoralt" item_state = "armoralt" @@ -140,7 +140,7 @@ return 1 /obj/item/clothing/suit/armor/vest/det_suit - name = "armor" + name = "detective's armor vest" desc = "An armored vest with a detective's badge on it." icon_state = "detective-armor" allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/ballistic,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder,/obj/item/weapon/melee/classic_baton) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index b55cb58f41d..45606035a42 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -178,7 +178,7 @@ if(istype(borghead, /obj/item/clothing/head/cardborg)) //why is this done this way? because equipped() is called BEFORE THE ITEM IS IN THE SLOT WHYYYY var/image/I = image(icon = 'icons/mob/robots.dmi' , icon_state = "robot", loc = H) I.override = 1 - I.add_overlay(image(icon = 'icons/mob/robots.dmi' , icon_state = "robot_e")) //gotta look realistic + I.add_overlay(mutable_appearance('icons/mob/robots.dmi', "robot_e")) //gotta look realistic add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/silicons, "standard_borg_disguise", I) //you look like a robot to robots! (including yourself because you're totally a robot) diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index bd59d31cc76..42d978e5dec 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -224,5 +224,5 @@ to_chat(user, "The rune can only be used on battlemage armour!") return W.current_charges += 8 - user <<"You charge \the [W]. It can now absorb [W.current_charges] hits." + to_chat(user, "You charge \the [W]. It can now absorb [W.current_charges] hits.") qdel(src) diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index 11951fcf685..509d5421c2f 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -14,7 +14,7 @@ icon_state = "captain" item_state = "b_suit" item_color = "captain" - sensor_mode = 3 + sensor_mode = SENSOR_COORDS random_sensor = 0 /obj/item/clothing/under/rank/cargo diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index a83e85e585f..27e6f061f8b 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -18,7 +18,7 @@ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 30, acid = 30) strip_delay = 50 alt_covers_chest = 1 - sensor_mode = 3 + sensor_mode = SENSOR_COORDS random_sensor = 0 /obj/item/clothing/under/rank/security/grey @@ -27,7 +27,7 @@ icon_state = "security" item_state = "gy_suit" item_color = "security" - + /obj/item/clothing/under/rank/warden name = "security suit" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index be458b7a4c4..0a8be08e809 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -61,8 +61,8 @@ icon_state = "prisoner" item_state = "o_suit" item_color = "prisoner" - has_sensor = 2 - sensor_mode = 3 + has_sensor = LOCKED_SENSORS + sensor_mode = SENSOR_COORDS random_sensor = 0 /obj/item/clothing/under/rank/mailman @@ -404,7 +404,7 @@ /obj/item/clothing/under/gladiator/ash_walker desc = "This gladiator uniform appears to be covered in ash and fairly dated." - has_sensor = 0 + has_sensor = NO_SENSORS /obj/item/clothing/under/sundress name = "sundress" diff --git a/code/modules/clothing/under/shorts.dm b/code/modules/clothing/under/shorts.dm index 0da22fc678e..1464c4a6848 100644 --- a/code/modules/clothing/under/shorts.dm +++ b/code/modules/clothing/under/shorts.dm @@ -8,25 +8,31 @@ can_adjust = 0 /obj/item/clothing/under/shorts/red + name = "red athletic shorts" icon_state = "redshorts" item_color = "redshorts" /obj/item/clothing/under/shorts/green + name = "green athletic shorts" icon_state = "greenshorts" item_color = "greenshorts" /obj/item/clothing/under/shorts/blue + name = "blue athletic shorts" icon_state = "blueshorts" item_color = "blueshorts" /obj/item/clothing/under/shorts/black + name = "black athletic shorts" icon_state = "blackshorts" item_color = "blackshorts" /obj/item/clothing/under/shorts/grey + name = "grey athletic shorts" icon_state = "greyshorts" item_color = "greyshorts" /obj/item/clothing/under/shorts/purple + name = "purple athletic shorts" icon_state = "purpleshorts" item_color = "purpleshorts" \ No newline at end of file diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm index ec506accf51..f2e70367e1e 100644 --- a/code/modules/clothing/under/syndicate.dm +++ b/code/modules/clothing/under/syndicate.dm @@ -4,7 +4,7 @@ icon_state = "syndicate" item_state = "bl_suit" item_color = "syndicate" - has_sensor = 0 + has_sensor = NO_SENSORS armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 40) alt_covers_chest = 1 diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm index 77d1e1d6d9c..a14d301a31e 100644 --- a/code/modules/crafting/craft.dm +++ b/code/modules/crafting/craft.dm @@ -124,7 +124,7 @@ var/atom/movable/I = new R.result (get_turf(user.loc)) I.CheckParts(parts, R) if(send_feedback) - feedback_add_details("object_crafted","[I.type]") + SSblackbox.add_details("object_crafted","[I.type]") return 0 return "." return ", missing tool." diff --git a/code/modules/detectivework/evidence.dm b/code/modules/detectivework/evidence.dm index 94e22b8b22a..dbfc2caee29 100644 --- a/code/modules/detectivework/evidence.dm +++ b/code/modules/detectivework/evidence.dm @@ -47,15 +47,12 @@ icon_state = "evidence" - var/xx = I.pixel_x //save the offset of the item - var/yy = I.pixel_y - I.pixel_x = 0 //then remove it so it'll stay within the evidence bag - I.pixel_y = 0 - var/image/img = image("icon"=I, "layer"=FLOAT_LAYER) //take a snapshot. (necessary to stop the underlays appearing under our inventory-HUD slots ~Carn - img.plane = FLOAT_PLANE - I.pixel_x = xx //and then return it - I.pixel_y = yy - add_overlay(img) + var/mutable_appearance/in_evidence = new(I) + in_evidence.plane = FLOAT_PLANE + in_evidence.layer = FLOAT_LAYER + in_evidence.pixel_x = 0 + in_evidence.pixel_y = 0 + add_overlay(in_evidence) add_overlay("evidence") //should look nicer for transparent stuff. not really that important, but hey. desc = "An evidence bag containing [I]. [I.desc]" diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm index 4046e7dcb80..4eef1c06a31 100644 --- a/code/modules/events/_event.dm +++ b/code/modules/events/_event.dm @@ -78,13 +78,13 @@ triggering = FALSE message_admins("[key_name_admin(usr)] cancelled event [name].") log_admin_private("[key_name(usr)] cancelled event [name].") - feedback_add_details("event_admin_cancelled","[typepath]") + SSblackbox.add_details("event_admin_cancelled","[typepath]") /datum/round_event_control/proc/runEvent(random) var/datum/round_event/E = new typepath() E.current_players = get_active_player_count(alive_check = 1, afk_check = 1, human_check = 1) E.control = src - feedback_add_details("event_ran","[E]") + SSblackbox.add_details("event_ran","[E]") occurrences++ testing("[time2text(world.time, "hh:mm:ss")] [E.type]") diff --git a/code/modules/events/portal_storm.dm b/code/modules/events/portal_storm.dm index 8f95552a4b9..888b87cc026 100644 --- a/code/modules/events/portal_storm.dm +++ b/code/modules/events/portal_storm.dm @@ -34,10 +34,10 @@ var/list/hostile_types = list() var/number_of_hostiles var/list/station_areas = list() - var/image/storm + var/mutable_appearance/storm /datum/round_event/portal_storm/setup() - storm = image('icons/obj/tesla_engine/energy_ball.dmi', "energy_ball_fast", layer=FLY_LAYER) + storm = storm = mutable_appearance('icons/obj/tesla_engine/energy_ball.dmi', "energy_ball_fast", FLY_LAYER) storm.color = "#00FF00" station_areas = get_areas_in_z(ZLEVEL_STATION) diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm index 7e2deff368b..1e2710afb69 100644 --- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm +++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm @@ -22,9 +22,9 @@ if(R.glass_icon_state) icon_state = R.glass_icon_state else - var/image/I = image(icon, "glassoverlay") - I.color = mix_color_from_reagents(reagents.reagent_list) - add_overlay(I) + var/mutable_appearance/reagent_overlay = mutable_appearance(icon, "glassoverlay") + reagent_overlay.color = mix_color_from_reagents(reagents.reagent_list) + add_overlay(reagent_overlay) else icon_state = "glass_empty" name = "drinking glass" @@ -64,9 +64,9 @@ icon_state = largest_reagent.shot_glass_icon_state else icon_state = "shotglassclear" - var/image/I = image(icon, "shotglassoverlay") - I.color = mix_color_from_reagents(reagents.reagent_list) - add_overlay(I) + var/mutable_appearance/shot_overlay = mutable_appearance(icon, "shotglassoverlay") + shot_overlay.color = mix_color_from_reagents(reagents.reagent_list) + add_overlay(shot_overlay) else diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm index 705319f7c3a..3a6c2d91f66 100644 --- a/code/modules/food_and_drinks/food/customizables.dm +++ b/code/modules/food_and_drinks/food/customizables.dm @@ -101,37 +101,36 @@ filling_color = rgb(rgbcolor[1], rgbcolor[2], rgbcolor[3], rgbcolor[4]) /obj/item/weapon/reagent_containers/food/snacks/customizable/update_overlays(obj/item/weapon/reagent_containers/food/snacks/S) - var/image/I = new(icon, "[initial(icon_state)]_filling") + var/mutable_appearance/filling = mutable_appearance(icon, "[initial(icon_state)]_filling") if(S.filling_color == "#FFFFFF") - I.color = pick("#FF0000","#0000FF","#008000","#FFFF00") + filling.color = pick("#FF0000","#0000FF","#008000","#FFFF00") else - I.color = S.filling_color + filling.color = S.filling_color switch(ingredients_placement) if(INGREDIENTS_SCATTER) - I.pixel_x = rand(-1,1) - I.pixel_y = rand(-1,1) + filling.pixel_x = rand(-1,1) + filling.pixel_y = rand(-1,1) if(INGREDIENTS_STACK) - I.pixel_x = rand(-1,1) - I.pixel_y = 2 * ingredients.len - 1 + filling.pixel_x = rand(-1,1) + filling.pixel_y = 2 * ingredients.len - 1 if(INGREDIENTS_STACKPLUSTOP) - I.pixel_x = rand(-1,1) - I.pixel_y = 2 * ingredients.len - 1 + filling.pixel_x = rand(-1,1) + filling.pixel_y = 2 * ingredients.len - 1 if(our_overlays) our_overlays.Cut(ingredients.len) //???, add overlay calls later in this proc will queue the compile if necessary - var/image/TOP = new(icon, "[icon_state]_top") + var/mutable_appearance/TOP = mutable_appearance(icon, "[icon_state]_top") TOP.pixel_y = 2 * ingredients.len + 3 - add_overlay(I) + add_overlay(filling) add_overlay(TOP) return if(INGREDIENTS_FILL) cut_overlays() - I.color = filling_color + filling.color = filling_color if(INGREDIENTS_LINE) - I.pixel_y = rand(-8,3) - I.pixel_x = I.pixel_y + filling.pixel_x = filling.pixel_y = rand(-8,3) - add_overlay(I) + add_overlay(filling) /obj/item/weapon/reagent_containers/food/snacks/customizable/initialize_slice(obj/item/weapon/reagent_containers/food/snacks/slice, reagents_per_slice) @@ -248,14 +247,14 @@ name = "[customname] sandwich" BS.reagents.trans_to(src, BS.reagents.total_volume) ingMax = ingredients.len //can't add more ingredients after that - var/image/TOP = new(icon, "[BS.icon_state]") + var/mutable_appearance/TOP = mutable_appearance(icon, "[BS.icon_state]") TOP.pixel_y = 2 * ingredients.len + 3 add_overlay(TOP) if(istype(BS, /obj/item/weapon/reagent_containers/food/snacks/breadslice/custom)) - var/image/O = new(icon, "[initial(BS.icon_state)]_filling") - O.color = BS.filling_color - O.pixel_y = 2 * ingredients.len + 3 - add_overlay(O) + var/mutable_appearance/filling = new(icon, "[initial(BS.icon_state)]_filling") + filling.color = BS.filling_color + filling.pixel_y = 2 * ingredients.len + 3 + add_overlay(filling) qdel(BS) return else @@ -313,7 +312,7 @@ /obj/item/weapon/reagent_containers/glass/bowl/update_icon() cut_overlays() if(reagents && reagents.total_volume) - var/image/filling = image('icons/obj/food/soupsalad.dmi', "fullbowl") + var/mutable_appearance/filling = mutable_appearance('icons/obj/food/soupsalad.dmi', "fullbowl") filling.color = mix_color_from_reagents(reagents.reagent_list) add_overlay(filling) else diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index 96b88269718..148541922ff 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -170,7 +170,7 @@ if(istype(A, B)) continue contents_loop qdel(A) - feedback_add_details("food_made","[type]") + SSblackbox.add_details("food_made","[type]") if(bonus_reagents && bonus_reagents.len) for(var/r_id in bonus_reagents) @@ -234,13 +234,13 @@ /obj/item/weapon/reagent_containers/food/snacks/proc/update_overlays(obj/item/weapon/reagent_containers/food/snacks/S) cut_overlays() - var/image/I = new(src.icon, "[initial(icon_state)]_filling") + var/mutable_appearance/filling = mutable_appearance(icon, "[initial(icon_state)]_filling") if(S.filling_color == "#FFFFFF") - I.color = pick("#FF0000","#0000FF","#008000","#FFFF00") + filling.color = pick("#FF0000","#0000FF","#008000","#FFFF00") else - I.color = S.filling_color + filling.color = S.filling_color - add_overlay(I) + add_overlay(filling) // initialize_cooked_food() is called when microwaving the food /obj/item/weapon/reagent_containers/food/snacks/proc/initialize_cooked_food(obj/item/weapon/reagent_containers/food/snacks/S, cooking_efficiency = 1) @@ -262,7 +262,7 @@ initialize_cooked_food(S, M.efficiency) else initialize_cooked_food(S, 1) - feedback_add_details("food_made","[type]") + SSblackbox.add_details("food_made","[type]") else new /obj/item/weapon/reagent_containers/food/snacks/badrecipe(src) if(M && M.dirty < 100) diff --git a/code/modules/food_and_drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm index 625a0bfd560..c1b5a55ac06 100644 --- a/code/modules/food_and_drinks/food/snacks/meat.dm +++ b/code/modules/food_and_drinks/food/snacks/meat.dm @@ -17,9 +17,9 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/slab/initialize_slice(obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/slice, reagents_per_slice) ..() - var/image/I = new(icon, "rawcutlet_coloration") - I.color = filling_color - slice.add_overlay(I) + var/mutable_appearance/filling = mutable_appearance(icon, "rawcutlet_coloration") + filling.color = filling_color + slice.add_overlay(filling) slice.filling_color = filling_color slice.name = "raw [name] cutlet" slice.meat_type = name diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm index 4a9001c68f6..6ec7fd9a1e7 100644 --- a/code/modules/food_and_drinks/food/snacks_other.dm +++ b/code/modules/food_and_drinks/food/snacks_other.dm @@ -383,13 +383,13 @@ icon = 'icons/obj/lollipop.dmi' icon_state = "lollipop_stick" list_reagents = list("nutriment" = 1, "vitamin" = 1, "iron" = 10, "sugar" = 5, "omnizine" = 2) //Honk - var/image/head + var/mutable_appearance/head var/headcolor = rgb(0, 0, 0) tastes = list("candy" = 1) /obj/item/weapon/reagent_containers/food/snacks/lollipop/New() ..() - head = image(icon = 'icons/obj/lollipop.dmi', icon_state = "lollipop_head") + head = mutable_appearance('icons/obj/lollipop.dmi', "lollipop_head") change_head_color(rgb(rand(0, 255), rand(0, 255), rand(0, 255))) /obj/item/weapon/reagent_containers/food/snacks/lollipop/proc/change_head_color(C) diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm index 68ccce9f2f4..27016d0c20c 100644 --- a/code/modules/food_and_drinks/food/snacks_pie.dm +++ b/code/modules/food_and_drinks/food/snacks_pie.dm @@ -33,7 +33,7 @@ if(ishuman(hit_atom)) var/mob/living/carbon/human/H = hit_atom - var/image/creamoverlay = image('icons/effects/creampie.dmi') + var/mutable_appearance/creamoverlay = mutable_appearance('icons/effects/creampie.dmi') if(H.dna.species.id == "lizard") creamoverlay.icon_state = "creampie_lizard" else diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index 13442c40320..a4d9a32d3d2 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -47,7 +47,7 @@ /obj/machinery/gibber/New() ..() - src.add_overlay(image('icons/obj/kitchen.dmi', "grjam")) + add_overlay("grjam") var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/gibber(null) B.apply_default_parts(src) @@ -72,15 +72,15 @@ /obj/machinery/gibber/update_icon() cut_overlays() if (dirty) - src.add_overlay(image('icons/obj/kitchen.dmi', "grbloody")) + add_overlay("grbloody") if(stat & (NOPOWER|BROKEN)) return if (!occupant) - src.add_overlay(image('icons/obj/kitchen.dmi', "grjam")) + add_overlay("grjam") else if (operating) - src.add_overlay(image('icons/obj/kitchen.dmi', "gruse")) + add_overlay("gruse") else - src.add_overlay(image('icons/obj/kitchen.dmi', "gridle")) + add_overlay("gridle") /obj/machinery/gibber/attack_paw(mob/user) return src.attack_hand(user) diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index 6274716f0d9..4a2f0948d9a 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -142,7 +142,7 @@ return for(var/i in 1 to (C+processor.rating_amount-1)) new S.coretype(loc) - feedback_add_details("slime_core_harvested","[replacetext(S.colour," ","_")]") + SSblackbox.add_details("slime_core_harvested","[replacetext(S.colour," ","_")]") ..() /datum/food_processor_process/mob/slime/input = /mob/living/simple_animal/slime diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm index dab5673aef8..ce13bda98aa 100644 --- a/code/modules/food_and_drinks/pizzabox.dm +++ b/code/modules/food_and_drinks/pizzabox.dm @@ -59,21 +59,20 @@ icon_state = "pizzabox_open" if(pizza) icon_state = "pizzabox_messy" - var/image/pizzaimg = image(pizza.icon, icon_state = pizza.icon_state) - pizzaimg.pixel_y = -3 - add_overlay(pizzaimg) + var/mutable_appearance/pizza_overlay = mutable_appearance(pizza.icon, pizza.icon_state) + pizza_overlay.pixel_y = -3 + add_overlay(pizza_overlay) if(bomb) bomb.icon_state = "pizzabomb_[bomb_active ? "active" : "inactive"]" - var/image/bombimg = image(bomb.icon, icon_state = bomb.icon_state) - bombimg.pixel_y = 5 - add_overlay(bombimg) - else + var/mutable_appearance/bomb_overlay = mutable_appearance(bomb.icon, bomb.icon_state) + bomb_overlay.pixel_y = 5 + add_overlay(bomb_overlay) icon_state = "pizzabox[boxes.len + 1]" var/obj/item/pizzabox/box = boxes.len ? boxes[boxes.len] : src if(box.boxtag != "") - var/image/tagimg = image(icon, icon_state = "pizzabox_tag") - tagimg.pixel_y = boxes.len * 3 - add_overlay(tagimg) + var/mutable_appearance/tag_overlay = mutable_appearance(icon, "pizzabox_tag") + tag_overlay.pixel_y = boxes.len * 3 + add_overlay(tag_overlay) /obj/item/pizzabox/attack_self(mob/user) if(boxes.len > 0) diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index 29d3f6d5911..a5c21aa0f51 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -416,8 +416,8 @@ /datum/chemical_reaction/bananahonk name = "Banana Honk" id = "bananahonk" - results = list("bananahonk" = 3) - required_reagents = list("banana" = 1, "cream" = 1, "sugar" = 1) + results = list("bananahonk" = 2) + required_reagents = list("laughter" = 1, "cream" = 1) /datum/chemical_reaction/silencer name = "Silencer" @@ -542,9 +542,9 @@ results = list("chocolate_milk" = 2) required_reagents = list("milk" = 1, "cocoa" = 1) mix_message = "The color changes as the mixture blends smoothly." - + /datum/chemical_reaction/eggnog name = "eggnog" id = "eggnog" results = list("eggnog" = 15) - required_reagents = list("rum" = 5, "cream" = 5, "eggyolk" = 5) \ No newline at end of file + required_reagents = list("rum" = 5, "cream" = 5, "eggyolk" = 5) \ No newline at end of file diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index ebc9f84ae90..4e6f4c734e5 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -234,31 +234,30 @@ if (cards.len == 1) var/datum/playingcard/P = cards[1] - var/image/I = new(src.icon, (concealed ? "card_back" : "[P.card_icon]") ) + var/mutable_appearance/card_overlay = mutable_appearance(icon, (concealed ? "card_back" : "[P.card_icon]") ) - I.pixel_x = I.pixel_x + (-5 + rand(10)) - I.pixel_y = I.pixel_y + (-5 + rand(10)) + card_overlay.pixel_x = card_overlay.pixel_x + (-5 + rand(10)) + card_overlay.pixel_y = card_overlay.pixel_y + (-5 + rand(10)) - add_overlay(I) + add_overlay(card_overlay) else - var/origin = -12 - var/offset = round(32 / cards.len) + var/origin = -12 + var/offset = round(32 / cards.len) - var/i = 0 - var/image/I + var/i = 0 + var/mutable_appearance/card_overlay for(var/datum/playingcard/P in cards) - I = new(src.icon, (concealed ? "card_back" : "[P.card_icon]") ) - I.pixel_x = origin + (offset * i) + card_overlay = mutable_appearance(icon, (concealed ? "card_back" : P.card_icon)) + card_overlay.pixel_x = origin + (offset * i) - add_overlay(I) + add_overlay(card_overlay) + i = i + 1 - i = i + 1 - - var/html = "" + var/html = "" for(var/datum/playingcard/card in cards) - html = html + "" + html = html + "" src.hi.updateContent("hand", html) diff --git a/code/modules/games/cas.dm b/code/modules/games/cas.dm index c34325c9041..3858e633a2c 100644 --- a/code/modules/games/cas.dm +++ b/code/modules/games/cas.dm @@ -28,7 +28,7 @@ card_text_file = "strings/cas_black.txt" /obj/item/toy/cards/deck/cas/New() - var/static/list/cards_against_space = list("cas_white" = file2list("strings/cas_white.txt"),"cas_black" = file2list("strings/cas_black.txt")) + var/static/list/cards_against_space = list("cas_white" = world.file2list("strings/cas_white.txt"),"cas_black" = world.file2list("strings/cas_black.txt")) allcards = cards_against_space[card_face] var/list/possiblecards = allcards.Copy() if(possiblecards.len < decksize) // sanity check diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm index 067162be8ca..d418b40b811 100644 --- a/code/modules/holiday/easter.dm +++ b/code/modules/holiday/easter.dm @@ -73,8 +73,8 @@ /obj/item/weapon/storage/bag/easterbasket/proc/countEggs() cut_overlays() - add_overlay(image("icon" = icon, "icon_state" = "basket-grass", "layer" = -1)) - add_overlay(image("icon" = icon, "icon_state" = "basket-egg[contents.len <= 5 ? contents.len : 5]", "layer" = -1)) + add_overlay("basket-grass") + add_overlay("basket-egg[min(contents.len, 5)]") /obj/item/weapon/storage/bag/easterbasket/remove_from_storage(obj/item/W as obj, atom/new_location) ..() diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm index 18be292e97f..2648355b10d 100644 --- a/code/modules/holodeck/computer.dm +++ b/code/modules/holodeck/computer.dm @@ -48,49 +48,49 @@ /obj/machinery/computer/holodeck/Initialize(mapload) - . = mapload //late-initialize, area_copy need turfs to have air - if(!mapload) - ..() + ..() + return INITIALIZE_HINT_LATELOAD - if(ispath(holodeck_type,/area)) - var/list/possible = get_areas(holodeck_type,subtypes = FALSE) - linked = pop(possible) - if(ispath(offline_program,/area)) - var/list/possible = get_areas(offline_program,subtypes = FALSE) - offline_program = pop(possible) - // the following is necessary for power reasons - if(!linked || !offline_program) - log_world("No matching holodeck area found") - qdel(src) - return - var/area/AS = get_area(src) - if(istype(AS,/area/holodeck)) - log_world("### MAPPING ERROR") - log_world("Holodeck computer cannot be in a holodeck.") - log_world("This would cause circular power dependency.") - qdel(src) // todo handle constructed computers - return //l-lewd... - else - linked.linked = src // todo detect multiple/constructed computers +/obj/machinery/computer/holodeck/LateInitialize() + if(ispath(holodeck_type,/area)) + var/list/possible = get_areas(holodeck_type,subtypes = FALSE) + linked = pop(possible) + if(ispath(offline_program,/area)) + var/list/possible = get_areas(offline_program,subtypes = FALSE) + offline_program = pop(possible) + // the following is necessary for power reasons + if(!linked || !offline_program) + log_world("No matching holodeck area found") + qdel(src) + return + var/area/AS = get_area(src) + if(istype(AS,/area/holodeck)) + log_world("### MAPPING ERROR") + log_world("Holodeck computer cannot be in a holodeck.") + log_world("This would cause circular power dependency.") + qdel(src) // todo handle constructed computers + return //l-lewd... + else + linked.linked = src // todo detect multiple/constructed computers - program_cache = list() - emag_programs = list() - for(var/typekey in subtypesof(program_type)) - var/area/holodeck/A = locate(typekey) - if(!A || A == offline_program) - continue - if(A.contents.len == 0) - continue // not loaded - if(A.restricted) - emag_programs += A - else - program_cache += A - if(typekey == init_program) - load_program(A,force=1) - if(random_program && program_cache.len && init_program == null) - load_program(pick(program_cache),force=1) - else if(!program) - load_program(offline_program) + program_cache = list() + emag_programs = list() + for(var/typekey in subtypesof(program_type)) + var/area/holodeck/A = locate(typekey) + if(!A || A == offline_program) + continue + if(A.contents.len == 0) + continue // not loaded + if(A.restricted) + emag_programs += A + else + program_cache += A + if(typekey == init_program) + load_program(A,force=1) + if(random_program && program_cache.len && init_program == null) + load_program(pick(program_cache),force=1) + else if(!program) + load_program(offline_program) /obj/machinery/computer/holodeck/power_change() ..() diff --git a/code/modules/hydroponics/beekeeping/honeycomb.dm b/code/modules/hydroponics/beekeeping/honeycomb.dm index 442dd84aaf5..85d623d1e98 100644 --- a/code/modules/hydroponics/beekeeping/honeycomb.dm +++ b/code/modules/hydroponics/beekeeping/honeycomb.dm @@ -21,13 +21,11 @@ /obj/item/weapon/reagent_containers/honeycomb/update_icon() cut_overlays() - var/image/honey + var/mutable_appearance/honey_overlay = mutable_appearance(icon, "honey") if(honey_color) - honey = image(icon = 'icons/obj/hydroponics/harvest.dmi', icon_state = "greyscale_honey") - honey.color = honey_color - else - honey = image(icon = 'icons/obj/hydroponics/harvest.dmi', icon_state = "honey") - add_overlay(honey) + honey_overlay.icon_state = "greyscale_honey" + honey_overlay.color = honey_color + add_overlay(honey_overlay) /obj/item/weapon/reagent_containers/honeycomb/proc/set_reagent(reagent) diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 2c995695d14..6a1c877b97f 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -116,8 +116,9 @@ can_buckle = 1 buckle_requires_restraints = 1 to_chat(user, "You add a rod to [src].") - var/image/U = image(icon='icons/obj/hydroponics/equipment.dmi',icon_state="bonfire_rod",pixel_y=16) - underlays += U + var/mutable_appearance/rod_underlay = mutable_appearance('icons/obj/hydroponics/equipment.dmi', "bonfire_rod") + rod_underlay.pixel_y = 16 + underlays += rod_underlay if(W.is_hot()) StartBurning() diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 8e3b2e705a3..22384aa8039 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -259,7 +259,7 @@ if(istype(src, /obj/machinery/hydroponics/soil)) add_atom_colour(rgb(255, 175, 0), FIXED_COLOUR_PRIORITY) else - add_overlay(image('icons/obj/hydroponics/equipment.dmi', icon_state = "gaia_blessing")) + overlays += mutable_appearance('icons/obj/hydroponics/equipment.dmi', "gaia_blessing") set_light(3) update_icon_hoses() @@ -287,31 +287,30 @@ icon_state = "hoses-[n]" /obj/machinery/hydroponics/proc/update_icon_plant() - var/image/I + var/mutable_appearance/plant_overlay = mutable_appearance(myseed.growing_icon, layer = OBJ_LAYER + 0.01) if(dead) - I = image(icon = myseed.growing_icon, icon_state = myseed.icon_dead) + plant_overlay.icon_state = myseed.icon_dead else if(harvest) if(!myseed.icon_harvest) - I = image(icon = myseed.growing_icon, icon_state = "[myseed.icon_grow][myseed.growthstages]") + plant_overlay.icon_state = "[myseed.icon_grow][myseed.growthstages]" else - I = image(icon = myseed.growing_icon, icon_state = myseed.icon_harvest) + plant_overlay.icon_state = myseed.icon_harvest else var/t_growthstate = min(round((age / myseed.maturation) * myseed.growthstages), myseed.growthstages) - I = image(icon = myseed.growing_icon, icon_state = "[myseed.icon_grow][t_growthstate]") - I.layer = OBJ_LAYER + 0.01 - add_overlay(I) + plant_overlay.icon_state = "[myseed.icon_grow][t_growthstate]" + add_overlay(plant_overlay) /obj/machinery/hydroponics/proc/update_icon_lights() if(waterlevel <= 10) - add_overlay(image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_lowwater3")) + add_overlay(mutable_appearance('icons/obj/hydroponics/equipment.dmi', "over_lowwater3")) if(nutrilevel <= 2) - add_overlay(image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_lownutri3")) + add_overlay(mutable_appearance('icons/obj/hydroponics/equipment.dmi', "over_lownutri3")) if(plant_health <= (myseed.endurance / 2)) - add_overlay(image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_lowhealth3")) + add_overlay(mutable_appearance('icons/obj/hydroponics/equipment.dmi', "over_lowhealth3")) if(weedlevel >= 5 || pestlevel >= 5 || toxic >= 40) - add_overlay(image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_alert3")) + add_overlay(mutable_appearance('icons/obj/hydroponics/equipment.dmi', "over_alert3")) if(harvest) - add_overlay(image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_harvest3")) + add_overlay(mutable_appearance('icons/obj/hydroponics/equipment.dmi', "over_harvest3")) /obj/machinery/hydroponics/examine(user) diff --git a/code/modules/hydroponics/sample.dm b/code/modules/hydroponics/sample.dm index a4ab2919be8..52c2e1052fe 100644 --- a/code/modules/hydroponics/sample.dm +++ b/code/modules/hydroponics/sample.dm @@ -8,9 +8,9 @@ /obj/item/seeds/sample/New() ..() if(sample_color) - var/image/I = image(icon, icon_state = "sample-filling") - I.color = sample_color - add_overlay(I) + var/mutable_appearance/filling = mutable_appearance(icon, "sample-filling") + filling.color = sample_color + add_overlay(filling) /obj/item/seeds/sample/get_analyzer_text() return " The DNA of this sample is damaged beyond recovery, it can't support life on its own.\n*---------*" diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 7c2d58d8a80..4b83485fa55 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -150,7 +150,7 @@ t_amount++ product_name = t_prod.name if(getYield() >= 1) - feedback_add_details("food_harvested","[product_name]|[getYield()]") + SSblackbox.add_details("food_harvested","[product_name]|[getYield()]") parent.update_tray() return result diff --git a/code/modules/jobs/job_types/civilian_chaplain.dm b/code/modules/jobs/job_types/civilian_chaplain.dm index f796da92005..0633e6486d3 100644 --- a/code/modules/jobs/job_types/civilian_chaplain.dm +++ b/code/modules/jobs/job_types/civilian_chaplain.dm @@ -82,8 +82,8 @@ Chaplain H.equip_to_slot_or_del(B, slot_in_backpack) - feedback_set_details("religion_name","[new_religion]") - feedback_set_details("religion_deity","[new_deity]") + SSblackbox.set_details("religion_name","[new_religion]") + SSblackbox.set_details("religion_deity","[new_deity]") /datum/outfit/job/chaplain name = "Chaplain" diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index d47c4da04b2..e0588acf2b5 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -51,7 +51,7 @@ return FALSE smooth_zlevel(world.maxz) - SortAreas() + repopulate_sorted_areas() //initialize things that are normally initialized after map load initTemplateBounds(bounds) @@ -74,6 +74,9 @@ //initialize things that are normally initialized after map load initTemplateBounds(bounds) + if(!SSmapping.loading_ruins) //Will be done manually during mapping ss init + repopulate_sorted_areas() + log_game("[name] loaded at at [T.x],[T.y],[T.z]") return TRUE diff --git a/code/modules/mining/aux_base.dm b/code/modules/mining/aux_base.dm index b98a3cfd98f..8c2d1ca2818 100644 --- a/code/modules/mining/aux_base.dm +++ b/code/modules/mining/aux_base.dm @@ -131,7 +131,7 @@ interface with the mining shuttle at the landing site if a mobile beacon is also /obj/machinery/computer/auxillary_base/onShuttleMove(turf/T1, rotation) ..() if(z == ZLEVEL_MINING) //Avoids double logging and landing on other Z-levels due to badminnery - feedback_add_details("colonies_dropped", "[x]|[y]|[z]") //Number of times a base has been dropped! + SSblackbox.add_details("colonies_dropped", "[x]|[y]|[z]") //Number of times a base has been dropped! /obj/machinery/computer/auxillary_base/proc/set_mining_mode() if(z == ZLEVEL_MINING) //The console switches to controlling the mining shuttle once landed. diff --git a/code/modules/mining/equipment.dm b/code/modules/mining/equipment.dm index 02a752c2d76..dd8766bdc9a 100644 --- a/code/modules/mining/equipment.dm +++ b/code/modules/mining/equipment.dm @@ -68,7 +68,7 @@ /obj/item/device/wormhole_jaunter/attack_self(mob/user) user.visible_message("[user.name] activates the [src.name]!") - feedback_add_details("jaunter", "User") // user activated + SSblackbox.add_details("jaunter", "User") // user activated activate(user) /obj/item/device/wormhole_jaunter/proc/turf_check(mob/user) @@ -124,13 +124,13 @@ if(triggered) usr.visible_message("The [src] overloads and activates!") - feedback_add_details("jaunter","EMP") // EMP accidental activation + SSblackbox.add_details("jaunter","EMP") // EMP accidental activation activate(usr) /obj/item/device/wormhole_jaunter/proc/chasm_react(mob/user) if(user.get_item_by_slot(slot_belt) == src) to_chat(user, "Your [src] activates, saving you from the chasm!") - feedback_add_details("jaunter","Chasm") // chasm automatic activation + SSblackbox.add_details("jaunter","Chasm") // chasm automatic activation activate(user) else to_chat(user, "The [src] is not attached to your belt, preventing it from saving you from the chasm. RIP.") @@ -320,7 +320,7 @@ H.attack_same = 0 loaded = 0 user.visible_message("[user] injects [M] with [src], reviving it.") - feedback_add_details("lazarus_injector", "[M.type]") + SSblackbox.add_details("lazarus_injector", "[M.type]") playsound(src,'sound/effects/refill.ogg',50,1) icon_state = "lazarus_empty" return @@ -513,7 +513,7 @@ var/charged = 1 var/charge_time = 16 var/atom/mark = null - var/marked_image = null + var/mutable_appearance/marked_underlay /obj/item/projectile/destabilizer name = "destabilizing force" @@ -530,15 +530,16 @@ if(hammer_synced.mark == target) return ..() if(isliving(target)) - if(hammer_synced.mark && hammer_synced.marked_image) - hammer_synced.mark.underlays -= hammer_synced.marked_image - hammer_synced.marked_image = null + if(hammer_synced.mark && hammer_synced.marked_underlay) + hammer_synced.mark.underlays -= hammer_synced.marked_underlay + hammer_synced.marked_underlay = null var/mob/living/L = target if(L.mob_size >= MOB_SIZE_LARGE) hammer_synced.mark = L - var/image/I = image('icons/effects/effects.dmi', loc = L, icon_state = "shield2",pixel_y = (-L.pixel_y),pixel_x = (-L.pixel_x)) - L.underlays += I - hammer_synced.marked_image = I + hammer_synced.marked_underlay = mutable_appearance('icons/effects/effects.dmi', "shield2") + hammer_synced.marked_underlay.pixel_x = -L.pixel_x + hammer_synced.marked_underlay.pixel_y = -L.pixel_y + L.underlays += hammer_synced.marked_underlay var/target_turf = get_turf(target) if(ismineralturf(target_turf)) var/turf/closed/mineral/M = target_turf @@ -570,9 +571,8 @@ new /obj/effect/overlay/temp/kinetic_blast(get_turf(L)) mark = 0 if(L.mob_size >= MOB_SIZE_LARGE) - L.underlays -= marked_image - qdel(marked_image) - marked_image = null + L.underlays -= marked_underlay + QDEL_NULL(marked_underlay) var/backstab_dir = get_dir(user, L) var/def_check = L.getarmor(type = "bomb") if((user.dir & backstab_dir) && (L.dir & backstab_dir)) diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index 463ee524f94..b8b1bcc6b9e 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -69,9 +69,9 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) if(uses_left <= 0) user.drop_item(src) loc = A - var/image/balloon - var/image/balloon2 - var/image/balloon3 + var/mutable_appearance/balloon + var/mutable_appearance/balloon2 + var/mutable_appearance/balloon3 if(isliving(A)) var/mob/living/M = A M.Weaken(16) // Keep them from moving during the duration of the extraction @@ -82,12 +82,12 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) var/obj/effect/extraction_holder/holder_obj = new(A.loc) holder_obj.appearance = A.appearance A.loc = holder_obj - balloon2 = image('icons/obj/fulton_balloon.dmi',"fulton_expand") + balloon2 = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_expand") balloon2.pixel_y = 10 balloon2.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM holder_obj.add_overlay(balloon2) sleep(4) - balloon = image('icons/obj/fulton_balloon.dmi',"fulton_balloon") + balloon = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_balloon") balloon.pixel_y = 10 balloon.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM holder_obj.cut_overlay(balloon2) @@ -121,7 +121,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) sleep(10) animate(holder_obj, pixel_z = 10, time = 10) sleep(10) - balloon3 = image('icons/obj/fulton_balloon.dmi',"fulton_retract") + balloon3 = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_retract") balloon3.pixel_y = 10 balloon3.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM holder_obj.cut_overlay(balloon) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 95f8d2d9bdc..6b1179a5851 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -86,7 +86,7 @@ user.sight |= SEE_MOBS icon_state = "lantern" wisp.orbit(user, 20) - feedback_add_details("wisp_lantern","Freed") + SSblackbox.add_details("wisp_lantern","Freed") else to_chat(user, "You return the wisp to the lantern.") @@ -101,7 +101,7 @@ wisp.stop_orbit() wisp.loc = src icon_state = "lantern-blue" - feedback_add_details("wisp_lantern","Returned") + SSblackbox.add_details("wisp_lantern","Returned") /obj/item/device/wisp_lantern/Initialize() ..() @@ -140,7 +140,7 @@ return new /obj/effect/particle_effect/smoke(user.loc) user.forceMove(get_turf(linked)) - feedback_add_details("warp_cube","[src.type]") + SSblackbox.add_details("warp_cube","[src.type]") new /obj/effect/particle_effect/smoke(user.loc) /obj/item/device/warp_cube/red @@ -228,7 +228,7 @@ /obj/item/device/immortality_talisman/attack_self(mob/user) if(cooldown < world.time) - feedback_add_details("immortality_talisman","Activated") // usage + SSblackbox.add_details("immortality_talisman","Activated") // usage cooldown = world.time + 600 user.visible_message("[user] vanishes from reality, leaving a a hole in [user.p_their()] place!") var/obj/effect/immortality_talisman/Z = new(get_turf(src.loc)) diff --git a/code/modules/mining/lavaland/ruins/gym.dm b/code/modules/mining/lavaland/ruins/gym.dm index c390851b1b3..13e3e56f667 100644 --- a/code/modules/mining/lavaland/ruins/gym.dm +++ b/code/modules/mining/lavaland/ruins/gym.dm @@ -68,9 +68,8 @@ user.setDir(SOUTH) user.Stun(4) user.loc = src.loc - var/image/W = image('goon/icons/obj/fitness.dmi',"fitnessweight-w") - W.layer = WALL_OBJ_LAYER - add_overlay(W) + var/mutable_appearance/swole_overlay = mutable_appearance(icon, "fitnessweight-w", WALL_OBJ_LAYER) + add_overlay(swole_overlay) var/bragmessage = pick("pushing it to the limit","going into overdrive","burning with determination","rising up to the challenge", "getting strong now","getting ripped") user.visible_message("[user] is [bragmessage]!") var/reps = 0 @@ -93,5 +92,5 @@ animate(user, pixel_y = 0, time = 3) var/finishmessage = pick("You feel stronger!","You feel like you can take on the world!","You feel robust!","You feel indestructible!") icon_state = "fitnessweight" - cut_overlay(W) + cut_overlay(swole_overlay) to_chat(user, "[finishmessage]") \ No newline at end of file diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index dc6bc87d189..0d651518b75 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -136,7 +136,7 @@ else inserted_id.mining_points -= prize.cost new prize.equipment_path(src.loc) - feedback_add_details("mining_equipment_bought", + SSblackbox.add_details("mining_equipment_bought", "[src.type]|[prize.equipment_path]") // Add src.type to keep track of free golem purchases // seperately. @@ -189,7 +189,7 @@ if("Mining Conscription Kit") new /obj/item/weapon/storage/backpack/dufflebag/mining_conscript(loc) - feedback_add_details("mining_voucher_redeemed", selection) + SSblackbox.add_details("mining_voucher_redeemed", selection) qdel(voucher) /obj/machinery/mineral/equipment_vendor/ex_act(severity, target) diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index eff7e4780b7..1f7f4b4695f 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -392,7 +392,7 @@ return if (CC.use(1)) - add_overlay(image('icons/obj/economy.dmi',"coin_string_overlay")) + add_overlay("coin_string_overlay") string_attached = 1 to_chat(user, "You attach a string to the coin.") else diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index c3441cc16c9..bec7ba24fec 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -1,9 +1,11 @@ //Dead mobs can exist whenever. This is needful -/mob/dead/New(loc) - ..() - if(!initialized) - args[1] = FALSE - Initialize(arglist(args)) //EXIST DAMN YOU!!! + +INITIALIZE_IMMEDIATE(/mob/dead) + +/mob/dead/Initialize() + . = ..() + if(config.cross_allowed) + verbs += /mob/dead/proc/server_hop /mob/dead/dust() //ghosts can't be vaporised. return @@ -12,4 +14,29 @@ return /mob/dead/ConveyorMove() //lol - return \ No newline at end of file + return + + + +/mob/dead/proc/server_hop() + set category = "OOC" + set name = "Server Hop!" + set desc= "Jump to the other server" + if(notransform) + return + if(!config.cross_allowed) + verbs -= /mob/dead/proc/server_hop + to_chat(src, "Server Hop has been disabled.") + return + if (alert(src, "Jump to server running at [config.cross_address]?", "Server Hop", "Yes", "No") != "Yes") + return 0 + if (client && config.cross_allowed) + to_chat(src, "Sending you to [config.cross_address].") + new /obj/screen/splash(client) + notransform = TRUE + sleep(29) //let the animation play + notransform = FALSE + winset(src, null, "command=.options") //other wise the user never knows if byond is downloading resources + client << link(config.cross_address + "?server_hop=[key]") + else + to_chat(src, "There is no other server configured!") diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index ae11de49739..aa948343089 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -30,6 +30,7 @@ loc = pick(GLOB.newplayer_start) else loc = locate(1,1,1) + return INITIALIZE_HINT_NORMAL /mob/dead/new_player/proc/new_player_panel() @@ -148,7 +149,7 @@ return 1 if(href_list["late_join"]) - if(!SSticker || SSticker.current_state != GAME_STATE_PLAYING) + if(!SSticker || !SSticker.IsRoundInProgress()) to_chat(usr, "The round is either not ready, or has already finished...") return diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 7a77aab7cdf..6234eaa5145 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -37,10 +37,10 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) //These variables store hair data if the ghost originates from a species with head and/or facial hair. var/hair_style var/hair_color - var/image/hair_image + var/mutable_appearance/hair_overlay var/facial_hair_style var/facial_hair_color - var/image/facial_hair_image + var/mutable_appearance/facial_hair_overlay var/updatedir = 1 //Do we have to update our dir as the ghost moves around? var/lastsetting = null //Stores the last setting that ghost_others was set to, for a little more efficiency when we update ghost images. Null means no update is necessary @@ -58,9 +58,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) verbs += /mob/dead/observer/proc/dead_tele - if(config.cross_allowed) - verbs += /mob/dead/observer/proc/server_hop - if(icon_state in GLOB.ghost_forms_with_directions_list) ghostimage_default = image(src.icon,src,src.icon_state + "_nodir") else @@ -161,13 +158,13 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) ghost_accs = client.prefs.ghost_accs ghost_others = client.prefs.ghost_others - if(hair_image) - cut_overlay(hair_image) - hair_image = null + if(hair_overlay) + cut_overlay(hair_overlay) + hair_overlay = null - if(facial_hair_image) - cut_overlay(facial_hair_image) - facial_hair_image = null + if(facial_hair_overlay) + cut_overlay(facial_hair_overlay) + facial_hair_overlay = null if(new_form) @@ -188,19 +185,19 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) if(facial_hair_style) S = GLOB.facial_hair_styles_list[facial_hair_style] if(S) - facial_hair_image = image("icon" = S.icon, "icon_state" = "[S.icon_state]", "layer" = -HAIR_LAYER) + facial_hair_overlay = mutable_appearance(S.icon, "[S.icon_state]", -HAIR_LAYER) if(facial_hair_color) - facial_hair_image.color = "#" + facial_hair_color - facial_hair_image.alpha = 200 - add_overlay(facial_hair_image) + facial_hair_overlay.color = "#" + facial_hair_color + facial_hair_overlay.alpha = 200 + add_overlay(facial_hair_overlay) if(hair_style) S = GLOB.hair_styles_list[hair_style] if(S) - hair_image = image("icon" = S.icon, "icon_state" = "[S.icon_state]", "layer" = -HAIR_LAYER) + hair_overlay = mutable_appearance(S.icon, "[S.icon_state]", -HAIR_LAYER) if(hair_color) - hair_image.color = "#" + hair_color - hair_image.alpha = 200 - add_overlay(hair_image) + hair_overlay.color = "#" + hair_color + hair_overlay.alpha = 200 + add_overlay(hair_overlay) /* * Increase the brightness of a color by calculating the average distance between the R, G and B values, @@ -354,9 +351,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(!isobserver(usr)) to_chat(usr, "Not when you're not dead!") return - var/A - A = input("Area to jump to", "BOOYEA", A) as null|anything in GLOB.sortedAreas - var/area/thearea = A + var/list/filtered = list() + for(var/V in GLOB.sortedAreas) + var/area/A = V + if(!A.hidden) + filtered += A + var/area/thearea = input("Area to jump to", "BOOYEA") as null|anything in filtered + if(!thearea) return @@ -585,29 +586,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp target.faction = list("neutral") return 1 -/mob/dead/observer/proc/server_hop() - set category = "Ghost" - set name = "Server Hop!" - set desc= "Jump to the other server" - if(notransform) - return - if(!config.cross_allowed) - verbs -= /mob/dead/observer/proc/server_hop - to_chat(src, "Server Hop has been disabled.") - return - if (alert(src, "Jump to server running at [config.cross_address]?", "Server Hop", "Yes", "No") != "Yes") - return 0 - if (client && config.cross_allowed) - to_chat(src, "Sending you to [config.cross_address].") - new /obj/screen/splash(client) - notransform = TRUE - sleep(29) //let the animation play - notransform = FALSE - winset(src, null, "command=.options") //other wise the user never knows if byond is downloading resources - client << link(config.cross_address + "?server_hop=[key]") - else - to_chat(src, "There is no other server configured!") - /proc/show_server_hop_transfer_screen(expected_key) //only show it to incoming ghosts for(var/mob/dead/observer/O in GLOB.player_list) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index c83ebe90d34..ca380170f73 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -65,12 +65,8 @@ listclearnulls(BP.embedded_objects) temp_bleed += 0.5*BP.embedded_objects.len - if(brutedamage > 30) - temp_bleed += 0.5 - if(brutedamage > 50) - temp_bleed += 1 - if(brutedamage > 70) - temp_bleed += 2 + if(brutedamage >= 20) + temp_bleed += (brutedamage * 0.013) bleed_rate = max(bleed_rate - 0.5, temp_bleed)//if no wounds, other bleed effects (heparin) naturally decreases diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index 397824d8301..62470837479 100644 --- a/code/modules/mob/living/brain/MMI.dm +++ b/code/modules/mob/living/brain/MMI.dm @@ -73,7 +73,7 @@ name = "Man-Machine Interface: [brainmob.real_name]" update_icon() - feedback_inc("cyborg_mmis_filled",1) + SSblackbox.inc("cyborg_mmis_filled",1) else if(brainmob) O.attack(brainmob, user) //Oh noooeeeee diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index 6cfd8473dd7..8b3a68ab365 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -179,7 +179,7 @@ Doesn't work on other aliens/AI.*/ var/message if(active) message = "You empty your neurotoxin gland." - remove_ranged_ability(message) + remove_ranged_ability(user,message) else message = "You prepare your neurotoxin gland. Left-click to fire at a target!" add_ranged_ability(user, message, TRUE) diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm index 556d5ac7db7..8b88440a8ef 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm @@ -1,7 +1,7 @@ /mob/living/carbon/alien/humanoid/update_icons() cut_overlays() - for(var/image/I in overlays_standing) + for(var/I in overlays_standing) add_overlay(I) if(stat == DEAD) @@ -66,7 +66,7 @@ dmi_file = 'icons/mob/alienqueen.dmi' if(handcuffed) - overlays_standing[HANDCUFF_LAYER] = image(dmi_file,icon_state= cuff_icon, layer =-HANDCUFF_LAYER) + overlays_standing[HANDCUFF_LAYER] = mutable_appearance(dmi_file, cuff_icon, -HANDCUFF_LAYER) apply_overlay(HANDCUFF_LAYER) //Royals have bigger sprites, so inhand things must be handled differently. @@ -80,16 +80,14 @@ var/itm_state = l_hand.item_state if(!itm_state) itm_state = l_hand.icon_state - var/image/I = image("icon" = alt_inhands_file , "icon_state"="[itm_state][caste]_l", "layer"=-HANDS_LAYER) - hands += I + hands += mutable_appearance(alt_inhands_file, "[itm_state][caste]_l", -HANDS_LAYER) var/obj/item/r_hand = get_item_for_held_index(2) if(r_hand) var/itm_state = r_hand.item_state if(!itm_state) itm_state = r_hand.icon_state - var/image/I = image("icon" = alt_inhands_file , "icon_state"="[itm_state][caste]_r", "layer"=-HANDS_LAYER) - hands += I + hands += mutable_appearance(alt_inhands_file, "[itm_state][caste]_r", -HANDS_LAYER) overlays_standing[HANDS_LAYER] = hands apply_overlay(HANDS_LAYER) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/screen.dm b/code/modules/mob/living/carbon/alien/screen.dm index 58f10ab1222..b5b646b08b6 100644 --- a/code/modules/mob/living/carbon/alien/screen.dm +++ b/code/modules/mob/living/carbon/alien/screen.dm @@ -18,7 +18,6 @@ return var/Qdir = get_dir(src, Q) var/Qdist = get_dist(src, Q) - image(icon,loc,icon_state,layer,dir) var/finder_icon = "finder_center" //Overlay showed when adjacent to or on top of the queen! switch(Qdist) if(2 to 7) @@ -27,7 +26,7 @@ finder_icon = "finder_med" if(21 to INFINITY) finder_icon = "finder_far" - var/image/finder_eye = image('icons/mob/screen_alien.dmi', icon_state = finder_icon, dir = Qdir) + var/image/finder_eye = image('icons/mob/screen_alien.dmi', finder_icon, dir = Qdir) hud_used.alien_queen_finder.add_overlay(finder_eye) /mob/living/carbon/alien/humanoid/royal/queen/findQueen() diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index 63f79d2eb8c..7eb6d182ef4 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -81,7 +81,7 @@ var/mob/dead/observer/ghost = pick(candidates) - var/overlay = image('icons/mob/alien.dmi', loc = owner, icon_state = "burst_lie") + var/mutable_appearance/overlay = mutable_appearance('icons/mob/alien.dmi', "burst_lie") owner.add_overlay(overlay) var/atom/xeno_loc = get_turf(owner) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 80fbdbb71df..44e578c909d 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -754,7 +754,7 @@ ..() /mob/living/carbon/fakefire(var/fire_icon = "Generic_mob_burning") - var/image/new_fire_overlay = image("icon"='icons/mob/OnFire.dmi', "icon_state"= fire_icon, "layer"=-FIRE_LAYER) + var/mutable_appearance/new_fire_overlay = mutable_appearance('icons/mob/OnFire.dmi', fire_icon, -FIRE_LAYER) new_fire_overlay.appearance_flags = RESET_COLOR overlays_standing[FIRE_LAYER] = new_fire_overlay apply_overlay(FIRE_LAYER) diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index 59c04c9841f..c6c7196755c 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -24,7 +24,8 @@ if(!no_bodyparts) if(no_organs)//so the organs don't get transfered inside the bodyparts we'll drop. for(var/X in internal_organs) - qdel(X) + if(no_brain || !istype(X, /obj/item/organ/brain)) + qdel(X) else //we're going to drop all bodyparts except chest, so the only organs that needs spilling are those inside it. for(var/X in internal_organs) var/obj/item/organ/O = X @@ -42,6 +43,9 @@ if(no_brain && istype(I, /obj/item/organ/brain)) qdel(I) continue + if(no_organs && !istype(I, /obj/item/organ/brain)) + qdel(I) + continue I.Remove(src) I.forceMove(get_turf(src)) I.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 68b48c81d73..5df1d9296ae 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -33,7 +33,7 @@ dna.species.spec_death(gibbed, src) if(SSticker && SSticker.mode) - sql_report_death(src) + SSblackbox.ReportDeath(src) if(mind && mind.devilinfo) INVOKE_ASYNC(mind.devilinfo, /datum/devilinfo.proc/beginResurrectionCheck, src) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 57d7d4e2f87..b43245192c0 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -730,8 +730,8 @@ /mob/living/carbon/human/wash_cream() //clean both to prevent a rare bug - cut_overlay(image('icons/effects/creampie.dmi', "creampie_lizard")) - cut_overlay(image('icons/effects/creampie.dmi', "creampie_human")) + cut_overlay(mutable_appearance('icons/effects/creampie.dmi', "creampie_lizard")) + cut_overlay(mutable_appearance('icons/effects/creampie.dmi', "creampie_human")) //Turns a mob black, flashes a skeleton overlay @@ -740,17 +740,19 @@ //Handle mutant parts if possible if(dna && dna.species) add_atom_colour("#000000", TEMPORARY_COLOUR_PRIORITY) - var/static/image/electrocution_skeleton_anim = image(icon = icon, icon_state = "electrocuted_base") - electrocution_skeleton_anim.appearance_flags = RESET_COLOR + var/static/mutable_appearance/electrocution_skeleton_anim + if(!electrocution_skeleton_anim) + electrocution_skeleton_anim = mutable_appearance(icon, "electrocuted_base") + electrocution_skeleton_anim.appearance_flags |= RESET_COLOR add_overlay(electrocution_skeleton_anim) addtimer(CALLBACK(src, .proc/end_electrocution_animation, electrocution_skeleton_anim), anim_duration) else //or just do a generic animation flick_overlay_view(image(icon,src,"electrocuted_generic",ABOVE_MOB_LAYER), src, anim_duration) -/mob/living/carbon/human/proc/end_electrocution_animation(image/I) +/mob/living/carbon/human/proc/end_electrocution_animation(mutable_appearance/MA) remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#000000") - cut_overlay(I) + cut_overlay(MA) /mob/living/carbon/human/canUseTopic(atom/movable/M, be_close = 0) if(incapacitated() || lying ) @@ -819,9 +821,9 @@ if(hal_screwyhud == SCREWYHUD_HEALTHY) icon_num = 0 if(icon_num) - hud_used.healthdoll.add_overlay(image('icons/mob/screen_gen.dmi',"[BP.body_zone][icon_num]")) + hud_used.healthdoll.add_overlay(mutable_appearance('icons/mob/screen_gen.dmi', "[BP.body_zone][icon_num]")) for(var/t in get_missing_limbs()) //Missing limbs - hud_used.healthdoll.add_overlay(image('icons/mob/screen_gen.dmi',"[t]6")) + hud_used.healthdoll.add_overlay(mutable_appearance('icons/mob/screen_gen.dmi', "[t]6")) else hud_used.healthdoll.icon_state = "healthdoll_DEAD" @@ -924,15 +926,19 @@ riding_datum = new /datum/riding/human(src) if(buckled_mobs && ((M in buckled_mobs) || (buckled_mobs.len >= max_buckled_mobs)) || buckled || (M.stat != CONSCIOUS)) return - if(iscarbon(M)) - if(M.incapacitated(FALSE, TRUE) || incapacitated(FALSE, TRUE)) - M.visible_message("[M] can't hang onto [src]!") - return - if(!riding_datum.equip_buckle_inhands(M, 2)) //MAKE SURE THIS IS LAST!! - M.visible_message("[M] can't climb onto [src]!") - return - . = ..(M, force, check_loc) - stop_pulling() + visible_message("[M] starts to climb onto [src]...") + if(do_after(M, 15, target = src)) + if(iscarbon(M)) + if(M.incapacitated(FALSE, TRUE) || incapacitated(FALSE, TRUE)) + M.visible_message("[M] can't hang onto [src]!") + return + if(!riding_datum.equip_buckle_inhands(M, 2)) //MAKE SURE THIS IS LAST!! + M.visible_message("[M] can't climb onto [src]!") + return + . = ..(M, force, check_loc) + stop_pulling() + else + visible_message("[M] fails to climb onto [src]!") /mob/living/carbon/human/unbuckle_mob(mob/living/M, force=FALSE) if(iscarbon(M)) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 5c2e6ccf255..573c0a44e23 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -177,8 +177,8 @@ var/obj/item/bodypart/affecting = get_bodypart(ran_zone(user.zone_selected)) //what we're actually ending up trying to hit. var/target_area = parse_zone(check_zone(user.zone_selected)) //our intended target - feedback_add_details("item_used_for_combat","[I.type]|[I.force]") - feedback_add_details("zone_targeted","[target_area]") + SSblackbox.add_details("item_used_for_combat","[I.type]|[I.force]") + SSblackbox.add_details("zone_targeted","[target_area]") // the attacked_by code varies among species return dna.species.spec_attacked_by(I, user, affecting, a_intent, src) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index ac2fed005f8..f64d30e90ac 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -228,22 +228,22 @@ fhair_state += dynamic_fhair_suffix fhair_file = 'icons/mob/facialhair_extensions.dmi' - var/image/img_facial = image("icon" = fhair_file, "icon_state" = fhair_state, "layer" = -HAIR_LAYER) + var/mutable_appearance/facial_overlay = mutable_appearance(fhair_file, fhair_state, -HAIR_LAYER) if(!forced_colour) if(hair_color) if(hair_color == "mutcolor") - img_facial.color = "#" + H.dna.features["mcolor"] + facial_overlay.color = "#" + H.dna.features["mcolor"] else - img_facial.color = "#" + hair_color + facial_overlay.color = "#" + hair_color else - img_facial.color = "#" + H.facial_hair_color + facial_overlay.color = "#" + H.facial_hair_color else - img_facial.color = forced_colour + facial_overlay.color = forced_colour - img_facial.alpha = hair_alpha + facial_overlay.alpha = hair_alpha - standing += img_facial + standing += facial_overlay if(H.head) var/obj/item/I = H.head @@ -261,9 +261,11 @@ hair_hidden = TRUE if(!hair_hidden || dynamic_hair_suffix) + var/mutable_appearance/hair_overlay = mutable_appearance(layer = -HAIR_LAYER) if(!hair_hidden && !H.getorgan(/obj/item/organ/brain)) //Applies the debrained overlay if there is no brain if(!(NOBLOOD in species_traits)) - standing += image("icon"='icons/mob/human_face.dmi', "icon_state" = "debrained", "layer" = -HAIR_LAYER) + hair_overlay.icon = 'icons/mob/human_face.dmi' + hair_overlay.icon_state = "debrained" else if(H.hair_style && (HAIR in species_traits)) S = GLOB.hair_styles_list[H.hair_style] @@ -285,67 +287,69 @@ hair_state += dynamic_hair_suffix hair_file = 'icons/mob/hair_extensions.dmi' - var/image/img_hair = image("icon" = hair_file, "icon_state" = hair_state, "layer" = -HAIR_LAYER) + hair_overlay.icon = hair_file + hair_overlay.icon_state = hair_state if(!forced_colour) if(hair_color) if(hair_color == "mutcolor") - img_hair.color = "#" + H.dna.features["mcolor"] + hair_overlay.color = "#" + H.dna.features["mcolor"] else - img_hair.color = "#" + hair_color + hair_overlay.color = "#" + hair_color else - img_hair.color = "#" + H.hair_color + hair_overlay.color = "#" + H.hair_color else - img_hair.color = forced_colour - img_hair.alpha = hair_alpha - img_hair.pixel_y += hair_y_offset - standing += img_hair + hair_overlay.color = forced_colour + hair_overlay.alpha = hair_alpha + hair_overlay.pixel_y += hair_y_offset + if(hair_overlay.icon) + standing += hair_overlay if(standing.len) - H.overlays_standing[HAIR_LAYER] = standing + H.overlays_standing[HAIR_LAYER] = standing H.apply_overlay(HAIR_LAYER) /datum/species/proc/handle_body(mob/living/carbon/human/H) H.remove_overlay(BODY_LAYER) - var/list/standing = list() + var/list/standing = list() var/obj/item/bodypart/head/HD = H.get_bodypart("head") if(!(H.disabilities & HUSK)) // lipstick if(H.lip_style && (LIPS in species_traits) && HD) - var/image/lips = image("icon"='icons/mob/human_face.dmi', "icon_state"="lips_[H.lip_style]", "layer" = -BODY_LAYER) - lips.color = H.lip_color - lips.pixel_y += face_y_offset - standing += lips + var/mutable_appearance/lip_overlay = mutable_appearance('icons/mob/human_face.dmi', "lips_[H.lip_style]", -BODY_LAYER) + lip_overlay.color = H.lip_color + lip_overlay.pixel_y += face_y_offset + standing += lip_overlay // eyes if((EYECOLOR in species_traits) && HD) - var/image/img_eyes = image("icon" = 'icons/mob/human_face.dmi', "icon_state" = "eyes", "layer" = -BODY_LAYER) - img_eyes.color = "#" + H.eye_color - img_eyes.pixel_y += face_y_offset - standing += img_eyes + var/mutable_appearance/eye_overlay = mutable_appearance('icons/mob/human_face.dmi', "eyes", -BODY_LAYER) + eye_overlay.color = "#" + H.eye_color + eye_overlay.pixel_y += face_y_offset + standing += eye_overlay //Underwear, Undershirts & Socks if(H.underwear) var/datum/sprite_accessory/underwear/underwear = GLOB.underwear_list[H.underwear] if(underwear) - standing += image("icon"=underwear.icon, "icon_state"="[underwear.icon_state]", "layer"=-BODY_LAYER) + standing += mutable_appearance(underwear.icon, underwear.icon_state, -BODY_LAYER) if(H.undershirt) var/datum/sprite_accessory/undershirt/undershirt = GLOB.undershirt_list[H.undershirt] if(undershirt) if(H.dna.species.sexes && H.gender == FEMALE) - standing += wear_female_version("[undershirt.icon_state]", undershirt.icon, BODY_LAYER) + standing += wear_female_version(undershirt.icon_state, undershirt.icon, -BODY_LAYER) else - standing += image("icon"=undershirt.icon, "icon_state"="[undershirt.icon_state]", "layer"=-BODY_LAYER) + standing += mutable_appearance(undershirt.icon, undershirt.icon_state, -BODY_LAYER) if(H.socks && H.get_num_legs() >= 2 && !(DIGITIGRADE in species_traits)) var/datum/sprite_accessory/socks/socks = GLOB.socks_list[H.socks] if(socks) - standing += image("icon"=socks.icon, "icon_state"="[socks.icon_state]", "layer"=-BODY_LAYER) + standing += mutable_appearance(socks.icon, socks.icon_state, -BODY_LAYER) if(standing.len) H.overlays_standing[BODY_LAYER] = standing @@ -453,8 +457,6 @@ var/g = (H.gender == FEMALE) ? "f" : "m" - var/image/I - for(var/layer in relevent_layers) var/layertext = mutant_bodyparts_layertext(layer) @@ -493,58 +495,54 @@ if(!S || S.icon_state == "none") continue + var/mutable_appearance/accessory_overlay = mutable_appearance(S.icon, layer = -layer) + //A little rename so we don't have to use tail_lizard or tail_human when naming the sprites. if(bodypart == "tail_lizard" || bodypart == "tail_human") bodypart = "tail" else if(bodypart == "waggingtail_lizard" || bodypart == "waggingtail_human") bodypart = "waggingtail" - - var/icon_string - if(S.gender_specific) - icon_string = "[g]_[bodypart]_[S.icon_state]_[layertext]" + accessory_overlay.icon_state = "[g]_[bodypart]_[S.icon_state]_[layertext]" else - icon_string = "m_[bodypart]_[S.icon_state]_[layertext]" - - I = image("icon" = S.icon, "icon_state" = icon_string, "layer" =- layer) + accessory_overlay.icon_state = "m_[bodypart]_[S.icon_state]_[layertext]" if(S.center) - I = center_image(I,S.dimension_x,S.dimension_y) + accessory_overlay = center_image(accessory_overlay, S.dimension_x, S.dimension_y) if(!(H.disabilities & HUSK)) if(!forced_colour) switch(S.color_src) if(MUTCOLORS) if(fixed_mut_color) - I.color = "#[fixed_mut_color]" + accessory_overlay.color = "#[fixed_mut_color]" else - I.color = "#[H.dna.features["mcolor"]]" + accessory_overlay.color = "#[H.dna.features["mcolor"]]" if(HAIR) if(hair_color == "mutcolor") - I.color = "#[H.dna.features["mcolor"]]" + accessory_overlay.color = "#[H.dna.features["mcolor"]]" else - I.color = "#[H.hair_color]" + accessory_overlay.color = "#[H.hair_color]" if(FACEHAIR) - I.color = "#[H.facial_hair_color]" + accessory_overlay.color = "#[H.facial_hair_color]" if(EYECOLOR) - I.color = "#[H.eye_color]" + accessory_overlay.color = "#[H.eye_color]" else - I.color = forced_colour - standing += I + accessory_overlay.color = forced_colour + standing += accessory_overlay if(S.hasinner) + var/mutable_appearance/inner_accessory_overlay = mutable_appearance(S.icon, layer = -layer) if(S.gender_specific) - icon_string = "[g]_[bodypart]inner_[S.icon_state]_[layertext]" + inner_accessory_overlay.icon_state = "[g]_[bodypart]inner_[S.icon_state]_[layertext]" else - icon_string = "m_[bodypart]inner_[S.icon_state]_[layertext]" - - I = image("icon" = S.icon, "icon_state" = icon_string, "layer" =- layer) + inner_accessory_overlay.icon_state = "m_[bodypart]inner_[S.icon_state]_[layertext]" if(S.center) - I = center_image(I,S.dimension_x,S.dimension_y) + inner_accessory_overlay = center_image(inner_accessory_overlay, S.dimension_x, S.dimension_y) - standing += I + standing += inner_accessory_overlay H.overlays_standing[layer] = standing.Copy() standing = list() 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 750c88fd881..0b8ca1500d7 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -3,8 +3,7 @@ id = "abductor" say_mod = "gibbers" sexes = 0 - species_traits = list(NOBLOOD,NOBREATH,VIRUSIMMUNE,NOGUNS) + species_traits = list(NOBLOOD,NOBREATH,VIRUSIMMUNE,NOGUNS,NOHUNGER) mutant_organs = list(/obj/item/organ/tongue/abductor) var/scientist = 0 // vars to not pollute spieces list with castes - var/agent = 0 var/team = 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index b5f047b0da9..f8e62704518 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -124,17 +124,17 @@ There are several things that need to be remembered: else if(U.adjusted == DIGITIGRADE_STYLE) t_color = "[t_color]_l" - var/image/standing + var/mutable_appearance/uniform_overlay if(dna && dna.species.sexes) var/G = (gender == FEMALE) ? "f" : "m" if(G == "f" && U.fitted != NO_FEMALE_UNIFORM) - standing = U.build_worn_icon(state = "[t_color]", default_layer = UNIFORM_LAYER, default_icon_file = 'icons/mob/uniform.dmi', isinhands = FALSE, femaleuniform = U.fitted) + uniform_overlay = U.build_worn_icon(state = "[t_color]", default_layer = UNIFORM_LAYER, default_icon_file = 'icons/mob/uniform.dmi', isinhands = FALSE, femaleuniform = U.fitted) - if(!standing) - standing = U.build_worn_icon(state = "[t_color]", default_layer = UNIFORM_LAYER, default_icon_file = 'icons/mob/uniform.dmi', isinhands = FALSE) + if(!uniform_overlay) + uniform_overlay = U.build_worn_icon(state = "[t_color]", default_layer = UNIFORM_LAYER, default_icon_file = 'icons/mob/uniform.dmi', isinhands = FALSE) - overlays_standing[UNIFORM_LAYER] = standing + overlays_standing[UNIFORM_LAYER] = uniform_overlay else if(!(dna && dna.species.nojumpsuit) && invdrop) // Automatically drop anything in store / id / belt if you're not wearing a uniform. //CHECK IF NECESARRY @@ -159,8 +159,7 @@ There are several things that need to be remembered: update_observer_view(wear_id) //TODO: add an icon file for ID slot stuff, so it's less snowflakey - var/image/standing = wear_id.build_worn_icon(state = wear_id.item_state, default_layer = ID_LAYER, default_icon_file = 'icons/mob/mob.dmi') - overlays_standing[ID_LAYER] = standing + overlays_standing[ID_LAYER] = wear_id.build_worn_icon(state = wear_id.item_state, default_layer = ID_LAYER, default_icon_file = 'icons/mob/mob.dmi') apply_overlay(ID_LAYER) @@ -168,20 +167,20 @@ There are several things that need to be remembered: /mob/living/carbon/human/update_inv_gloves() remove_overlay(GLOVES_LAYER) - if(get_num_arms() <2) - if(!gloves && blood_DNA) - if(has_left_hand()) - overlays_standing[GLOVES_LAYER] = image("icon"='icons/effects/blood.dmi', "icon_state"="bloodyhands_left", "layer"=-GLOVES_LAYER) - apply_overlay(GLOVES_LAYER) - else if(has_right_hand()) - overlays_standing[GLOVES_LAYER] = image("icon"='icons/effects/blood.dmi', "icon_state"="bloodyhands_right", "layer"=-GLOVES_LAYER) - apply_overlay(GLOVES_LAYER) - return - if(client && hud_used && hud_used.inv_slots[slot_gloves]) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_gloves] inv.update_icon() + if(!gloves && blood_DNA) + var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER) + if(get_num_arms() < 2) + if(has_left_hand()) + bloody_overlay.icon_state = "bloodyhands_left" + else if(has_right_hand()) + bloody_overlay.icon_state = "bloodyhands_right" + + overlays_standing[GLOVES_LAYER] = bloody_overlay + if(gloves) gloves.screen_loc = ui_gloves if(client && hud_used && hud_used.hud_shown) @@ -191,14 +190,7 @@ There are several things that need to be remembered: var/t_state = gloves.item_state if(!t_state) t_state = gloves.icon_state - - var/image/standing = gloves.build_worn_icon(state = t_state, default_layer = GLOVES_LAYER, default_icon_file = 'icons/mob/hands.dmi') - - overlays_standing[GLOVES_LAYER] = standing - - else - if(blood_DNA) - overlays_standing[GLOVES_LAYER] = image("icon"='icons/effects/blood.dmi', "icon_state"="bloodyhands", "layer"=-GLOVES_LAYER) + overlays_standing[GLOVES_LAYER] = gloves.build_worn_icon(state = t_state, default_layer = GLOVES_LAYER, default_icon_file = 'icons/mob/hands.dmi') apply_overlay(GLOVES_LAYER) @@ -221,8 +213,7 @@ There are several things that need to be remembered: update_observer_view(glasses,1) if(!(head && (head.flags_inv & HIDEEYES)) && !(wear_mask && (wear_mask.flags_inv & HIDEEYES))) - var/image/standing = glasses.build_worn_icon(state = glasses.icon_state, default_layer = GLASSES_LAYER, default_icon_file = 'icons/mob/eyes.dmi') - overlays_standing[GLASSES_LAYER] = standing + overlays_standing[GLASSES_LAYER] = glasses.build_worn_icon(state = glasses.icon_state, default_layer = GLASSES_LAYER, default_icon_file = 'icons/mob/eyes.dmi') apply_overlay(GLASSES_LAYER) @@ -244,8 +235,7 @@ There are several things that need to be remembered: client.screen += ears //add it to the client's screen update_observer_view(ears,1) - var/image/standing = ears.build_worn_icon(state = ears.icon_state, default_layer = EARS_LAYER, default_icon_file = 'icons/mob/ears.dmi') - overlays_standing[EARS_LAYER] = standing + overlays_standing[EARS_LAYER] = ears.build_worn_icon(state = ears.icon_state, default_layer = EARS_LAYER, default_icon_file = 'icons/mob/ears.dmi') apply_overlay(EARS_LAYER) @@ -266,8 +256,7 @@ There are several things that need to be remembered: if(hud_used.inventory_shown) //if the inventory is open client.screen += shoes //add it to client's screen update_observer_view(shoes,1) - var/image/standing = shoes.build_worn_icon(state = shoes.icon_state, default_layer = SHOES_LAYER, default_icon_file = 'icons/mob/feet.dmi') - overlays_standing[SHOES_LAYER] = standing + overlays_standing[SHOES_LAYER] = shoes.build_worn_icon(state = shoes.icon_state, default_layer = SHOES_LAYER, default_icon_file = 'icons/mob/feet.dmi') apply_overlay(SHOES_LAYER) @@ -287,7 +276,7 @@ There are several things that need to be remembered: var/t_state = s_store.item_state if(!t_state) t_state = s_store.icon_state - overlays_standing[SUIT_STORE_LAYER] = image("icon"='icons/mob/belt_mirror.dmi', "icon_state"="[t_state]", "layer"=-SUIT_STORE_LAYER) + overlays_standing[SUIT_STORE_LAYER] = mutable_appearance('icons/mob/belt_mirror.dmi', t_state, -SUIT_STORE_LAYER) apply_overlay(SUIT_STORE_LAYER) @@ -313,8 +302,7 @@ There are several things that need to be remembered: if(!t_state) t_state = belt.icon_state - var/image/standing = belt.build_worn_icon(state = t_state, default_layer = BELT_LAYER, default_icon_file = 'icons/mob/belt.dmi') - overlays_standing[BELT_LAYER] = standing + overlays_standing[BELT_LAYER] = belt.build_worn_icon(state = t_state, default_layer = BELT_LAYER, default_icon_file = 'icons/mob/belt.dmi') apply_overlay(BELT_LAYER) @@ -335,8 +323,7 @@ There are several things that need to be remembered: client.screen += wear_suit update_observer_view(wear_suit,1) - var/image/standing = wear_suit.build_worn_icon(state = wear_suit.icon_state, default_layer = SUIT_LAYER, default_icon_file = 'icons/mob/suit.dmi') - overlays_standing[SUIT_LAYER] = standing + overlays_standing[SUIT_LAYER] = wear_suit.build_worn_icon(state = wear_suit.icon_state, default_layer = SUIT_LAYER, default_icon_file = 'icons/mob/suit.dmi') if(wear_suit.breakouttime) //suit is restraining drop_all_held_items() @@ -379,7 +366,7 @@ There are several things that need to be remembered: remove_overlay(LEGCUFF_LAYER) clear_alert("legcuffed") if(legcuffed) - overlays_standing[LEGCUFF_LAYER] = image("icon"='icons/mob/mob.dmi', "icon_state"="legcuff1", "layer"=-LEGCUFF_LAYER) + overlays_standing[LEGCUFF_LAYER] = mutable_appearance('icons/mob/mob.dmi', "legcuff1", -LEGCUFF_LAYER) apply_overlay(LEGCUFF_LAYER) throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = src.legcuffed) @@ -388,8 +375,7 @@ There are several things that need to be remembered: var/icon/female_clothing_icon = GLOB.female_clothing_icons[index] if(!female_clothing_icon) //Create standing/laying icons if they don't exist generate_female_clothing(index,t_color,icon,type) - var/standing = image("icon"=GLOB.female_clothing_icons["[t_color]"], "layer"=-layer) - return(standing) + return mutable_appearance(GLOB.female_clothing_icons[t_color], layer = -layer) /mob/living/carbon/human/proc/get_overlays_copy(list/unwantedLayers) var/list/out = new @@ -438,12 +424,12 @@ There are several things that need to be remembered: /* -Does everything in relation to building the /image used in the mob's overlays list +Does everything in relation to building the /mutable_appearance used in the mob's overlays list covers: inhands and any other form of worn item - centering large images - layering images on custom layers - building images from custom icon files + centering large appearances + layering appearances on custom layers + building appearances from custom icon files By Remie Richards (yes I'm taking credit because this just removed 90% of the copypaste in update_icons()) @@ -478,13 +464,13 @@ generate/load female uniform sprites matching all previously decided variables if(!layer2use) layer2use = default_layer - var/image/standing + var/mutable_appearance/standing if(femaleuniform) standing = wear_female_version(state,file2use,layer2use,femaleuniform) if(!standing) - standing = image("icon"=file2use, "icon_state"=state,"layer"=-layer2use) + standing = mutable_appearance(file2use, state, -layer2use) - //Get the overlay images for this item when it's being worn + //Get the overlays for this item when it's being worn //eg: ammo counters, primed grenade flashes, etc. var/list/worn_overlays = worn_overlays(isinhands) if(worn_overlays && worn_overlays.len) diff --git a/code/modules/mob/living/carbon/monkey/update_icons.dm b/code/modules/mob/living/carbon/monkey/update_icons.dm index 57e2bb7e02f..5a4ba686b25 100644 --- a/code/modules/mob/living/carbon/monkey/update_icons.dm +++ b/code/modules/mob/living/carbon/monkey/update_icons.dm @@ -34,8 +34,7 @@ hair_hidden = 1 if(!hair_hidden) if(!getorgan(/obj/item/organ/brain)) //Applies the debrained overlay if there is no brain - var/image/I = image("icon"='icons/mob/human_face.dmi', "icon_state" = "debrained", "layer" = -HAIR_LAYER) - overlays_standing[HAIR_LAYER] = I + overlays_standing[HAIR_LAYER] = mutable_appearance('icons/mob/human_face.dmi', "debrained", -HAIR_LAYER) apply_overlay(HAIR_LAYER) @@ -45,9 +44,9 @@ /mob/living/carbon/monkey/update_inv_legcuffed() remove_overlay(LEGCUFF_LAYER) if(legcuffed) - var/image/standing = image("icon"='icons/mob/mob.dmi', "icon_state"="legcuff1", "layer"=-LEGCUFF_LAYER) - standing.pixel_y = 8 - overlays_standing[LEGCUFF_LAYER] = standing + var/mutable_appearance/legcuff_overlay = mutable_appearance('icons/mob/mob.dmi', "legcuff1", -LEGCUFF_LAYER) + legcuff_overlay.pixel_y = 8 + overlays_standing[LEGCUFF_LAYER] = legcuff_overlay apply_overlay(LEGCUFF_LAYER) diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index 4e76b3da1e9..762ebd56cc5 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -30,9 +30,8 @@ var/list/overlays_standing[TOTAL_LAYERS] /mob/living/carbon/proc/apply_overlay(cache_index) - var/I = overlays_standing[cache_index] - if(I) - add_overlay(I) + if((. = overlays_standing[cache_index])) + add_overlay(.) /mob/living/carbon/proc/remove_overlay(cache_index) var/I = overlays_standing[cache_index] @@ -79,8 +78,7 @@ if(get_held_index_of_item(I) % 2 == 0) icon_file = I.righthand_file - var/image/standing = I.build_worn_icon(state = t_state, default_layer = HANDS_LAYER, default_icon_file = icon_file, isinhands = TRUE) - hands += standing + hands += I.build_worn_icon(state = t_state, default_layer = HANDS_LAYER, default_icon_file = icon_file, isinhands = TRUE) overlays_standing[HANDS_LAYER] = hands apply_overlay(HANDS_LAYER) @@ -89,7 +87,7 @@ /mob/living/carbon/update_fire(var/fire_icon = "Generic_mob_burning") remove_overlay(FIRE_LAYER) if(on_fire) - var/image/new_fire_overlay = image("icon"='icons/mob/OnFire.dmi', "icon_state"= fire_icon, "layer"=-FIRE_LAYER) + var/mutable_appearance/new_fire_overlay = mutable_appearance('icons/mob/OnFire.dmi', fire_icon, -FIRE_LAYER) new_fire_overlay.appearance_flags = RESET_COLOR overlays_standing[FIRE_LAYER] = new_fire_overlay @@ -100,16 +98,16 @@ /mob/living/carbon/update_damage_overlays() remove_overlay(DAMAGE_LAYER) - var/image/standing = image("icon"='icons/mob/dam_mob.dmi', "icon_state"="blank", "layer"=-DAMAGE_LAYER) - overlays_standing[DAMAGE_LAYER] = standing + var/mutable_appearance/damage_overlay = mutable_appearance('icons/mob/dam_mob.dmi', "blank", -DAMAGE_LAYER) + overlays_standing[DAMAGE_LAYER] = damage_overlay for(var/X in bodyparts) var/obj/item/bodypart/BP = X if(BP.dmg_overlay_type) if(BP.brutestate) - standing.add_overlay("[BP.dmg_overlay_type]_[BP.body_zone]_[BP.brutestate]0") //we're adding icon_states of the base image as overlays + damage_overlay.add_overlay("[BP.dmg_overlay_type]_[BP.body_zone]_[BP.brutestate]0") //we're adding icon_states of the base image as overlays if(BP.burnstate) - standing.add_overlay("[BP.dmg_overlay_type]_[BP.body_zone]_0[BP.burnstate]") + damage_overlay.add_overlay("[BP.dmg_overlay_type]_[BP.body_zone]_0[BP.burnstate]") apply_overlay(DAMAGE_LAYER) @@ -126,8 +124,7 @@ if(wear_mask) if(!(head && (head.flags_inv & HIDEMASK))) - var/image/standing = wear_mask.build_worn_icon(state = wear_mask.icon_state, default_layer = FACEMASK_LAYER, default_icon_file = 'icons/mob/mask.dmi') - overlays_standing[FACEMASK_LAYER] = standing + overlays_standing[FACEMASK_LAYER] = wear_mask.build_worn_icon(state = wear_mask.icon_state, default_layer = FACEMASK_LAYER, default_icon_file = 'icons/mob/mask.dmi') update_hud_wear_mask(wear_mask) apply_overlay(FACEMASK_LAYER) @@ -141,8 +138,7 @@ if(wear_neck) if(!(head && (head.flags_inv & HIDENECK))) - var/image/standing = wear_neck.build_worn_icon(state = wear_neck.icon_state, default_layer = NECK_LAYER, default_icon_file = 'icons/mob/neck.dmi') - overlays_standing[NECK_LAYER] = standing + overlays_standing[NECK_LAYER] = wear_neck.build_worn_icon(state = wear_neck.icon_state, default_layer = NECK_LAYER, default_icon_file = 'icons/mob/neck.dmi') update_hud_neck(wear_neck) apply_overlay(NECK_LAYER) @@ -155,8 +151,7 @@ inv.update_icon() if(back) - var/image/standing = back.build_worn_icon(state = back.icon_state, default_layer = BACK_LAYER, default_icon_file = 'icons/mob/back.dmi') - overlays_standing[BACK_LAYER] = standing + overlays_standing[BACK_LAYER] = back.build_worn_icon(state = back.icon_state, default_layer = BACK_LAYER, default_icon_file = 'icons/mob/back.dmi') update_hud_back(back) apply_overlay(BACK_LAYER) @@ -171,8 +166,7 @@ inv.update_icon() if(head) - var/image/standing = head.build_worn_icon(state = head.icon_state, default_layer = HEAD_LAYER, default_icon_file = 'icons/mob/head.dmi') - overlays_standing[HEAD_LAYER] = standing + overlays_standing[HEAD_LAYER] = head.build_worn_icon(state = head.icon_state, default_layer = HEAD_LAYER, default_icon_file = 'icons/mob/head.dmi') update_hud_head(head) apply_overlay(HEAD_LAYER) @@ -181,7 +175,7 @@ /mob/living/carbon/update_inv_handcuffed() remove_overlay(HANDCUFF_LAYER) if(handcuffed) - overlays_standing[HANDCUFF_LAYER] = image("icon"='icons/mob/mob.dmi', "icon_state"="handcuff1", "layer"=-HANDCUFF_LAYER) + overlays_standing[HANDCUFF_LAYER] = mutable_appearance('icons/mob/mob.dmi', "handcuff1", -HANDCUFF_LAYER) apply_overlay(HANDCUFF_LAYER) @@ -244,9 +238,7 @@ var/list/new_limbs = list() for(var/X in bodyparts) var/obj/item/bodypart/BP = X - var/image/temp = BP.get_limb_icon() - if(temp) - new_limbs += temp + new_limbs += BP.get_limb_icon() if(new_limbs.len) overlays_standing[BODYPARTS_LAYER] = new_limbs limb_icon_cache[icon_render_key] = new_limbs diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index b06223a7cbf..78970c0bc97 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -489,7 +489,7 @@ for(var/obj/effect/decal/cleanable/trail_holder/TH in src.loc) if((!(newdir in TH.existing_dirs) || trail_type == "trails_1" || trail_type == "trails_2") && TH.existing_dirs.len <= 16) //maximum amount of overlays is 16 (all light & heavy directions filled) TH.existing_dirs += newdir - TH.overlays.Add(image('icons/effects/blood.dmi',trail_type,dir = newdir)) + TH.add_overlay(image('icons/effects/blood.dmi', trail_type, dir = newdir)) TH.transfer_mob_blood_dna(src) /mob/living/carbon/human/makeTrail(turf/T) @@ -925,4 +925,4 @@ /mob/living/ConveyorMove() if((movement_type & FLYING) && !stat) return - ..() \ No newline at end of file + ..() diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 0047089cbf2..422acf49f9a 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -238,7 +238,7 @@ else if(icontype == "Angel") icon_state = "ai-angel" //else - //usr <<"You can only change your display once!" + //to_chat(usr, "You can only change your display once!") //return /mob/living/silicon/ai/Stat() @@ -351,7 +351,7 @@ if(isAI(usr)) var/mob/living/silicon/ai/AI = src if(AI.control_disabled) - src << "Wireless control is disabled!" + to_chat(src, "Wireless control is disabled!") return SSshuttle.cancelEvac(src) return diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index 3d88433dec2..4df0c54d1a1 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -32,4 +32,4 @@ unbuckle_all_mobs(TRUE) - sql_report_death(src) + SSblackbox.ReportDeath(src) diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index bb25eb2e4d6..fba4f50080f 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -102,11 +102,11 @@ return /mob/living/silicon/robot/update_fire() - var/I = image("icon"='icons/mob/OnFire.dmi', "icon_state"="Generic_mob_burning") + var/mutable_appearance/fire_overlay = mutable_appearance('icons/mob/OnFire.dmi', "Generic_mob_burning") if(on_fire) - add_overlay(I) + add_overlay(fire_overlay) else - cut_overlay(I) + cut_overlay(fire_overlay) /mob/living/silicon/robot/update_canmove() if(stat || buckled || lockcharge) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 023ddd9719d..6ef36096dc8 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -38,7 +38,7 @@ var/obj/item/module_active = null held_items = list(null, null, null) //we use held_items for the module holding, because that makes sense to do! - var/image/eye_lights + var/mutable_appearance/eye_lights var/mob/living/silicon/ai/connected_ai = null var/obj/item/weapon/stock_parts/cell/cell = null @@ -602,7 +602,7 @@ else add_overlay("ov-opencover -c") if(hat) - var/image/head_overlay = hat.build_worn_icon(state = hat.icon_state, default_layer = 20, default_icon_file = 'icons/mob/head.dmi') + var/mutable_appearance/head_overlay = hat.build_worn_icon(state = hat.icon_state, default_layer = 20, default_icon_file = 'icons/mob/head.dmi') head_overlay.pixel_y += hat_offset add_overlay(head_overlay) update_fire() diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 257bf11163c..1891e2a5520 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -222,7 +222,7 @@ if(R.hud_used) R.hud_used.update_robot_modules_display() if(feedback_key && !did_feedback) - feedback_inc(feedback_key, 1) + SSblackbox.inc(feedback_key, 1) /obj/item/weapon/robot_module/standard name = "Standard" diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index 95e62a556d3..25be0495467 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -286,7 +286,7 @@ ..() spawn(5) if(skin) - add_overlay(image('icons/mob/aibots.dmi', "kit_skin_[skin]")) + add_overlay("kit_skin_[skin]") /obj/item/weapon/storage/firstaid/attackby(obj/item/bodypart/S, mob/user, params) @@ -333,7 +333,7 @@ build_step++ to_chat(user, "You add the health sensor to [src].") name = "First aid/robot arm/health analyzer assembly" - add_overlay(image('icons/mob/aibots.dmi', "na_scanner")) + add_overlay("na_scanner") if(1) if(isprox(W)) diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index ef133252d70..8c96a70cc0e 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -358,7 +358,7 @@ Auto Patrol[]"}, var/obj/item/weapon/ed209_assembly/Sa = new /obj/item/weapon/ed209_assembly(Tsec) Sa.build_step = 1 - Sa.add_overlay(image('icons/mob/aibots.dmi', "hs_hole")) + Sa.add_overlay("hs_hole") Sa.created_name = name new /obj/item/device/assembly/prox_sensor(Tsec) diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index b2a4eaefc68..f1629296a7c 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -90,7 +90,7 @@ update_icon() if(skin) - add_overlay(image('icons/mob/aibots.dmi', "medskin_[skin]")) + add_overlay("medskin_[skin]") var/datum/job/doctor/J = new /datum/job/doctor access_card.access += J.get_access() diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index bcc8e1d90e9..75cc8ff1b8a 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -406,7 +406,7 @@ cut_overlays() if(inventory_head) var/image/head_icon - var/datum/dog_fashion.DF = new inventory_head.dog_fashion(src) + var/datum/dog_fashion/DF = new inventory_head.dog_fashion(src) if(!DF.obj_icon_state) DF.obj_icon_state = inventory_head.icon_state @@ -416,17 +416,17 @@ DF.obj_color = inventory_head.color if(health <= 0) - head_icon = DF.get_image(dir = EAST) + head_icon = DF.get_overlay(dir = EAST) head_icon.pixel_y = -8 head_icon.transform = turn(head_icon.transform, 180) else - head_icon = DF.get_image() + head_icon = DF.get_overlay() add_overlay(head_icon) if(inventory_back) var/image/back_icon - var/datum/dog_fashion.DF = new inventory_back.dog_fashion(src) + var/datum/dog_fashion/DF = new inventory_back.dog_fashion(src) if(!DF.obj_icon_state) DF.obj_icon_state = inventory_back.icon_state @@ -436,18 +436,20 @@ DF.obj_color = inventory_back.color if(health <= 0) - back_icon = DF.get_image(dir = EAST) + back_icon = DF.get_overlay(dir = EAST) back_icon.pixel_y = -11 back_icon.transform = turn(back_icon.transform, 180) else - back_icon = DF.get_image() + back_icon = DF.get_overlay() add_overlay(back_icon) if(facehugger) + var/mutable_appearance/facehugger_overlay = mutable_appearance('icons/mob/mask.dmi') if(istype(src, /mob/living/simple_animal/pet/dog/corgi/puppy)) - add_overlay(image('icons/mob/mask.dmi',"facehugger_corgipuppy")) + facehugger_overlay.icon_state = "facehugger_corgipuppy" else - add_overlay(image('icons/mob/mask.dmi',"facehugger_corgi")) + facehugger_overlay.icon_state = "facehugger_corgi" + add_overlay(facehugger_overlay) if(pcollar) add_overlay(collar) add_overlay(pettag) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm b/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm index 7fb7caf8e9f..259ca4327dc 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm @@ -7,9 +7,8 @@ /mob/living/simple_animal/drone/proc/apply_overlay(cache_index) - var/I = drone_overlays[cache_index] - if(I) - add_overlay(I) + if((. = drone_overlays[cache_index])) + add_overlay(.) /mob/living/simple_animal/drone/proc/remove_overlay(cache_index) @@ -34,11 +33,11 @@ if(!r_state) r_state = r_hand.icon_state - var/image/r_hand_image = r_hand.build_worn_icon(state = r_state, default_layer = DRONE_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE) + var/mutable_appearance/r_hand_overlay = r_hand.build_worn_icon(state = r_state, default_layer = DRONE_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE) if(y_shift) - r_hand_image.pixel_y += y_shift + r_hand_overlay.pixel_y += y_shift - hands_overlays += r_hand_image + hands_overlays += r_hand_overlay if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) r_hand.layer = ABOVE_HUD_LAYER @@ -52,11 +51,11 @@ if(!l_state) l_state = l_hand.icon_state - var/image/l_hand_image = l_hand.build_worn_icon(state = l_state, default_layer = DRONE_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE) + var/mutable_appearance/l_hand_overlay = l_hand.build_worn_icon(state = l_state, default_layer = DRONE_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE) if(y_shift) - l_hand_image.pixel_y += y_shift + l_hand_overlay.pixel_y += y_shift - hands_overlays += l_hand_image + hands_overlays += l_hand_overlay if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) l_hand.layer = ABOVE_HUD_LAYER @@ -86,10 +85,10 @@ var/used_head_icon = 'icons/mob/head.dmi' if(istype(head, /obj/item/clothing/mask)) used_head_icon = 'icons/mob/mask.dmi' - var/image/head_overlay = head.build_worn_icon(state = head.icon_state, default_layer = DRONE_HEAD_LAYER, default_icon_file = used_head_icon) + var/mutable_appearance/head_overlay = head.build_worn_icon(state = head.icon_state, default_layer = DRONE_HEAD_LAYER, default_icon_file = used_head_icon) head_overlay.pixel_y += -15 - drone_overlays[DRONE_HEAD_LAYER] = head_overlay + drone_overlays[DRONE_HEAD_LAYER] = head_overlay apply_overlay(DRONE_HEAD_LAYER) diff --git a/code/modules/mob/living/simple_animal/friendly/pet.dm b/code/modules/mob/living/simple_animal/friendly/pet.dm index baad2da95cf..ae707fb2e6f 100644 --- a/code/modules/mob/living/simple_animal/friendly/pet.dm +++ b/code/modules/mob/living/simple_animal/friendly/pet.dm @@ -2,16 +2,16 @@ icon = 'icons/mob/pets.dmi' mob_size = MOB_SIZE_SMALL var/obj/item/clothing/neck/petcollar/pcollar = null - var/image/collar = null - var/image/pettag = null + var/collar = "" + var/pettag = "" blood_volume = BLOOD_VOLUME_NORMAL /mob/living/simple_animal/pet/attackby(obj/item/O, mob/user, params) if(istype(O, /obj/item/clothing/neck/petcollar) && !pcollar) var/obj/item/clothing/neck/petcollar/P = O pcollar = P - collar = image('icons/mob/pets.dmi', src, "[icon_state]collar") - pettag = image('icons/mob/pets.dmi', src, "[icon_state]tag") + collar = "[icon_state]collar" + pettag = "[icon_state]tag" regenerate_icons() to_chat(user, "You put the [P] around [src]'s neck.") if(P.tagname) @@ -46,5 +46,7 @@ /mob/living/simple_animal/pet/regenerate_icons() cut_overlays() - add_overlay(collar) - add_overlay(pettag) + if(collar) + add_overlay(collar) + if(pettag) + add_overlay(pettag) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index e49e4120478..be889a4183c 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -260,9 +260,8 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians I.plane = ABOVE_HUD_PLANE /mob/living/simple_animal/hostile/guardian/proc/apply_overlay(cache_index) - var/I = guardian_overlays[cache_index] - if(I) - add_overlay(I) + if((. = guardian_overlays[cache_index])) + add_overlay(.) /mob/living/simple_animal/hostile/guardian/proc/remove_overlay(cache_index) var/I = guardian_overlays[cache_index] @@ -281,9 +280,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians if(!r_state) r_state = r_hand.icon_state - var/image/r_hand_image = r_hand.build_worn_icon(state = r_state, default_layer = GUARDIAN_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE) - - hands_overlays += r_hand_image + hands_overlays += r_hand.build_worn_icon(state = r_state, default_layer = GUARDIAN_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE) if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) r_hand.layer = ABOVE_HUD_LAYER @@ -296,9 +293,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians if(!l_state) l_state = l_hand.icon_state - var/image/l_hand_image = l_hand.build_worn_icon(state = l_state, default_layer = GUARDIAN_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE) - - hands_overlays += l_hand_image + hands_overlays += l_hand.build_worn_icon(state = l_state, default_layer = GUARDIAN_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE) if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) l_hand.layer = ABOVE_HUD_LAYER diff --git a/code/modules/mob/living/simple_animal/guardian/types/protector.dm b/code/modules/mob/living/simple_animal/guardian/types/protector.dm index 80212004217..eacf58410b4 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/protector.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/protector.dm @@ -40,10 +40,10 @@ to_chat(src, "You switch to combat mode.") toggle = FALSE else - var/image/I = new('icons/effects/effects.dmi', "shield-grey") + var/mutable_appearance/shield_overlay = mutable_appearance('icons/effects/effects.dmi', "shield-grey") if(namedatum) - I.color = namedatum.colour - add_overlay(I) + shield_overlay.color = namedatum.colour + add_overlay(shield_overlay) melee_damage_lower = 2 melee_damage_upper = 2 speed = 1 diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm index 95d561abeb3..159e6df5f4c 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/support.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm @@ -16,7 +16,7 @@ var/toggle = FALSE /mob/living/simple_animal/hostile/guardian/healer/Initialize() - ..() + . = ..() var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] medsensor.add_hud_to(src) diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index 462bad0df16..67b3d451b9a 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -71,9 +71,7 @@ /mob/living/simple_animal/hostile/bear/update_icons() ..() if(armored) - var/image/B = image(icon = 'icons/mob/animal.dmi', icon_state = "armor_bear") - if(B) - add_overlay(B) + add_overlay("armor_bear") /obj/item/bear_armor name = "pile of bear armor" diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index fbbd2c20c87..e7ab6e1b565 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -49,7 +49,6 @@ var/idle = 0 var/isqueen = FALSE var/icon_base = "bee" - var/static/list/bee_icons = list() /mob/living/simple_animal/hostile/poison/bees/Process_Spacemove(movement_dir = 0) @@ -91,24 +90,15 @@ if(beegent && beegent.color) col = beegent.color - var/image/base - if(!bee_icons["[icon_base]_base"]) - bee_icons["[icon_base]_base"] = image(icon = 'icons/mob/bees.dmi', icon_state = "[icon_base]_base") - base = bee_icons["[icon_base]_base"] - add_overlay(base) + add_overlay("[icon_base]_base") - var/image/greyscale - if(!bee_icons["[icon_base]_grey_[col]"]) - bee_icons["[icon_base]_grey_[col]"] = image(icon = 'icons/mob/bees.dmi', icon_state = "[icon_base]_grey") - greyscale = bee_icons["[icon_base]_grey_[col]"] - greyscale.color = col - add_overlay(greyscale) + var/static/mutable_appearance/greyscale_overlay + greyscale_overlay = greyscale_overlay || mutable_appearance('icons/mob/bees.dmi') + greyscale_overlay.icon_state = "[icon_base]_grey" + greyscale_overlay.color = col + add_overlay(greyscale_overlay) - var/image/wings - if(!bee_icons["[icon_base]_wings"]) - bee_icons["[icon_base]_wings"] = image(icon = 'icons/mob/bees.dmi', icon_state = "[icon_base]_wings") - wings = bee_icons["[icon_base]_wings"] - add_overlay(wings) + add_overlay("[icon_base]_wings") //We don't attack beekeepers/people dressed as bees//Todo: bee costume diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm index 2829bf574e1..951589daaf1 100644 --- a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm +++ b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm @@ -149,8 +149,8 @@ duration = 18 randomdir = FALSE -/obj/effect/overlay/temp/paperwiz_dying/New() - ..() +/obj/effect/overlay/temp/paperwiz_dying/Initialize() + . = ..() visible_message("The wizard cries out in pain as a gate appears behind him, sucking him in!") playsound(get_turf(src),'sound/magic/MandSwap.ogg', 50, 1, 1) playsound(get_turf(src),'sound/hallucinations/wail.ogg', 50, 1, 1) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 2e64ee526e7..fa61a16e517 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -150,7 +150,7 @@ Difficulty: Hard var/turf/T = get_turf(target) if(!T || T == loc) return - new /obj/effect/overlay/temp/dragon_swoop(T) + new /obj/effect/overlay/temp/dragon_swoop/bubblegum(T) charging = TRUE DestroySurroundings() walk(src, 0) @@ -276,6 +276,9 @@ Difficulty: Hard addtimer(CALLBACK(src, .proc/devour, L), 2) sleep(1) +/obj/effect/overlay/temp/dragon_swoop/bubblegum + duration = 10 + /obj/effect/overlay/temp/bubblegum_hands icon = 'icons/effects/bubblegum.dmi' duration = 9 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 a0e7c3694f3..d822a058864 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -46,7 +46,7 @@ Difficulty: Very Hard del_on_death = 1 medal_type = MEDAL_PREFIX score_type = COLOSSUS_SCORE - loot = list(/obj/machinery/anomalous_crystal/random, /obj/item/organ/vocal_cords/colossus) + loot = list(/obj/effect/spawner/lootdrop/anomalous_crystal, /obj/item/organ/vocal_cords/colossus) butcher_results = list(/obj/item/weapon/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30) deathmessage = "disintegrates, leaving a glowing core in its wake." death_sound = 'sound/magic/demon_dies.ogg' @@ -106,7 +106,7 @@ Difficulty: Very Hard var/target /obj/effect/overlay/temp/at_shield/Initialize(mapload, new_target) - ..() + . = ..() target = new_target INVOKE_ASYNC(src, /atom/movable/proc/orbit, target, 0, FALSE, 0, 0, FALSE, TRUE) @@ -360,9 +360,20 @@ Difficulty: Very Hard ///Anomolous Crystal/// +#define ACTIVATE_TOUCH "touch" +#define ACTIVATE_SPEECH "speech" +#define ACTIVATE_HEAT "heat" +#define ACTIVATE_BULLET "bullet" +#define ACTIVATE_ENERGY "energy" +#define ACTIVATE_BOMB "bomb" +#define ACTIVATE_MOB_BUMP "bumping" +#define ACTIVATE_WEAPON "weapon" +#define ACTIVATE_MAGIC "magic" + /obj/machinery/anomalous_crystal name = "anomalous crystal" desc = "A strange chunk of crystal, being in the presence of it fills you with equal parts excitement and dread." + var/observer_desc = "Anomalous crystals have descriptions that only observers can see. But this one hasn't been changed from the default." icon = 'icons/obj/lavaland/artefacts.dmi' icon_state = "anomaly_crystal" light_range = 8 @@ -370,66 +381,78 @@ Difficulty: Very Hard use_power = 0 density = 1 flags = HEAR - var/activation_method = "touch" + var/activation_method + var/list/possible_methods = list(ACTIVATE_TOUCH, ACTIVATE_SPEECH, ACTIVATE_HEAT, ACTIVATE_BULLET, ACTIVATE_ENERGY, ACTIVATE_BOMB, ACTIVATE_MOB_BUMP, ACTIVATE_WEAPON, ACTIVATE_MAGIC) + var/activation_damage_type = null var/last_use_timer = 0 var/cooldown_add = 30 var/list/affected_targets = list() var/activation_sound = 'sound/effects/break_stone.ogg' -/obj/machinery/anomalous_crystal/New() - activation_method = pick("touch","laser","bullet","energy","bomb","mob_bump","heat","weapon","speech") - ..() +/obj/machinery/anomalous_crystal/Initialize(mapload) + . = ..() + if(!activation_method) + activation_method = pick(possible_methods) + +/obj/machinery/anomalous_crystal/examine(mob/user) + . = ..() + if(isobserver(user)) + to_chat(user, observer_desc) + to_chat(user, "It is activated by [activation_method].") /obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans) ..() if(isliving(speaker)) - ActivationReaction(speaker,"speech") + ActivationReaction(speaker, ACTIVATE_SPEECH) /obj/machinery/anomalous_crystal/attack_hand(mob/user) ..() - ActivationReaction(user,"touch") + ActivationReaction(user, ACTIVATE_TOUCH) /obj/machinery/anomalous_crystal/attackby(obj/item/I, mob/user, params) if(I.is_hot()) - ActivationReaction(user,"heat") + ActivationReaction(user, ACTIVATE_HEAT) else - ActivationReaction(user,"weapon") + ActivationReaction(user, ACTIVATE_WEAPON) ..() /obj/machinery/anomalous_crystal/bullet_act(obj/item/projectile/P, def_zone) ..() if(istype(P, /obj/item/projectile/magic)) - ActivationReaction(P.firer, "magic", P.damage_type) + ActivationReaction(P.firer, ACTIVATE_MAGIC, P.damage_type) return ActivationReaction(P.firer, P.flag, P.damage_type) /obj/machinery/anomalous_crystal/proc/ActivationReaction(mob/user, method, damtype) if(world.time < last_use_timer) - return 0 + return FALSE if(activation_damage_type && activation_damage_type != damtype) - return 0 + return FALSE if(method != activation_method) - return 0 + return FALSE last_use_timer = (world.time + cooldown_add) playsound(user, activation_sound, 100, 1) - return 1 + return TRUE /obj/machinery/anomalous_crystal/Bumped(atom/AM as mob|obj) ..() if(ismob(AM)) - ActivationReaction(AM,"mob_bump") + ActivationReaction(AM, ACTIVATE_MOB_BUMP) /obj/machinery/anomalous_crystal/ex_act() - ActivationReaction(null,"bomb") + ActivationReaction(null, ACTIVATE_BOMB) -/obj/machinery/anomalous_crystal/random/New()//Just a random crysal spawner for loot - var/random_crystal = pick(typesof(/obj/machinery/anomalous_crystal) - /obj/machinery/anomalous_crystal/random - /obj/machinery/anomalous_crystal) - new random_crystal(loc) - qdel(src) +/obj/effect/spawner/lootdrop/anomalous_crystal + name = "anomalous crystal spawner" + +/obj/effect/spawner/lootdrop/anomalous_crystal/Initialize() + loot = subtypesof(/obj/machinery/anomalous_crystal) + . = ..() /obj/machinery/anomalous_crystal/honk //Strips and equips you as a clown. I apologize for nothing - activation_method = "mob_bump" + observer_desc = "This crystal strips and equips its targets as clowns." + possible_methods = list(ACTIVATE_MOB_BUMP, ACTIVATE_SPEECH) activation_sound = 'sound/items/bikehorn.ogg' /obj/machinery/anomalous_crystal/honk/ActivationReaction(mob/user) @@ -442,12 +465,9 @@ Difficulty: Very Hard qdel(C) affected_targets.Add(H) -/obj/machinery/anomalous_crystal/honk/New() - ..() - activation_method = pick("mob_bump","speech") - /obj/machinery/anomalous_crystal/theme_warp //Warps the area you're in to look like a new one - activation_method = "touch" + observer_desc = "This crystal warps the area around it to a theme." + activation_method = ACTIVATE_TOUCH cooldown_add = 200 var/terrain_theme = "winter" var/NewTerrainFloors @@ -457,9 +477,11 @@ Difficulty: Very Hard var/list/NewFlora = list() var/florachance = 8 -/obj/machinery/anomalous_crystal/theme_warp/New() - ..() +/obj/machinery/anomalous_crystal/theme_warp/Initialize() + . = ..() terrain_theme = pick("lavaland","winter","jungle","ayy lmao") + observer_desc = "This crystal changes the area around it to match the theme of \"[terrain_theme]\"." + switch(terrain_theme) if("lavaland")//Depressurizes the place... and free cult metal, I guess. NewTerrainFloors = /turf/open/floor/grass/snow/basalt @@ -518,15 +540,19 @@ Difficulty: Very Hard affected_targets += A /obj/machinery/anomalous_crystal/emitter //Generates a projectile when interacted with - activation_method = "touch" + observer_desc = "This crystal generates a projectile when activated." + activation_method = ACTIVATE_TOUCH cooldown_add = 50 - var/generated_projectile = /obj/item/projectile/beam/emitter + var/obj/item/projectile/generated_projectile = /obj/item/projectile/beam/emitter -/obj/machinery/anomalous_crystal/emitter/New() - ..() +/obj/machinery/anomalous_crystal/emitter/Initialize() + . = ..() generated_projectile = pick(/obj/item/projectile/magic/aoe/fireball/infernal,/obj/item/projectile/magic/aoe/lightning,/obj/item/projectile/magic/spellblade, /obj/item/projectile/bullet/meteorshot, /obj/item/projectile/beam/xray, /obj/item/projectile/colossus) + var/proj_name = initial(generated_projectile.name) + observer_desc = "This crystal generates \a [proj_name] when activated." + /obj/machinery/anomalous_crystal/emitter/ActivationReaction(mob/user, method) if(..()) var/obj/item/projectile/P = new generated_projectile(get_turf(src)) @@ -547,7 +573,8 @@ Difficulty: Very Hard P.fire() /obj/machinery/anomalous_crystal/dark_reprise //Revives anyone nearby, but turns them into shadowpeople and renders them uncloneable, so the crystal is your only hope of getting up again if you go down. - activation_method = "touch" + observer_desc = "When activated, this crystal revives anyone nearby, but turns them into Shadowpeople and makes them unclonable, making the crystal their only hope of getting up again." + activation_method = ACTIVATE_TOUCH activation_sound = 'sound/hallucinations/growl1.ogg' /obj/machinery/anomalous_crystal/dark_reprise/ActivationReaction(mob/user, method) @@ -565,13 +592,20 @@ Difficulty: Very Hard H.grab_ghost(force = TRUE) /obj/machinery/anomalous_crystal/helpers //Lets ghost spawn as helpful creatures that can only heal people slightly. Incredibly fragile and they can't converse with humans - activation_method = "touch" - var/ready_to_deploy = 0 + observer_desc = "This crystal allows ghosts to turn into a fragile creature that can heal people." + activation_method = ACTIVATE_TOUCH + activation_sound = 'sound/effects/ghost2.ogg' + var/ready_to_deploy = FALSE + +/obj/machinery/anomalous_crystal/helpers/Destroy() + GLOB.poi_list -= src + . = ..() /obj/machinery/anomalous_crystal/helpers/ActivationReaction(mob/user, method) if(..() && !ready_to_deploy) - ready_to_deploy = 1 - notify_ghosts("An anomalous crystal has been activated in [get_area(src)]! This crystal can always be used by ghosts hereafter.", enter_link = "(Click to enter)", source = src, action = NOTIFY_ATTACK) + GLOB.poi_list |= src + ready_to_deploy = TRUE + notify_ghosts("An anomalous crystal has been activated in [get_area(src)]! This crystal can always be used by ghosts hereafter.", enter_link = "(Click to enter)", ghost_sound = 'sound/effects/ghost2.ogg', source = src, action = NOTIFY_ATTACK) /obj/machinery/anomalous_crystal/helpers/attack_ghost(mob/dead/observer/user) ..() @@ -613,10 +647,12 @@ 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 damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) light_range = 4 faction = list("neutral") - del_on_death = 1 + del_on_death = TRUE unsuitable_atmos_damage = 0 movement_type = FLYING minbodytemp = 0 @@ -628,7 +664,7 @@ Difficulty: Very Hard var/heal_power = 5 /mob/living/simple_animal/hostile/lightgeist/Initialize() - ..() + . = ..() verbs -= /mob/living/verb/pulled verbs -= /mob/verb/me_verb var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] @@ -638,7 +674,7 @@ Difficulty: Very Hard . = ..() if(isliving(target) && target != src) var/mob/living/L = target - if(L.stat < DEAD) + if(L.stat != DEAD) L.heal_overall_damage(heal_power, heal_power) new /obj/effect/overlay/temp/heal(get_turf(target), "#80F5FF") @@ -649,13 +685,14 @@ Difficulty: Very Hard /obj/machinery/anomalous_crystal/refresher //Deletes and recreates a copy of the item, "refreshing" it. - activation_method = "touch" + observer_desc = "This crystal \"refreshes\" items that it affects, rendering them as new." + activation_method = ACTIVATE_TOUCH cooldown_add = 50 activation_sound = 'sound/magic/TIMEPARADOX2.ogg' var/list/banned_items_typecache = list(/obj/item/weapon/storage, /obj/item/weapon/implant, /obj/item/weapon/implanter, /obj/item/weapon/disk/nuclear, /obj/item/projectile, /obj/item/weapon/spellbook) -/obj/machinery/anomalous_crystal/refresher/New() - ..() +/obj/machinery/anomalous_crystal/refresher/Initialize() + . = ..() banned_items_typecache = typecacheof(banned_items_typecache) @@ -675,7 +712,8 @@ Difficulty: Very Hard qdel(CHOSEN) /obj/machinery/anomalous_crystal/possessor //Allows you to bodyjack small animals, then exit them at your leisure, but you can only do this once per activation. Because they blow up. Also, if the bodyjacked animal dies, SO DO YOU. - activation_method = "touch" + observer_desc = "When activated, this crystal allows you to take over small animals, and then exit them at the possessors leisure. Exiting the animal kills it, and if you die while possessing the animal, you die as well." + activation_method = ACTIVATE_TOUCH /obj/machinery/anomalous_crystal/possessor/ActivationReaction(mob/user, method) if(..()) @@ -770,4 +808,14 @@ Difficulty: Very Hard target_mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/exit_possession) +#undef ACTIVATE_TOUCH +#undef ACTIVATE_SPEECH +#undef ACTIVATE_HEAT +#undef ACTIVATE_BULLET +#undef ACTIVATE_ENERGY +#undef ACTIVATE_BOMB +#undef ACTIVATE_MOB_BUMP +#undef ACTIVATE_WEAPON +#undef ACTIVATE_MAGIC + #undef MEDAL_PREFIX diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm index 9bc32993fa9..3425d08e239 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm @@ -1,4 +1,10 @@ #define MEDAL_PREFIX "Drake" + +#define DRAKE_SWOOP_HEIGHT 270 //how high up drakes go, in pixels +#define DRAKE_SWOOP_DIRECTION_CHANGE_RANGE 5 //the range our x has to be within to not change the direction we slam from + +#define SWOOP_DAMAGEABLE 1 +#define SWOOP_INVULNERABLE 2 /* ASH DRAKE @@ -9,8 +15,9 @@ It acts as a melee creature, chasing down and attacking its target while also us Whenever possible, the drake will breathe fire in the four cardinal directions, igniting and heavily damaging anything caught in the blast. It also often causes fire to rain from the sky - many nearby turfs will flash red as a fireball crashes into them, dealing damage to anything on the turfs. -The drake also utilizes its wings to fly into the sky and crash down onto a specified point. Anything on this point takes tremendous damage. +The drake also utilizes its wings to fly into the sky, flying after its target and attempting to slam down on them. Anything near when it slams down takes huge damage. - Sometimes it will chain these swooping attacks over and over, making swiftness a necessity. + - Sometimes, it will spew fire while flying at its target. When an ash drake dies, it leaves behind a chest that can contain four things: 1. A spectral blade that allows its wielder to call ghosts to it, enhancing its power @@ -46,7 +53,7 @@ Difficulty: Medium pixel_x = -16 loot = list(/obj/structure/closet/crate/necropolis/dragon) butcher_results = list(/obj/item/weapon/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30) - var/swooping = 0 + var/swooping = NONE var/swoop_cooldown = 0 medal_type = MEDAL_PREFIX score_type = DRAKE_SCORE @@ -54,7 +61,7 @@ Difficulty: Medium death_sound = 'sound/magic/demon_dies.ogg' /mob/living/simple_animal/hostile/megafauna/dragon/Initialize() - ..() + . = ..() internal = new/obj/item/device/gps/internal/dragon(src) /mob/living/simple_animal/hostile/megafauna/dragon/ex_act(severity, target) @@ -63,10 +70,15 @@ Difficulty: Medium ..() /mob/living/simple_animal/hostile/megafauna/dragon/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - if(!forced && swooping) + if(!forced && (swooping & SWOOP_INVULNERABLE)) return FALSE return ..() +/mob/living/simple_animal/hostile/megafauna/dragon/visible_message() + if(swooping & SWOOP_INVULNERABLE) //to suppress attack messages without overriding every single proc that could send a message saying we got hit + return + return ..() + /mob/living/simple_animal/hostile/megafauna/dragon/AttackingTarget() if(!swooping) return ..() @@ -86,62 +98,15 @@ Difficulty: Medium /mob/living/simple_animal/hostile/megafauna/dragon/Process_Spacemove(movement_dir = 0) return 1 -/obj/effect/overlay/temp/fireball - icon = 'icons/obj/wizard.dmi' - icon_state = "fireball" - name = "fireball" - desc = "Get out of the way!" - layer = FLY_LAYER - randomdir = 0 - duration = 12 - pixel_z = 500 - -/obj/effect/overlay/temp/fireball/Initialize(loc) - ..() - animate(src, pixel_z = 0, time = 12) - -/obj/effect/overlay/temp/target - icon = 'icons/mob/actions.dmi' - icon_state = "sniper_zoom" - layer = BELOW_MOB_LAYER - light_range = 2 - duration = 12 - -/obj/effect/overlay/temp/dragon_swoop - name = "certain death" - desc = "Don't just stand there, move!" - icon = 'icons/effects/96x96.dmi' - icon_state = "landing" - layer = BELOW_MOB_LAYER - pixel_x = -32 - pixel_y = -32 - color = "#FF0000" - duration = 10 - -/obj/effect/overlay/temp/target/ex_act() - return - -/obj/effect/overlay/temp/target/Initialize(loc) - ..() - INVOKE_ASYNC(src, .proc/fall) - -/obj/effect/overlay/temp/target/proc/fall() - var/turf/T = get_turf(src) - playsound(T,'sound/magic/Fireball.ogg', 200, 1) - new /obj/effect/overlay/temp/fireball(T) - sleep(12) - explosion(T, 0, 0, 1, 0, 0, 0, 1) - /mob/living/simple_animal/hostile/megafauna/dragon/OpenFire() + if(swooping) + return anger_modifier = Clamp(((maxHealth - health)/50),0,20) ranged_cooldown = world.time + ranged_cooldown_time - if(swooping) - fire_rain() - return if(prob(15 + anger_modifier) && !client) if(health < maxHealth/2) - INVOKE_ASYNC(src, .proc/swoop_attack, 1) + INVOKE_ASYNC(src, .proc/swoop_attack, TRUE, null, 50) else fire_rain() @@ -154,9 +119,11 @@ Difficulty: Medium fire_walls() /mob/living/simple_animal/hostile/megafauna/dragon/proc/fire_rain() - visible_message("Fire rains from the sky!") - for(var/turf/turf in range(12,get_turf(src))) - if(prob(10)) + if(!target) + return + target.visible_message("Fire rains from the sky!") + for(var/turf/turf in range(9,get_turf(target))) + if(prob(11)) new /obj/effect/overlay/temp/target(turf) /mob/living/simple_animal/hostile/megafauna/dragon/proc/fire_walls() @@ -177,6 +144,8 @@ Difficulty: Medium new /obj/effect/hotspot(J) J.hotspot_expose(700,50,1) for(var/mob/living/L in J.contents - hit_things) + if(istype(L, /mob/living/simple_animal/hostile/megafauna/dragon)) + continue L.adjustFireLoss(20) to_chat(L, "You're hit by the drake's fire breath!") hit_things += L @@ -184,43 +153,86 @@ Difficulty: Medium sleep(1) /mob/living/simple_animal/hostile/megafauna/dragon/proc/triple_swoop() - swoop_attack() - swoop_attack() - swoop_attack() + swoop_attack(swoop_duration = 30) + swoop_attack(swoop_duration = 30) + swoop_attack(swoop_duration = 30) -/mob/living/simple_animal/hostile/megafauna/dragon/proc/swoop_attack(fire_rain = 0, atom/movable/manual_target) +/mob/living/simple_animal/hostile/megafauna/dragon/proc/swoop_attack(fire_rain, atom/movable/manual_target, swoop_duration = 40) if(stat || swooping) return - swoop_cooldown = world.time + 200 - var/atom/swoop_target if(manual_target) - swoop_target = manual_target - else - swoop_target = target + target = manual_target + if(!target) + return + swoop_cooldown = world.time + 200 stop_automated_movement = TRUE - swooping = 1 - density = 0 - icon_state = "swoop" + swooping |= SWOOP_DAMAGEABLE + density = FALSE + icon_state = "shadow" visible_message("[src] swoops up high!") - if(prob(50)) - animate(src, pixel_x = 500, pixel_z = 500, time = 10) + + var/negative + var/initial_x = x + if(target.x < initial_x) //if the target's x is lower than ours, swoop to the left + negative = TRUE + else if(target.x > initial_x) + negative = FALSE + else if(target.x == initial_x) //if their x is the same, pick a direction + negative = prob(50) + var/obj/effect/overlay/temp/dragon_flight/F = new /obj/effect/overlay/temp/dragon_flight(loc, negative) + + negative = !negative //invert it for the swoop down later + + var/oldtransform = transform + animate(src, transform = matrix()*0.9, time = 3, easing = BOUNCE_EASING) + for(var/i in 1 to 3) + sleep(1) + if(QDELETED(src)) //we got hit and died, rip us + qdel(F) + return + animate(src, transform = matrix()*0.7, time = 7) + swooping |= SWOOP_INVULNERABLE + sleep(7) + var/list/flame_hit = list() + while(swoop_duration > 0) + if(!target && !FindTarget()) + break //we lost our target while chasing it down and couldn't get a new one + if(swoop_duration < 7) + fire_rain = FALSE //stop raining fire near the end of the swoop + if(loc == get_turf(target)) + if(!fire_rain) + break //we're not spewing fire at our target, slam they + if(isliving(target)) + var/mob/living/L = target + if(L.stat == DEAD) + break //target is dead and we're on em, slam they + if(fire_rain) + new /obj/effect/overlay/temp/target(loc, flame_hit) + forceMove(get_step(src, get_dir(src, target))) + if(loc == get_turf(target)) + if(!fire_rain) + break + if(isliving(target)) + var/mob/living/L = target + if(L.stat == DEAD) + break + var/swoop_speed = 1.5 + swoop_duration -= swoop_speed + sleep(swoop_speed) + + //ensure swoop direction continuity. + if(negative) + if(IsInRange(x, initial_x + 1, initial_x + DRAKE_SWOOP_DIRECTION_CHANGE_RANGE)) + negative = FALSE else - animate(src, pixel_x = -500, pixel_z = 500, time = 10) - sleep(30) - - var/turf/tturf - if(fire_rain) - fire_rain() - + if(IsInRange(x, initial_x - DRAKE_SWOOP_DIRECTION_CHANGE_RANGE, initial_x - 1)) + negative = TRUE + new /obj/effect/overlay/temp/dragon_flight/end(loc, negative) + new /obj/effect/overlay/temp/dragon_swoop(loc) + animate(src, transform = oldtransform, time = 5) + sleep(5) + swooping &= ~SWOOP_INVULNERABLE icon_state = "dragon" - if(swoop_target && !QDELETED(swoop_target) && swoop_target.z == src.z) - tturf = get_turf(swoop_target) - else - tturf = get_turf(src) - forceMove(tturf) - new /obj/effect/overlay/temp/dragon_swoop(tturf) - animate(src, pixel_x = initial(pixel_x), pixel_z = 0, time = 10) - sleep(10) playsound(src.loc, 'sound/effects/meteorimpact.ogg', 200, 1) for(var/mob/living/L in orange(1, src)) if(L.stat) @@ -239,9 +251,9 @@ Difficulty: Medium for(var/mob/M in range(7, src)) shake_camera(M, 15, 1) - stop_automated_movement = FALSE - swooping = 0 - density = 1 + density = TRUE + sleep(1) + swooping &= ~SWOOP_DAMAGEABLE /mob/living/simple_animal/hostile/megafauna/dragon/AltClickOn(atom/movable/A) if(!istype(A)) @@ -249,7 +261,7 @@ Difficulty: Medium if(swoop_cooldown >= world.time) to_chat(src, "You need to wait 20 seconds between swoop attacks!") return - swoop_attack(1, A) + swoop_attack(TRUE, A, 25) /obj/item/device/gps/internal/dragon icon_state = null @@ -257,6 +269,103 @@ Difficulty: Medium desc = "Here there be dragons." invisibility = 100 + +/obj/effect/overlay/temp/fireball + icon = 'icons/obj/wizard.dmi' + icon_state = "fireball" + name = "fireball" + desc = "Get out of the way!" + layer = FLY_LAYER + randomdir = FALSE + duration = 9 + pixel_z = DRAKE_SWOOP_HEIGHT + +/obj/effect/overlay/temp/fireball/Initialize() + . = ..() + animate(src, pixel_z = 0, time = duration) + +/obj/effect/overlay/temp/target + icon = 'icons/mob/actions.dmi' + icon_state = "sniper_zoom" + layer = BELOW_MOB_LAYER + light_range = 2 + duration = 9 + +/obj/effect/overlay/temp/target/ex_act() + return + +/obj/effect/overlay/temp/target/Initialize(mapload, list/flame_hit) + . = ..() + INVOKE_ASYNC(src, .proc/fall, flame_hit) + +/obj/effect/overlay/temp/target/proc/fall(list/flame_hit) + var/turf/T = get_turf(src) + playsound(T,'sound/magic/Fireball.ogg', 80, 1) + new /obj/effect/overlay/temp/fireball(T) + sleep(duration) + if(ismineralturf(T)) + var/turf/closed/mineral/M = T + M.gets_drilled() + playsound(T, "explosion", 80, 1) + new /obj/effect/hotspot(T) + T.hotspot_expose(700, 50, 1) + for(var/mob/living/L in T.contents) + if(istype(L, /mob/living/simple_animal/hostile/megafauna/dragon)) + continue + if(!islist(flame_hit) || !flame_hit[L]) + L.adjustFireLoss(40) + to_chat(L, "You're hit by the drake's fire breath!") + flame_hit[L] = TRUE + else + L.adjustFireLoss(10) //if we've already hit them, do way less damage + +/obj/effect/overlay/temp/dragon_swoop + name = "certain death" + desc = "Don't just stand there, move!" + icon = 'icons/effects/96x96.dmi' + icon_state = "landing" + layer = BELOW_MOB_LAYER + pixel_x = -32 + pixel_y = -32 + color = "#FF0000" + duration = 5 + +/obj/effect/overlay/temp/dragon_flight + icon = 'icons/mob/lavaland/dragon.dmi' + icon_state = "dragon" + layer = ABOVE_ALL_MOB_LAYER + pixel_x = -16 + duration = 10 + randomdir = FALSE + +/obj/effect/overlay/temp/dragon_flight/Initialize(mapload, negative) + . = ..() + INVOKE_ASYNC(src, .proc/flight, negative) + +/obj/effect/overlay/temp/dragon_flight/proc/flight(negative) + if(negative) + animate(src, pixel_x = -DRAKE_SWOOP_HEIGHT*0.10, pixel_z = DRAKE_SWOOP_HEIGHT*0.15, time = 3, easing = BOUNCE_EASING) + else + animate(src, pixel_x = DRAKE_SWOOP_HEIGHT*0.10, pixel_z = DRAKE_SWOOP_HEIGHT*0.15, time = 3, easing = BOUNCE_EASING) + sleep(3) + icon_state = "swoop" + if(negative) + animate(src, pixel_x = -DRAKE_SWOOP_HEIGHT, pixel_z = DRAKE_SWOOP_HEIGHT, time = 7) + else + animate(src, pixel_x = DRAKE_SWOOP_HEIGHT, pixel_z = DRAKE_SWOOP_HEIGHT, time = 7) + +/obj/effect/overlay/temp/dragon_flight/end + pixel_x = DRAKE_SWOOP_HEIGHT + pixel_z = DRAKE_SWOOP_HEIGHT + duration = 5 + +/obj/effect/overlay/temp/dragon_flight/end/flight(negative) + if(negative) + pixel_x = -DRAKE_SWOOP_HEIGHT + animate(src, pixel_x = -16, pixel_z = 0, time = 5) + else + animate(src, pixel_x = -16, pixel_z = 0, time = 5) + /mob/living/simple_animal/hostile/megafauna/dragon/lesser name = "lesser ash drake" maxHealth = 200 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index d9f099e2f11..03f8ce63cfe 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -74,7 +74,7 @@ Difficulty: Hard death_sound = 'sound/magic/Repulse.ogg' /mob/living/simple_animal/hostile/megafauna/hierophant/Initialize() - ..() + . = ..() internal = new/obj/item/device/gps/internal/hierophant(src) spawned_beacon = new(loc) @@ -426,8 +426,8 @@ Difficulty: Hard layer = BELOW_MOB_LAYER var/mob/living/caster //who made this, anyway -/obj/effect/overlay/temp/hierophant/New(loc, new_caster) - ..() +/obj/effect/overlay/temp/hierophant/Initialize(mapload, new_caster) + . = ..() if(new_caster) caster = new_caster @@ -437,13 +437,13 @@ Difficulty: Hard light_range = 1 randomdir = FALSE -/obj/effect/overlay/temp/hierophant/squares/New(loc, new_caster) - ..() +/obj/effect/overlay/temp/hierophant/squares/Initialize(mapload, new_caster) + . = ..() if(ismineralturf(loc)) var/turf/closed/mineral/M = loc M.gets_drilled(caster) -/obj/effect/overlay/temp/hierophant/wall //smoothing and pooling are not friends. TODO: figure this out +/obj/effect/overlay/temp/hierophant/wall //smoothing and pooling were not friends, but pooling is dead. name = "vortex wall" icon = 'icons/turf/walls/hierophant_wall_temp.dmi' icon_state = "wall" @@ -451,15 +451,14 @@ Difficulty: Hard duration = 100 smooth = SMOOTH_TRUE -/obj/effect/overlay/temp/hierophant/wall/New(loc, new_caster) - ..() +/obj/effect/overlay/temp/hierophant/wall/Initialize(mapload, new_caster) + . = ..() queue_smooth_neighbors(src) queue_smooth(src) /obj/effect/overlay/temp/hierophant/wall/Destroy() queue_smooth_neighbors(src) - ..() - return QDEL_HINT_QUEUE + return ..() /obj/effect/overlay/temp/hierophant/wall/CanPass(atom/movable/mover, turf/target, height = 0) if(mover == caster) @@ -480,8 +479,8 @@ Difficulty: Hard var/currently_seeking = FALSE var/friendly_fire_check = FALSE //if blasts produced apply friendly fire -/obj/effect/overlay/temp/hierophant/chaser/New(loc, new_caster, new_target, new_speed, is_friendly_fire) - ..() +/obj/effect/overlay/temp/hierophant/chaser/Initialize(mapload, new_caster, new_target, new_speed, is_friendly_fire) + . = ..() target = new_target friendly_fire_check = is_friendly_fire if(new_speed) @@ -558,8 +557,8 @@ Difficulty: Hard var/friendly_fire_check = FALSE var/bursting = FALSE //if we're bursting and need to hit anyone crossing us -/obj/effect/overlay/temp/hierophant/blast/New(loc, new_caster, friendly_fire) - ..() +/obj/effect/overlay/temp/hierophant/blast/Initialize(mapload, new_caster, friendly_fire) + . = ..() friendly_fire_check = friendly_fire if(new_caster) hit_things += new_caster diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index bf834fce03d..1e97dedb745 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -51,7 +51,7 @@ Difficulty: Medium mouse_opacity = 1 /mob/living/simple_animal/hostile/megafauna/legion/Initialize() - ..() + . = ..() internal = new/obj/item/device/gps/internal/legion(src) /mob/living/simple_animal/hostile/megafauna/legion/AttackingTarget() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index 8af5c76f5be..0a0ff6bdd3a 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -53,7 +53,7 @@ return else if(!admin_spawned) - feedback_set_details("megafauna_kills","[initial(name)]") + SSblackbox.set_details("megafauna_kills","[initial(name)]") if(!elimination) //used so the achievment only occurs for the last legion to die. grant_achievement(medal_type,score_type) ..() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm index 8b6c9c5e1cd..62833132ec3 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm @@ -66,7 +66,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa /mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon/Initialize() - ..() + . = ..() swarmer_caps = GLOB.AISwarmerCapsByType //for admin-edits internal = new/obj/item/device/gps/internal/swarmer_beacon(src) for(var/ddir in GLOB.cardinal) @@ -109,7 +109,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa /mob/living/simple_animal/hostile/swarmer/ai/Initialize() - ..() + . = ..() ToggleLight() //so you can see them eating you out of house and home/shooting you/stunlocking you for eternity LAZYINITLIST(GLOB.AISwarmersByType[type]) GLOB.AISwarmers += src @@ -179,7 +179,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa /mob/living/simple_animal/hostile/swarmer/ai/resource/Initialize() - ..() + . = ..() sharedWanted = typecacheof(sharedWanted) sharedIgnore = typecacheof(sharedIgnore) diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 825b376a07f..aade8cbca16 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -100,7 +100,7 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca var/mob/living/creator = null // the creator var/destroy_objects = 0 var/knockdown_people = 0 - var/image/googly_eyes = null + var/static/mutable_appearance/googly_eyes = mutable_appearance('icons/mob/mob.dmi', "googly_eyes") gold_core_spawnable = 0 /mob/living/simple_animal/hostile/mimic/copy/Initialize(mapload, obj/copy, mob/living/creator, destroy_original = 0) @@ -143,7 +143,6 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca icon_state = O.icon_state icon_living = icon_state copy_overlays(O) - googly_eyes = image('icons/mob/mob.dmi',"googly_eyes") add_overlay(googly_eyes) if(istype(O, /obj/structure) || istype(O, /obj/machinery)) health = (anchored * 50) + 50 @@ -178,11 +177,6 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca C.visible_message("\The [src] knocks down \the [C]!", \ "\The [src] knocks you down!") -/mob/living/simple_animal/hostile/mimic/copy/Aggro() - ..() - googly_eyes.setDir(get_dir(src,target)) - - /mob/living/simple_animal/hostile/mimic/copy/machine speak = list("HUMANS ARE IMPERFECT!", "YOU SHALL BE ASSIMILATED!", "YOU ARE HARMING YOURSELF", "You have been deemed hazardous. Will you comply?", \ "My logic is undeniable.", "One of us.", "FLESH IS WEAK", "THIS ISN'T WAR, THIS IS EXTERMINATION!") diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index ca0ef6a7ea7..a68ccc48840 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -48,7 +48,7 @@ ..() /mob/living/simple_animal/hostile/asteroid/death(gibbed) - feedback_add_details("mobs_killed_mining","[src.type]") + SSblackbox.add_details("mobs_killed_mining","[src.type]") ..(gibbed) /mob/living/simple_animal/hostile/asteroid/basilisk @@ -266,15 +266,15 @@ update_icon() if(implanted) - feedback_add_details("hivelord_core", "[type]|implanted") + SSblackbox.add_details("hivelord_core", "[type]|implanted") else - feedback_add_details("hivelord_core", "[type]|stabilizer") + SSblackbox.add_details("hivelord_core", "[type]|stabilizer") /obj/item/organ/hivelord_core/proc/go_inert() inert = TRUE desc = "The remains of a hivelord that have become useless, having been left alone too long after being harvested." - feedback_add_details("hivelord_core", "[src.type]|inert") + SSblackbox.add_details("hivelord_core", "[src.type]|inert") update_icon() /obj/item/organ/hivelord_core/ui_action_click() @@ -298,10 +298,10 @@ return if(H != user) H.visible_message("[user] forces [H] to apply [src]... [H.p_they()] quickly regenerate all injuries!") - feedback_add_details("hivelord_core","[src.type]|used|other") + SSblackbox.add_details("hivelord_core","[src.type]|used|other") else to_chat(user, "You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments.") - feedback_add_details("hivelord_core","[src.type]|used|self") + SSblackbox.add_details("hivelord_core","[src.type]|used|self") H.revive(full_heal = 1) qdel(src) ..() diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index 4419b3eb04d..202a26b355c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -29,12 +29,13 @@ unique_name = 1 speak_emote = list("squeaks") deathmessage = "fainted." + var/cap_color = "#ffffff" var/powerlevel = 0 //Tracks our general strength level gained from eating other shrooms var/bruised = 0 //If someone tries to cheat the system by attacking a shroom to lower its health, punish them so that it wont award levels to shrooms that eat it var/recovery_cooldown = 0 //So you can't repeatedly revive it during a fight var/faint_ticker = 0 //If we hit three, another mushroom's gonna eat us - var/image/cap_living = null //Where we store our cap icons so we dont generate them constantly to update our icon - var/image/cap_dead = null + var/static/mutable_appearance/cap_living //Where we store our cap icons so we dont generate them constantly to update our icon + var/static/mutable_appearance/cap_dead /mob/living/simple_animal/hostile/mushroom/examine(mob/user) ..() @@ -53,11 +54,10 @@ melee_damage_upper += rand(10,20) maxHealth += rand(40,60) move_to_delay = rand(3,11) - var/cap_color = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) - cap_living = image('icons/mob/animal.dmi',icon_state = "mushroom_cap") - cap_dead = image('icons/mob/animal.dmi',icon_state = "mushroom_cap_dead") - cap_living.color = cap_color - cap_dead.color = cap_color + cap_living = cap_living || mutable_appearance(icon, "mushroom_cap") + cap_dead = cap_dead || mutable_appearance(icon, "mushroom_cap_dead") + + cap_color = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) UpdateMushroomCap() health = maxHealth ..() @@ -101,6 +101,8 @@ /mob/living/simple_animal/hostile/mushroom/proc/UpdateMushroomCap() cut_overlays() + cap_living.color = cap_color + cap_dead.color = cap_color if(health == 0) add_overlay(cap_dead) else diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm index 3f54f3d20ba..0dc4609e912 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm @@ -26,7 +26,7 @@ gold_core_spawnable = 1 /mob/living/simple_animal/hostile/retaliate/frog/Initialize() - ..() + . = ..() if(prob(1)) name = "rare frog" desc = "It seems a little smug." diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm index 20bb9c497e3..a0078013c7a 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm @@ -32,35 +32,31 @@ gold_core_spawnable = 0 //too spooky for science var/ghost_hair_style var/ghost_hair_color - var/image/ghost_hair = null + var/mutable_appearance/ghost_hair var/ghost_facial_hair_style var/ghost_facial_hair_color - var/image/ghost_facial_hair = null + var/mutable_appearance/ghost_facial_hair var/random = TRUE //if you want random names for ghosts or not /mob/living/simple_animal/hostile/retaliate/ghost/Initialize() - ..() - if(!random) - give_hair() - else + . = ..() + give_hair() + if(random) switch(rand(0,1)) if(0) name = "ghost of [pick(GLOB.first_names_male)] [pick(GLOB.last_names)]" if(1) name = "ghost of [pick(GLOB.first_names_female)] [pick(GLOB.last_names)]" - give_hair() /mob/living/simple_animal/hostile/retaliate/ghost/proc/give_hair() if(ghost_hair_style != null) - ghost_hair = image('icons/mob/human_face.dmi', "hair_[ghost_hair_style]") - ghost_hair.layer = -HAIR_LAYER + ghost_hair = mutable_appearance('icons/mob/human_face.dmi', "hair_[ghost_hair_style]", -HAIR_LAYER) ghost_hair.alpha = 200 ghost_hair.color = ghost_hair_color add_overlay(ghost_hair) if(ghost_facial_hair_style != null) - ghost_facial_hair = image('icons/mob/human_face.dmi', "facial_[ghost_facial_hair_style]") - ghost_facial_hair.layer = -HAIR_LAYER + ghost_facial_hair = mutable_appearance('icons/mob/human_face.dmi', "facial_[ghost_facial_hair_style]", -HAIR_LAYER) ghost_facial_hair.alpha = 200 ghost_facial_hair.color = ghost_facial_hair_color add_overlay(ghost_facial_hair) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index d87573edd3f..d3b27dd5df5 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -127,9 +127,11 @@ stuttering = 0 /mob/living/simple_animal/proc/handle_automated_action() + set waitfor = FALSE return /mob/living/simple_animal/proc/handle_automated_movement() + set waitfor = FALSE if(!stop_automated_movement && wander) if((isturf(src.loc) || allow_movement_on_non_turfs) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc. turns_since_move++ @@ -142,6 +144,7 @@ return 1 /mob/living/simple_animal/proc/handle_automated_speech(var/override) + set waitfor = FALSE if(speak_chance) if(prob(speak_chance) || override) if(speak && speak.len) @@ -337,7 +340,7 @@ . = 1 /mob/living/simple_animal/proc/make_babies() // <3 <3 <3 - if(gender != FEMALE || stat || next_scan_time > world.time || !childtype || !animal_species || SSticker.current_state != GAME_STATE_PLAYING) + if(gender != FEMALE || stat || next_scan_time > world.time || !childtype || !animal_species || !SSticker.IsRoundInProgress()) return next_scan_time = world.time + 400 var/alone = 1 diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm index aec971fb37f..dab6b717a41 100644 --- a/code/modules/mob/living/simple_animal/slime/powers.dm +++ b/code/modules/mob/living/simple_animal/slime/powers.dm @@ -166,7 +166,7 @@ M.Friends = Friends.Copy() babies += M M.mutation_chance = Clamp(mutation_chance+(rand(5,-5)),0,100) - feedback_add_details("slime_babies_born","slimebirth_[replacetext(M.colour," ","_")]") + SSblackbox.add_details("slime_babies_born","slimebirth_[replacetext(M.colour," ","_")]") var/mob/living/simple_animal/slime/new_slime = pick(babies) new_slime.a_intent = INTENT_HARM diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 5c58c4c1dfe..11a6ca71608 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -92,7 +92,7 @@ E.Grant(src) create_reagents(100) set_colour(new_colour) - ..() + . = ..() /mob/living/simple_animal/slime/proc/set_colour(new_colour) colour = new_colour @@ -118,7 +118,7 @@ if(stat != DEAD) icon_state = icon_text if(mood && !stat) - add_overlay(image('icons/mob/slimes.dmi', icon_state = "aslime-[mood]")) + add_overlay("aslime-[mood]") else icon_state = icon_dead ..() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 023c1047178..95d3abfa288 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -29,6 +29,8 @@ prepare_huds() can_ride_typecache = typecacheof(can_ride_typecache) for(var/v in GLOB.active_alternate_appearances) + if(!v) + continue var/datum/atom_hud/alternate_appearance/AA = v AA.onNewMob(src) ..() diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 3942014fb9f..f2fbcac82c9 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -377,7 +377,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp /mob/proc/reagent_check(datum/reagent/R) // utilized in the species code return 1 -/proc/notify_ghosts(var/message, var/ghost_sound = null, var/enter_link = null, var/atom/source = null, var/image/alert_overlay = null, var/action = NOTIFY_JUMP, flashwindow = TRUE) //Easy notification of ghosts. +/proc/notify_ghosts(var/message, var/ghost_sound = null, var/enter_link = null, var/atom/source = null, var/mutable_appearance/alert_overlay = null, var/action = NOTIFY_JUMP, flashwindow = TRUE) //Easy notification of ghosts. if(SSatoms.initialized != INITIALIZATION_INNEW_REGULAR) //don't notify for objects created during a map load return for(var/mob/dead/observer/O in GLOB.player_list) @@ -396,17 +396,10 @@ It's fairly easy to fix if dealing with single letters but not so much with comp A.action = action A.target = source if(!alert_overlay) - var/old_layer = source.layer - var/old_plane = source.plane - source.layer = FLOAT_LAYER - source.plane = FLOAT_PLANE - A.add_overlay(source) - source.layer = old_layer - source.plane = old_plane - else - alert_overlay.layer = FLOAT_LAYER - alert_overlay.plane = FLOAT_PLANE - A.add_overlay(alert_overlay) + alert_overlay = new(source) + alert_overlay.layer = FLOAT_LAYER + alert_overlay.plane = FLOAT_PLANE + A.add_overlay(alert_overlay) /proc/item_heal_robotic(mob/living/carbon/human/H, mob/user, brute_heal, burn_heal) var/obj/item/bodypart/affecting = H.get_bodypart(check_zone(user.zone_selected)) diff --git a/code/modules/modular_computers/computers/item/laptop.dm b/code/modules/modular_computers/computers/item/laptop.dm index 6a14d3a43fe..e1d20c3ecc2 100644 --- a/code/modules/modular_computers/computers/item/laptop.dm +++ b/code/modules/modular_computers/computers/item/laptop.dm @@ -19,7 +19,7 @@ var/slowdown_open = 1 /obj/item/device/modular_computer/laptop/Initialize() - ..() + . = ..() // No running around with open laptops in hands. SET_SECONDARY_FLAG(src, SLOWS_WHILE_IN_HAND) diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm index b959ced6cf4..eec36d6c4c2 100644 --- a/code/modules/modular_computers/file_system/programs/card.dm +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -3,7 +3,7 @@ filedesc = "ID card modification program" program_icon_state = "id" extended_desc = "Program for programming employee ID cards to access parts of the station." - transfer_access = GLOB.access_change_ids + transfer_access = GLOB.access_heads requires_ntnet = 0 size = 8 var/mod_mode = 1 @@ -452,7 +452,7 @@ var/obj/item/weapon/card/id/auth_card = card_slot.stored_card2 if(auth_card) region_access = list() - if(transfer_access in auth_card.GetAccess()) + if(GLOB.access_change_ids in auth_card.GetAccess()) minor = 0 authenticated = 1 return 1 diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm index 33f1a307cbd..481c4d46b5f 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm @@ -14,8 +14,7 @@ if(T.density)//Don't want them shooting nets through walls. It's kind of cheesy. to_chat(H, "You may not use an energy net through solid obstacles!") return - spawn(0) - H.Beam(C,"n_beam",time=15) + H.Beam(C,"n_beam",time=15) H.say("Get over here!") var/obj/structure/energy_net/E = new /obj/structure/energy_net(C.loc) H.visible_message("[H] caught [C] with an energy net!","You caught [C] with an energy net!") diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 3b120840c0f..dadb1ddd60a 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -32,7 +32,7 @@ /obj/structure/filingcabinet/Initialize(mapload) - ..() + . = ..() if(mapload) for(var/obj/item/I in loc) if(istype(I, /obj/item/weapon/paper) || istype(I, /obj/item/weapon/folder) || istype(I, /obj/item/weapon/photo)) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 72fe84de458..36e69828b27 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -336,12 +336,10 @@ return stamps += "" - var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') + var/mutable_appearance/stampoverlay = mutable_appearance('icons/obj/bureaucracy.dmi', "paper_[P.icon_state]") stampoverlay.pixel_x = rand(-2, 2) stampoverlay.pixel_y = rand(-3, 2) - stampoverlay.icon_state = "paper_[P.icon_state]" - LAZYADD(stamped, P.icon_state) add_overlay(stampoverlay) diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 2fca29b45c5..6a25273b83e 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -15,7 +15,7 @@ var/obj/item/weapon/pen/bin_pen /obj/item/weapon/paper_bin/Initialize(mapload) - ..() + . = ..() if(!mapload) return var/obj/item/weapon/pen/P = locate(/obj/item/weapon/pen) in src.loc @@ -135,7 +135,7 @@ icon_state = "[initial(icon_state)]" cut_overlays() if(bin_pen) - add_overlay(image(icon=bin_pen.icon,icon_state=bin_pen.icon_state)) + add_overlay(mutable_appearance(bin_pen.icon, bin_pen.icon_state)) /obj/item/weapon/paper_bin/construction name = "construction paper bin" diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index d294e094f56..2514784bcb5 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -14,7 +14,7 @@ var/obj/item/weapon/paper/internalPaper /obj/item/weapon/paperplane/Initialize(mapload, obj/item/weapon/paper/newPaper) - ..() + . = ..() pixel_y = rand(-8, 8) pixel_x = rand(-9, 9) if(newPaper) @@ -44,8 +44,7 @@ var/list/stamped = internalPaper.stamped if(stamped) for(var/S in stamped) - var/image/stampoverlay = image('icons/obj/bureaucracy.dmi', "paperplane_[stamped]") - add_overlay(stampoverlay) + add_overlay("paperplane_[S]") /obj/item/weapon/paperplane/attack_self(mob/user) to_chat(user, "You unfold [src].") diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm index 527d5d62a26..8bdc5c1015c 100644 --- a/code/modules/power/antimatter/shielding.dm +++ b/code/modules/power/antimatter/shielding.dm @@ -28,11 +28,9 @@ var/dirs = 0 -/obj/machinery/am_shielding/New(loc) - ..(loc) - spawn(10) - controllerscan() - return +/obj/machinery/am_shielding/Initialize() + . = ..() + addtimer(CALLBACK(src, .proc/controllerscan), 10) /obj/machinery/am_shielding/proc/controllerscan(priorscan = 0) @@ -59,11 +57,9 @@ if(!control_unit) if(!priorscan) - spawn(20) - controllerscan(1)//Last chance + addtimer(CALLBACK(src, .proc/controllerscan, 1), 20) return qdel(src) - return /obj/machinery/am_shielding/Destroy() diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index a9dd0e78f2f..46332854887 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -93,12 +93,6 @@ var/force_update = 0 var/update_state = -1 var/update_overlay = -1 - var/global/status_overlays = 0 - var/global/list/status_overlays_lock - var/global/list/status_overlays_charging - var/global/list/status_overlays_equipment - var/global/list/status_overlays_lighting - var/global/list/status_overlays_environ /obj/machinery/power/apc/connect_to_network() @@ -172,7 +166,7 @@ terminal.master = src /obj/machinery/power/apc/Initialize(mapload) - ..() + . = ..() if(!mapload) return has_electronics = 2 //installed and secured @@ -218,35 +212,6 @@ // update the APC icon to show the three base states // also add overlays for indicator lights /obj/machinery/power/apc/update_icon() - if (!status_overlays) - status_overlays = 1 - status_overlays_lock = new(2) - status_overlays_charging = new(3) - status_overlays_equipment = new(4) - status_overlays_lighting = new(4) - status_overlays_environ = new(4) - - status_overlays_lock[1] = image(icon, "apcox-0") // 0=blue 1=red - status_overlays_lock[2] = image(icon, "apcox-1") - - status_overlays_charging[1] = image(icon, "apco3-0") - status_overlays_charging[2] = image(icon, "apco3-1") - status_overlays_charging[3] = image(icon, "apco3-2") - - status_overlays_equipment[1] = image(icon, "apco0-0") - status_overlays_equipment[2] = image(icon, "apco0-1") - status_overlays_equipment[3] = image(icon, "apco0-2") - status_overlays_equipment[4] = image(icon, "apco0-3") - - status_overlays_lighting[1] = image(icon, "apco1-0") - status_overlays_lighting[2] = image(icon, "apco1-1") - status_overlays_lighting[3] = image(icon, "apco1-2") - status_overlays_lighting[4] = image(icon, "apco1-3") - - status_overlays_environ[1] = image(icon, "apco2-0") - status_overlays_environ[2] = image(icon, "apco2-1") - status_overlays_environ[3] = image(icon, "apco2-2") - status_overlays_environ[4] = image(icon, "apco2-3") var/update = check_updates() //returns 0 if no need to update icons. // 1 if we need to update the icon_state @@ -283,12 +248,12 @@ cut_overlays() if(!(stat & (BROKEN|MAINT)) && update_state & UPSTATE_ALLGOOD) var/list/O = list( - status_overlays_lock[locked+1], - status_overlays_charging[charging+1]) + "apcox-[locked]", + "apco3-[charging]") if(operating) - O += status_overlays_equipment[equipment+1] - O += status_overlays_lighting[lighting+1] - O += status_overlays_environ[environ+1] + O += "apco0-[equipment]" + O += "apco1-[lighting]" + O += "apco2-[environ]" add_overlay(O) // And now, seperately for cleanness, the lighting changing diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index c12be4e0135..350eb534e65 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -49,13 +49,13 @@ /obj/item/weapon/stock_parts/cell/proc/updateicon() cut_overlays() if(grown_battery) - add_overlay(image('icons/obj/power.dmi', "grown_wires")) + add_overlay("grown_wires") if(charge < 0.01) return else if(charge/maxcharge >=0.995) - add_overlay(image('icons/obj/power.dmi', "cell-o2")) + add_overlay("cell-o2") else - add_overlay(image('icons/obj/power.dmi', "cell-o1")) + add_overlay("cell-o1") /obj/item/weapon/stock_parts/cell/proc/percent() // return % charge of cell return 100*charge/maxcharge @@ -69,7 +69,7 @@ return 0 charge = (charge - amount) if(!istype(loc, /obj/machinery/power/apc)) - feedback_add_details("cell_used","[src.type]") + SSblackbox.add_details("cell_used","[src.type]") return 1 // recharge the cell diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index 3dfba8e952c..f3bbc205663 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -28,7 +28,7 @@ /obj/machinery/power/generator/Initialize(mapload) - ..() + . = ..() var/obj/machinery/atmospherics/components/binary/circulator/circpath = /obj/machinery/atmospherics/components/binary/circulator cold_circ = locate(circpath) in get_step(src, cold_dir) hot_circ = locate(circpath) in get_step(src, hot_dir) @@ -64,9 +64,9 @@ cut_overlays() if(lastgenlev != 0) - add_overlay(image('icons/obj/power.dmi', "teg-op[lastgenlev]")) + add_overlay("teg-op[lastgenlev]") - add_overlay(image('icons/obj/power.dmi', "teg-oc[lastcirc]")) + add_overlay("teg-oc[lastcirc]") #define GENRATE 800 // generator output coefficient from Q diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index c23597f95f8..17682376c56 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -98,7 +98,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne // /obj/machinery/gravity_generator/main/station/Initialize() - ..() + . = ..() setup_parts() middle.add_overlay("activated") update_list() @@ -304,7 +304,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne // Sound the alert if gravity was just enabled or disabled. var/alert = 0 var/area/area = get_area(src) - if(on && SSticker && SSticker.current_state == GAME_STATE_PLAYING) // If we turned on and the game is live. + if(on && SSticker.IsRoundInProgress()) // If we turned on and the game is live. if(gravity_in_level() == 0) alert = 1 investigate_log("was brought online and is now producing gravity for this level.", "gravity") diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 30ec0f41707..f24c7fdd5fb 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -60,7 +60,7 @@ var/current_heat = 0 /obj/machinery/power/port_gen/pacman/Initialize() - ..() + . = ..() if(anchored) connect_to_network() diff --git a/code/modules/power/rtg.dm b/code/modules/power/rtg.dm index 2f006d1965a..53bcc0869b5 100644 --- a/code/modules/power/rtg.dm +++ b/code/modules/power/rtg.dm @@ -34,7 +34,7 @@ /obj/item/stack/sheet/mineral/uranium = 10) // We have no Pu-238, and this is the closest thing to it. /obj/machinery/power/rtg/Initialize() - ..() + . = ..() connect_to_network() /obj/machinery/power/rtg/process() diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 7e04df570f2..9fc4f668c9c 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -141,11 +141,11 @@ GLOBAL_LIST_EMPTY(rad_collectors) /obj/machinery/power/rad_collector/proc/update_icons() cut_overlays() if(loaded_tank) - add_overlay(image('icons/obj/singularity.dmi', "ptank")) + add_overlay("ptank") if(stat & (NOPOWER|BROKEN)) return if(active) - add_overlay(image('icons/obj/singularity.dmi', "on")) + add_overlay("on") /obj/machinery/power/rad_collector/proc/toggle_power() diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index e007949b088..9d10624093a 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -88,7 +88,7 @@ rotate() /obj/machinery/power/emitter/Initialize() - ..() + . = ..() if(state == 2 && anchored) connect_to_network() @@ -96,7 +96,7 @@ sparks.set_up(5, TRUE, src) /obj/machinery/power/emitter/Destroy() - if(SSticker && SSticker.current_state == GAME_STATE_PLAYING) + if(SSticker && SSticker.IsRoundInProgress()) message_admins("Emitter deleted at ([x],[y],[z] - JMP)",0,1) log_game("Emitter deleted at ([x],[y],[z])") investigate_log("deleted at ([x],[y],[z]) at [get_area(src)]","singulo") diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm index bc3d6f86691..9e6f2fdb967 100644 --- a/code/modules/power/singularity/generator.dm +++ b/code/modules/power/singularity/generator.dm @@ -32,7 +32,7 @@ if(energy > 0) if(energy >= 200) var/turf/T = get_turf(src) - feedback_add_details("engine_started","[src.type]") + SSblackbox.add_details("engine_started","[src.type]") var/obj/singularity/S = new creation_type(T, 50) transfer_fingerprints_to(S) qdel(src) diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index dc54a3db4e7..9deebdfe10a 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -33,13 +33,13 @@ var/area/A = get_area(src) if(A) - var/image/alert_overlay = image('icons/effects/effects.dmi', "ghostalertsie") + var/mutable_appearance/alert_overlay = mutable_appearance('icons/effects/effects.dmi', "ghostalertsie") notify_ghosts("Nar-Sie has risen in \the [A.name]. Reach out to the Geometer to be given a new shell for your soul.", source = src, alert_overlay = alert_overlay, action=NOTIFY_ATTACK) narsie_spawn_animation() sleep(70) - SSshuttle.emergency.request(null, 0.1) // Cannot recall + SSshuttle.emergency.request(null, set_coefficient = 0.1) // Cannot recall /obj/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index e03eaf944ac..1e1737661e4 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -38,9 +38,6 @@ var/obj/machinery/power/terminal/terminal = null - var/static/list/smesImageCache - - /obj/machinery/power/smes/examine(user) ..() if(!terminal) @@ -194,7 +191,7 @@ cell.charge = (charge / capacity) * cell.maxcharge /obj/machinery/power/smes/Destroy() - if(SSticker && SSticker.current_state == GAME_STATE_PLAYING) + if(SSticker && SSticker.IsRoundInProgress()) var/area/area = get_area(src) message_admins("SMES deleted at ([area.name])") log_game("SMES deleted at ([area.name])") @@ -226,36 +223,20 @@ if(panel_open) return - if(!smesImageCache || !smesImageCache.len) - smesImageCache = list() - smesImageCache.len = 9 - - smesImageCache[SMES_CLEVEL_1] = image('icons/obj/power.dmi',"smes-og1") - smesImageCache[SMES_CLEVEL_2] = image('icons/obj/power.dmi',"smes-og2") - smesImageCache[SMES_CLEVEL_3] = image('icons/obj/power.dmi',"smes-og3") - smesImageCache[SMES_CLEVEL_4] = image('icons/obj/power.dmi',"smes-og4") - smesImageCache[SMES_CLEVEL_5] = image('icons/obj/power.dmi',"smes-og5") - - smesImageCache[SMES_OUTPUTTING] = image('icons/obj/power.dmi', "smes-op1") - smesImageCache[SMES_NOT_OUTPUTTING] = image('icons/obj/power.dmi',"smes-op0") - smesImageCache[SMES_INPUTTING] = image('icons/obj/power.dmi', "smes-oc1") - smesImageCache[SMES_INPUT_ATTEMPT] = image('icons/obj/power.dmi', "smes-oc0") - if(outputting) - add_overlay(smesImageCache[SMES_OUTPUTTING]) + add_overlay("smes-op1") else - add_overlay(smesImageCache[SMES_NOT_OUTPUTTING]) + add_overlay("smes-op0") if(inputting) - add_overlay(smesImageCache[SMES_INPUTTING]) + add_overlay("smes-oc1") else if(input_attempt) - add_overlay(smesImageCache[SMES_INPUT_ATTEMPT]) + add_overlay("smes-oc0") var/clevel = chargedisplay() if(clevel>0) - add_overlay(smesImageCache[clevel]) - return + add_overlay("smes-og[clevel]") /obj/machinery/power/smes/proc/chargedisplay() diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index e5097d422a0..47e04339d49 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -103,9 +103,9 @@ ..() cut_overlays() if(stat & BROKEN) - add_overlay(image('icons/obj/power.dmi', icon_state = "solar_panel-b", layer = FLY_LAYER)) + add_overlay(mutable_appearance(icon, "solar_panel-b", FLY_LAYER)) else - add_overlay(image('icons/obj/power.dmi', icon_state = "solar_panel", layer = FLY_LAYER)) + add_overlay(mutable_appearance(icon, "solar_panel", FLY_LAYER)) src.setDir(angle2dir(adir)) //calculates the fraction of the sunlight that the panel recieves @@ -282,7 +282,7 @@ var/list/connected_panels = list() /obj/machinery/power/solar_control/Initialize() - ..() + . = ..() if(powernet) set_panels(currentdir) connect_to_network() @@ -345,7 +345,8 @@ else add_overlay(icon_screen) if(currentdir > -1) - add_overlay(image('icons/obj/computer.dmi', "solcon-o", FLY_LAYER, angle2dir(currentdir))) + setDir(angle2dir(currentdir)) + add_overlay(mutable_appearance(icon, "solcon-o", FLY_LAYER)) /obj/machinery/power/solar_control/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 8f0e4d0f330..120dd0b46c6 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -86,7 +86,7 @@ /obj/item/weapon/stock_parts/manipulator = 6) /obj/machinery/power/compressor/Initialize() - ..() + . = ..() locate_machinery() if(!turbine) stat |= BROKEN @@ -170,13 +170,13 @@ if(rpm>50000) - add_overlay(image('icons/obj/atmospherics/pipes/simple.dmi', "comp-o4", FLY_LAYER)) + add_overlay(mutable_appearance(icon, "comp-o4", FLY_LAYER)) else if(rpm>10000) - add_overlay(image('icons/obj/atmospherics/pipes/simple.dmi', "comp-o3", FLY_LAYER)) + add_overlay(mutable_appearance(icon, "comp-o3", FLY_LAYER)) else if(rpm>2000) - add_overlay(image('icons/obj/atmospherics/pipes/simple.dmi', "comp-o2", FLY_LAYER)) + add_overlay(mutable_appearance(icon, "comp-o2", FLY_LAYER)) else if(rpm>500) - add_overlay(image('icons/obj/atmospherics/pipes/simple.dmi', "comp-o1", FLY_LAYER)) + add_overlay(mutable_appearance(icon, "comp-o1", FLY_LAYER)) //TODO: DEFERRED // These are crucial to working of a turbine - the stats modify the power output. TurbGenQ modifies how much raw energy can you get from @@ -202,7 +202,7 @@ /obj/item/weapon/stock_parts/capacitor = 6) /obj/machinery/power/turbine/Initialize() - ..() + . = ..() locate_machinery() if(!compressor) stat |= BROKEN @@ -255,7 +255,7 @@ // If it works, put an overlay that it works! if(lastgen > 100) - add_overlay(image('icons/obj/atmospherics/pipes/simple.dmi', "turb-o", FLY_LAYER)) + add_overlay(mutable_appearance(icon, "turb-o", FLY_LAYER)) updateDialog() @@ -338,7 +338,7 @@ /obj/machinery/computer/turbine_computer/Initialize() - ..() + . = ..() locate_machinery() /obj/machinery/computer/turbine_computer/locate_machinery() diff --git a/code/modules/procedural_mapping/mapGenerator.dm b/code/modules/procedural_mapping/mapGenerator.dm index 0de4a45dcb1..5653e804224 100644 --- a/code/modules/procedural_mapping/mapGenerator.dm +++ b/code/modules/procedural_mapping/mapGenerator.dm @@ -107,8 +107,7 @@ if(!modules || !modules.len) return for(var/datum/mapGeneratorModule/mod in modules) - spawn(0) - mod.generate() + INVOKE_ASYNC(mod, /datum/mapGeneratorModule.proc/generate) //Requests the mapGeneratorModule(s) to (re)generate this one turf @@ -119,8 +118,7 @@ if(!modules || !modules.len) return for(var/datum/mapGeneratorModule/mod in modules) - spawn(0) - mod.place(T) + INVOKE_ASYNC(mod, /datum/mapGeneratorModule.proc/place, T) //Replaces all paths in the module list with actual module datums diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index 57196e6c80b..65b9ef926f3 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -135,27 +135,27 @@ /// SAW ROUNDS -/obj/item/ammo_casing/mm556x45 - desc = "A 556x45mm bullet casing." +/obj/item/ammo_casing/mm195x129 + desc = "A 1.95x129mm bullet casing." icon_state = "762-casing" - caliber = "mm55645" + caliber = "mm195129" projectile_type = /obj/item/projectile/bullet/saw -/obj/item/ammo_casing/mm556x45/bleeding - desc = "A 556x45mm bullet casing with specialized inner-casing, that when it makes contact with a target, release tiny shrapnel to induce internal bleeding." +/obj/item/ammo_casing/mm195x129/bleeding + desc = "A 1.95x129mm bullet casing with specialized inner-casing, that when it makes contact with a target, release tiny shrapnel to induce internal bleeding." icon_state = "762-casing" projectile_type = /obj/item/projectile/bullet/saw/bleeding -/obj/item/ammo_casing/mm556x45/hollow - desc = "A 556x45mm bullet casing designed to cause more damage to unarmored targets." +/obj/item/ammo_casing/mm195x129/hollow + desc = "A 1.95x129mm bullet casing designed to cause more damage to unarmored targets." projectile_type = /obj/item/projectile/bullet/saw/hollow -/obj/item/ammo_casing/mm556x45/ap - desc = "A 556x45mm bullet casing designed with a hardened-tipped core to help penetrate armored targets." +/obj/item/ammo_casing/mm195x129/ap + desc = "A 1.95x129mm bullet casing designed with a hardened-tipped core to help penetrate armored targets." projectile_type = /obj/item/projectile/bullet/saw/ap -/obj/item/ammo_casing/mm556x45/incen - desc = "A 556x45mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames. " +/obj/item/ammo_casing/mm195x129/incen + desc = "A 1.95x129mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames. " projectile_type = /obj/item/projectile/bullet/saw/incen diff --git a/code/modules/projectiles/boxes_magazines/external_mag.dm b/code/modules/projectiles/boxes_magazines/external_mag.dm index d4c6204233f..11112ec974e 100644 --- a/code/modules/projectiles/boxes_magazines/external_mag.dm +++ b/code/modules/projectiles/boxes_magazines/external_mag.dm @@ -234,35 +234,35 @@ //// SAW MAGAZINES -/obj/item/ammo_box/magazine/mm556x45 - name = "box magazine (5.56x45mm)" +/obj/item/ammo_box/magazine/mm195x129 + name = "box magazine (1.95x129mm)" icon_state = "a762-50" origin_tech = "combat=2" - ammo_type = /obj/item/ammo_casing/mm556x45 - caliber = "mm55645" + ammo_type = /obj/item/ammo_casing/mm195x129 + caliber = "mm195129" max_ammo = 50 -/obj/item/ammo_box/magazine/mm556x45/bleeding - name = "box magazine (Bleeding 5.56x45mm)" +/obj/item/ammo_box/magazine/mm195x129/bleeding + name = "box magazine (Bleeding 1.95x129mm)" origin_tech = "combat=3" - ammo_type = /obj/item/ammo_casing/mm556x45/bleeding + ammo_type = /obj/item/ammo_casing/mm195x129/bleeding -/obj/item/ammo_box/magazine/mm556x45/hollow - name = "box magazine (Hollow-Point 5.56x45mm)" +/obj/item/ammo_box/magazine/mm195x129/hollow + name = "box magazine (Hollow-Point 1.95x129mm)" origin_tech = "combat=3" - ammo_type = /obj/item/ammo_casing/mm556x45/hollow + ammo_type = /obj/item/ammo_casing/mm195x129/hollow -/obj/item/ammo_box/magazine/mm556x45/ap - name = "box magazine (Armor Penetrating 5.56x45mm)" +/obj/item/ammo_box/magazine/mm195x129/ap + name = "box magazine (Armor Penetrating 1.95x129mm)" origin_tech = "combat=4" - ammo_type = /obj/item/ammo_casing/mm556x45/ap + ammo_type = /obj/item/ammo_casing/mm195x129/ap -/obj/item/ammo_box/magazine/mm556x45/incen - name = "box magazine (Incendiary 5.56x45mm)" +/obj/item/ammo_box/magazine/mm195x129/incen + name = "box magazine (Incendiary 1.95x129mm)" origin_tech = "combat=4" - ammo_type = /obj/item/ammo_casing/mm556x45/incen + ammo_type = /obj/item/ammo_casing/mm195x129/incen -/obj/item/ammo_box/magazine/mm556x45/update_icon() +/obj/item/ammo_box/magazine/mm195x129/update_icon() ..() icon_state = "a762-[round(ammo_count(),10)]" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 8b889a70801..2dffe0a567e 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -175,8 +175,7 @@ else if(G.can_trigger_gun(user)) bonus_spread += 24 * G.weapon_weight loop_counter++ - spawn(loop_counter) - G.process_fire(target,user,1,params, null, bonus_spread) + addtimer(CALLBACK(G, /obj/item/weapon/gun.proc/process_fire, target, user, 1, params, null, bonus_spread), loop_counter) process_fire(target,user,1,params, null, bonus_spread) @@ -266,7 +265,7 @@ if(user) user.update_inv_hands() - feedback_add_details("gun_fired","[src.type]") + SSblackbox.add_details("gun_fired","[src.type]") return 1 /obj/item/weapon/gun/attack(mob/M as mob, mob/user) diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index b334b7b7759..1ffdaf0d29b 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -278,13 +278,13 @@ /obj/item/weapon/gun/ballistic/automatic/l6_saw name = "\improper L6 SAW" - desc = "A heavily modified 5.56x45mm light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation." + desc = "A heavily modified 1.95x129mm light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation." icon_state = "l6closed100" item_state = "l6closedmag" w_class = WEIGHT_CLASS_HUGE slot_flags = 0 origin_tech = "combat=6;engineering=3;syndicate=6" - mag_type = /obj/item/ammo_box/magazine/mm556x45 + mag_type = /obj/item/ammo_box/magazine/mm195x129 weapon_weight = WEAPON_HEAVY fire_sound = 'sound/weapons/Gunshot_smg.ogg' var/cover_open = 0 diff --git a/code/modules/projectiles/guns/ballistic/bow.dm b/code/modules/projectiles/guns/ballistic/bow.dm index bd00fdd7d92..89a5faa9283 100644 --- a/code/modules/projectiles/guns/ballistic/bow.dm +++ b/code/modules/projectiles/guns/ballistic/bow.dm @@ -15,7 +15,7 @@ var/slowdown_when_ready = 2 /obj/item/weapon/gun/ballistic/bow/Initialize(mapload) - ..() + . = ..() SET_SECONDARY_FLAG(src, SLOWS_WHILE_IN_HAND) /obj/item/weapon/gun/ballistic/bow/update_icon() diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 77910478423..4b2a43a3fcf 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -132,15 +132,20 @@ add_overlay("[icon_state]_empty") else if(!shaded_charge) + var/mutable_appearance/charge_overlay = mutable_appearance(icon, iconState) for(var/i = ratio, i >= 1, i--) - add_overlay(image(icon = icon, icon_state = iconState, pixel_x = ammo_x_offset * (i -1))) + charge_overlay.pixel_x = ammo_x_offset * (i - 1) + add_overlay(charge_overlay) else - add_overlay(image(icon = icon, icon_state = "[icon_state]_charge[ratio]")) + add_overlay("[icon_state]_charge[ratio]") if(gun_light && can_flashlight) var/iconF = "flight" if(gun_light.on) iconF = "flight_on" - add_overlay(image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset)) + var/mutable_appearance/flashlight_overlay = mutable_appearance(icon, iconF) + flashlight_overlay.pixel_x = flight_x_offset + flashlight_overlay.pixel_y = flight_y_offset + add_overlay(flashlight_overlay) if(itemState) itemState += "[ratio]" item_state = itemState diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 07450fc9b5a..6a5dab12bf6 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -136,7 +136,10 @@ var/iconF = "flight" if(gun_light.on) iconF = "flight_on" - add_overlay(image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset)) + var/mutable_appearance/flashlight_overlay = mutable_appearance(icon, iconF) + flashlight_overlay.pixel_x = flight_x_offset + flashlight_overlay.pixel_y = flight_y_offset + add_overlay(flashlight_overlay) //Casing /obj/item/ammo_casing/energy/kinetic diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index e6fa3e9cfdf..90c3b4a72ab 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -138,7 +138,7 @@ /obj/item/weapon/gun/energy/plasmacutter/examine(mob/user) ..() if(power_supply) - user <<"[src] is [round(power_supply.percent())]% charged." + to_chat(user, "[src] is [round(power_supply.percent())]% charged.") /obj/item/weapon/gun/energy/plasmacutter/attackby(obj/item/A, mob/user) if(istype(A, /obj/item/stack/sheet/mineral/plasma)) diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/medbeam.dm index da4346109a3..32646ee1e8f 100644 --- a/code/modules/projectiles/guns/medbeam.dm +++ b/code/modules/projectiles/guns/medbeam.dm @@ -55,7 +55,7 @@ current_beam = new(user,current_target,time=6000,beam_icon_state="medbeam",btype=/obj/effect/ebeam/medical) INVOKE_ASYNC(current_beam, /datum/beam.proc/Start) - feedback_add_details("gun_fired","[src.type]") + SSblackbox.add_details("gun_fired","[src.type]") /obj/item/weapon/gun/medbeam/process() diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index a3dd75c3749..7c845759ea0 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -42,7 +42,7 @@ range = 10 /obj/item/projectile/energy/net/Initialize() - ..() + . = ..() SpinAnimation() /obj/item/projectile/energy/net/on_hit(atom/target, blocked = 0) @@ -61,11 +61,11 @@ desc = "A field of bluespace energy, locking on to teleport a target." icon = 'icons/effects/effects.dmi' icon_state = "dragnetfield" + light_range = 3 anchored = 1 /obj/effect/nettingportal/Initialize() - ..() - set_light(3) + . = ..() var/obj/item/device/radio/beacon/teletarget = null for(var/obj/machinery/computer/teleporter/com in GLOB.machines) if(com.target) diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index b5c2a93996b..f5df46cb7b5 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -204,7 +204,8 @@ dismemberment = 20 impact_effect_type = /obj/effect/overlay/temp/impact_effect/purple_laser -/obj/item/projectile/plasma/New() +/obj/item/projectile/plasma/Initialize() + . = ..() var/turf/proj_turf = get_turf(src) if(!isturf(proj_turf)) return @@ -215,7 +216,6 @@ name = "full strength [name]" damage *= 4 range *= 2 - ..() /obj/item/projectile/plasma/on_hit(atom/target) . = ..() @@ -254,9 +254,10 @@ var/power = 4 var/list/thrown_items = list() -/obj/item/projectile/gravityrepulse/New(var/obj/item/ammo_casing/energy/gravityrepulse/C) - ..() - if(C) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items +/obj/item/projectile/gravityrepulse/Initialize() + . = ..() + var/obj/item/ammo_casing/energy/gravityrepulse/C = loc + if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items power = min(C.gun.power, 15) /obj/item/projectile/gravityrepulse/on_hit() @@ -284,9 +285,10 @@ var/power = 4 var/list/thrown_items = list() -/obj/item/projectile/gravityattract/New(var/obj/item/ammo_casing/energy/gravityattract/C) - ..() - if(C) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items +/obj/item/projectile/gravityattract/Initialize() + . = ..() + var/obj/item/ammo_casing/energy/gravityattract/C = loc + if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items power = min(C.gun.power, 15) /obj/item/projectile/gravityattract/on_hit() @@ -313,9 +315,10 @@ var/power = 4 var/list/thrown_items = list() -/obj/item/projectile/gravitychaos/New(var/obj/item/ammo_casing/energy/gravitychaos/C) - ..() - if(C) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items +/obj/item/projectile/gravitychaos/Initialize() + . = ..() + var/obj/item/ammo_casing/energy/gravitychaos/C = loc + if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items power = min(C.gun.power, 15) /obj/item/projectile/gravitychaos/on_hit() diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 0dac6c02dd6..382e6bcae1d 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -396,7 +396,7 @@ remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1) for(var/P in C.results) - feedback_add_details("chemical_reaction", "[P]|[cached_results[P]*multiplier]") + SSblackbox.add_details("chemical_reaction", "[P]|[cached_results[P]*multiplier]") multiplier = max(multiplier, 1) //this shouldnt happen ... add_reagent(P, cached_results[P]*multiplier, null, chem_temp) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index b4166d8070e..da1eb90685b 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -14,7 +14,7 @@ var/amount = 30 var/recharged = 0 var/recharge_delay = 5 - var/image/icon_beaker = null + var/mutable_appearance/beaker_overlay var/obj/item/weapon/reagent_containers/beaker = null var/list/dispensable_reagents = list( "hydrogen", @@ -52,8 +52,8 @@ "toxin" ) -/obj/machinery/chem_dispenser/New() - ..() +/obj/machinery/chem_dispenser/Initialize() + . = ..() recharge() dispensable_reagents = sortList(dispensable_reagents) @@ -184,10 +184,9 @@ beaker.loc = src to_chat(user, "You add \the [B] to the machine.") - if(!icon_beaker) - icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position. - icon_beaker.pixel_x = rand(-10,5) - add_overlay(icon_beaker) + beaker_overlay = beaker_overlay || mutable_appearance(icon, "disp_beaker") + beaker_overlay.pixel_x = rand(-10, 5)//randomize beaker overlay position. + add_overlay(beaker_overlay) else if(user.a_intent != INTENT_HARM && !istype(I, /obj/item/weapon/card/emag)) to_chat(user, "You can't load \the [I] into the machine!") else @@ -245,8 +244,8 @@ ) ) -/obj/machinery/chem_dispenser/constructable/New() - ..() +/obj/machinery/chem_dispenser/constructable/Initialize() + . = ..() var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/chem_dispenser(null) B.apply_default_parts(src) diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 2c6f7712e4d..da728fea892 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -12,8 +12,8 @@ var/heater_coefficient = 0.10 var/on = FALSE -/obj/machinery/chem_heater/New() - ..() +/obj/machinery/chem_heater/Initialize() + . = ..() var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/chem_heater(null) B.apply_default_parts(src) diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index a94a1c01fff..93628a9cc15 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -17,12 +17,12 @@ var/useramount = 30 // Last used amount layer = BELOW_OBJ_LAYER -/obj/machinery/chem_master/New() +/obj/machinery/chem_master/Initialize() create_reagents(100) add_overlay("waitlight") var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/chem_master(null) B.apply_default_parts(src) - ..() + . = ..() /obj/item/weapon/circuitboard/machine/chem_master name = "ChemMaster 3000 (Machine Board)" diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index cfc8198b382..5a73c5dcf4c 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -13,8 +13,8 @@ var/wait = null var/obj/item/weapon/reagent_containers/beaker = null -/obj/machinery/computer/pandemic/New() - ..() +/obj/machinery/computer/pandemic/Initialize() + . = ..() update_icon() /obj/machinery/computer/pandemic/proc/GetVirusByIndex(index) diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 5c8d6950071..2dbc0ff1c23 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -54,7 +54,9 @@ /obj/item/slime_extract = list(), /obj/item/weapon/reagent_containers/pill = list(), /obj/item/weapon/reagent_containers/food = list(), - /obj/item/weapon/reagent_containers/honeycomb = list() + /obj/item/weapon/reagent_containers/honeycomb = list(), + /obj/item/toy/crayon = list() + ) var/list/juice_items = list ( @@ -89,10 +91,9 @@ var/list/holdingitems = list() -/obj/machinery/reagentgrinder/New() - ..() +/obj/machinery/reagentgrinder/Initialize() + . = ..() beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src) - return /obj/machinery/reagentgrinder/Destroy() if(beaker) @@ -456,3 +457,13 @@ O.reagents.trans_to(beaker, amount) if(!O.reagents.total_volume) remove_object(O) + + for (var/obj/item/toy/crayon/O in holdingitems) + if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume) + break + for (var/r_id in O.reagent_contents) + var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume + if (space == 0) + break + beaker.reagents.add_reagent(r_id, min(O.reagent_contents[r_id], space)) + remove_object(O) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index dee5b7e68ad..aa913ba8f0a 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -867,44 +867,6 @@ . = 1 ..() -/datum/reagent/medicine/stimulants/longterm - name = "Stimulants" - id = "stimulants_longterm" - description = "Increases stun resistance and movement speed in addition to restoring minor damage and weakness. Highly addictive." - color = "#78008C" - metabolization_rate = 2 * REAGENTS_METABOLISM - overdose_threshold = 0 - addiction_threshold = 5 - -/datum/reagent/medicine/stimulants/longterm/addiction_act_stage1(mob/living/M) - M.adjustToxLoss(5*REM, 0) - M.adjustStaminaLoss(5*REM, 0) - ..() - . = 1 - -/datum/reagent/medicine/stimulants/longterm/addiction_act_stage2(mob/living/M) - M.adjustToxLoss(6*REM, 0) - M.adjustStaminaLoss(5*REM, 0) - M.Stun(2, 0) - ..() - . = 1 - -/datum/reagent/medicine/stimulants/longterm/addiction_act_stage3(mob/living/M) - M.adjustToxLoss(7*REM, 0) - M.adjustStaminaLoss(5*REM, 0) - M.adjustBrainLoss(1*REM) - M.Stun(2, 0) - ..() - . = 1 - -/datum/reagent/medicine/stimulants/longterm/addiction_act_stage4(mob/living/M) - M.adjustToxLoss(8*REM, 0) - M.adjustStaminaLoss(5*REM, 0) - M.adjustBrainLoss(2*REM) - M.Stun(2, 0) - ..() - . = 1 - /datum/reagent/medicine/insulin name = "Insulin" id = "insulin" diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index cf956227ba1..c25a1d050d4 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1128,7 +1128,7 @@ //For colouring in /proc/mix_color_from_reagents -/datum/reagent/crayonpowder +/datum/reagent/colorful_reagent/crayonpowder name = "Crayon Powder" id = "crayon powder" var/colorname = "none" @@ -1137,50 +1137,72 @@ color = "#FFFFFF" // rgb: 207, 54, 0 taste_description = "the back of class" -/datum/reagent/crayonpowder/New() +/datum/reagent/colorful_reagent/crayonpowder/New() description = "\an [colorname] powder made by grinding down crayons, good for colouring chemical reagents." -/datum/reagent/crayonpowder/red +/datum/reagent/colorful_reagent/crayonpowder/red name = "Red Crayon Powder" id = "redcrayonpowder" colorname = "red" + color = "#DA0000" // red + random_color_list = list("#DA0000") -/datum/reagent/crayonpowder/orange +/datum/reagent/colorful_reagent/crayonpowder/orange name = "Orange Crayon Powder" id = "orangecrayonpowder" colorname = "orange" color = "#FF9300" // orange + random_color_list = list("#FF9300") -/datum/reagent/crayonpowder/yellow +/datum/reagent/colorful_reagent/crayonpowder/yellow name = "Yellow Crayon Powder" id = "yellowcrayonpowder" colorname = "yellow" color = "#FFF200" // yellow + random_color_list = list("#FFF200") -/datum/reagent/crayonpowder/green +/datum/reagent/colorful_reagent/crayonpowder/green name = "Green Crayon Powder" id = "greencrayonpowder" colorname = "green" color = "#A8E61D" // green + random_color_list = list("#A8E61D") -/datum/reagent/crayonpowder/blue +/datum/reagent/colorful_reagent/crayonpowder/blue name = "Blue Crayon Powder" id = "bluecrayonpowder" colorname = "blue" color = "#00B7EF" // blue + random_color_list = list("#00B7EF") -/datum/reagent/crayonpowder/purple +/datum/reagent/colorful_reagent/crayonpowder/purple name = "Purple Crayon Powder" id = "purplecrayonpowder" colorname = "purple" color = "#DA00FF" // purple + random_color_list = list("#DA00FF") -/datum/reagent/crayonpowder/invisible +/datum/reagent/colorful_reagent/crayonpowder/invisible name = "Invisible Crayon Powder" id = "invisiblecrayonpowder" colorname = "invisible" color = "#FFFFFF00" // white + no alpha + random_color_list = list(null) //because using the powder color turns things invisible + +/datum/reagent/colorful_reagent/crayonpowder/black + name = "Black Crayon Powder" + id = "blackcrayonpowder" + colorname = "black" + color = "#1C1C1C" // not quite black + random_color_list = list("#404040") + +/datum/reagent/colorful_reagent/crayonpowder/white + name = "White Crayon Powder" + id = "whitecrayonpowder" + colorname = "white" + color = "#FFFFFF" // white + random_color_list = list("#FFFFFF") //doesn't actually change appearance at all diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index cb06dc29eec..5eb034d6043 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -15,7 +15,7 @@ else Wall.thermite = Wall.thermite+(reac_volume*10) Wall.overlays = list() - Wall.add_overlay(image('icons/effects/effects.dmi',"thermite")) + Wall.add_overlay(mutable_appearance('icons/effects/effects.dmi', "thermite")) /datum/reagent/thermite/on_mob_life(mob/living/M) M.adjustFireLoss(1, 0) diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 52205b24973..a1c4a74795f 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -3,7 +3,7 @@ var/deletes_extract = TRUE /datum/chemical_reaction/slime/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") + SSblackbox.add_details("slime_cores_used","[type]") if(deletes_extract) delete_extract(holder) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 2f8a1799466..ac3152ddfd1 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -12,9 +12,9 @@ var/disease_amount = 20 var/spillable = 0 -/obj/item/weapon/reagent_containers/New(location, vol = 0) - ..() - if (isnum(vol) && vol > 0) +/obj/item/weapon/reagent_containers/Initialize(mapload, vol) + . = ..() + if(isnum(vol) && vol > 0) volume = vol create_reagents(volume) if(spawned_disease) diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index 1ed89a74db8..2571e3573df 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -7,8 +7,8 @@ var/blood_type = null var/labelled = 0 -/obj/item/weapon/reagent_containers/blood/New() - ..() +/obj/item/weapon/reagent_containers/blood/Initialize() + . = ..() if(blood_type != null) reagents.add_reagent("blood", 200, list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=blood_type,"resistances"=null,"trace_chem"=null)) update_icon() @@ -25,13 +25,10 @@ /obj/item/weapon/reagent_containers/blood/proc/update_pack_name() if(!labelled) - if(volume) - if(blood_type) - name = "blood pack [blood_type]" - else - name = "blood pack" + if(blood_type) + name = "blood pack - [blood_type]" else - name = "empty blood pack" + name = "blood pack" /obj/item/weapon/reagent_containers/blood/update_icon() var/percent = round((reagents.total_volume / volume) * 100) @@ -43,9 +40,9 @@ if(51 to INFINITY) icon_state = "full" -/obj/item/weapon/reagent_containers/blood/random/New() +/obj/item/weapon/reagent_containers/blood/random/Initialize() blood_type = pick("A+", "A-", "B+", "B-", "O+", "O-", "L") - ..() + . = ..() /obj/item/weapon/reagent_containers/blood/APlus blood_type = "A+" @@ -69,7 +66,7 @@ blood_type = "L" /obj/item/weapon/reagent_containers/blood/empty - name = "empty blood pack" + name = "blood pack" icon_state = "empty" /obj/item/weapon/reagent_containers/blood/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 46e41ecfeb8..8cbbfc8fb98 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -30,8 +30,8 @@ Borg Hypospray //Used as list for input() in shakers. -/obj/item/weapon/reagent_containers/borghypo/New() - ..() +/obj/item/weapon/reagent_containers/borghypo/Initialize() + . = ..() for(var/R in reagent_ids) add_reagent(R) diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 01f39db4d35..a92c52abf47 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -9,8 +9,8 @@ volume = 30 -/obj/item/weapon/reagent_containers/glass/bottle/New() - ..() +/obj/item/weapon/reagent_containers/glass/bottle/Initialize() + . = ..() if(!icon_state) icon_state = "bottle" update_icon() @@ -21,7 +21,7 @@ /obj/item/weapon/reagent_containers/glass/bottle/update_icon() cut_overlays() if(reagents.total_volume) - var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]-10") + var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "[icon_state]-10") var/percent = round((reagents.total_volume / volume) * 100) switch(percent) @@ -139,8 +139,8 @@ icon_state = "bottle16" var/extra_reagent = null -/obj/item/weapon/reagent_containers/glass/bottle/traitor/New() - ..() +/obj/item/weapon/reagent_containers/glass/bottle/traitor/Initialize() + . = ..() extra_reagent = pick("polonium", "histamine", "formaldehyde", "venom", "neurotoxin2", "cyanide") reagents.add_reagent("[extra_reagent]", 3) diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 7b4faf0f7a0..9f0094bfc32 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -91,6 +91,6 @@ /obj/item/weapon/reagent_containers/dropper/update_icon() cut_overlays() if(reagents.total_volume) - var/image/filling = image('icons/obj/reagentfillings.dmi', src, "dropper") + var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "dropper") filling.color = mix_color_from_reagents(reagents.reagent_list) add_overlay(filling) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 9a4ccada9b2..a697ccbe5b8 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -122,8 +122,8 @@ item_state = "beaker" materials = list(MAT_GLASS=500) -/obj/item/weapon/reagent_containers/glass/beaker/New() - ..() +/obj/item/weapon/reagent_containers/glass/beaker/Initialize() + . = ..() update_icon() /obj/item/weapon/reagent_containers/glass/beaker/on_reagent_change() @@ -133,7 +133,7 @@ cut_overlays() if(reagents.total_volume) - var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]10") + var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "[icon_state]10") var/percent = round((reagents.total_volume / volume) * 100) switch(percent) @@ -176,8 +176,8 @@ origin_tech = "materials=2;engineering=3;plasmatech=3" flags = OPENCONTAINER -/obj/item/weapon/reagent_containers/glass/beaker/noreact/New() - ..() +/obj/item/weapon/reagent_containers/glass/beaker/noreact/Initialize() + . = ..() reagents.set_reacting(FALSE) /obj/item/weapon/reagent_containers/glass/beaker/bluespace diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index d8cebf9d0d3..f7399fc4b74 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -11,8 +11,8 @@ var/roundstart = 0 var/self_delay = 0 //pills are instant, this is because patches inheret their aplication from pills -/obj/item/weapon/reagent_containers/pill/New() - ..() +/obj/item/weapon/reagent_containers/pill/Initialize() + . = ..() if(!icon_state) icon_state = "pill[rand(1,20)]" if(reagents.total_volume && roundstart) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 0cb848974af..e7a6b5e6cc9 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -16,8 +16,8 @@ materials = list(MAT_METAL=10, MAT_GLASS=20) container_type = TRANSPARENT -/obj/item/weapon/reagent_containers/syringe/New() - ..() +/obj/item/weapon/reagent_containers/syringe/Initialize() + . = ..() if(list_reagents) //syringe starts in inject mode if its already got something inside mode = SYRINGE_INJECT update_icon() @@ -167,10 +167,9 @@ item_state = "syringe_[rounded_vol]" if(reagents.total_volume) - var/image/filling = image('icons/obj/reagentfillings.dmi', src, "syringe10") - filling.icon_state = "syringe[rounded_vol]" - filling.color = mix_color_from_reagents(reagents.reagent_list) - add_overlay(filling) + var/image/filling_overlay = mutable_appearance('icons/obj/reagentfillings.dmi', "syringe[rounded_vol]") + filling_overlay.color = mix_color_from_reagents(reagents.reagent_list) + add_overlay(filling_overlay) /obj/item/weapon/reagent_containers/syringe/epinephrine name = "syringe (epinephrine)" @@ -243,7 +242,7 @@ volume = 20 origin_tech = "materials=3;engineering=3" -/obj/item/weapon/reagent_containers/syringe/noreact/New() +/obj/item/weapon/reagent_containers/syringe/noreact/Initialize() . = ..() reagents.set_reacting(FALSE) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index a30e7b0b761..5ad154e12b9 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -23,10 +23,10 @@ else return ..() -/obj/structure/reagent_dispensers/New() +/obj/structure/reagent_dispensers/Initialize() create_reagents(tank_volume) reagents.add_reagent(reagent_id, tank_volume) - ..() + . = ..() /obj/structure/reagent_dispensers/examine(mob/user) ..() @@ -129,8 +129,8 @@ density = 0 reagent_id = "condensedcapsaicin" -/obj/structure/reagent_dispensers/peppertank/New() - ..() +/obj/structure/reagent_dispensers/peppertank/Initialize() + . = ..() if(prob(1)) desc = "IT'S PEPPER TIME, BITCH!" diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 0e00b1fb7b2..951b4c09e9a 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -24,8 +24,8 @@ // Auto conveyour is always on unless unpowered -/obj/machinery/conveyor/auto/New(loc, newdir) - ..(loc, newdir) +/obj/machinery/conveyor/auto/Initialize(mapload, newdir) + . = ..() operating = 1 update_move_direction() @@ -43,8 +43,8 @@ icon_state = "conveyor[operating * verted]" // create a conveyor -/obj/machinery/conveyor/New(loc, newdir) - ..(loc) +/obj/machinery/conveyor/Initialize(mapload, newdir) + . = ..() if(newdir) setDir(newdir) update_move_direction() @@ -212,13 +212,14 @@ /obj/machinery/conveyor_switch/Initialize(mapload, newid) - if(mapload) - return TRUE //need machines list ..() if(!id) id = newid update() + return INITIALIZE_HINT_LATELOAD //for machines list + +/obj/machinery/conveyor_switch/LateInitialize() conveyors = list() for(var/obj/machinery/conveyor/C in GLOB.machines) if(C.id == id) @@ -326,8 +327,8 @@ w_class = WEIGHT_CLASS_BULKY var/id = "" //inherited by the switch -/obj/item/conveyor_switch_construct/New() - ..() +/obj/item/conveyor_switch_construct/Initialize() + . = ..() id = rand() //this couldn't possibly go wrong /obj/item/conveyor_switch_construct/afterattack(atom/A, mob/user, proximity) diff --git a/code/modules/recycling/disposal-structures.dm b/code/modules/recycling/disposal-structures.dm index 531af922389..6ea1d958b3c 100644 --- a/code/modules/recycling/disposal-structures.dm +++ b/code/modules/recycling/disposal-structures.dm @@ -147,8 +147,8 @@ var/obj/structure/disposalconstruct/stored // new pipe, set the icon_state as on map -/obj/structure/disposalpipe/New(loc,var/obj/structure/disposalconstruct/make_from) - ..() +/obj/structure/disposalpipe/Initialize(mapload, obj/structure/disposalconstruct/make_from) + . = ..() if(make_from && !QDELETED(make_from)) base_icon_state = make_from.base_state @@ -176,7 +176,6 @@ stored.ptype = DISP_SORTJUNCTION if("pipe-j2s") stored.ptype = DISP_SORTJUNCTION_FLIP - return // pipe is deleted @@ -359,15 +358,14 @@ /obj/structure/disposalpipe/segment icon_state = "pipe-s" -/obj/structure/disposalpipe/segment/New() - ..() +/obj/structure/disposalpipe/segment/Initialize() + . = ..() if(stored.ptype == DISP_PIPE_STRAIGHT) dpdir = dir | turn(dir, 180) else dpdir = dir | turn(dir, -90) update() - return @@ -376,8 +374,8 @@ /obj/structure/disposalpipe/junction icon_state = "pipe-j1" -/obj/structure/disposalpipe/junction/New() - ..() +/obj/structure/disposalpipe/junction/Initialize() + . = ..() switch(stored.ptype) if(DISP_JUNCTION) dpdir = dir | turn(dir, -90) | turn(dir,180) @@ -386,7 +384,6 @@ if(DISP_YJUNCTION) dpdir = dir | turn(dir,90) | turn(dir, -90) update() - return // next direction to move @@ -452,8 +449,8 @@ dpdir = sortdir | posdir | negdir -/obj/structure/disposalpipe/sortjunction/New() - ..() +/obj/structure/disposalpipe/sortjunction/Initialize() + . = ..() // Generate a list of soring tags. if(sortType) @@ -468,7 +465,6 @@ updatedir() update() - return /obj/structure/disposalpipe/sortjunction/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/device/destTagger)) @@ -516,8 +512,8 @@ var/negdir = 0 var/sortdir = 0 -/obj/structure/disposalpipe/wrapsortjunction/New() - ..() +/obj/structure/disposalpipe/wrapsortjunction/Initialize() + . = ..() posdir = dir if(stored.ptype == DISP_SORTJUNCTION) sortdir = turn(posdir, -90) @@ -529,7 +525,6 @@ dpdir = sortdir | posdir | negdir update() - return // next direction to move // if coming in from negdir, then next is primary dir or sortdir @@ -557,14 +552,13 @@ icon_state = "pipe-t" var/obj/linked // the linked obj/machinery/disposal or obj/disposaloutlet -/obj/structure/disposalpipe/trunk/New() - ..() +/obj/structure/disposalpipe/trunk/Initialize() + . = ..() dpdir = dir spawn(1) getlinked() update() - return /obj/structure/disposalpipe/trunk/Destroy() if(linked) @@ -631,8 +625,8 @@ // i.e. will be treated as an empty turf desc = "A broken piece of disposal pipe." -/obj/structure/disposalpipe/broken/New() - ..() +/obj/structure/disposalpipe/broken/Initialize() + . = ..() update() // the disposal outlet machine @@ -655,9 +649,8 @@ var/start_eject = 0 var/eject_range = 2 -/obj/structure/disposaloutlet/New(loc, var/obj/structure/disposalconstruct/make_from) - ..() - +/obj/structure/disposaloutlet/Initialize(mapload, obj/structure/disposalconstruct/make_from) + . = ..() if(make_from) setDir(make_from.dir) make_from.loc = src diff --git a/code/modules/recycling/disposal-unit.dm b/code/modules/recycling/disposal-unit.dm index 7cc890c1f64..626a3f2549f 100644 --- a/code/modules/recycling/disposal-unit.dm +++ b/code/modules/recycling/disposal-unit.dm @@ -26,9 +26,8 @@ // create a new disposal // find the attached trunk (if present) and init gas resvr. -/obj/machinery/disposal/New(loc, var/obj/structure/disposalconstruct/make_from) - ..() - +/obj/machinery/disposal/Initialize(mapload, obj/structure/disposalconstruct/make_from) + . = ..() if(make_from) setDir(make_from.dir) make_from.loc = 0 @@ -64,17 +63,17 @@ deconstruct() /obj/machinery/disposal/Initialize(mapload) - . = mapload //late-initialize, we need turfs to have air - if(initialized) //will only be run on late mapload initialization - //this will get a copy of the air turf and take a SEND PRESSURE amount of air from it - var/atom/L = loc - var/datum/gas_mixture/env = new - env.copy_from(L.return_air()) - var/datum/gas_mixture/removed = env.remove(SEND_PRESSURE + 1) - air_contents.merge(removed) - trunk_check() - else - ..() + ..() + return INITIALIZE_HINT_LATELOAD //we need turfs to have air + +/obj/machinery/disposal/LateInitialize() + //this will get a copy of the air turf and take a SEND PRESSURE amount of air from it + var/atom/L = loc + var/datum/gas_mixture/env = new + env.copy_from(L.return_air()) + var/datum/gas_mixture/removed = env.remove(SEND_PRESSURE + 1) + air_contents.merge(removed) + trunk_check() /obj/machinery/disposal/attackby(obj/item/I, mob/user, params) add_fingerprint(user) @@ -364,7 +363,7 @@ //flush handle if(flush) - add_overlay(image('icons/obj/atmospherics/pipes/disposal.dmi', "dispover-handle")) + add_overlay("dispover-handle") //only handle is shown if no power if(stat & NOPOWER || panel_open) @@ -372,13 +371,13 @@ //check for items in disposal - occupied light if(contents.len > 0) - add_overlay(image('icons/obj/atmospherics/pipes/disposal.dmi', "dispover-full")) + add_overlay("dispover-full") //charging and ready light if(pressure_charging) - add_overlay(image('icons/obj/atmospherics/pipes/disposal.dmi', "dispover-charge")) + add_overlay("dispover-charge") else if(full_pressure) - add_overlay(image('icons/obj/atmospherics/pipes/disposal.dmi', "dispover-ready")) + add_overlay("dispover-ready") //timed process //charge the gas reservoir and perform flush if ready @@ -391,7 +390,7 @@ if(contents.len) if(full_pressure) spawn(0) - feedback_inc("disposal_auto_flush",1) + SSblackbox.inc("disposal_auto_flush",1) flush() flush_count = 0 @@ -445,8 +444,8 @@ icon_state = "intake" pressure_charging = FALSE // the chute doesn't need charging and always works -/obj/machinery/disposal/deliveryChute/New(loc,var/obj/structure/disposalconstruct/make_from) - ..() +/obj/machinery/disposal/deliveryChute/Initialize(mapload, obj/structure/disposalconstruct/make_from) + . = ..() stored.ptype = DISP_END_CHUTE spawn(5) trunk = locate() in loc diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index 1c28dc73b2e..3cb462c9c83 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -27,8 +27,8 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). "Computer Parts" ) -/obj/machinery/r_n_d/circuit_imprinter/New() - ..() +/obj/machinery/r_n_d/circuit_imprinter/Initialize() + . = ..() materials = new(src, list(MAT_GLASS, MAT_GOLD, MAT_DIAMOND, MAT_METAL, MAT_BLUESPACE)) create_reagents(0) var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/circuit_imprinter(null) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index e23c71e5fca..41ba8197a17 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -54,10 +54,10 @@ other types of metals and chemistry for reagents). var/list/blueprints = list() var/max_blueprints = 1 -/obj/item/weapon/disk/design_disk/New() - ..() - src.pixel_x = rand(-5, 5) - src.pixel_y = rand(-5, 5) +/obj/item/weapon/disk/design_disk/Initialize() + . = ..() + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) for(var/i in 1 to max_blueprints) blueprints += null diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index 6afeb6cb0d4..4f950f178f0 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -13,8 +13,8 @@ Note: Must be placed within 3 tiles of the R&D Console icon_state = "d_analyzer" var/decon_mod = 0 -/obj/machinery/r_n_d/destructive_analyzer/New() - ..() +/obj/machinery/r_n_d/destructive_analyzer/Initialize() + . = ..() var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/destructive_analyzer(null) B.apply_default_parts(src) diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index c12a6d553fd..47d6b52b44c 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -79,8 +79,8 @@ critical_items += I -/obj/machinery/r_n_d/experimentor/New() - ..() +/obj/machinery/r_n_d/experimentor/Initialize() + . = ..() var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/experimentor(null) B.apply_default_parts(src) @@ -589,8 +589,8 @@ var/cooldownMax = 60 var/cooldown -/obj/item/weapon/relic/New() - ..() +/obj/item/weapon/relic/Initialize() + . = ..() icon_state = pick("shock_kit","armor-igniter-analyzer","infra-igniter0","infra-igniter1","radio-multitool","prox-radio1","radio-radio","timer-multitool0","radio-igniter-tank") realName = "[pick("broken","twisted","spun","improved","silly","regular","badly made")] [pick("device","object","toy","illegal tech","weapon")]" diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index ec99299f06d..5c28bc752a8 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -4,7 +4,7 @@ GLOBAL_LIST_INIT(message_servers, list()) var/recipient = "Unspecified" //name of the person var/sender = "Unspecified" //name of the sender var/message = "Blank" //transferred message - var/image/photo = null //Attached photo + var/icon/photo //Attached photo /datum/data_pda_msg/New(var/param_rec = "",var/param_sender = "",var/param_message = "",var/param_photo=null) @@ -78,12 +78,11 @@ GLOBAL_LIST_INIT(message_servers, list()) var/active = 1 var/decryptkey = "password" -/obj/machinery/message_server/New() +/obj/machinery/message_server/Initialize() GLOB.message_servers += src decryptkey = GenerateKey() send_pda_message("System Administrator", "system", "This is an automated message. The messaging system is functioning correctly.") - ..() - return + . = ..() /obj/machinery/message_server/Destroy() GLOB.message_servers -= src diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index 05889bf097f..0abe4e952c1 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -31,8 +31,8 @@ Note: Must be placed west/left of and R&D console to function. ) -/obj/machinery/r_n_d/protolathe/New() - ..() +/obj/machinery/r_n_d/protolathe/Initialize() + . = ..() create_reagents(0) materials = new(src, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE)) var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/protolathe(null) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index f2bdd738c46..be96f758927 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -100,8 +100,8 @@ won't update every console in existence) but it's more of a hassle to do. Also, C.files.RefreshResearch() -/obj/machinery/computer/rdconsole/New() - ..() +/obj/machinery/computer/rdconsole/Initialize() + . = ..() files = new /datum/research(src) //Setup the research data holder. matching_designs = list() if(!id) @@ -309,13 +309,13 @@ won't update every console in existence) but it's more of a hassle to do. Also, for(var/T in temp_tech) var/datum/tech/KT = files.known_tech[T] //For stat logging of high levels if(files.IsTechHigher(T, temp_tech[T]) && KT.level >= 5) //For stat logging of high levels - feedback_add_details("high_research_level","[KT][KT.level + 1]") //+1 to show the level which we're about to get + SSblackbox.add_details("high_research_level","[KT][KT.level + 1]") //+1 to show the level which we're about to get files.UpdateTech(T, temp_tech[T]) if(linked_lathe) //Also sends salvaged materials to a linked protolathe, if any. for(var/material in linked_destroy.loaded_item.materials) linked_lathe.materials.insert_amount(min((linked_lathe.materials.max_amount - linked_lathe.materials.total_amount), (linked_destroy.loaded_item.materials[material]*(linked_destroy.decon_mod/10))), material) - feedback_add_details("item_deconstructed","[linked_destroy.loaded_item.type]") + SSblackbox.add_details("item_deconstructed","[linked_destroy.loaded_item.type]") linked_destroy.loaded_item = null for(var/obj/I in linked_destroy.contents) for(var/mob/M in I.contents) @@ -452,7 +452,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, new_item.materials = efficient_mats.Copy() new_item.loc = linked_lathe.loc if(!already_logged) - feedback_add_details("item_printed","[new_item.type]|[amount]") + SSblackbox.add_details("item_printed","[new_item.type]|[amount]") already_logged = 1 screen = old_screen linked_lathe.busy = 0 @@ -519,7 +519,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/obj/item/new_item = new P(src) new_item.loc = linked_imprinter.loc new_item.materials = efficient_mats.Copy() - feedback_add_details("circuit_printed","[new_item.type]") + SSblackbox.add_details("circuit_printed","[new_item.type]") screen = old_screen linked_imprinter.busy = 0 else @@ -1065,10 +1065,10 @@ won't update every console in existence) but it's more of a hassle to do. Also, req_access = null req_access_txt = "29" -/obj/machinery/computer/rdconsole/robotics/New() - ..() +/obj/machinery/computer/rdconsole/robotics/Initialize() + . = ..() if(circuit) - circuit.name = "RD Console - Robotics (Computer Board)" + circuit.name = "R&D Console - Robotics (Computer Board)" circuit.build_path = /obj/machinery/computer/rdconsole/robotics /obj/machinery/computer/rdconsole/core diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index 2ff9387a719..f029b65b382 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -16,8 +16,8 @@ var/obj/machinery/computer/rdconsole/linked_console var/obj/item/loaded_item = null //the item loaded inside the machine (currently only used by experimentor and destructive analyzer) -/obj/machinery/r_n_d/New() - ..() +/obj/machinery/r_n_d/Initialize() + . = ..() wires = new /datum/wires/r_n_d(src) /obj/machinery/r_n_d/Destroy() diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index e98e3771b65..a321c03b473 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -313,10 +313,10 @@ research holder datum. var/list/tech_stored = list() var/max_tech_stored = 1 -/obj/item/weapon/disk/tech_disk/New() - ..() - src.pixel_x = rand(-5, 5) - src.pixel_y = rand(-5, 5) +/obj/item/weapon/disk/tech_disk/Initialize() + . = ..() + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) for(var/i in 1 to max_tech_stored) tech_stored += null @@ -339,8 +339,8 @@ research holder datum. materials = list() max_tech_stored = 0 -/obj/item/weapon/disk/tech_disk/debug/New() - ..() +/obj/item/weapon/disk/tech_disk/debug/Initialize() + . = ..() var/list/techs = subtypesof(/datum/tech) max_tech_stored = techs.len for(var/V in techs) diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 4b8242c1f86..468185e615c 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -14,8 +14,8 @@ var/delay = 10 req_access = list(GLOB.access_rd) //Only the R&D can change server settings. -/obj/machinery/r_n_d/server/New() - ..() +/obj/machinery/r_n_d/server/Initialize() + . = ..() var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/rdserver(null) B.apply_default_parts(src) @@ -38,7 +38,7 @@ heat_gen /= max(1, tot_rating) /obj/machinery/r_n_d/server/Initialize(mapload) - ..() + . = ..() if(!files) files = new /datum/research(src) var/list/temp_list if(!id_with_upload.len) @@ -137,7 +137,7 @@ server_id = -1 /obj/machinery/r_n_d/server/centcom/Initialize() - ..() + . = ..() fix_noid_research_servers() /proc/fix_noid_research_servers() diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index 74b5bc01213..0c32efbb64d 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -72,10 +72,10 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi w_class = WEIGHT_CLASS_SMALL var/rating = 1 -/obj/item/weapon/stock_parts/New() - ..() - src.pixel_x = rand(-5, 5) - src.pixel_y = rand(-5, 5) +/obj/item/weapon/stock_parts/Initialize() + . = ..() + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) //Rating 1 diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index c02894bc3c9..bd34ff60c0d 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -8,7 +8,7 @@ /mob/camera/aiEye/remote/xenobio/Initialize() var/area/A = get_area(loc) allowed_area = A.name - ..() + . = ..() /mob/camera/aiEye/remote/xenobio/setLoc(var/t) var/area/new_area = get_area(t) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 38d742c5be0..708a155fb3c 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -20,14 +20,14 @@ if(Uses >= 5) to_chat(user, "You cannot enhance this extract further!") return ..() - user <<"You apply the enhancer to the slime extract. It may now be reused one more time." + to_chat(user, "You apply the enhancer to the slime extract. It may now be reused one more time.") Uses++ qdel(O) ..() -/obj/item/slime_extract/New() - ..() - create_reagents(100) +/obj/item/slime_extract/Initialize() + . = ..() + create_reagents(100) /obj/item/slime_extract/grey name = "grey slime extract" @@ -146,8 +146,8 @@ M.docile = 1 M.nutrition = 700 - M <<"You absorb the potion and feel your intense desire to feed melt away." - user <<"You feed the slime the potion, removing its hunger and calming it." + to_chat(M, "You absorb the potion and feel your intense desire to feed melt away.") + to_chat(user, "You feed the slime the potion, removing its hunger and calming it.") var/newname = copytext(sanitize(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text),1,MAX_NAME_LEN) if (!newname) @@ -261,10 +261,10 @@ to_chat(user, "The slime is dead!") return ..() if(M.cores >= 5) - user <<"The slime already has the maximum amount of extract!" + to_chat(user, "The slime already has the maximum amount of extract!") return ..() - user <<"You feed the slime the steroid. It will now produce one more extract." + to_chat(user, "You feed the slime the steroid. It will now produce one more extract.") M.cores++ qdel(src) @@ -288,10 +288,10 @@ to_chat(user, "The slime is dead!") return ..() if(M.mutation_chance == 0) - user <<"The slime already has no chance of mutating!" + to_chat(user, "The slime already has no chance of mutating!") return ..() - user <<"You feed the slime the stabilizer. It is now less likely to mutate." + to_chat(user, "You feed the slime the stabilizer. It is now less likely to mutate.") M.mutation_chance = Clamp(M.mutation_chance-15,0,100) qdel(src) @@ -312,10 +312,10 @@ to_chat(user, "This slime has already consumed a mutator, any more would be far too unstable!") return ..() if(M.mutation_chance == 100) - user <<"The slime is already guaranteed to mutate!" + to_chat(user, "The slime is already guaranteed to mutate!") return ..() - user <<"You feed the slime the mutator. It is now more likely to mutate." + to_chat(user, "You feed the slime the mutator. It is now more likely to mutate.") M.mutation_chance = Clamp(M.mutation_chance+12,0,100) M.mutator_used = TRUE qdel(src) @@ -348,7 +348,7 @@ return ..() R.vehicle_move_delay = 0 - user <<"You slather the red gunk over the [C], making it faster." + to_chat(user, "You slather the red gunk over the [C], making it faster.") C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) C.add_atom_colour("#FF0000", FIXED_COLOUR_PRIORITY) qdel(src) @@ -373,7 +373,7 @@ if(C.max_heat_protection_temperature == FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT) to_chat(user, "The [C] is already fireproof!") return ..() - user <<"You slather the blue gunk over the [C], fireproofing it." + to_chat(user, "You slather the blue gunk over the [C], fireproofing it.") C.name = "fireproofed [C.name]" C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) C.add_atom_colour("#000080", FIXED_COLOUR_PRIORITY) @@ -420,7 +420,7 @@ item_color = "golem" flags = ABSTRACT | NODROP resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - has_sensor = 0 + has_sensor = NO_SENSORS /obj/item/clothing/suit/golem name = "adamantine shell" @@ -559,8 +559,8 @@ var/duration = 140 alpha = 125 -/obj/effect/timestop/New() - ..() +/obj/effect/timestop/Initialize() + . = ..() for(var/mob/living/M in GLOB.player_list) for(var/obj/effect/proc_holder/spell/aoe_turf/conjure/timestop/T in M.mind.spell_list) //People who can stop time are immune to timestop immune |= M diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index 376c8aa9f26..32fb4a46e5c 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -24,8 +24,8 @@ icon_state = "datadisk1" max_blueprints = 1 -/obj/item/weapon/disk/design_disk/golem_shell/New() - ..() +/obj/item/weapon/disk/design_disk/golem_shell/Initialize() + . = ..() var/datum/design/golem_shell/G = new blueprints[1] = G diff --git a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm index 6d18ce98f7e..2938f9263cf 100644 --- a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm +++ b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm @@ -47,7 +47,7 @@ to_chat(M, "Discordant whispers flood your mind in a thousand voices. Each one speaks your name, over and over. Something horrible has come.") M << 'sound/creatures/legion_spawn.ogg' flash_color(M, flash_color = "#FF0000", flash_time = 50) - var/image/door_overlay = image('icons/effects/effects.dmi', "legiondoor") + var/mutable_appearance/door_overlay = mutable_appearance('icons/effects/effects.dmi', "legiondoor") notify_ghosts("Legion has been summoned in the [get_area(src)]!", source = src, alert_overlay = door_overlay, action = NOTIFY_JUMP) is_anyone_home = FALSE new/mob/living/simple_animal/hostile/megafauna/legion(get_step(src.loc, SOUTH)) diff --git a/code/modules/ruins/objects_and_mobs/ruin_mapping_aids.dm b/code/modules/ruins/objects_and_mobs/ruin_mapping_aids.dm index 4db811604d8..669890a279a 100644 --- a/code/modules/ruins/objects_and_mobs/ruin_mapping_aids.dm +++ b/code/modules/ruins/objects_and_mobs/ruin_mapping_aids.dm @@ -7,7 +7,7 @@ var/baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface /obj/effect/baseturf_helper/Initialize() - ..() + . = ..() var/area/thearea = get_area(src) for(var/turf/T in get_area_turfs(thearea, z)) if(T.baseturf != T.type) //Don't break indestructible walls and the like diff --git a/code/modules/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/ruins/objects_and_mobs/sin_ruins.dm index c5aacadecbc..349d716d2d9 100644 --- a/code/modules/ruins/objects_and_mobs/sin_ruins.dm +++ b/code/modules/ruins/objects_and_mobs/sin_ruins.dm @@ -45,7 +45,7 @@ anchored = FALSE density = TRUE -/obj/structure/cursed_money/New() +/obj/structure/cursed_money/Initialize() . = ..() addtimer(CALLBACK(src, .proc/collapse), 600) diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm index e7c115e1004..006943ade52 100644 --- a/code/modules/security_levels/keycard_authentication.dm +++ b/code/modules/security_levels/keycard_authentication.dm @@ -18,7 +18,7 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new) var/mob/triggerer = null var/waiting = 0 -/obj/machinery/keycard_auth/New() +/obj/machinery/keycard_auth/Initialize() . = ..() ev = GLOB.keycard_events.addEvent("triggerEvent", CALLBACK(src, .proc/triggerEvent)) @@ -95,10 +95,10 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new) switch(event) if("Red Alert") set_security_level(SEC_LEVEL_RED) - feedback_inc("alert_keycard_auth_red",1) + SSblackbox.inc("alert_keycard_auth_red",1) if("Emergency Maintenance Access") make_maint_all_access() - feedback_inc("alert_keycard_auth_maint",1) + SSblackbox.inc("alert_keycard_auth_maint",1) GLOBAL_VAR_INIT(emergency_access, FALSE) diff --git a/code/modules/shuttle/arrivals.dm b/code/modules/shuttle/arrivals.dm index cc0efd53594..cd501432237 100644 --- a/code/modules/shuttle/arrivals.dm +++ b/code/modules/shuttle/arrivals.dm @@ -22,20 +22,17 @@ var/perma_docked = FALSE //highlander with RESPAWN??? OH GOD!!! /obj/docking_port/mobile/arrivals/Initialize(mapload) - if(mapload) - return TRUE //late initialize to make sure the latejoin list is populated - - preferred_direction = dir - if(SSshuttle.arrivals) WARNING("More than one arrivals docking_port placed on map!") - qdel(src) - return - + return INITIALIZE_HINT_QDEL SSshuttle.arrivals = src - ..() + . = ..() + preferred_direction = dir + return INITIALIZE_HINT_LATELOAD //for latejoin list + +/obj/docking_port/mobile/arrivals/LateInitialize() areas = list() var/list/new_latejoin = list() @@ -177,7 +174,7 @@ Launch(TRUE) - user << "Calling your shuttle. One moment..." + to_chat(user, "Calling your shuttle. One moment...") while(mode != SHUTTLE_CALL && !damaged) stoplag() @@ -190,5 +187,5 @@ /obj/docking_port/mobile/arrivals/vv_edit_var(var_name, var_value) switch(var_name) if("perma_docked") - feedback_add_details("admin_secrets_fun_used","ShA[var_value ? "s" : "g"]") + SSblackbox.add_details("admin_secrets_fun_used","ShA[var_value ? "s" : "g"]") return ..() diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm index 0033f380d17..4f5b85ced78 100644 --- a/code/modules/shuttle/computer.dm +++ b/code/modules/shuttle/computer.dm @@ -10,8 +10,8 @@ var/admin_controlled var/no_destination_swap = 0 -/obj/machinery/computer/shuttle/New(location, obj/item/weapon/circuitboard/computer/shuttle/C) - ..() +/obj/machinery/computer/shuttle/Initialize(mapload, obj/item/weapon/circuitboard/computer/shuttle/C) + . = ..() if(istype(C)) possible_destinations = C.possible_destinations shuttleId = C.shuttleId diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 07c135d7955..b9d284b280a 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -207,8 +207,17 @@ . = ..() -/obj/docking_port/mobile/emergency/request(obj/docking_port/stationary/S, coefficient=1, area/signalOrigin, reason, redAlert) - var/call_time = SSshuttle.emergencyCallTime * coefficient +/obj/docking_port/mobile/emergency/request(obj/docking_port/stationary/S, area/signalOrigin, reason, redAlert, set_coefficient=null) + if(!isnum(set_coefficient)) + var/security_num = seclevel2num(get_security_level()) + switch(security_num) + if(SEC_LEVEL_GREEN) + set_coefficient = 2 + if(SEC_LEVEL_BLUE) + set_coefficient = 1 + else + set_coefficient = 0.5 + var/call_time = SSshuttle.emergencyCallTime * set_coefficient switch(mode) // The shuttle can not normally be called while "recalling", so // if this proc is called, it's via admin fiat @@ -290,7 +299,7 @@ setTimer(SSshuttle.emergencyDockTime) send2irc("Server", "The Emergency Shuttle has docked with the station.") priority_announce("The Emergency Shuttle has docked with the station. You have [timeLeft(600)] minutes to board the Emergency Shuttle.", null, 'sound/AI/shuttledock.ogg', "Priority") - feedback_add_details("emergency_shuttle", src.name) + SSblackbox.add_details("emergency_shuttle", src.name) // Gangs only have one attempt left if the shuttle has // docked with the station to prevent suffering from @@ -412,8 +421,8 @@ to_chat(usr, "Escape pods will only launch during \"Code Red\" security alert.") return 1 -/obj/docking_port/mobile/pod/New() - ..() +/obj/docking_port/mobile/pod/Initialize() + . = ..() if(id == "pod") WARNING("[type] id has not been changed from the default. Use the id convention \"pod1\" \"pod2\" etc.") @@ -450,7 +459,7 @@ // Minimal distance from the map edge, setting this too low can result in shuttle landing on the edge and getting "sliced" /obj/docking_port/stationary/random/Initialize(mapload) - ..() + . = ..() if(!mapload) return @@ -492,8 +501,7 @@ icon_state = "safe" var/unlocked = FALSE -/obj/item/weapon/storage/pod/New() - ..() +/obj/item/weapon/storage/pod/PopulateContents() new /obj/item/clothing/head/helmet/space/orange(src) new /obj/item/clothing/head/helmet/space/orange(src) new /obj/item/clothing/suit/space/orange(src) @@ -533,13 +541,13 @@ dir = EAST roundstart_move = "backup_away" -/obj/docking_port/mobile/emergency/backup/New() +/obj/docking_port/mobile/emergency/backup/Initialize() // We want to be a valid emergency shuttle // but not be the main one, keep whatever's set // valid. // backup shuttle ignores `timid` because THERE SHOULD BE NO TOUCHING IT var/current_emergency = SSshuttle.emergency - ..() + . = ..() SSshuttle.emergency = current_emergency SSshuttle.backup_shuttle = src diff --git a/code/modules/shuttle/manipulator.dm b/code/modules/shuttle/manipulator.dm index bb2f401cdba..c2feb1331a5 100644 --- a/code/modules/shuttle/manipulator.dm +++ b/code/modules/shuttle/manipulator.dm @@ -20,15 +20,15 @@ var/obj/docking_port/mobile/preview_shuttle var/datum/map_template/shuttle/preview_template -/obj/machinery/shuttle_manipulator/New() +/obj/machinery/shuttle_manipulator/Initialize() . = ..() update_icon() /obj/machinery/shuttle_manipulator/update_icon() cut_overlays() - var/image/hologram_projection = image(icon, "hologram_on") + var/mutable_appearance/hologram_projection = mutable_appearance(icon, "hologram_on") hologram_projection.pixel_y = 22 - var/image/hologram_ship = image(icon, "hologram_whiteship") + var/mutable_appearance/hologram_ship = mutable_appearance(icon, "hologram_whiteship") hologram_ship.pixel_y = 27 add_overlay(hologram_projection) add_overlay(hologram_ship) @@ -155,7 +155,7 @@ message_admins("[key_name_admin(usr)] fast travelled \ [M]") log_admin("[key_name(usr)] fast travelled [M]") - feedback_add_details("shuttle_fasttravel", M.name) + SSblackbox.add_details("shuttle_fasttravel", M.name) break if("preview") @@ -182,7 +182,7 @@ with the shuttle manipulator.") log_admin("[key_name(usr)] loaded [mdp] with the \ shuttle manipulator.
") - feedback_add_details("shuttle_manipulator", mdp.name) + SSblackbox.add_details("shuttle_manipulator", mdp.name) update_icon() diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 94d10392ccd..00ddecb7f82 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -145,8 +145,8 @@ var/area_type = /area/space var/last_dock_time -/obj/docking_port/stationary/New() - ..() +/obj/docking_port/stationary/Initialize() + . = ..() SSshuttle.stationary += src if(!id) id = "[SSshuttle.stationary.len]" @@ -168,8 +168,8 @@ var/area/shuttle/transit/assigned_area var/obj/docking_port/mobile/owner -/obj/docking_port/stationary/transit/New() - ..() +/obj/docking_port/stationary/transit/Initialize() + . = ..() SSshuttle.transit += src /obj/docking_port/stationary/transit/proc/dezone() @@ -223,8 +223,8 @@ var/list/ripples = list() -/obj/docking_port/mobile/New() - ..() +/obj/docking_port/mobile/Initialize() + . = ..() if(!timid) register() @@ -241,7 +241,7 @@ . = ..() /obj/docking_port/mobile/Initialize(mapload) - ..() + . = ..() var/area/A = get_area(src) if(istype(A, /area/shuttle)) @@ -316,7 +316,7 @@ if(!check_dock(S)) testing("check_dock failed on request for [src]") return - + if(mode == SHUTTLE_IGNITING && destination == S) return @@ -583,9 +583,9 @@ "You feel an immense \ crushing pressure as the space around you ripples.") if(M.key || M.get_ghost(TRUE)) - feedback_add_details("shuttle_gib", "[type]") + SSblackbox.add_details("shuttle_gib", "[type]") else - feedback_add_details("shuttle_gib_unintelligent", "[type]") + SSblackbox.add_details("shuttle_gib_unintelligent", "[type]") M.gib() else //non-living mobs shouldn't be affected by shuttles, which is why this is an else diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index b78d0efd846..78732d82e4b 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -14,7 +14,7 @@ var/tables_required = 2 active = FALSE -/obj/machinery/power/emitter/energycannon/magical/New() +/obj/machinery/power/emitter/energycannon/magical/Initialize() . = ..() if(prob(50)) desc = "Oh no, not again." diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 1e3b9906beb..82d5db8b209 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -90,7 +90,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( SSshuttle.orderhistory += SO SO.generate(pick_n_take(empty_turfs)) - feedback_add_details("cargo_imports", + SSblackbox.add_details("cargo_imports", "[SO.pack.type]|[SO.pack.name]|[SO.pack.cost]") investigate_log("Order #[SO.id] ([SO.pack.name], placed by [key_name(SO.orderer_ckey)]) has shipped.", "cargo") if(SO.pack.dangerous) diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm index 8151b864442..57a8ffd7efa 100644 --- a/code/modules/shuttle/syndicate.dm +++ b/code/modules/shuttle/syndicate.dm @@ -31,9 +31,9 @@ var/challenge = FALSE var/moved = FALSE -/obj/item/weapon/circuitboard/computer/syndicate_shuttle/New() +/obj/item/weapon/circuitboard/computer/syndicate_shuttle/Initialize() + . = ..() GLOB.syndicate_shuttle_boards += src - ..() /obj/item/weapon/circuitboard/computer/syndicate_shuttle/Destroy() GLOB.syndicate_shuttle_boards -= src diff --git a/code/modules/shuttle/transit.dm b/code/modules/shuttle/transit.dm index c03d4a26450..7bf217d1ff7 100644 --- a/code/modules/shuttle/transit.dm +++ b/code/modules/shuttle/transit.dm @@ -5,7 +5,7 @@ icon = 'icons/effects/effects.dmi' icon_state = "at_shield1" -/obj/effect/landmark/transit/New() +/obj/effect/landmark/transit/Initialize() . = ..() GLOB.transit_markers += src diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index bdab8b6c226..cc3f2c1ab90 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -223,8 +223,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th /obj/effect/proc_holder/spell/proc/playMagSound() playsound(get_turf(usr), sound,50,1) -/obj/effect/proc_holder/spell/New() - ..() +/obj/effect/proc_holder/spell/Initialize() + . = ..() action = new(src) still_recharging_msg = "[name] is still recharging." diff --git a/code/modules/spells/spell_types/area_teleport.dm b/code/modules/spells/spell_types/area_teleport.dm index 0ff91495ed1..5a06351f885 100644 --- a/code/modules/spells/spell_types/area_teleport.dm +++ b/code/modules/spells/spell_types/area_teleport.dm @@ -14,9 +14,8 @@ revert_cast() return invocation(thearea,user) - spawn(0) - if(charge_type == "recharge" && recharge) - start_recharge() + if(charge_type == "recharge" && recharge) + INVOKE_ASYNC(src, .proc/start_recharge) cast(targets,thearea,user) after_cast(targets) @@ -48,7 +47,7 @@ L+=T if(!L.len) - usr <<"The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry." + to_chat(usr, "The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry.") return if(target && target.buckled) diff --git a/code/modules/spells/spell_types/charge.dm b/code/modules/spells/spell_types/charge.dm index 32bdf54a311..c37166a2446 100644 --- a/code/modules/spells/spell_types/charge.dm +++ b/code/modules/spells/spell_types/charge.dm @@ -26,9 +26,9 @@ if(M.mind) for(var/obj/effect/proc_holder/spell/S in M.mind.spell_list) S.charge_counter = S.charge_max - M <<"You feel raw magic flowing through you. It feels good!" + to_chat(M, "You feel raw magic flowing through you. It feels good!") else - M <<"you feel very strange for a moment, but then it passes." + to_chat(M, "You feel very strange for a moment, but then it passes.") burnt_out = 1 charged_item = M break diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm index c9ff8929100..8e8968fb528 100644 --- a/code/modules/spells/spell_types/devil.dm +++ b/code/modules/spells/spell_types/devil.dm @@ -234,7 +234,7 @@ else var/list/funky_turfs = RANGE_TURFS(1, user) for(var/turf/closed/solid in funky_turfs) - user << "You're too close to a wall." + to_chat(user, "You're too close to a wall.") return dancefloor_exists = TRUE var/i = 1 diff --git a/code/modules/spells/spell_types/forcewall.dm b/code/modules/spells/spell_types/forcewall.dm index 6579171738a..8b2a40fe591 100644 --- a/code/modules/spells/spell_types/forcewall.dm +++ b/code/modules/spells/spell_types/forcewall.dm @@ -26,8 +26,8 @@ /obj/effect/forcefield/wizard var/mob/wizard -/obj/effect/forcefield/wizard/New(atom/loc, mob/summoner) - ..() +/obj/effect/forcefield/wizard/Initialize(mapload, mob/summoner) + . = ..() wizard = summoner QDEL_IN(src, 300) diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm index 20d223354b7..26c543537e6 100644 --- a/code/modules/spells/spell_types/godhand.dm +++ b/code/modules/spells/spell_types/godhand.dm @@ -14,9 +14,9 @@ throw_range = 0 throw_speed = 0 -/obj/item/weapon/melee/touch_attack/New(var/spell) - attached_spell = spell - ..() +/obj/item/weapon/melee/touch_attack/Initialize() + attached_spell = loc + . = ..() /obj/item/weapon/melee/touch_attack/attack(mob/target, mob/living/carbon/user) if(!iscarbon(user)) //Look ma, no hands diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm index f72eff6302c..50f51a0b3b9 100644 --- a/code/modules/spells/spell_types/lichdom.dm +++ b/code/modules/spells/spell_types/lichdom.dm @@ -85,7 +85,7 @@ var/static/active_phylacteries = 0 /obj/item/phylactery/Initialize(mapload, datum/mind/newmind) - ..() + . = ..() mind = newmind name = "phylactery of [mind.name]" diff --git a/code/modules/spells/spell_types/lightning.dm b/code/modules/spells/spell_types/lightning.dm index 4f469b61b2a..3a84f73ef91 100644 --- a/code/modules/spells/spell_types/lightning.dm +++ b/code/modules/spells/spell_types/lightning.dm @@ -11,7 +11,7 @@ selection_type = "view" random_target = 1 var/ready = 0 - var/image/halo = null + var/static/mutable_appearance/halo var/sound/Snd // so far only way i can think of to stop a sound, thank MSO for the idea. action_icon_state = "lightning" @@ -25,7 +25,7 @@ ready = 1 to_chat(user, "You start gathering the power.") Snd = new/sound('sound/magic/lightning_chargeup.ogg',channel = 7) - halo = image("icon"='icons/effects/effects.dmi',"icon_state" ="electricity","layer" = EFFECTS_LAYER) + halo = halo || mutable_appearance('icons/effects/effects.dmi', "electricity", EFFECTS_LAYER) user.add_overlay(halo) playsound(get_turf(user), Snd, 50, 0) if(do_mob(user,user,100,1)) @@ -38,8 +38,7 @@ /obj/effect/proc_holder/spell/targeted/tesla/proc/Reset(mob/user = usr) ready = 0 - if(halo) - user.cut_overlay(halo) + user.cut_overlay(halo) /obj/effect/proc_holder/spell/targeted/tesla/revert_cast(mob/user = usr, message = 1) if(message) diff --git a/code/modules/spells/spell_types/spacetime_distortion.dm b/code/modules/spells/spell_types/spacetime_distortion.dm index bed0255b027..6a68643d557 100644 --- a/code/modules/spells/spell_types/spacetime_distortion.dm +++ b/code/modules/spells/spell_types/spacetime_distortion.dm @@ -74,7 +74,7 @@ var/walks_left = 50 //prevents the game from hanging in extreme cases (such as minigun fire) /obj/effect/cross_action/spacetime_dist/Initialize(mapload) - ..() + . = ..() sound = "sound/guitar/[safepick(GLOB.guitar_notes)]" dir = pick(GLOB.cardinal) diff --git a/code/modules/spells/spell_types/trigger.dm b/code/modules/spells/spell_types/trigger.dm index 9c6dc7490f3..7dfda257309 100644 --- a/code/modules/spells/spell_types/trigger.dm +++ b/code/modules/spells/spell_types/trigger.dm @@ -5,8 +5,8 @@ var/list/linked_spells = list() //those are just referenced by the trigger spell and are unaffected by it directly var/list/starting_spells = list() //those are added on New() to contents from default spells and are deleted when the trigger spell is deleted to prevent memory leaks -/obj/effect/proc_holder/spell/targeted/trigger/New() - ..() +/obj/effect/proc_holder/spell/targeted/trigger/Initialize() + . = ..() for(var/spell in starting_spells) var/spell_to_add = text2path(spell) diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index 0d4200d49eb..5f808035fd3 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -127,7 +127,7 @@ icon = 'icons/obj/lavaland/cannon.dmi' icon_state = "orbital_cannon1" unsecuring_tool = null - var/static/image/top_layer = null + var/static/mutable_appearance/top_layer var/ex_power = 3 var/power_used_per_shot = 2000000 //enough to kil standard apc - todo : make this use wires instead and scale explosion power with it var/ready @@ -161,19 +161,18 @@ return locate(world.maxx,y,z) return get_turf(src) -/obj/machinery/bsa/full/New(loc,cannon_direction = WEST) - ..() +/obj/machinery/bsa/full/Initialize(mapload, cannon_direction = WEST) + . = ..() + top_layer = top_layer || mutable_appearance(icon, layer = ABOVE_MOB_LAYER) switch(cannon_direction) if(WEST) dir = WEST pixel_x = -192 - top_layer = image("icons/obj/lavaland/orbital_cannon.dmi", "top_west") - top_layer.layer = ABOVE_MOB_LAYER + top_layer.icon_state = "top_west" icon_state = "cannon_west" if(EAST) dir = EAST - top_layer = image("icons/obj/lavaland/orbital_cannon.dmi", "top_east") - top_layer.layer = ABOVE_MOB_LAYER + top_layer.icon_state = "top_east" icon_state = "cannon_east" add_overlay(top_layer) reload() diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index d7f9a72a9ef..02ce0f77069 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -170,7 +170,7 @@ plants_max = G.plant_count dna_max = G.human_count break - ..() + . = ..() /obj/machinery/dna_vault/Destroy() for(var/V in fillers) diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm index 863d7d4bde3..b89ed4bde05 100644 --- a/code/modules/station_goals/shield.dm +++ b/code/modules/station_goals/shield.dm @@ -99,8 +99,8 @@ var/static/gid = 0 var/id = 0 -/obj/machinery/satellite/New() - ..() +/obj/machinery/satellite/Initialize() + . = ..() id = gid++ /obj/machinery/satellite/interact(mob/user) diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index 56d35be23b3..d93fc658ddb 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -284,79 +284,66 @@ /obj/item/bodypart/proc/get_limb_icon(dropped) icon_state = "" //to erase the default sprite, we're building the visual aspects of the bodypart through overlays alone. - var/list/standing = list() + . = list() - var/image_dir + var/image_dir = 0 if(dropped) image_dir = SOUTH if(dmg_overlay_type) if(brutestate) - standing += image("icon"='icons/mob/dam_mob.dmi', "icon_state"="[dmg_overlay_type]_[body_zone]_[brutestate]0", "layer"=-DAMAGE_LAYER, "dir"=image_dir) + . += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_[brutestate]0", -DAMAGE_LAYER, image_dir) if(burnstate) - standing += image("icon"='icons/mob/dam_mob.dmi', "icon_state"="[dmg_overlay_type]_[body_zone]_0[burnstate]", "layer"=-DAMAGE_LAYER, "dir"=image_dir) + . += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_0[burnstate]", -DAMAGE_LAYER, image_dir) + var/image/limb = image(layer = -BODYPARTS_LAYER, dir = image_dir) + . += limb if(animal_origin) if(status == BODYPART_ORGANIC) + limb.icon = 'icons/mob/animal_parts.dmi' if(species_id == "husk") - standing += image("icon"='icons/mob/animal_parts.dmi', "icon_state"="[animal_origin]_husk_[body_zone]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir) + limb.icon_state = "[animal_origin]_husk_[body_zone]" else - standing += image("icon"='icons/mob/animal_parts.dmi', "icon_state"="[animal_origin]_[body_zone]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir) + limb.icon_state = "[animal_origin]_[body_zone]" else - standing += image("icon"='icons/mob/augments.dmi', "icon_state"="[animal_origin]_[body_zone]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir) - return standing + limb.icon = 'icons/mob/augments.dmi' + limb.icon_state = "[animal_origin]_[body_zone]" + return var/icon_gender = (body_gender == FEMALE) ? "f" : "m" //gender of the icon, if applicable if((body_zone != "head" && body_zone != "chest")) should_draw_gender = FALSE - var/image/I - if(status == BODYPART_ORGANIC) if(should_draw_greyscale) + limb.icon = 'icons/mob/human_parts_greyscale.dmi' if(should_draw_gender) - I = image("icon"='icons/mob/human_parts_greyscale.dmi', "icon_state"="[species_id]_[body_zone]_[icon_gender]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir) + limb.icon_state = "[species_id]_[body_zone]_[icon_gender]" else if(use_digitigrade) - I = image("icon"='icons/mob/human_parts_greyscale.dmi', "icon_state"="digitigrade_[use_digitigrade]_[body_zone]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir) + limb.icon_state = "digitigrade_[use_digitigrade]_[body_zone]" else - I = image("icon"='icons/mob/human_parts_greyscale.dmi', "icon_state"="[species_id]_[body_zone]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir) + limb.icon_state = "[species_id]_[body_zone]" else + limb.icon = 'icons/mob/human_parts.dmi' if(should_draw_gender) - I = image("icon"='icons/mob/human_parts.dmi', "icon_state"="[species_id]_[body_zone]_[icon_gender]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir) + limb.icon_state = "[species_id]_[body_zone]_[icon_gender]" else - I = image("icon"='icons/mob/human_parts.dmi', "icon_state"="[species_id]_[body_zone]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir) + limb.icon_state = "[species_id]_[body_zone]" + else + limb.icon = icon if(should_draw_gender) - I = image("icon"= icon, "icon_state"="[body_zone]_[icon_gender]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir) + limb.icon_state = "[body_zone]_[icon_gender]" else - I = image("icon"= icon, "icon_state"="[body_zone]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir) - standing += I - return standing - - - if(!should_draw_greyscale) - standing += I - return standing - - //Greyscale Colouring - var/draw_color - - if(skin_tone) //Limb has skin color variable defined, use it - draw_color = skintone2hex(skin_tone) - if(species_color) - draw_color = species_color - if(mutation_color) - draw_color = mutation_color - - if(draw_color) - I.color = "#[draw_color]" - //End Greyscale Colouring - standing += I - - return standing + limb.icon_state = "[body_zone]" + return + if(should_draw_greyscale) + var/draw_color = mutation_color || species_color || (skin_tone && skintone2hex(skin_tone)) + if(draw_color) + limb.color = "#[draw_color]" /obj/item/bodypart/deconstruct(disassembled = TRUE) drop_organs() diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 6417ade8198..909f83e4d71 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -119,7 +119,7 @@ /obj/item/bodypart/head/get_limb_icon(dropped) cut_overlays() - var/list/standing = ..() + . = ..() if(dropped) //certain overlays only appear when the limb is being detached from its owner. var/datum/sprite_accessory/S @@ -128,45 +128,48 @@ if(facial_hair_style) S = GLOB.facial_hair_styles_list[facial_hair_style] if(S) - var/image/img_facial = image("icon" = S.icon, "icon_state" = "[S.icon_state]", "layer" = -HAIR_LAYER, "dir"=SOUTH) - img_facial.color = "#" + facial_hair_color - img_facial.alpha = hair_alpha - standing += img_facial + var/image/facial_overlay = image(S.icon, "[S.icon_state]", -HAIR_LAYER, SOUTH) + facial_overlay.color = "#" + facial_hair_color + facial_overlay.alpha = hair_alpha + . += facial_overlay + var/image/hair_overlay = image(layer = -HAIR_LAYER, dir = SOUTH) + . += hair_overlay //Applies the debrained overlay if there is no brain if(!brain) if(animal_origin == ALIEN_BODYPART) - standing += image("icon"='icons/mob/animal_parts.dmi', "icon_state" = "debrained_alien", "layer" = -HAIR_LAYER, "dir"=SOUTH) + hair_overlay.icon = 'icons/mob/animal_parts.dmi' + hair_overlay.icon_state = "debrained_alien" else if(animal_origin == LARVA_BODYPART) - standing += image("icon"='icons/mob/animal_parts.dmi', "icon_state" = "debrained_larva", "layer" = -HAIR_LAYER, "dir"=SOUTH) + hair_overlay.icon = 'icons/mob/animal_parts.dmi' + hair_overlay.icon_state = "debrained_larva" else if(!(NOBLOOD in species_flags_list)) - standing += image("icon"='icons/mob/human_face.dmi', "icon_state" = "debrained", "layer" = -HAIR_LAYER, "dir"=SOUTH) + hair_overlay.icon = 'icons/mob/human_face.dmi' + hair_overlay.icon_state = "debrained" else if(hair_style) S = GLOB.hair_styles_list[hair_style] if(S) - var/image/img_hair = image("icon" = S.icon, "icon_state" = "[S.icon_state]", "layer" = -HAIR_LAYER, "dir"=SOUTH) - img_hair.color = "#" + hair_color - img_hair.alpha = hair_alpha - standing += img_hair + hair_overlay.icon = icon + hair_overlay.icon_state = "[S.icon_state]" + hair_overlay.color = "#" + hair_color + hair_overlay.alpha = hair_alpha // lipstick if(lip_style) - var/image/lips = image("icon"='icons/mob/human_face.dmi', "icon_state"="lips_[lip_style]", "layer" = -BODY_LAYER, "dir"=SOUTH) - lips.color = lip_color - standing += lips + var/image/lips_overlay = image('icons/mob/human_face.dmi', "lips_[lip_style]", -BODY_LAYER, SOUTH) + lips_overlay.color = lip_color + . += lips_overlay // eyes + var/image/eyes_overlay = image('icons/mob/human_face.dmi', "eyes", -BODY_LAYER, SOUTH) + . += eyes_overlay if(!eyes) - standing += image("icon"='icons/mob/human_face.dmi', "icon_state" = "eyes_missing", "layer" = -BODY_LAYER, "dir"=SOUTH) + eyes_overlay.icon_state = "eyes_missing" else if(eyes.eye_color) - var/image/img_eyes = image("icon" = 'icons/mob/human_face.dmi', "icon_state" = "eyes", "layer" = -BODY_LAYER, "dir"=SOUTH) - img_eyes.color = "#" + eyes.eye_color - standing += img_eyes - - return standing + eyes_overlay.color = "#" + eyes.eye_color /obj/item/bodypart/head/monkey icon = 'icons/mob/animal_parts.dmi' diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index 1a0932f6e09..4fc22ec2c2a 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -14,8 +14,8 @@ var/obj/item/holder = null // You can use this var for item path, it would be converted into an item on New() -/obj/item/organ/cyberimp/arm/New() - ..() +/obj/item/organ/cyberimp/arm/Initialize() + . = ..() if(ispath(holder)) holder = new holder(src) @@ -207,8 +207,8 @@ contents = newlist(/obj/item/device/assembly/flash/armimplant) origin_tech = "materials=4;combat=3;biotech=4;magnets=4;powerstorage=3" -/obj/item/organ/cyberimp/arm/flash/New() - ..() +/obj/item/organ/cyberimp/arm/flash/Initialize() + . = ..() if(locate(/obj/item/device/assembly/flash/armimplant) in items_list) var/obj/item/device/assembly/flash/armimplant/F = locate(/obj/item/device/assembly/flash/armimplant) in items_list F.I = src @@ -225,8 +225,8 @@ contents = newlist(/obj/item/weapon/melee/energy/blade/hardlight, /obj/item/weapon/gun/medbeam, /obj/item/borg/stun, /obj/item/device/assembly/flash/armimplant) origin_tech = "materials=5;combat=7;biotech=5;powerstorage=5;syndicate=6;programming=5" -/obj/item/organ/cyberimp/arm/combat/New() - ..() +/obj/item/organ/cyberimp/arm/combat/Initialize() + . = ..() if(locate(/obj/item/device/assembly/flash/armimplant) in items_list) var/obj/item/device/assembly/flash/armimplant/F = locate(/obj/item/device/assembly/flash/armimplant) in items_list F.I = src diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 85a98b09e6f..ff2a3f03120 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -11,7 +11,7 @@ if(iscarbon(M)) src.Insert(M) if(implant_overlay) - var/image/overlay = new /image(icon, implant_overlay) + var/mutable_appearance/overlay = mutable_appearance(icon, implant_overlay) overlay.color = implant_color add_overlay(overlay) return ..() @@ -155,8 +155,7 @@ /obj/item/device/autosurgeon/reviver) var/amount = 5 -/obj/item/weapon/storage/box/cyber_implants/bundle/New() - ..() +/obj/item/weapon/storage/box/cyber_implants/PopulateContents() var/implant while(contents.len <= amount) implant = pick(boxed) diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm index 981e6000c37..53b0d5f17f4 100644 --- a/code/modules/surgery/organs/autosurgeon.dm +++ b/code/modules/surgery/organs/autosurgeon.dm @@ -12,7 +12,7 @@ var/starting_organ /obj/item/device/autosurgeon/Initialize(mapload) - ..() + . = ..() if(starting_organ) insert_organ(new starting_organ(src)) diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 672ac924adb..4ad8b9c518e 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -106,19 +106,27 @@ icon_state = "flashlight_eyes" flash_protect = 2 tint = INFINITY + var/obj/item/device/flashlight/eyelight/eye /obj/item/organ/eyes/robotic/flashlight/emp_act(severity) return /obj/item/organ/eyes/robotic/flashlight/Insert(var/mob/living/carbon/M, var/special = 0) ..() - M.set_light(M.light_range + 15, M.light_power + 1) + if(!eye) + eye = new /obj/item/device/flashlight/eyelight() + eye.on = TRUE + eye.forceMove(M) + eye.update_brightness(M) /obj/item/organ/eyes/robotic/flashlight/Remove(var/mob/living/carbon/M, var/special = 0) - M.set_light(M.light_range -15, M.light_power - 1) + eye.on = FALSE + eye.update_brightness(M) + eye.forceMove(src) ..() + // Welding shield implant /obj/item/organ/eyes/robotic/shield name = "shielded robotic eyes" diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index f8deed5b289..d90e1448634 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -78,7 +78,9 @@ /obj/item/organ/Destroy() if(owner) - Remove(owner) + // The special flag is important, because otherwise mobs can die + // while undergoing transformation into different mobs. + Remove(owner, special=TRUE) return ..() /obj/item/organ/attack(mob/living/carbon/M, mob/user) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 096e7e955a4..c02c22d19e0 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -10,7 +10,7 @@ var/taste_sensitivity = 15 // lower is more sensitive. /obj/item/organ/tongue/Initialize(mapload) - ..() + . = ..() languages_possible = typecacheof(list( /datum/language/common, /datum/language/monkey, @@ -123,7 +123,7 @@ taste_sensitivity = 10 // LIZARDS ARE ALIENS CONFIRMED /obj/item/organ/tongue/alien/Initialize(mapload) - ..() + . = ..() languages_possible = typecacheof(list( /datum/language/xenocommon, /datum/language/common, @@ -136,9 +136,7 @@ /obj/item/organ/tongue/bone name = "bone \"tongue\"" - desc = "Apparently skeletons alter the sounds they produce \ - through oscillation of their teeth, hence their characteristic \ - rattling." + desc = "Apparently skeletons alter the sounds they produce through oscillation of their teeth, hence their characteristic rattling." icon_state = "tonguebone" say_mod = "rattles" attack_verb = list("bitten", "chattered", "chomped", "enamelled", "boned") @@ -148,7 +146,7 @@ var/phomeme_type = "sans" var/list/phomeme_types = list("sans", "papyrus") -/obj/item/organ/tongue/bone/New() +/obj/item/organ/tongue/bone/Initialize() . = ..() phomeme_type = pick(phomeme_types) @@ -186,7 +184,7 @@ 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, diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index d1f56978cb8..03beacf27b3 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -54,7 +54,7 @@ return new step_type /datum/surgery/proc/complete() - feedback_add_details("surgeries_completed", "[type]") + SSblackbox.add_details("surgeries_completed", "[type]") qdel(src) diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm index 027cab8c3e6..918ec309f2b 100644 --- a/code/modules/telesci/telepad.dm +++ b/code/modules/telesci/telepad.dm @@ -10,8 +10,8 @@ active_power_usage = 5000 var/efficiency -/obj/machinery/telepad/New() - ..() +/obj/machinery/telepad/Initialize() + . = ..() var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/telesci_pad(null) B.apply_default_parts(src) diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index 60ac49a529c..6c80a3ee1f4 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -30,9 +30,9 @@ var/list/crystals = list() var/obj/item/device/gps/inserted_gps -/obj/machinery/computer/telescience/New() +/obj/machinery/computer/telescience/Initialize() recalibrate() - ..() + . = ..() /obj/machinery/computer/telescience/Destroy() eject() @@ -46,7 +46,7 @@ to_chat(user, "There are [crystals.len ? crystals.len : "no"] bluespace crystal\s in the crystal slots.") /obj/machinery/computer/telescience/Initialize(mapload) - ..() + . = ..() if(mapload) for(var/i = 1; i <= starting_crystals; i++) crystals += new /obj/item/weapon/ore/bluespace_crystal/artificial(null) // starting crystals diff --git a/code/modules/uplink/uplink.dm b/code/modules/uplink/uplink.dm index 0538232fc06..6e70077063d 100644 --- a/code/modules/uplink/uplink.dm +++ b/code/modules/uplink/uplink.dm @@ -20,8 +20,8 @@ GLOBAL_LIST_EMPTY(uplinks) var/purchase_log = "" var/list/uplink_items -/obj/item/device/uplink/New() - ..() +/obj/item/device/uplink/Initialize() + . = ..() GLOB.uplinks += src uplink_items = get_uplink_items(gamemode) @@ -133,24 +133,24 @@ GLOBAL_LIST_EMPTY(uplinks) return hidden_uplink.attackby(I, user, params) // A collection of pre-set uplinks, for admin spawns. -/obj/item/device/radio/uplink/New() - ..() +/obj/item/device/radio/uplink/Initialize() + . = ..() icon_state = "radio" hidden_uplink = new(src) hidden_uplink.active = TRUE hidden_uplink.lockable = FALSE -/obj/item/device/radio/uplink/nuclear/New() - ..() +/obj/item/device/radio/uplink/nuclear/Initialize() + . = ..() hidden_uplink.set_gamemode(/datum/game_mode/nuclear) -/obj/item/device/multitool/uplink/New() - ..() +/obj/item/device/multitool/uplink/Initialize() + . = ..() hidden_uplink = new(src) hidden_uplink.active = TRUE hidden_uplink.lockable = FALSE -/obj/item/weapon/pen/uplink/New() - ..() +/obj/item/weapon/pen/uplink/Initialize() + . = ..() hidden_uplink = new(src) traitor_unlock_degrees = 360 diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm index 859999ea689..2c5508041fd 100644 --- a/code/modules/uplink/uplink_item.dm +++ b/code/modules/uplink/uplink_item.dm @@ -88,7 +88,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. /datum/uplink_item/proc/spawn_item(turf/loc, obj/item/device/uplink/U) if(item) - feedback_add_details("traitor_uplink_items_bought", "[name]|[cost]") + SSblackbox.add_details("traitor_uplink_items_bought", "[name]|[cost]") return new item(loc) /datum/uplink_item/proc/buy(mob/user, obj/item/device/uplink/U) @@ -222,7 +222,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. /datum/uplink_item/dangerous/machinegun name = "L6 Squad Automatic Weapon" desc = "A fully-loaded Aussec Armoury belt-fed machine gun. \ - This deadly weapon has a massive 50-round magazine of devastating 5.56x45mm ammunition." + This deadly weapon has a massive 50-round magazine of devastating 1.95x129mm ammunition." item = /obj/item/weapon/gun/ballistic/automatic/l6_saw cost = 18 surplus = 0 @@ -469,34 +469,34 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. include_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/ammo/machinegun/basic - name = "5.56x45mm Box Magazine" - desc = "A 50-round magazine of 5.56x45mm ammunition for use with the L6 SAW. \ + name = "1.95x129mm Box Magazine" + desc = "A 50-round magazine of 1.95x129mm ammunition for use with the L6 SAW. \ By the time you need to use this, you'll already be on a pile of corpses." - item = /obj/item/ammo_box/magazine/mm556x45 + item = /obj/item/ammo_box/magazine/mm195x129 /datum/uplink_item/ammo/machinegun/bleeding - name = "5.56x45mm (Bleeding) Box Magazine" - desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; equipped with special properties \ + name = "1.95x129mm (Bleeding) Box Magazine" + desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; equipped with special properties \ to induce internal bleeding on targets." - item = /obj/item/ammo_box/magazine/mm556x45/bleeding + item = /obj/item/ammo_box/magazine/mm195x129/bleeding /datum/uplink_item/ammo/machinegun/hollow - name = "5.56x45mm (Hollow-Point) Box Magazine" - desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; equipped with hollow-point tips to help \ + name = "1.95x129mm (Hollow-Point) Box Magazine" + desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; equipped with hollow-point tips to help \ with the unarmored masses of crew." - item = /obj/item/ammo_box/magazine/mm556x45/hollow + item = /obj/item/ammo_box/magazine/mm195x129/hollow /datum/uplink_item/ammo/machinegun/ap - name = "5.56x45mm (Armor Penetrating) Box Magazine" - desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; equipped with special properties \ + name = "1.95x129mm (Armor Penetrating) Box Magazine" + desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; equipped with special properties \ to puncture even the most durable armor." - item = /obj/item/ammo_box/magazine/mm556x45/ap + item = /obj/item/ammo_box/magazine/mm195x129/ap /datum/uplink_item/ammo/machinegun/incen - name = "5.56x45mm (Incendiary) Box Magazine" - desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; tipped with a special flammable \ + name = "1.95x129mm (Incendiary) Box Magazine" + desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; tipped with a special flammable \ mixture that'll ignite anyone struck by the bullet. Some men just want to watch the world burn." - item = /obj/item/ammo_box/magazine/mm556x45/incen + item = /obj/item/ammo_box/magazine/mm195x129/incen /datum/uplink_item/ammo/sniper cost = 4 @@ -1158,7 +1158,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. /datum/uplink_item/cyber_implants/spawn_item(turf/loc, obj/item/device/uplink/U) if(item) if(istype(item, /obj/item/organ)) - feedback_add_details("traitor_uplink_items_bought", "[item]|[cost]") + SSblackbox.add_details("traitor_uplink_items_bought", "[item]|[cost]") return new /obj/item/weapon/storage/box/cyber_implants(loc, item) else return ..() @@ -1326,7 +1326,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. new I.item(C) U.purchase_log += "[bicon(I.item)]" - feedback_add_details("traitor_uplink_items_bought", "[name]|[cost]") + SSblackbox.add_details("traitor_uplink_items_bought", "[name]|[cost]") return C /datum/uplink_item/badass/random @@ -1352,6 +1352,6 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. var/datum/uplink_item/I = pick(possible_items) U.telecrystals -= I.cost U.spent_telecrystals += I.cost - feedback_add_details("traitor_uplink_items_bought","[name]|[I.cost]") - feedback_add_details("traitor_random_uplink_items_gotten","[I.name]") + SSblackbox.add_details("traitor_uplink_items_bought","[name]|[I.cost]") + SSblackbox.add_details("traitor_random_uplink_items_gotten","[I.name]") return new I.item(loc) diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm index 6afd401b75a..c10b6f8ebc3 100644 --- a/code/modules/vehicles/atv.dm +++ b/code/modules/vehicles/atv.dm @@ -3,17 +3,15 @@ name = "all-terrain vehicle" desc = "An all-terrain vehicle built for traversing rough terrain with ease. One of the few old-earth technologies that are still relevant on most planet-bound outposts." icon_state = "atv" - var/static/image/atvcover = null + var/static/mutable_appearance/atvcover /obj/vehicle/atv/buckle_mob(mob/living/buckled_mob, force = 0, check_loc = 1) . = ..() riding_datum = new/datum/riding/atv -/obj/vehicle/atv/New() - ..() - if(!atvcover) - atvcover = image("icons/obj/vehicles.dmi", "atvcover") - atvcover.layer = ABOVE_MOB_LAYER +/obj/vehicle/atv/Initialize() + . = ..() + atvcover = atvcover || mutable_appearance(icon, "atvcover", ABOVE_MOB_LAYER) /obj/vehicle/atv/post_buckle_mob(mob/living/M) @@ -36,7 +34,7 @@ density = 0 -/obj/vehicle/atv/turret/New() +/obj/vehicle/atv/turret/Initialize() . = ..() turret = new(loc) turret.base = src diff --git a/code/modules/vehicles/bicycle.dm b/code/modules/vehicles/bicycle.dm index 184b03a6bfd..d51de5809c5 100644 --- a/code/modules/vehicles/bicycle.dm +++ b/code/modules/vehicles/bicycle.dm @@ -7,8 +7,8 @@ var/static/list/bike_music = list('sound/misc/bike1.mid', 'sound/misc/bike2.mid', 'sound/misc/bike3.mid') -/obj/vehicle/bicycle/New() - ..() +/obj/vehicle/bicycle/Initialize() + . = ..() riding_datum = new/datum/riding/bicycle /obj/vehicle/bicycle/buckle_mob(mob/living/M, force = 0, check_loc = 1) diff --git a/code/modules/vehicles/pimpin_ride.dm b/code/modules/vehicles/pimpin_ride.dm index ae34cfd5157..42e9298c881 100644 --- a/code/modules/vehicles/pimpin_ride.dm +++ b/code/modules/vehicles/pimpin_ride.dm @@ -8,7 +8,7 @@ var/floorbuffer = FALSE /obj/vehicle/janicart/Initialize(mapload) - ..() + . = ..() update_icon() /obj/vehicle/janicart/Destroy() diff --git a/code/modules/vehicles/speedbike.dm b/code/modules/vehicles/speedbike.dm index 3db99e736b6..cc909e27755 100644 --- a/code/modules/vehicles/speedbike.dm +++ b/code/modules/vehicles/speedbike.dm @@ -4,7 +4,7 @@ icon_state = "speedbike_blue" layer = LYING_MOB_LAYER var/overlay_state = "cover_blue" - var/image/overlay = null + var/static/mutable_appearance/overlay /obj/vehicle/space/speedbike/buckle_mob(mob/living/M, force = 0, check_loc = 1) . = ..() @@ -12,24 +12,12 @@ /obj/vehicle/space/speedbike/New() . = ..() - overlay = image("icons/obj/bike.dmi", overlay_state) - overlay.layer = ABOVE_MOB_LAYER + overlay = overlay || mutable_appearance(icon, overlay_state, ABOVE_MOB_LAYER) add_overlay(overlay) -/obj/effect/overlay/temp/speedbike_trail - name = "speedbike trails" - icon_state = "ion_fade" - layer = BELOW_MOB_LAYER - duration = 10 - randomdir = 0 - -/obj/effect/overlay/temp/speedbike_trail/New(loc,move_dir) - ..() - setDir(move_dir) - /obj/vehicle/space/speedbike/Move(newloc,move_dir) if(has_buckled_mobs()) - new /obj/effect/overlay/temp/speedbike_trail(loc,move_dir) + new /obj/effect/overlay/temp/dir_setting/speedbike_trail(loc,move_dir) . = ..() /obj/vehicle/space/speedbike/red diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm index 295d7745955..f254ef6337e 100644 --- a/code/modules/zombie/organs.dm +++ b/code/modules/zombie/organs.dm @@ -13,7 +13,7 @@ var/revive_time_max = 700 var/timer_id -/obj/item/organ/zombie_infection/New(loc) +/obj/item/organ/zombie_infection/Initialize() . = ..() if(iscarbon(loc)) Insert(loc) diff --git a/code/world.dm b/code/world.dm index 6207483c2dc..5602e62aff7 100644 --- a/code/world.dm +++ b/code/world.dm @@ -17,7 +17,7 @@ log_world("World loaded at [time_stamp()]") #if (PRELOAD_RSC == 0) - external_rsc_urls = file2list("config/external_rsc_urls.txt","\n") + external_rsc_urls = world.file2list("config/external_rsc_urls.txt","\n") var/i=1 while(i<=external_rsc_urls.len) if(external_rsc_urls[i]) @@ -208,11 +208,9 @@ #undef WORLD_REBOOT /world/proc/OnReboot(reason, feedback_c, feedback_r, round_end_sound_sent) - feedback_set_details("[feedback_c]","[feedback_r]") + SSblackbox.set_details("[feedback_c]","[feedback_r]") log_game("Rebooting World. [reason]") - feedback_set("ahelp_unresolved", GLOB.ahelp_tickets.active_tickets.len) - if(GLOB.blackbox) - GLOB.blackbox.save_all_data_to_sql() + SSblackbox.set_val("ahelp_unresolved", GLOB.ahelp_tickets.active_tickets.len) Master.Shutdown() //run SS shutdowns RoundEndAnimation(round_end_sound_sent) kick_clients_in_lobby("The round came to an end with you in the lobby.", 1) //second parameter ensures only afk clients are kicked @@ -251,7 +249,7 @@ world << sound(round_end_sound) /world/proc/load_mode() - var/list/Lines = file2list("data/mode.txt") + var/list/Lines = world.file2list("data/mode.txt") if(Lines.len) if(Lines[1]) GLOB.master_mode = Lines[1] @@ -315,3 +313,6 @@ s += ": [jointext(features, ", ")]" status = s + +/world/proc/has_round_started() + return SSticker.HasRoundStarted() \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html index 25e46e97e11..84c30da356c 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,110 @@ -->
+

27 April 2017

+

Gun Hog updated:

+
    +
  • The GPS interface has been converted to tgui.
  • +
  • GPS now update automatically or manually, give distance and direction to a signal, and many other improvements!
  • +
+

MrStonedOne updated:

+
    +
  • Tweaked how things were deleted to cut down on lag from consecutive deletes and provide better logging for things that cause lag when hard-deleted.
  • +
  • Server hop verb moved to the OOC tab
  • +
  • Server hop verb can now be used in the lobby as well as while a ghost.
  • +
+

QualityVan updated:

+
    +
  • You can hit emagged cloning pods with a medical ID to empty them
  • +
  • Crayons can be ground
  • +
  • Crayon powder can be used to color stuff
  • +
+

Shadowlight213 updated:

+
    +
  • Heads of staff may now download the ID card modification program from NTNet.
  • +
+

bgobandit updated:

+
    +
  • When jumpsuits take severe damage, their suit sensors break. They can be fixed by applying a cable coil.
  • +
+

coiax updated:

+
    +
  • Anomalous crystals can be examined by ghosts to determine their function and activation method.
  • +
  • Lightbringers can understand Slime and Galactic Common, and can only speak Slime, as before.
  • +
  • The helper anomalous crystal is in the orbit list after it has been activated.
  • +
+ +

26 April 2017

+

CoreOverload updated:

+
    +
  • Gas injectors are now buildable!
  • +
+

Joan updated:

+
    +
  • Ash Drake swoops no longer teleport the Ash Drake to your position.
  • +
  • Some other tweaks to Ash Drake attacks and patterns; discover these yourself!
  • +
+

coiax updated:

+
    +
  • The wizard spell Rod Form now costs 3 points, up from 2.
  • +
+

flashdim updated:

+
    +
  • Omega Station had two APCs not wired properly. (#26526)
  • +
+ +

25 April 2017

+

BeeSting12 updated:

+
    +
  • Deltastation's secure tech storage is no longer all access.
  • +
+

CoreOverload updated:

+
    +
  • Disposals no longer get broken by shuttles rotation.
  • +
  • Wires no longer get broken by shuttles movement and rotation.
  • +
  • Atmospheric equipment no longer gets broken by shuttles movement and rotation. Glory to the Flying Fortress of Atmosia!
  • +
+

Jalleo updated:

+
    +
  • WW_maze from lavaland has been removed it wasnt that good really anyhow
  • +
+

QualityVan updated:

+
    +
  • Changeling brains are now more fully vestigial
  • +
+

WJohnston updated:

+
    +
  • Skeletons and plasmamen's hitboxes now more closely match that of humans. They are no longer full of holes and incredibly frustrating to hit, should they run around naked.
  • +
+

XDTM updated:

+
    +
  • Items will no longer be used on backpacks if they fail to insert when they're too full.
  • +
  • T-Ray scans are no longer visible to bystanders.
  • +
  • T-Ray scans no longer allow viewers to interact with underfloor objects.
  • +
+

basilman updated:

+
    +
  • fixed species with no skin dropping skin when gibbed.
  • +
+

coiax updated:

+
    +
  • Examining a window now gives hints to the appropriate tool for the next stage of construction/deconstruction.
  • +
  • You can examine a firedoor for hints on how to construct/deconstruct it.
  • +
  • Add an additional hint during construction where you can add plasteel to make the firedoor reinforced.
  • +
  • Fixed easter eggs spawning during non-Easter.
  • +
  • Fixes stations not having holiday specific prefixes during the holidays.
  • +
  • Ghosts no longer drift in space.
  • +
  • Swarmers now only speak their own language, rather than swarmer and common.
  • +
  • When you are crushed by a door, it prints a visible message, instead of, in some cases, silently damaging you.
  • +
  • The vent in the Escape Coridoor on Omega Station has been fixed.
  • +
  • You no longer die when turning into a monkey.
  • +
+

coiax, WJohnston updated:

+
    +
  • Plasmamen lungs, also known as "plasma filters" now look different from human lungs.
  • +
  • Plasmamen now have their own special type of bone tongue. They still sound the same, it's just purple. Like them.
  • +
+

23 April 2017

coiax updated:

    @@ -1158,126 +1262,6 @@
    • Science crates now have new sprites
    - -

    24 February 2017

    -

    MrStonedOne updated:

    -
      -
    • Limit on Mining Satchel of Holding Removed
    • -
    • Dumping/mass pickup/mass transfer of items is now lag checked
    • -
    • Dumping/mass pickup/mass transfer of items has a progress bar
    • -
    - -

    23 February 2017

    -

    Cyberboss updated:

    -
      -
    • Fixed a bug where the fire overlay wasn't getting removed from objects
    • -
    • The graphical delays with characters at roundstart are gone
    • -
    • The crew manifest is working again
    • -
    • Admins can now asay with ":p" and dsay with ":d"
    • -
    -

    Dannno updated:

    -
      -
    • Robust Softdrinks LLC. has sent out new vendies to the stendy.
    • -
    -

    Joan updated:

    -
      -
    • Off-station and carded AIs no longer prevent Judgement scripture from unlocking.
    • -
    -

    Nienhaus updated:

    -
      -
    • Updates ammo sprites to the new perspective.
    • -
    -

    Tofa01 updated:

    -
      -
    • Disables sound/frequency variance on cryo tube alert sound
    • -
    -

    coiax updated:

    -
      -
    • Nanotrasen reminds its employees that they have ALWAYS been able to taste. Anyone claiming that they've recently only just gained the ability to taste are probably Syndicate agents.
    • -
    - -

    22 February 2017

    -

    AnonymousNow updated:

    -
      -
    • Added Medical HUD Sunglasses. Not currently available on-station, unless you can convince Centcom to send you a pair.
    • -
    -

    Cyberboss updated:

    -
      -
    • Spawning to the station should now be a less hitchy experience
    • -
    -

    MrPerson updated:

    -
      -
    • Ion storms have several new additions:
    • -
    • 25% chance to flatly replace the AI's core lawset with something random in the config. Suddenly the AI is Corporate, deal w/ it.
    • -
    • 10% chance to delete one of the AI's core or supplied laws. Hope you treated the AI well without its precious law 1 to protect your sorry ass.
    • -
    • 10% chance that, instead of adding a random law, it will instead replace one of the AI's existing core or supplied laws with the ion law. Otherwise, it adds the generated law as normal. There's still a 100% chance of getting a generated ion law.
    • -
    • 10% chance afterwards to shuffle all the AI's laws.
    • -
    -

    TalkingCactus updated:

    -
      -
    • New characters will now have their backpack preference correctly set to "Department Backpack".
    • -
    -

    Tofa01 updated:

    -
      -
    • [Delta] Fixes missing R&D shutter near public autolathe
    • -
    -

    Xhuis updated:

    -
      -
    • Highlanders can no longer hide behind chairs and plants.
    • -
    • Highlanders no longer bleed and are no longer slowed down by damage.
    • -
    - -

    21 February 2017

    -

    Cyberboss updated:

    -
      -
    • You can now unshunt as a malfunctioning AI again
    • -
    -

    Kor updated:

    -
      -
    • You will now retain your facing when getting pushed by another mob.
    • -
    -

    Tofa01 updated:

    -
      -
    • [Z2] Fixed Centcomm shutters to have proper access levels for inspectors and other Admin given roles
    • -
    -

    coiax updated:

    -
      -
    • Refactors heart attack code, a cardiac arrest will knock someone unconscious and kill them very quickly.
    • -
    • Adds corazone, an anti-heart attack drug, made by mixing 2 parts Phenol, 1 part Lithium. A person with corazone in their system will not suffer any negative effects from missing a heart. Use it during surgery.
    • -
    • Abductor glands are now hearts, the abductor operation table now automatically injects corazone to prevent deaths during surgery. The gland will restart if it stops beating.
    • -
    • Cloning pods always know the name of the person they are cloning.
    • -
    • You can swipe a medical ID card to eject someone from the cloning pod early. The cloning pod will announce this over the radio.
    • -
    • Fresh clones have no organs or limbs, they gain them during the cloning process. Ejecting a clone too early is not recommended. Power loss will also eject a clone as before.
    • -
    • An ejected clone will take damage from being at critical health very quickly upon ejection, rather than before, where a clone could be stable in critical for up to two minutes.
    • -
    • Occupants of cloning pods do not interact with the air outside the pod.
    • -
    -

    uraniummeltdown updated:

    -
      -
    • All shuttle engines should now be facing the right way
    • -
    - -

    20 February 2017

    -

    Cyberboss updated:

    -
      -
    • The frequncy fire alarms play at is now consistent
    • -
    -

    MrStonedOne updated:

    -
      -
    • bluespace ore cap changed from 100 ores to 500
    • -
    -

    Tofa01 updated:

    -
      -
    • [Meta] Replaces orange jumpsuit in holding cell with prisoner jumpsuits
    • -
    -

    XDTM updated:

    -
      -
    • Repairing someone else's robotic limb is instant. Repairing your own robotic limbs will still take time.
    • -
    • Repairing limbs with cable or welding will now heal more.
    • -
    -

    Xhuis updated:

    -
      -
    • Medipens are no longer reusable.
    • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index bd0f91fdc75..f2cd1614b29 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -10644,3 +10644,80 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscadd: Centcom would like to inform all employees that they have ears. - rscadd: Adds "ear" organs to all carbons. These organs store ear damage and deafness. A carbon without any ears is deaf. Genetic deafness functions as before. +2017-04-25: + BeeSting12: + - bugfix: Deltastation's secure tech storage is no longer all access. + CoreOverload: + - bugfix: Disposals no longer get broken by shuttles rotation. + - bugfix: Wires no longer get broken by shuttles movement and rotation. + - bugfix: Atmospheric equipment no longer gets broken by shuttles movement and rotation. + Glory to the Flying Fortress of Atmosia! + Jalleo: + - rscdel: WW_maze from lavaland has been removed it wasnt that good really anyhow + QualityVan: + - bugfix: Changeling brains are now more fully vestigial + WJohnston: + - tweak: Skeletons and plasmamen's hitboxes now more closely match that of humans. + They are no longer full of holes and incredibly frustrating to hit, should they + run around naked. + XDTM: + - bugfix: Items will no longer be used on backpacks if they fail to insert when + they're too full. + - bugfix: T-Ray scans are no longer visible to bystanders. + - bugfix: T-Ray scans no longer allow viewers to interact with underfloor objects. + basilman: + - bugfix: fixed species with no skin dropping skin when gibbed. + coiax: + - rscadd: Examining a window now gives hints to the appropriate tool for the next + stage of construction/deconstruction. + - rscadd: You can examine a firedoor for hints on how to construct/deconstruct it. + - rscadd: Add an additional hint during construction where you can add plasteel + to make the firedoor reinforced. + - bugfix: Fixed easter eggs spawning during non-Easter. + - bugfix: Fixes stations not having holiday specific prefixes during the holidays. + - bugfix: Ghosts no longer drift in space. + - bugfix: Swarmers now only speak their own language, rather than swarmer and common. + - bugfix: When you are crushed by a door, it prints a visible message, instead of, + in some cases, silently damaging you. + - bugfix: The vent in the Escape Coridoor on Omega Station has been fixed. + - bugfix: You no longer die when turning into a monkey. + coiax, WJohnston: + - rscadd: Plasmamen lungs, also known as "plasma filters" now look different from + human lungs. + - rscadd: Plasmamen now have their own special type of bone tongue. They still sound + the same, it's just purple. Like them. +2017-04-26: + CoreOverload: + - rscadd: Gas injectors are now buildable! + Joan: + - tweak: Ash Drake swoops no longer teleport the Ash Drake to your position. + - balance: Some other tweaks to Ash Drake attacks and patterns; discover these yourself! + coiax: + - balance: The wizard spell Rod Form now costs 3 points, up from 2. + flashdim: + - bugfix: Omega Station had two APCs not wired properly. (#26526) +2017-04-27: + Gun Hog: + - rscadd: The GPS interface has been converted to tgui. + - experiment: GPS now update automatically or manually, give distance and direction + to a signal, and many other improvements! + MrStonedOne: + - tweak: Tweaked how things were deleted to cut down on lag from consecutive deletes + and provide better logging for things that cause lag when hard-deleted. + - tweak: Server hop verb moved to the OOC tab + - rscadd: Server hop verb can now be used in the lobby as well as while a ghost. + QualityVan: + - bugfix: You can hit emagged cloning pods with a medical ID to empty them + - rscadd: Crayons can be ground + - rscadd: Crayon powder can be used to color stuff + Shadowlight213: + - tweak: Heads of staff may now download the ID card modification program from NTNet. + bgobandit: + - tweak: When jumpsuits take severe damage, their suit sensors break. They can be + fixed by applying a cable coil. + coiax: + - rscadd: Anomalous crystals can be examined by ghosts to determine their function + and activation method. + - rscdel: Lightbringers can understand Slime and Galactic Common, and can only speak + Slime, as before. + - rscadd: The helper anomalous crystal is in the orbit list after it has been activated. diff --git a/html/changelogs/AutoChangeLog-pr-26292.yml b/html/changelogs/AutoChangeLog-pr-26292.yml deleted file mode 100644 index 9d91cc6f1f5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26292.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BeeSting12" -delete-after: True -changes: - - bugfix: "Deltastation's secure tech storage is no longer all access." diff --git a/html/changelogs/AutoChangeLog-pr-26346.yml b/html/changelogs/AutoChangeLog-pr-26346.yml deleted file mode 100644 index f1756d26d8c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26346.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "QualityVan" -delete-after: True -changes: - - bugfix: "Changeling brains are now more fully vestigial" diff --git a/html/changelogs/AutoChangeLog-pr-26381.yml b/html/changelogs/AutoChangeLog-pr-26381.yml deleted file mode 100644 index b81943d30fb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26381.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - rscadd: "You can examine a firedoor for hints on how to -construct/deconstruct it." - - rscadd: "Add an additional hint during construction where you can add -plasteel to make the firedoor reinforced." diff --git a/html/changelogs/AutoChangeLog-pr-26397.yml b/html/changelogs/AutoChangeLog-pr-26397.yml deleted file mode 100644 index 0e555c64add..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26397.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - bugfix: "Fixed easter eggs spawning during non-Easter." - - bugfix: "Fixes stations not having holiday specific prefixes during the holidays." diff --git a/html/changelogs/AutoChangeLog-pr-26400.yml b/html/changelogs/AutoChangeLog-pr-26400.yml deleted file mode 100644 index 821d37f331e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26400.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "CoreOverload" -delete-after: True -changes: - - bugfix: "Disposals no longer get broken by shuttles rotation." - - bugfix: "Wires no longer get broken by shuttles movement and rotation." - - bugfix: "Atmospheric equipment no longer gets broken by shuttles movement and rotation. Glory to the Flying Fortress of Atmosia!" diff --git a/html/changelogs/AutoChangeLog-pr-26416.yml b/html/changelogs/AutoChangeLog-pr-26416.yml deleted file mode 100644 index cbfa45a0a50..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26416.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - bugfix: "Ghosts no longer drift in space." diff --git a/html/changelogs/AutoChangeLog-pr-26436.yml b/html/changelogs/AutoChangeLog-pr-26436.yml deleted file mode 100644 index 87f80c1ad07..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26436.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - bugfix: "Swarmers now only speak their own language, rather than swarmer and -common." diff --git a/html/changelogs/AutoChangeLog-pr-26441.yml b/html/changelogs/AutoChangeLog-pr-26441.yml deleted file mode 100644 index 731e4a870b0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26441.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "coiax, WJohnston" -delete-after: True -changes: - - rscadd: "Plasmamen lungs, also known as \"plasma filters\" now look different -from human lungs." - - rscadd: "Plasmamen now have their own special type of bone tongue. They -still sound the same, it's just purple. Like them." diff --git a/html/changelogs/AutoChangeLog-pr-26445.yml b/html/changelogs/AutoChangeLog-pr-26445.yml deleted file mode 100644 index e61bf150ef9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26445.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - bugfix: "Items will no longer be used on backpacks if they fail to insert when they're too full." diff --git a/html/changelogs/AutoChangeLog-pr-26456.yml b/html/changelogs/AutoChangeLog-pr-26456.yml deleted file mode 100644 index 758f0c4c15c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26456.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "basilman" -delete-after: True -changes: - - bugfix: "fixed species with no skin dropping skin when gibbed." diff --git a/html/changelogs/AutoChangeLog-pr-26457.yml b/html/changelogs/AutoChangeLog-pr-26457.yml deleted file mode 100644 index 43829911c1b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26457.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - bugfix: "When you are crushed by a door, it prints a visible message, -instead of, in some cases, silently damaging you." diff --git a/html/changelogs/AutoChangeLog-pr-26484.yml b/html/changelogs/AutoChangeLog-pr-26484.yml deleted file mode 100644 index cc711de25cd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26484.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Jalleo" -delete-after: True -changes: - - rscdel: "WW_maze from lavaland has been removed it wasnt that good really anyhow" diff --git a/icons/mob/ears.dmi b/icons/mob/ears.dmi index f87713f7a1f..0a5154c396c 100644 Binary files a/icons/mob/ears.dmi and b/icons/mob/ears.dmi differ diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi index ab69241cdea..5b526ab99d8 100644 Binary files a/icons/mob/human.dmi and b/icons/mob/human.dmi differ diff --git a/icons/mob/human_parts.dmi b/icons/mob/human_parts.dmi index f6b10be4961..80127e3f786 100644 Binary files a/icons/mob/human_parts.dmi and b/icons/mob/human_parts.dmi differ diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi index e23288dedb9..caf9de716f5 100644 Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ diff --git a/icons/mob/lavaland/dragon.dmi b/icons/mob/lavaland/dragon.dmi index 7e44b775de8..911d7288d12 100644 Binary files a/icons/mob/lavaland/dragon.dmi and b/icons/mob/lavaland/dragon.dmi differ diff --git a/icons/obj/abductor.dmi b/icons/obj/abductor.dmi index 88d50bb6026..ac30dccb4f1 100644 Binary files a/icons/obj/abductor.dmi and b/icons/obj/abductor.dmi differ diff --git a/icons/obj/atmospherics/components/unary_devices.dmi b/icons/obj/atmospherics/components/unary_devices.dmi index b1c7922190b..fada1c72517 100644 Binary files a/icons/obj/atmospherics/components/unary_devices.dmi and b/icons/obj/atmospherics/components/unary_devices.dmi differ diff --git a/icons/obj/atmospherics/pipes/pipe_item.dmi b/icons/obj/atmospherics/pipes/pipe_item.dmi index 7f04644b2d1..7503e09e884 100644 Binary files a/icons/obj/atmospherics/pipes/pipe_item.dmi and b/icons/obj/atmospherics/pipes/pipe_item.dmi differ diff --git a/interface/interface.dm b/interface/interface.dm index fde1c0ea140..253738064ba 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -78,29 +78,13 @@ Admin: mob.hotkey_help() if(holder) - src << adminhotkeys + to_chat(src, adminhotkeys) /client/verb/changelog() set name = "Changelog" set category = "OOC" - getFiles( - 'html/88x31.png', - 'html/bug-minus.png', - 'html/cross-circle.png', - 'html/hard-hat-exclamation.png', - 'html/image-minus.png', - 'html/image-plus.png', - 'html/music-minus.png', - 'html/music-plus.png', - 'html/tick-circle.png', - 'html/wrench-screwdriver.png', - 'html/spell-check.png', - 'html/burn-exclamation.png', - 'html/chevron.png', - 'html/chevron-expand.png', - 'html/changelog.css', - 'html/changelog.html' - ) + var/datum/asset/changelog = get_asset_datum(/datum/asset/simple/changelog) + changelog.send(src) src << browse('html/changelog.html', "window=changes;size=675x650") if(prefs.lastchangelog != GLOB.changelog_hash) prefs.lastchangelog = GLOB.changelog_hash @@ -165,8 +149,8 @@ Any-Mode: (hotkey doesn't need to be on) \tCtrl+Numpad = Body target selection (Press 8 repeatedly for Head->Eyes->Mouth)
"} - src << hotkey_mode - src << other + to_chat(src, hotkey_mode) + to_chat(src, other) /mob/living/silicon/robot/hotkey_help() //h = talk-wheel has a nonsense tag in it because \th is an escape sequence in BYOND. @@ -217,8 +201,8 @@ Any-Mode: (hotkey doesn't need to be on) \tPGDN = activate held object "} - src << hotkey_mode - src << other + to_chat(src, hotkey_mode) + to_chat(src, other) // Needed to circumvent a bug where .winset does not work when used on the window.on-size event in skins. // Used by /datum/html_interface/nanotrasen (code/modules/html_interface/nanotrasen/nanotrasen.dm) diff --git a/tgstation.dme b/tgstation.dme index 7799229ee7f..f75cf9c01ce 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -160,6 +160,7 @@ #include "code\controllers\subsystem\assets.dm" #include "code\controllers\subsystem\atoms.dm" #include "code\controllers\subsystem\augury.dm" +#include "code\controllers\subsystem\blackbox.dm" #include "code\controllers\subsystem\communications.dm" #include "code\controllers\subsystem\dbcore.dm" #include "code\controllers\subsystem\disease.dm" @@ -180,7 +181,6 @@ #include "code\controllers\subsystem\pai.dm" #include "code\controllers\subsystem\parallax.dm" #include "code\controllers\subsystem\persistence.dm" -#include "code\controllers\subsystem\ping.dm" #include "code\controllers\subsystem\radio.dm" #include "code\controllers\subsystem\religion.dm" #include "code\controllers\subsystem\server_maint.dm" @@ -218,6 +218,7 @@ #include "code\datums\martial.dm" #include "code\datums\material_container.dm" #include "code\datums\mind.dm" +#include "code\datums\mutable_appearance.dm" #include "code\datums\mutations.dm" #include "code\datums\outfit.dm" #include "code\datums\progressbar.dm" @@ -454,8 +455,10 @@ #include "code\game\gamemodes\malfunction\Malf_Modules.dm" #include "code\game\gamemodes\meteor\meteor.dm" #include "code\game\gamemodes\meteor\meteors.dm" +#include "code\game\gamemodes\miniantags\abduction\abductee_objectives.dm" #include "code\game\gamemodes\miniantags\abduction\abduction.dm" #include "code\game\gamemodes\miniantags\abduction\abduction_gear.dm" +#include "code\game\gamemodes\miniantags\abduction\abduction_outfits.dm" #include "code\game\gamemodes\miniantags\abduction\abduction_surgery.dm" #include "code\game\gamemodes\miniantags\abduction\gland.dm" #include "code\game\gamemodes\miniantags\abduction\machinery\camera.dm" @@ -2085,7 +2088,6 @@ #include "code\modules\VR\vr_sleeper.dm" #include "code\modules\zombie\items.dm" #include "code\modules\zombie\organs.dm" -#include "code\orphaned_procs\statistics.dm" #include "goon\code\datums\browserOutput.dm" #include "interface\interface.dm" #include "interface\stylesheet.dm" diff --git a/tgui/assets/tgui.css b/tgui/assets/tgui.css index d52500b9d64..531fb00530b 100644 --- a/tgui/assets/tgui.css +++ b/tgui/assets/tgui.css @@ -1 +1 @@ -@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.clockwork{background:linear-gradient(180deg,#b18b25 0,#5f380e);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffb18b25',endColorstr='#ff5f380e',GradientType=0)}body.clockwork .normal{color:#b18b25}body.clockwork .good{color:#cfba47}body.clockwork .average{color:#896b19}body.clockwork .bad{color:#5f380e}body.clockwork .highlight{color:#b18b25}body.clockwork main{display:block;margin-top:32px;padding:2px 6px 0}body.clockwork hr{height:2px;background-color:#b18b25;border:none}body.clockwork .hidden{display:none}body.clockwork .bar .barText,body.clockwork span.button{color:#b18b25;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.clockwork .bold{font-weight:700}body.clockwork .italic{font-style:italic}body.clockwork [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.clockwork div[data-tooltip],body.clockwork span[data-tooltip]{position:relative}body.clockwork div[data-tooltip]:after,body.clockwork span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #170800;background-color:#2d1400}body.clockwork div[data-tooltip]:hover:after,body.clockwork span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.clockwork div[data-tooltip].tooltip-top:after,body.clockwork span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork div[data-tooltip].tooltip-top:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-top:hover:after{-webkit-transform:translateX(-50%) translateY(-8px);-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-bottom:after{top:100%;left:50%}body.clockwork div[data-tooltip].tooltip-bottom:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:hover:after{-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-left:after,body.clockwork span[data-tooltip].tooltip-left:after{top:50%;right:100%;-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-left:hover:after,body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-left:hover:after,body.clockwork span[data-tooltip].tooltip-right:after{-webkit-transform:translateX(-8px) translateY(-50%);-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-right:after{top:50%;left:100%}body.clockwork div[data-tooltip].tooltip-right:hover:after,body.clockwork span[data-tooltip].tooltip-right:hover:after{-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #170800;background:#2d1400}body.clockwork .bar .barText{position:absolute;top:0;right:3px}body.clockwork .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#b18b25}body.clockwork .bar .barFill.good{background-color:#cfba47}body.clockwork .bar .barFill.average{background-color:#896b19}body.clockwork .bar .barFill.bad{background-color:#5f380e}body.clockwork span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #170800}body.clockwork span.button .fa{padding-right:2px}body.clockwork span.button.normal{transition:background-color .5s;background-color:#5f380e}body.clockwork span.button.normal.active:focus,body.clockwork span.button.normal.active:hover{transition:background-color .25s;background-color:#704211;outline:0}body.clockwork span.button.disabled{transition:background-color .5s;background-color:#2d1400}body.clockwork span.button.disabled.active:focus,body.clockwork span.button.disabled.active:hover{transition:background-color .25s;background-color:#441e00;outline:0}body.clockwork span.button.selected{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.selected.active:focus,body.clockwork span.button.selected.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.toggle{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.toggle.active:focus,body.clockwork span.button.toggle.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.caution{transition:background-color .5s;background-color:#be6209}body.clockwork span.button.caution.active:focus,body.clockwork span.button.caution.active:hover{transition:background-color .25s;background-color:#cd6a0a;outline:0}body.clockwork span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.clockwork span.button.danger.active:focus,body.clockwork span.button.danger.active:hover{transition:background-color .25s;background-color:#abaf00;outline:0}body.clockwork span.button.gridable{width:125px;margin:2px 0}body.clockwork span.button+span:not(.button),body.clockwork span:not(.button)+span.button{margin-left:5px}body.clockwork div.display{width:100%;padding:4px;margin:6px 0;background-color:#2d1400;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400);background-color:rgba(45,20,0,.9);box-shadow:inset 0 0 5px rgba(0,0,0,.3)}body.clockwork div.display header,body.clockwork div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#cfba47;border-bottom:2px solid #b18b25}body.clockwork div.display header .buttonRight,body.clockwork div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.clockwork div.display article,body.clockwork div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.clockwork input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#b18b25;background-color:#cfba47;border:1px solid #272727}body.clockwork input::-webkit-input-placeholder{color:#999}body.clockwork input::-moz-placeholder{color:#999}body.clockwork input:-ms-input-placeholder{color:#999}body.clockwork input::placeholder{color:#999}body.clockwork input::-ms-clear{display:none}body.clockwork svg.linegraph{overflow:hidden}body.clockwork div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#2d1400;font-weight:700;font-style:italic;background-color:#000;background-image:repeating-linear-gradient(-45deg,#000,#000 10px,#170800 0,#170800 20px)}body.clockwork div.notice .label{color:#2d1400}body.clockwork div.notice .content:only-of-type{padding:0}body.clockwork div.notice hr{background-color:#896b19}body.clockwork div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #5f380e;-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}body.clockwork section .content,body.clockwork section .label,body.clockwork section .line,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.clockwork section{display:table-row;width:100%}body.clockwork section:not(:first-child){padding-top:4px}body.clockwork section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.clockwork section .label{width:1%;padding-right:32px;white-space:nowrap;color:#b18b25}body.clockwork section .content:not(:last-child){padding-right:16px}body.clockwork section .line{width:100%}body.clockwork div.subdisplay{width:100%;margin:0}body.clockwork header.titlebar .close,body.clockwork header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#cfba47}body.clockwork header.titlebar .close:hover,body.clockwork header.titlebar .minimize:hover{color:#d1bd50}body.clockwork header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#5f380e;border-bottom:1px solid #170800;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.clockwork header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.clockwork header.titlebar .title{position:absolute;top:6px;left:46px;color:#cfba47;font-size:16px;white-space:nowrap}body.clockwork header.titlebar .minimize{position:absolute;top:6px;right:46px}body.clockwork header.titlebar .close{position:absolute;top:4px;right:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCA0MjUgMjAwIiBvcGFjaXR5PSIuMzMiPgogIDxwYXRoIGQ9Im0gMTc4LjAwMzk5LDAuMDM4NjkgLTcxLjIwMzkzLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM0LDYuMDI1NTUgbCAwLDE4Ny44NzE0NyBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgNi43NjEzNCw2LjAyNTU0IGwgNTMuMTA3MiwwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM1LC02LjAyNTU0IGwgMCwtMTAxLjU0NDAxOCA3Mi4yMTYyOCwxMDQuNjk5Mzk4IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA1Ljc2MDE1LDIuODcwMTYgbCA3My41NTQ4NywwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM1LC02LjAyNTU0IGwgMCwtMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNi43NjEzNSwtNi4wMjU1NSBsIC01NC43MTY0NCwwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNi43NjEzMyw2LjAyNTU1IGwgMCwxMDIuNjE5MzUgTCAxODMuNzY0MTMsMi45MDg4NiBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTUuNzYwMTQsLTIuODcwMTcgeiIgLz4KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPgogIDxwYXRoIGQ9Im0gNDIwLjE1NTM1LDE3Ny44OTExOSBhIDEzLjQxMjAzOCwxMi41MDE4NDIgMCAwIDEgLTguNjMyOTUsMjIuMDY5NTEgbCAtNjYuMTE4MzIsMCBhIDUuMzY0ODE1Miw1LjAwMDczNyAwIDAgMSAtNS4zNjQ4MiwtNS4wMDA3NCBsIDAsLTc5Ljg3OTMxIHoiIC8+Cjwvc3ZnPgo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4KPCEtLSBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvIC0tPgo=") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-webkit-transform:translateX(-50%) translateY(-8px);-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:after{-webkit-transform:translateX(-8px) translateY(-50%);-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input::-webkit-input-placeholder{color:#999}body.nanotrasen input::-moz-placeholder{color:#999}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCAyMDAgMjg5Ljc0MiIgb3BhY2l0eT0iLjMzIj4KICA8cGF0aCBkPSJtIDkzLjUzNzY3NywwIGMgLTE4LjExMzEyNSwwIC0zNC4yMjAxMzMsMy4xMTE2NCAtNDguMzIzNDg0LDkuMzM0MzcgLTEzLjk2NTA5Miw2LjIyMTY3IC0yNC42MTI0NDIsMTUuMDcxMTQgLTMxLjk0MDY1MSwyNi41NDcxIC03LjE4OTkzOTgsMTEuMzM3ODkgLTEwLjMwMTIyNjYsMjQuNzQ5MTEgLTEwLjMwMTIyNjYsNDAuMjM0NzggMCwxMC42NDY2MiAyLjcyNTAwMjYsMjAuNDY0NjUgOC4xNzUxMTE2LDI5LjQ1MjU4IDUuNjE1Mjc3LDguOTg2ODYgMTQuMDM4Mjc3LDE3LjM1MjA0IDI1LjI2ODgyMSwyNS4wOTQzNiAxMS4yMzA1NDQsNy42MDUzMSAyNi41MDc0MjEsMTUuNDE4MzUgNDUuODMwNTE0LDIzLjQzNzgyIDE5Ljk4Mzc0OCw4LjI5NTU3IDM0Ljg0ODg0OCwxNS41NTQ3MSA0NC41OTI5OTgsMjEuNzc2MzggOS43NDQxNCw2LjIyMjczIDE2Ljc2MTcsMTIuODU4NSAyMS4wNTU3MiwxOS45MDk1MSA0LjI5NDA0LDcuMDUyMDggNi40NDE5MywxNS43NjQwOCA2LjQ0MTkzLDI2LjEzNDU5IDAsMTYuMTc3MDIgLTUuMjAxOTYsMjguNDgyMjIgLTE1LjYwNjczLDM2LjkxNjgyIC0xMC4yMzk2LDguNDM0NyAtMjUuMDIyMDMsMTIuNjUyMyAtNDQuMzQ1MTY5LDEyLjY1MjMgLTE0LjAzODE3MSwwIC0yNS41MTUyNDcsLTEuNjU5NCAtMzQuNDMzNjE4LC00Ljk3NzcgLTguOTE4MzcsLTMuNDU2NiAtMTYuMTg1NTcyLC04LjcxMTMgLTIxLjgwMDgzOSwtMTUuNzYzMyAtNS42MTUyNzcsLTcuMDUyMSAtMTAuMDc0Nzk1LC0xNi42NjA4OCAtMTMuMzc3ODk5LC0yOC44MjgxMiBsIC0yNC43NzMxNjI2MjkzOTQ1LDAgMCw1Ni44MjYzMiBDIDMzLjg1Njc2OSwyODYuMDc2MDEgNjMuNzQ5MDQsMjg5Ljc0MjAxIDg5LjY3ODM4MywyODkuNzQyMDEgYyAxNi4wMjAwMjcsMCAzMC43MTk3ODcsLTEuMzgyNyA0NC4wOTczMzcsLTQuMTQ3OSAxMy41NDI3MiwtMi45MDQzIDI1LjEwNDEsLTcuNDY3NiAzNC42ODMwOSwtMTMuNjg5MyA5Ljc0NDEzLC02LjM1OTcgMTcuMzQwNDIsLTE0LjUxOTUgMjIuNzkwNTIsLTI0LjQ3NDggNS40NTAxLC0xMC4wOTMzMiA4LjE3NTExLC0yMi4zOTk1OSA4LjE3NTExLC0zNi45MTY4MiAwLC0xMi45OTc2NCAtMy4zMDIxLC0yNC4zMzUzOSAtOS45MDgyOSwtMzQuMDE0NiAtNi40NDEwNSwtOS44MTcyNSAtMTUuNTI1NDUsLTE4LjUyNzA3IC0yNy4yNTE0NiwtMjYuMTMxMzMgLTExLjU2MDg1LC03LjYwNDI3IC0yNy45MTA4MywtMTUuODMxNDIgLTQ5LjA1MDY2LC0yNC42ODAyMiAtMTcuNTA2NDQsLTcuMTkwMTIgLTMwLjcxOTY2OCwtMTMuNjg5NDggLTM5LjYzODAzOCwtMTkuNDk3MDEgLTguOTE4MzcxLC01LjgwNzUyIC0xOC42MDc0NzQsLTEyLjQzNDA5IC0yNC4wOTY1MjQsLTE4Ljg3NDE3IC01LjQyNjA0MywtNi4zNjYxNiAtOS42NTg4MjYsLTE1LjA3MDAzIC05LjY1ODgyNiwtMjQuODg3MjkgMCwtOS4yNjQwMSAyLjA3NTQxNCwtMTcuMjEzNDUgNi4yMjM0NTQsLTIzLjg1MDMzIDExLjA5ODI5OCwtMTQuMzk3NDggNDEuMjg2NjM4LC0xLjc5NTA3IDQ1LjA3NTYwOSwyNC4zNDc2MiA0LjgzOTM5Miw2Ljc3NDkxIDguODQ5MzUsMTYuMjQ3MjkgMTIuMDI5NTE1LDI4LjQxNTYgbCAyMC41MzIzNCwwIDAsLTU1Ljk5OTY3IGMgLTQuNDc4MjUsLTUuOTI0NDggLTkuOTU0ODgsLTEwLjYzMjIyIC0xNS45MDgzNywtMTQuMzc0MTEgMS42NDA1NSwwLjQ3OTA1IDMuMTkwMzksMS4wMjM3NiA0LjYzODY1LDEuNjQwMjQgNi40OTg2MSwyLjYyNjA3IDEyLjE2NzkzLDcuMzI3NDcgMTcuMDA3MywxNC4xMDM0NSA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNSwxNi4yNDU2NyAxMi4wMjk1MiwyOC40MTM5NyAwLDAgOC40ODEyOCwtMC4xMjg5NCA4LjQ4OTc4LC0wLjAwMiAwLjQxNzc2LDYuNDE0OTQgLTEuNzUzMzksOS40NTI4NiAtNC4xMjM0MiwxMi41NjEwNCAtMi40MTc0LDMuMTY5NzggLTUuMTQ0ODYsNi43ODk3MyAtNC4wMDI3OCwxMy4wMDI5IDEuNTA3ODYsOC4yMDMxOCAxMC4xODM1NCwxMC41OTY0MiAxNC42MjE5NCw5LjMxMTU0IC0zLjMxODQyLC0wLjQ5OTExIC01LjMxODU1LC0xLjc0OTQ4IC01LjMxODU1LC0xLjc0OTQ4IDAsMCAxLjg3NjQ2LDAuOTk4NjggNS42NTExNywtMS4zNTk4MSAtMy4yNzY5NSwwLjk1NTcxIC0xMC43MDUyOSwtMC43OTczOCAtMTEuODAxMjUsLTYuNzYzMTMgLTAuOTU3NTIsLTUuMjA4NjEgMC45NDY1NCwtNy4yOTUxNCAzLjQwMTEzLC0xMC41MTQ4MiAyLjQ1NDYyLC0zLjIxOTY4IDUuMjg0MjYsLTYuOTU4MzEgNC42ODQzLC0xNC40ODgyNCBsIDAuMDAzLDAuMDAyIDguOTI2NzYsMCAwLC01NS45OTk2NyBjIC0xNS4wNzEyNSwtMy44NzE2OCAtMjcuNjUzMTQsLTYuMzYwNDIgLTM3Ljc0NjcxLC03LjQ2NTg2IC05Ljk1NTMxLC0xLjEwNzU1IC0yMC4xODgyMywtMS42NTk4MSAtMzAuNjk2NjEzLC0xLjY1OTgxIHogbSA3MC4zMjE2MDMsMTcuMzA4OTMgMC4yMzgwNSw0MC4zMDQ5IGMgMS4zMTgwOCwxLjIyNjY2IDIuNDM5NjUsMi4yNzgxNSAzLjM0MDgxLDMuMTA2MDIgNC44MzkzOSw2Ljc3NDkxIDguODQ5MzQsMTYuMjQ1NjYgMTIuMDI5NTEsMjguNDEzOTcgbCAyMC41MzIzNCwwIDAsLTU1Ljk5OTY3IGMgLTYuNjc3MzEsLTQuNTkzODEgLTE5LjgzNjQzLC0xMC40NzMwOSAtMzYuMTQwNzEsLTE1LjgyNTIyIHogbSAtMjguMTIwNDksNS42MDU1MSA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM3LC02LjQ2Njk3IC0xMy44NDY3OCwtOS43MTcyNiAtOC41NjQ3OSwtMTcuNzE2NTUgeiBtIDIyLjc5NzA1LDAgYyAyLjc3MTUsNy45OTkyOSAxLjc4NzQxLDExLjI0OTU4IC00LjQ5MzU0LDE3LjcxNjU1IGwgNC40OTM1NCwtMTcuNzE2NTUgeiBtIDE1LjIyMTk1LDI0LjAwODQ4IDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzgsLTYuNDY2OTcgLTEzLjg0Njc5LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDQsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gLTk5LjExMzg0LDIuMjA3NjQgOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzODIsLTYuNDY2OTcgLTEzLjg0Njc4MiwtOS43MTcyNiAtOC41NjQ3OSwtMTcuNzE2NTUgeiBtIDIyLjc5NTQyLDAgYyAyLjc3MTUsNy45OTkyOSAxLjc4NzQxLDExLjI0OTU4IC00LjQ5MzU0LDE3LjcxNjU1IGwgNC40OTM1NCwtMTcuNzE2NTUgeiIgLz4KPC9zdmc+CjwhLS0gVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDQuMCBJbnRlcm5hdGlvbmFsIExpY2Vuc2UuIC0tPgo8IS0tIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8gLS0+Cg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff750000',endColorstr='#ff340404',GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-webkit-transform:translateX(-50%) translateY(-8px);-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-right:after{-webkit-transform:translateX(-8px) translateY(-50%);-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input::-webkit-input-placeholder{color:#999}body.syndicate input::-moz-placeholder{color:#999}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"} \ No newline at end of file +@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.clockwork{background:linear-gradient(180deg,#b18b25 0,#5f380e);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffb18b25",endColorstr="#ff5f380e",GradientType=0)}body.clockwork .normal{color:#b18b25}body.clockwork .good{color:#cfba47}body.clockwork .average{color:#896b19}body.clockwork .bad{color:#5f380e}body.clockwork .highlight{color:#b18b25}body.clockwork main{display:block;margin-top:32px;padding:2px 6px 0}body.clockwork hr{height:2px;background-color:#b18b25;border:none}body.clockwork .hidden{display:none}body.clockwork .bar .barText,body.clockwork span.button{color:#b18b25;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.clockwork .bold{font-weight:700}body.clockwork .italic{font-style:italic}body.clockwork [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.clockwork div[data-tooltip],body.clockwork span[data-tooltip]{position:relative}body.clockwork div[data-tooltip]:after,body.clockwork span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #170800;background-color:#2d1400}body.clockwork div[data-tooltip]:hover:after,body.clockwork span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.clockwork div[data-tooltip].tooltip-top:after,body.clockwork span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-top:hover:after,body.clockwork span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-left:after,body.clockwork span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-left:hover:after,body.clockwork span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:hover:after,body.clockwork span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #170800;background:#2d1400}body.clockwork .bar .barText{position:absolute;top:0;right:3px}body.clockwork .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#b18b25}body.clockwork .bar .barFill.good{background-color:#cfba47}body.clockwork .bar .barFill.average{background-color:#896b19}body.clockwork .bar .barFill.bad{background-color:#5f380e}body.clockwork span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #170800}body.clockwork span.button .fa{padding-right:2px}body.clockwork span.button.normal{transition:background-color .5s;background-color:#5f380e}body.clockwork span.button.normal.active:focus,body.clockwork span.button.normal.active:hover{transition:background-color .25s;background-color:#704211;outline:0}body.clockwork span.button.disabled{transition:background-color .5s;background-color:#2d1400}body.clockwork span.button.disabled.active:focus,body.clockwork span.button.disabled.active:hover{transition:background-color .25s;background-color:#441e00;outline:0}body.clockwork span.button.selected{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.selected.active:focus,body.clockwork span.button.selected.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.toggle{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.toggle.active:focus,body.clockwork span.button.toggle.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.caution{transition:background-color .5s;background-color:#be6209}body.clockwork span.button.caution.active:focus,body.clockwork span.button.caution.active:hover{transition:background-color .25s;background-color:#cd6a0a;outline:0}body.clockwork span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.clockwork span.button.danger.active:focus,body.clockwork span.button.danger.active:hover{transition:background-color .25s;background-color:#abaf00;outline:0}body.clockwork span.button.gridable{width:125px;margin:2px 0}body.clockwork span.button+span:not(.button),body.clockwork span:not(.button)+span.button{margin-left:5px}body.clockwork div.display{width:100%;padding:4px;margin:6px 0;background-color:#2d1400;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400);background-color:rgba(45,20,0,.9);box-shadow:inset 0 0 5px rgba(0,0,0,.3)}body.clockwork div.display header,body.clockwork div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#cfba47;border-bottom:2px solid #b18b25}body.clockwork div.display header .buttonRight,body.clockwork div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.clockwork div.display article,body.clockwork div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.clockwork input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#b18b25;background-color:#cfba47;border:1px solid #272727}body.clockwork input::-webkit-input-placeholder{color:#999}body.clockwork input:-ms-input-placeholder{color:#999}body.clockwork input::placeholder{color:#999}body.clockwork input::-ms-clear{display:none}body.clockwork svg.linegraph{overflow:hidden}body.clockwork div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#2d1400;font-weight:700;font-style:italic;background-color:#000;background-image:repeating-linear-gradient(-45deg,#000,#000 10px,#170800 0,#170800 20px)}body.clockwork div.notice .label{color:#2d1400}body.clockwork div.notice .content:only-of-type{padding:0}body.clockwork div.notice hr{background-color:#896b19}body.clockwork div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #5f380e;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.clockwork section .content,body.clockwork section .label,body.clockwork section .line,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.clockwork section{display:table-row;width:100%}body.clockwork section:not(:first-child){padding-top:4px}body.clockwork section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.clockwork section .label{width:1%;padding-right:32px;white-space:nowrap;color:#b18b25}body.clockwork section .content:not(:last-child){padding-right:16px}body.clockwork section .line{width:100%}body.clockwork div.subdisplay{width:100%;margin:0}body.clockwork header.titlebar .close,body.clockwork header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#cfba47}body.clockwork header.titlebar .close:hover,body.clockwork header.titlebar .minimize:hover{color:#d1bd50}body.clockwork header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#5f380e;border-bottom:1px solid #170800;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.clockwork header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.clockwork header.titlebar .title{position:absolute;top:6px;left:46px;color:#cfba47;font-size:16px;white-space:nowrap}body.clockwork header.titlebar .minimize{position:absolute;top:6px;right:46px}body.clockwork header.titlebar .close{position:absolute;top:4px;right:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input::-webkit-input-placeholder{color:#999}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgMjAwIDI4OS43NDIiIG9wYWNpdHk9Ii4zMyI+DQogIDxwYXRoIGQ9Im0gOTMuNTM3Njc3LDAgYyAtMTguMTEzMTI1LDAgLTM0LjIyMDEzMywzLjExMTY0IC00OC4zMjM0ODQsOS4zMzQzNyAtMTMuOTY1MDkyLDYuMjIxNjcgLTI0LjYxMjQ0MiwxNS4wNzExNCAtMzEuOTQwNjUxLDI2LjU0NzEgLTcuMTg5OTM5OCwxMS4zMzc4OSAtMTAuMzAxMjI2NiwyNC43NDkxMSAtMTAuMzAxMjI2Niw0MC4yMzQ3OCAwLDEwLjY0NjYyIDIuNzI1MDAyNiwyMC40NjQ2NSA4LjE3NTExMTYsMjkuNDUyNTggNS42MTUyNzcsOC45ODY4NiAxNC4wMzgyNzcsMTcuMzUyMDQgMjUuMjY4ODIxLDI1LjA5NDM2IDExLjIzMDU0NCw3LjYwNTMxIDI2LjUwNzQyMSwxNS40MTgzNSA0NS44MzA1MTQsMjMuNDM3ODIgMTkuOTgzNzQ4LDguMjk1NTcgMzQuODQ4ODQ4LDE1LjU1NDcxIDQ0LjU5Mjk5OCwyMS43NzYzOCA5Ljc0NDE0LDYuMjIyNzMgMTYuNzYxNywxMi44NTg1IDIxLjA1NTcyLDE5LjkwOTUxIDQuMjk0MDQsNy4wNTIwOCA2LjQ0MTkzLDE1Ljc2NDA4IDYuNDQxOTMsMjYuMTM0NTkgMCwxNi4xNzcwMiAtNS4yMDE5NiwyOC40ODIyMiAtMTUuNjA2NzMsMzYuOTE2ODIgLTEwLjIzOTYsOC40MzQ3IC0yNS4wMjIwMywxMi42NTIzIC00NC4zNDUxNjksMTIuNjUyMyAtMTQuMDM4MTcxLDAgLTI1LjUxNTI0NywtMS42NTk0IC0zNC40MzM2MTgsLTQuOTc3NyAtOC45MTgzNywtMy40NTY2IC0xNi4xODU1NzIsLTguNzExMyAtMjEuODAwODM5LC0xNS43NjMzIC01LjYxNTI3NywtNy4wNTIxIC0xMC4wNzQ3OTUsLTE2LjY2MDg4IC0xMy4zNzc4OTksLTI4LjgyODEyIGwgLTI0Ljc3MzE2MjYyOTM5NDUsMCAwLDU2LjgyNjMyIEMgMzMuODU2NzY5LDI4Ni4wNzYwMSA2My43NDkwNCwyODkuNzQyMDEgODkuNjc4MzgzLDI4OS43NDIwMSBjIDE2LjAyMDAyNywwIDMwLjcxOTc4NywtMS4zODI3IDQ0LjA5NzMzNywtNC4xNDc5IDEzLjU0MjcyLC0yLjkwNDMgMjUuMTA0MSwtNy40Njc2IDM0LjY4MzA5LC0xMy42ODkzIDkuNzQ0MTMsLTYuMzU5NyAxNy4zNDA0MiwtMTQuNTE5NSAyMi43OTA1MiwtMjQuNDc0OCA1LjQ1MDEsLTEwLjA5MzMyIDguMTc1MTEsLTIyLjM5OTU5IDguMTc1MTEsLTM2LjkxNjgyIDAsLTEyLjk5NzY0IC0zLjMwMjEsLTI0LjMzNTM5IC05LjkwODI5LC0zNC4wMTQ2IC02LjQ0MTA1LC05LjgxNzI1IC0xNS41MjU0NSwtMTguNTI3MDcgLTI3LjI1MTQ2LC0yNi4xMzEzMyAtMTEuNTYwODUsLTcuNjA0MjcgLTI3LjkxMDgzLC0xNS44MzE0MiAtNDkuMDUwNjYsLTI0LjY4MDIyIC0xNy41MDY0NCwtNy4xOTAxMiAtMzAuNzE5NjY4LC0xMy42ODk0OCAtMzkuNjM4MDM4LC0xOS40OTcwMSAtOC45MTgzNzEsLTUuODA3NTIgLTE4LjYwNzQ3NCwtMTIuNDM0MDkgLTI0LjA5NjUyNCwtMTguODc0MTcgLTUuNDI2MDQzLC02LjM2NjE2IC05LjY1ODgyNiwtMTUuMDcwMDMgLTkuNjU4ODI2LC0yNC44ODcyOSAwLC05LjI2NDAxIDIuMDc1NDE0LC0xNy4yMTM0NSA2LjIyMzQ1NCwtMjMuODUwMzMgMTEuMDk4Mjk4LC0xNC4zOTc0OCA0MS4yODY2MzgsLTEuNzk1MDcgNDUuMDc1NjA5LDI0LjM0NzYyIDQuODM5MzkyLDYuNzc0OTEgOC44NDkzNSwxNi4yNDcyOSAxMi4wMjk1MTUsMjguNDE1NiBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNC40NzgyNSwtNS45MjQ0OCAtOS45NTQ4OCwtMTAuNjMyMjIgLTE1LjkwODM3LC0xNC4zNzQxMSAxLjY0MDU1LDAuNDc5MDUgMy4xOTAzOSwxLjAyMzc2IDQuNjM4NjUsMS42NDAyNCA2LjQ5ODYxLDIuNjI2MDcgMTIuMTY3OTMsNy4zMjc0NyAxNy4wMDczLDE0LjEwMzQ1IDQuODM5MzksNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NTY3IDEyLjAyOTUyLDI4LjQxMzk3IDAsMCA4LjQ4MTI4LC0wLjEyODk0IDguNDg5NzgsLTAuMDAyIDAuNDE3NzYsNi40MTQ5NCAtMS43NTMzOSw5LjQ1Mjg2IC00LjEyMzQyLDEyLjU2MTA0IC0yLjQxNzQsMy4xNjk3OCAtNS4xNDQ4Niw2Ljc4OTczIC00LjAwMjc4LDEzLjAwMjkgMS41MDc4Niw4LjIwMzE4IDEwLjE4MzU0LDEwLjU5NjQyIDE0LjYyMTk0LDkuMzExNTQgLTMuMzE4NDIsLTAuNDk5MTEgLTUuMzE4NTUsLTEuNzQ5NDggLTUuMzE4NTUsLTEuNzQ5NDggMCwwIDEuODc2NDYsMC45OTg2OCA1LjY1MTE3LC0xLjM1OTgxIC0zLjI3Njk1LDAuOTU1NzEgLTEwLjcwNTI5LC0wLjc5NzM4IC0xMS44MDEyNSwtNi43NjMxMyAtMC45NTc1MiwtNS4yMDg2MSAwLjk0NjU0LC03LjI5NTE0IDMuNDAxMTMsLTEwLjUxNDgyIDIuNDU0NjIsLTMuMjE5NjggNS4yODQyNiwtNi45NTgzMSA0LjY4NDMsLTE0LjQ4ODI0IGwgMC4wMDMsMC4wMDIgOC45MjY3NiwwIDAsLTU1Ljk5OTY3IGMgLTE1LjA3MTI1LC0zLjg3MTY4IC0yNy42NTMxNCwtNi4zNjA0MiAtMzcuNzQ2NzEsLTcuNDY1ODYgLTkuOTU1MzEsLTEuMTA3NTUgLTIwLjE4ODIzLC0xLjY1OTgxIC0zMC42OTY2MTMsLTEuNjU5ODEgeiBtIDcwLjMyMTYwMywxNy4zMDg5MyAwLjIzODA1LDQwLjMwNDkgYyAxLjMxODA4LDEuMjI2NjYgMi40Mzk2NSwyLjI3ODE1IDMuMzQwODEsMy4xMDYwMiA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNCwxNi4yNDU2NiAxMi4wMjk1MSwyOC40MTM5NyBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNi42NzczMSwtNC41OTM4MSAtMTkuODM2NDMsLTEwLjQ3MzA5IC0zNi4xNDA3MSwtMTUuODI1MjIgeiBtIC0yOC4xMjA0OSw1LjYwNTUxIDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzcsLTYuNDY2OTcgLTEzLjg0Njc4LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDUsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gMTUuMjIxOTUsMjQuMDA4NDggOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzOCwtNi40NjY5NyAtMTMuODQ2NzksLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNCwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAtOTkuMTEzODQsMi4yMDc2NCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4MiwtNi40NjY5NyAtMTMuODQ2NzgyLC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk1NDIsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff750000",endColorstr="#ff340404",GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input::-webkit-input-placeholder{color:#999}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"} \ No newline at end of file diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index a6e58022815..7f024a02be8 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;o=0;--a){var r=this.tryEntries[a],i=r.completion;if("root"===r.tryLoc)return e("end");if(r.tryLoc<=this.prev){var o=b.call(r,"catchLoc"),s=b.call(r,"finallyLoc");if(o&&s){if(this.prev=0;--n){var a=this.tryEntries[n];if(a.tryLoc<=this.prev&&b.call(a,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),d(n),E}},"catch":function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var a=n.completion;if("throw"===a.type){var r=a.arg;d(n)}return r}}throw Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:m(t),resultName:e,nextLoc:n},E}}}("object"==typeof n?n:"object"==typeof window?window:"object"==typeof self?self:this)}).call(this,t(190),void 0!==n?n:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{190:190}],3:[function(t,e,n){e.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},{}],4:[function(t,e,n){var a=t(84)("unscopables"),r=Array.prototype;void 0==r[a]&&t(32)(r,a,{}),e.exports=function(t){r[a][t]=!0}},{32:32,84:84}],5:[function(t,e,n){var a=t(39);e.exports=function(t){if(!a(t))throw TypeError(t+" is not an object!");return t}},{39:39}],6:[function(t,e,n){"use strict";var a=t(81),r=t(77),i=t(80);e.exports=[].copyWithin||function(t,e){var n=a(this),o=i(n.length),s=r(t,o),p=r(e,o),u=arguments,c=u.length>2?u[2]:void 0,l=Math.min((void 0===c?o:r(c,o))-p,o-s),f=1;for(s>p&&p+l>s&&(f=-1,p+=l-1,s+=l-1);l-- >0;)p in n?n[s]=n[p]:delete n[s],s+=f,p+=f;return n}},{77:77,80:80,81:81}],7:[function(t,e,n){"use strict";var a=t(81),r=t(77),i=t(80);e.exports=[].fill||function(t){for(var e=a(this),n=i(e.length),o=arguments,s=o.length,p=r(s>1?o[1]:void 0,n),u=s>2?o[2]:void 0,c=void 0===u?n:r(u,n);c>p;)e[p++]=t;return e}},{77:77,80:80,81:81}],8:[function(t,e,n){var a=t(79),r=t(80),i=t(77);e.exports=function(t){return function(e,n,o){var s,p=a(e),u=r(p.length),c=i(o,u);if(t&&n!=n){for(;u>c;)if(s=p[c++],s!=s)return!0}else for(;u>c;c++)if((t||c in p)&&p[c]===n)return t||c;return!t&&-1}}},{77:77,79:79,80:80}],9:[function(t,e,n){var a=t(18),r=t(35),i=t(81),o=t(80),s=t(10);e.exports=function(t){var e=1==t,n=2==t,p=3==t,u=4==t,c=6==t,l=5==t||c;return function(f,d,h){for(var m,v,g=i(f),b=r(g),y=a(d,h,3),_=o(b.length),x=0,w=e?s(f,_):n?s(f,0):void 0;_>x;x++)if((l||x in b)&&(m=b[x],v=y(m,x,g),t))if(e)w[x]=v;else if(v)switch(t){case 3:return!0;case 5:return m;case 6:return x;case 2:w.push(m)}else if(u)return!1;return c?-1:p||u?u:w}}},{10:10,18:18,35:35,80:80,81:81}],10:[function(t,e,n){var a=t(39),r=t(37),i=t(84)("species");e.exports=function(t,e){var n;return r(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!r(n.prototype)||(n=void 0),a(n)&&(n=n[i],null===n&&(n=void 0))),new(void 0===n?Array:n)(e)}},{37:37,39:39,84:84}],11:[function(t,e,n){var a=t(12),r=t(84)("toStringTag"),i="Arguments"==a(function(){return arguments}());e.exports=function(t){var e,n,o;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=(e=Object(t))[r])?n:i?a(e):"Object"==(o=a(e))&&"function"==typeof e.callee?"Arguments":o}},{12:12,84:84}],12:[function(t,e,n){var a={}.toString;e.exports=function(t){return a.call(t).slice(8,-1)}},{}],13:[function(t,e,n){"use strict";var a=t(47),r=t(32),i=t(61),o=t(18),s=t(70),p=t(19),u=t(28),c=t(43),l=t(45),f=t(83)("id"),d=t(31),h=t(39),m=t(66),v=t(20),g=Object.isExtensible||h,b=v?"_s":"size",y=0,_=function(t,e){if(!h(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!d(t,f)){if(!g(t))return"F";if(!e)return"E";r(t,f,++y)}return"O"+t[f]},x=function(t,e){var n,a=_(e);if("F"!==a)return t._i[a];for(n=t._f;n;n=n.n)if(n.k==e)return n};e.exports={getConstructor:function(t,e,n,r){var c=t(function(t,i){s(t,c,e),t._i=a.create(null),t._f=void 0,t._l=void 0,t[b]=0,void 0!=i&&u(i,n,t[r],t)});return i(c.prototype,{clear:function(){for(var t=this,e=t._i,n=t._f;n;n=n.n)n.r=!0,n.p&&(n.p=n.p.n=void 0),delete e[n.i];t._f=t._l=void 0,t[b]=0},"delete":function(t){var e=this,n=x(e,t);if(n){var a=n.n,r=n.p;delete e._i[n.i],n.r=!0,r&&(r.n=a),a&&(a.p=r),e._f==n&&(e._f=a),e._l==n&&(e._l=r),e[b]--}return!!n},forEach:function(t){for(var e,n=o(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.n:this._f;)for(n(e.v,e.k,this);e&&e.r;)e=e.p},has:function(t){return!!x(this,t)}}),v&&a.setDesc(c.prototype,"size",{get:function(){return p(this[b])}}),c},def:function(t,e,n){var a,r,i=x(t,e);return i?i.v=n:(t._l=i={i:r=_(e,!0),k:e,v:n,p:a=t._l,n:void 0,r:!1},t._f||(t._f=i),a&&(a.n=i),t[b]++,"F"!==r&&(t._i[r]=i)),t},getEntry:x,setStrong:function(t,e,n){c(t,e,function(t,e){this._t=t,this._k=e,this._l=void 0},function(){for(var t=this,e=t._k,n=t._l;n&&n.r;)n=n.p;return t._t&&(t._l=n=n?n.n:t._t._f)?"keys"==e?l(0,n.k):"values"==e?l(0,n.v):l(0,[n.k,n.v]):(t._t=void 0,l(1))},n?"entries":"values",!n,!0),m(e)}}},{18:18,19:19,20:20,28:28,31:31,32:32,39:39,43:43,45:45,47:47,61:61,66:66,70:70,83:83}],14:[function(t,e,n){var a=t(28),r=t(11);e.exports=function(t){return function(){if(r(this)!=t)throw TypeError(t+"#toJSON isn't generic");var e=[];return a(this,!1,e.push,e),e}}},{11:11,28:28}],15:[function(t,e,n){"use strict";var a=t(32),r=t(61),i=t(5),o=t(39),s=t(70),p=t(28),u=t(9),c=t(31),l=t(83)("weak"),f=Object.isExtensible||o,d=u(5),h=u(6),m=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},b=function(t,e){return d(t.a,function(t){return t[0]===e})};g.prototype={get:function(t){var e=b(this,t);return e?e[1]:void 0},has:function(t){return!!b(this,t)},set:function(t,e){var n=b(this,t);n?n[1]=e:this.a.push([t,e])},"delete":function(t){var e=h(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},e.exports={getConstructor:function(t,e,n,a){var i=t(function(t,r){s(t,i,e),t._i=m++,t._l=void 0,void 0!=r&&p(r,n,t[a],t)});return r(i.prototype,{"delete":function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i)&&delete t[l][this._i]:v(this)["delete"](t):!1},has:function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i):v(this).has(t):!1}}),i},def:function(t,e,n){return f(i(e))?(c(e,l)||a(e,l,{}),e[l][t._i]=n):v(t).set(e,n),t},frozenStore:v,WEAK:l}},{28:28,31:31,32:32,39:39,5:5,61:61,70:70,83:83,9:9}],16:[function(t,e,n){"use strict";var a=t(30),r=t(23),i=t(62),o=t(61),s=t(28),p=t(70),u=t(39),c=t(25),l=t(44),f=t(67);e.exports=function(t,e,n,d,h,m){var v=a[t],g=v,b=h?"set":"add",y=g&&g.prototype,_={},x=function(t){var e=y[t];i(y,t,"delete"==t?function(t){return m&&!u(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!u(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!u(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof g&&(m||y.forEach&&!c(function(){(new g).entries().next()}))){var w,k=new g,P=k[b](m?{}:-0,1)!=k,C=c(function(){k.has(1)}),E=l(function(t){new g(t)});E||(g=e(function(e,n){p(e,g,t);var a=new v;return void 0!=n&&s(n,h,a[b],a),a}),g.prototype=y,y.constructor=g),m||k.forEach(function(t,e){w=1/e===-(1/0)}),(C||w)&&(x("delete"),x("has"),h&&x("get")),(w||P)&&x(b),m&&y.clear&&delete y.clear}else g=d.getConstructor(e,t,h,b),o(g.prototype,n);return f(g,t),_[t]=g,r(r.G+r.W+r.F*(g!=v),_),m||d.setStrong(g,t,h),g}},{23:23,25:25,28:28,30:30,39:39,44:44,61:61,62:62,67:67,70:70}],17:[function(t,e,n){var a=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=a)},{}],18:[function(t,e,n){var a=t(3);e.exports=function(t,e,n){if(a(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,a){return t.call(e,n,a)};case 3:return function(n,a,r){return t.call(e,n,a,r)}}return function(){return t.apply(e,arguments)}}},{3:3}],19:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],20:[function(t,e,n){e.exports=!t(25)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{25:25}],21:[function(t,e,n){var a=t(39),r=t(30).document,i=a(r)&&a(r.createElement);e.exports=function(t){return i?r.createElement(t):{}}},{30:30,39:39}],22:[function(t,e,n){var a=t(47);e.exports=function(t){var e=a.getKeys(t),n=a.getSymbols;if(n)for(var r,i=n(t),o=a.isEnum,s=0;i.length>s;)o.call(t,r=i[s++])&&e.push(r);return e}},{47:47}],23:[function(t,e,n){var a=t(30),r=t(17),i=t(32),o=t(62),s=t(18),p="prototype",u=function(t,e,n){var c,l,f,d,h=t&u.F,m=t&u.G,v=t&u.S,g=t&u.P,b=t&u.B,y=m?a:v?a[e]||(a[e]={}):(a[e]||{})[p],_=m?r:r[e]||(r[e]={}),x=_[p]||(_[p]={});m&&(n=e);for(c in n)l=!h&&y&&c in y,f=(l?y:n)[c],d=b&&l?s(f,a):g&&"function"==typeof f?s(Function.call,f):f,y&&!l&&o(y,c,f),_[c]!=f&&i(_,c,d),g&&x[c]!=f&&(x[c]=f)};a.core=r,u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,e.exports=u},{17:17,18:18,30:30,32:32,62:62}],24:[function(t,e,n){var a=t(84)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[a]=!1,!"/./"[t](e)}catch(r){}}return!0}},{84:84}],25:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],26:[function(t,e,n){"use strict";var a=t(32),r=t(62),i=t(25),o=t(19),s=t(84);e.exports=function(t,e,n){var p=s(t),u=""[t];i(function(){var e={};return e[p]=function(){return 7},7!=""[t](e)})&&(r(String.prototype,t,n(o,p,u)),a(RegExp.prototype,p,2==e?function(t,e){return u.call(t,this,e)}:function(t){return u.call(t,this)}))}},{19:19,25:25,32:32,62:62,84:84}],27:[function(t,e,n){"use strict";var a=t(5);e.exports=function(){var t=a(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},{5:5}],28:[function(t,e,n){var a=t(18),r=t(41),i=t(36),o=t(5),s=t(80),p=t(85);e.exports=function(t,e,n,u){var c,l,f,d=p(t),h=a(n,u,e?2:1),m=0;if("function"!=typeof d)throw TypeError(t+" is not iterable!");if(i(d))for(c=s(t.length);c>m;m++)e?h(o(l=t[m])[0],l[1]):h(t[m]);else for(f=d.call(t);!(l=f.next()).done;)r(f,h,l.value,e)}},{18:18,36:36,41:41,5:5,80:80,85:85}],29:[function(t,e,n){var a=t(79),r=t(47).getNames,i={}.toString,o="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return r(t)}catch(e){return o.slice()}};e.exports.get=function(t){return o&&"[object Window]"==i.call(t)?s(t):r(a(t))}},{47:47,79:79}],30:[function(t,e,n){var a=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=a)},{}],31:[function(t,e,n){var a={}.hasOwnProperty;e.exports=function(t,e){return a.call(t,e)}},{}],32:[function(t,e,n){var a=t(47),r=t(60);e.exports=t(20)?function(t,e,n){return a.setDesc(t,e,r(1,n))}:function(t,e,n){return t[e]=n,t}},{20:20,47:47,60:60}],33:[function(t,e,n){e.exports=t(30).document&&document.documentElement},{30:30}],34:[function(t,e,n){e.exports=function(t,e,n){var a=void 0===n;switch(e.length){case 0:return a?t():t.call(n);case 1:return a?t(e[0]):t.call(n,e[0]);case 2:return a?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return a?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return a?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},{}],35:[function(t,e,n){var a=t(12);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==a(t)?t.split(""):Object(t)}},{12:12}],36:[function(t,e,n){var a=t(46),r=t(84)("iterator"),i=Array.prototype;e.exports=function(t){return void 0!==t&&(a.Array===t||i[r]===t)}},{46:46,84:84}],37:[function(t,e,n){var a=t(12);e.exports=Array.isArray||function(t){return"Array"==a(t)}},{12:12}],38:[function(t,e,n){var a=t(39),r=Math.floor;e.exports=function(t){return!a(t)&&isFinite(t)&&r(t)===t}},{39:39}],39:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],40:[function(t,e,n){var a=t(39),r=t(12),i=t(84)("match");e.exports=function(t){var e;return a(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==r(t))}},{12:12,39:39,84:84}],41:[function(t,e,n){var a=t(5);e.exports=function(t,e,n,r){try{return r?e(a(n)[0],n[1]):e(n)}catch(i){var o=t["return"];throw void 0!==o&&a(o.call(t)),i}}},{5:5}],42:[function(t,e,n){"use strict";var a=t(47),r=t(60),i=t(67),o={};t(32)(o,t(84)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=a.create(o,{next:r(1,n)}),i(t,e+" Iterator")}},{32:32,47:47,60:60,67:67,84:84}],43:[function(t,e,n){"use strict";var a=t(49),r=t(23),i=t(62),o=t(32),s=t(31),p=t(46),u=t(42),c=t(67),l=t(47).getProto,f=t(84)("iterator"),d=!([].keys&&"next"in[].keys()),h="@@iterator",m="keys",v="values",g=function(){return this};e.exports=function(t,e,n,b,y,_,x){u(n,e,b);var w,k,P=function(t){if(!d&&t in A)return A[t];switch(t){case m:return function(){return new n(this,t)};case v:return function(){return new n(this,t)}}return function(){return new n(this,t)}},C=e+" Iterator",E=y==v,S=!1,A=t.prototype,O=A[f]||A[h]||y&&A[y],T=O||P(y);if(O){var M=l(T.call(new t));c(M,C,!0),!a&&s(A,h)&&o(M,f,g),E&&O.name!==v&&(S=!0,T=function(){return O.call(this)})}if(a&&!x||!d&&!S&&A[f]||o(A,f,T),p[e]=T,p[C]=g,y)if(w={values:E?T:P(v),keys:_?T:P(m),entries:E?P("entries"):T},x)for(k in w)k in A||i(A,k,w[k]);else r(r.P+r.F*(d||S),e,w);return w}},{23:23,31:31,32:32,42:42,46:46,47:47,49:49,62:62,67:67,84:84}],44:[function(t,e,n){var a=t(84)("iterator"),r=!1;try{var i=[7][a]();i["return"]=function(){r=!0},Array.from(i,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!r)return!1;var n=!1;try{var i=[7],o=i[a]();o.next=function(){n=!0},i[a]=function(){return o},t(i)}catch(s){}return n}},{84:84}],45:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],46:[function(t,e,n){e.exports={}},{}],47:[function(t,e,n){var a=Object;e.exports={create:a.create,getProto:a.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:a.getOwnPropertyDescriptor,setDesc:a.defineProperty,setDescs:a.defineProperties,getKeys:a.keys,getNames:a.getOwnPropertyNames,getSymbols:a.getOwnPropertySymbols,each:[].forEach}},{}],48:[function(t,e,n){var a=t(47),r=t(79);e.exports=function(t,e){for(var n,i=r(t),o=a.getKeys(i),s=o.length,p=0;s>p;)if(i[n=o[p++]]===e)return n}},{47:47,79:79}],49:[function(t,e,n){e.exports=!1},{}],50:[function(t,e,n){e.exports=Math.expm1||function(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}},{}],51:[function(t,e,n){e.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&1e-8>t?t-t*t/2:Math.log(1+t)}},{}],52:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],53:[function(t,e,n){var a,r,i,o=t(30),s=t(76).set,p=o.MutationObserver||o.WebKitMutationObserver,u=o.process,c=o.Promise,l="process"==t(12)(u),f=function(){var t,e,n;for(l&&(t=u.domain)&&(u.domain=null,t.exit());a;)e=a.domain,n=a.fn,e&&e.enter(),n(),e&&e.exit(),a=a.next;r=void 0,t&&t.enter()};if(l)i=function(){u.nextTick(f)};else if(p){var d=1,h=document.createTextNode("");new p(f).observe(h,{characterData:!0}),i=function(){h.data=d=-d}}else i=c&&c.resolve?function(){c.resolve().then(f)}:function(){s.call(o,f)};e.exports=function(t){var e={fn:t,next:void 0,domain:l&&u.domain};r&&(r.next=e),a||(a=e,i()),r=e}},{12:12,30:30,76:76}],54:[function(t,e,n){var a=t(47),r=t(81),i=t(35);e.exports=t(25)(function(){var t=Object.assign,e={},n={},a=Symbol(),r="abcdefghijklmnopqrst";return e[a]=7,r.split("").forEach(function(t){n[t]=t}),7!=t({},e)[a]||Object.keys(t({},n)).join("")!=r})?function(t,e){for(var n=r(t),o=arguments,s=o.length,p=1,u=a.getKeys,c=a.getSymbols,l=a.isEnum;s>p;)for(var f,d=i(o[p++]),h=c?u(d).concat(c(d)):u(d),m=h.length,v=0;m>v;)l.call(d,f=h[v++])&&(n[f]=d[f]);return n}:Object.assign},{25:25,35:35,47:47,81:81}],55:[function(t,e,n){var a=t(23),r=t(17),i=t(25);e.exports=function(t,e){var n=(r.Object||{})[t]||Object[t],o={};o[t]=e(n),a(a.S+a.F*i(function(){n(1)}),"Object",o)}},{17:17,23:23,25:25}],56:[function(t,e,n){var a=t(47),r=t(79),i=a.isEnum;e.exports=function(t){return function(e){for(var n,o=r(e),s=a.getKeys(o),p=s.length,u=0,c=[];p>u;)i.call(o,n=s[u++])&&c.push(t?[n,o[n]]:o[n]);return c}}},{47:47,79:79}],57:[function(t,e,n){var a=t(47),r=t(5),i=t(30).Reflect;e.exports=i&&i.ownKeys||function(t){var e=a.getNames(r(t)),n=a.getSymbols;return n?e.concat(n(t)):e}},{30:30,47:47,5:5}],58:[function(t,e,n){"use strict";var a=t(59),r=t(34),i=t(3);e.exports=function(){for(var t=i(this),e=arguments.length,n=Array(e),o=0,s=a._,p=!1;e>o;)(n[o]=arguments[o++])===s&&(p=!0);return function(){var a,i=this,o=arguments,u=o.length,c=0,l=0;if(!p&&!u)return r(t,n,i);if(a=n.slice(),p)for(;e>c;c++)a[c]===s&&(a[c]=o[l++]);for(;u>l;)a.push(o[l++]);return r(t,a,i)}}},{3:3,34:34,59:59}],59:[function(t,e,n){e.exports=t(30)},{30:30}],60:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],61:[function(t,e,n){var a=t(62);e.exports=function(t,e){for(var n in e)a(t,n,e[n]);return t}},{62:62}],62:[function(t,e,n){var a=t(30),r=t(32),i=t(83)("src"),o="toString",s=Function[o],p=(""+s).split(o);t(17).inspectSource=function(t){return s.call(t)},(e.exports=function(t,e,n,o){"function"==typeof n&&(n.hasOwnProperty(i)||r(n,i,t[e]?""+t[e]:p.join(e+"")),n.hasOwnProperty("name")||r(n,"name",e)),t===a?t[e]=n:(o||delete t[e],r(t,e,n))})(Function.prototype,o,function(){return"function"==typeof this&&this[i]||s.call(this)})},{17:17,30:30,32:32,83:83}],63:[function(t,e,n){e.exports=function(t,e){var n=e===Object(e)?function(t){return e[t]}:e;return function(e){return(e+"").replace(t,n)}}},{}],64:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],65:[function(t,e,n){var a=t(47).getDesc,r=t(39),i=t(5),o=function(t,e){if(i(t),!r(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,r){try{r=t(18)(Function.call,a(Object.prototype,"__proto__").set,2),r(e,[]),n=!(e instanceof Array)}catch(i){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:r(t,e),t}}({},!1):void 0),check:o}},{18:18,39:39,47:47,5:5}],66:[function(t,e,n){"use strict";var a=t(30),r=t(47),i=t(20),o=t(84)("species");e.exports=function(t){var e=a[t];i&&e&&!e[o]&&r.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{20:20,30:30,47:47,84:84}],67:[function(t,e,n){var a=t(47).setDesc,r=t(31),i=t(84)("toStringTag");e.exports=function(t,e,n){t&&!r(t=n?t:t.prototype,i)&&a(t,i,{configurable:!0,value:e})}},{31:31,47:47,84:84}],68:[function(t,e,n){var a=t(30),r="__core-js_shared__",i=a[r]||(a[r]={});e.exports=function(t){return i[t]||(i[t]={})}},{30:30}],69:[function(t,e,n){var a=t(5),r=t(3),i=t(84)("species");e.exports=function(t,e){var n,o=a(t).constructor;return void 0===o||void 0==(n=a(o)[i])?e:r(n)}},{3:3,5:5,84:84}],70:[function(t,e,n){e.exports=function(t,e,n){if(!(t instanceof e))throw TypeError(n+": use the 'new' operator!");return t}},{}],71:[function(t,e,n){var a=t(78),r=t(19);e.exports=function(t){return function(e,n){var i,o,s=r(e)+"",p=a(n),u=s.length;return 0>p||p>=u?t?"":void 0:(i=s.charCodeAt(p),55296>i||i>56319||p+1===u||(o=s.charCodeAt(p+1))<56320||o>57343?t?s.charAt(p):i:t?s.slice(p,p+2):(i-55296<<10)+(o-56320)+65536)}}},{19:19,78:78}],72:[function(t,e,n){var a=t(40),r=t(19);e.exports=function(t,e,n){if(a(e))throw TypeError("String#"+n+" doesn't accept regex!");return r(t)+""}},{19:19,40:40}],73:[function(t,e,n){var a=t(80),r=t(74),i=t(19);e.exports=function(t,e,n,o){var s=i(t)+"",p=s.length,u=void 0===n?" ":n+"",c=a(e);if(p>=c)return s;""==u&&(u=" ");var l=c-p,f=r.call(u,Math.ceil(l/u.length));return f.length>l&&(f=f.slice(0,l)),o?f+s:s+f}},{19:19,74:74,80:80}],74:[function(t,e,n){"use strict";var a=t(78),r=t(19);e.exports=function(t){var e=r(this)+"",n="",i=a(t);if(0>i||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(e+=e))1&i&&(n+=e);return n}},{19:19,78:78}],75:[function(t,e,n){var a=t(23),r=t(19),i=t(25),o=" \n\x0B\f\r   ᠎              \u2028\u2029\ufeff",s="["+o+"]",p="​…",u=RegExp("^"+s+s+"*"),c=RegExp(s+s+"*$"),l=function(t,e){var n={};n[t]=e(f),a(a.P+a.F*i(function(){return!!o[t]()||p[t]()!=p}),"String",n)},f=l.trim=function(t,e){return t=r(t)+"",1&e&&(t=t.replace(u,"")),2&e&&(t=t.replace(c,"")),t};e.exports=l},{19:19,23:23,25:25}],76:[function(t,e,n){var a,r,i,o=t(18),s=t(34),p=t(33),u=t(21),c=t(30),l=c.process,f=c.setImmediate,d=c.clearImmediate,h=c.MessageChannel,m=0,v={},g="onreadystatechange",b=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},y=function(t){b.call(t.data)};f&&d||(f=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++m]=function(){s("function"==typeof t?t:Function(t),e)},a(m),m},d=function(t){delete v[t]},"process"==t(12)(l)?a=function(t){l.nextTick(o(b,t,1))}:h?(r=new h,i=r.port2,r.port1.onmessage=y,a=o(i.postMessage,i,1)):c.addEventListener&&"function"==typeof postMessage&&!c.importScripts?(a=function(t){c.postMessage(t+"","*")},c.addEventListener("message",y,!1)):a=g in u("script")?function(t){p.appendChild(u("script"))[g]=function(){p.removeChild(this),b.call(t)}}:function(t){setTimeout(o(b,t,1),0)}),e.exports={set:f,clear:d}},{12:12,18:18,21:21,30:30,33:33,34:34}],77:[function(t,e,n){var a=t(78),r=Math.max,i=Math.min;e.exports=function(t,e){return t=a(t),0>t?r(t+e,0):i(t,e)}},{78:78}],78:[function(t,e,n){var a=Math.ceil,r=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?r:a)(t)}},{}],79:[function(t,e,n){var a=t(35),r=t(19);e.exports=function(t){return a(r(t))}},{19:19,35:35}],80:[function(t,e,n){var a=t(78),r=Math.min;e.exports=function(t){return t>0?r(a(t),9007199254740991):0}},{78:78}],81:[function(t,e,n){var a=t(19);e.exports=function(t){return Object(a(t))}},{19:19}],82:[function(t,e,n){var a=t(39);e.exports=function(t,e){if(!a(t))return t;var n,r;if(e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;if("function"==typeof(n=t.valueOf)&&!a(r=n.call(t)))return r;if(!e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;throw TypeError("Can't convert object to primitive value")}},{39:39}],83:[function(t,e,n){var a=0,r=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++a+r).toString(36))}},{}],84:[function(t,e,n){var a=t(68)("wks"),r=t(83),i=t(30).Symbol;e.exports=function(t){return a[t]||(a[t]=i&&i[t]||(i||r)("Symbol."+t))}},{30:30,68:68,83:83}],85:[function(t,e,n){var a=t(11),r=t(84)("iterator"),i=t(46);e.exports=t(17).getIteratorMethod=function(t){return void 0!=t?t[r]||t["@@iterator"]||i[a(t)]:void 0}},{11:11,17:17,46:46,84:84}],86:[function(t,e,n){"use strict";var a,r=t(47),i=t(23),o=t(20),s=t(60),p=t(33),u=t(21),c=t(31),l=t(12),f=t(34),d=t(25),h=t(5),m=t(3),v=t(39),g=t(81),b=t(79),y=t(78),_=t(77),x=t(80),w=t(35),k=t(83)("__proto__"),P=t(9),C=t(8)(!1),E=Object.prototype,S=Array.prototype,A=S.slice,O=S.join,T=r.setDesc,M=r.getDesc,R=r.setDescs,j={};o||(a=!d(function(){return 7!=T(u("div"),"a",{get:function(){return 7}}).a}),r.setDesc=function(t,e,n){if(a)try{return T(t,e,n)}catch(r){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(h(t)[e]=n.value),t},r.getDesc=function(t,e){if(a)try{return M(t,e)}catch(n){}return c(t,e)?s(!E.propertyIsEnumerable.call(t,e),t[e]):void 0},r.setDescs=R=function(t,e){h(t);for(var n,a=r.getKeys(e),i=a.length,o=0;i>o;)r.setDesc(t,n=a[o++],e[n]);return t}),i(i.S+i.F*!o,"Object",{getOwnPropertyDescriptor:r.getDesc,defineProperty:r.setDesc,defineProperties:R});var L="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),N=L.concat("length","prototype"),D=L.length,F=function(){var t,e=u("iframe"),n=D,a=">";for(e.style.display="none",p.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("