diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm index e413e2ddba..4b50904ea2 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm @@ -12,6 +12,10 @@ /turf/closed/wall/mineral/plastitanium, /area/ruin/powered/syndicate_lava_base) "ae" = ( +/obj/item/weapon/bombcore/large/underwall, +/turf/closed/wall/mineral/plastitanium, +/area/ruin/powered/syndicate_lava_base) +"af" = ( /obj/structure/closet/secure_closet/bar{ req_access = null; req_access_txt = "150" @@ -20,7 +24,7 @@ dir = 10 }, /area/ruin/powered/syndicate_lava_base) -"af" = ( +"ag" = ( /obj/structure/table/wood, /obj/item/weapon/reagent_containers/food/snacks/syndicake, /obj/item/weapon/reagent_containers/food/snacks/syndicake, @@ -32,7 +36,7 @@ }, /turf/open/floor/plasteel/podhatch, /area/ruin/powered/syndicate_lava_base) -"ag" = ( +"ah" = ( /obj/structure/table/wood, /obj/item/weapon/reagent_containers/food/snacks/salad/validsalad, /turf/open/floor/plasteel/podhatch{ @@ -41,7 +45,7 @@ dir = 6 }, /area/ruin/powered/syndicate_lava_base) -"ah" = ( +"ai" = ( /obj/structure/rack{ icon = 'icons/obj/stationobjs.dmi'; icon_state = "minibar_left"; @@ -50,7 +54,7 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle/vodka, /turf/open/floor/wood, /area/ruin/powered/syndicate_lava_base) -"ai" = ( +"aj" = ( /obj/structure/rack{ icon = 'icons/obj/stationobjs.dmi'; icon_state = "minibar_right"; @@ -59,7 +63,7 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle/gin, /turf/open/floor/wood, /area/ruin/powered/syndicate_lava_base) -"aj" = ( +"ak" = ( /obj/structure/dresser, /obj/structure/mirror{ desc = "Mirror mirror on the wall, who is the most robust of them all?"; @@ -67,40 +71,40 @@ }, /turf/open/floor/plasteel/vault, /area/ruin/powered/syndicate_lava_base) -"ak" = ( +"al" = ( /obj/item/weapon/twohanded/required/kirbyplants{ icon_state = "plant-21"; layer = 4.1 }, /turf/open/floor/plasteel/vault, /area/ruin/powered/syndicate_lava_base) -"al" = ( +"am" = ( /obj/item/weapon/twohanded/required/kirbyplants{ icon_state = "plant-22" }, /turf/open/floor/plasteel/vault, /area/ruin/powered/syndicate_lava_base) -"am" = ( +"an" = ( /obj/structure/table/wood, /obj/item/weapon/clipboard, /obj/item/toy/figure/syndie, /turf/open/floor/plasteel/vault, /area/ruin/powered/syndicate_lava_base) -"an" = ( +"ao" = ( /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plasteel/podhatch{ dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"ao" = ( +"ap" = ( /turf/open/floor/plasteel/black, /area/ruin/powered/syndicate_lava_base) -"ap" = ( +"aq" = ( /turf/open/floor/plasteel/vault{ dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"aq" = ( +"ar" = ( /obj/item/stack/sheet/mineral/plastitanium{ amount = 30 }, @@ -112,10 +116,10 @@ dir = 9 }, /area/ruin/powered/syndicate_lava_base) -"ar" = ( +"as" = ( /turf/open/floor/wood, /area/ruin/powered/syndicate_lava_base) -"as" = ( +"at" = ( /obj/effect/mob_spawn/human/lavaland_syndicate{ tag = "icon-sleeper_s (EAST)"; icon_state = "sleeper_s"; @@ -123,10 +127,10 @@ }, /turf/open/floor/plasteel/grimy, /area/ruin/powered/syndicate_lava_base) -"at" = ( +"au" = ( /turf/open/floor/plasteel/grimy, /area/ruin/powered/syndicate_lava_base) -"au" = ( +"av" = ( /obj/effect/mob_spawn/human/lavaland_syndicate{ tag = "icon-sleeper_s (WEST)"; icon_state = "sleeper_s"; @@ -134,7 +138,7 @@ }, /turf/open/floor/plasteel/grimy, /area/ruin/powered/syndicate_lava_base) -"av" = ( +"aw" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plasteel/podhatch{ tag = "icon-podhatch (EAST)"; @@ -142,7 +146,7 @@ dir = 4 }, /area/ruin/powered/syndicate_lava_base) -"aw" = ( +"ax" = ( /obj/item/stack/cable_coil/white, /obj/item/stack/cable_coil/white, /obj/item/stack/packageWrap, @@ -152,17 +156,6 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"ax" = ( -/obj/structure/table/wood, -/obj/item/ammo_box/magazine/m10mm, -/obj/item/ammo_box/magazine/m10mm, -/obj/item/ammo_box/magazine/m10mm, -/obj/item/ammo_box/magazine/m10mm, -/obj/item/ammo_box/magazine/sniper_rounds, -/obj/item/ammo_box/magazine/sniper_rounds, -/obj/item/ammo_box/magazine/sniper_rounds, -/turf/open/floor/plasteel/grimy, -/area/ruin/powered/syndicate_lava_base) "ay" = ( /obj/structure/table/wood, /obj/item/ammo_box/magazine/m10mm, @@ -172,12 +165,23 @@ /obj/item/ammo_box/magazine/sniper_rounds, /obj/item/ammo_box/magazine/sniper_rounds, /obj/item/ammo_box/magazine/sniper_rounds, +/turf/open/floor/plasteel/grimy, +/area/ruin/powered/syndicate_lava_base) +"az" = ( +/obj/structure/table/wood, +/obj/item/ammo_box/magazine/m10mm, +/obj/item/ammo_box/magazine/m10mm, +/obj/item/ammo_box/magazine/m10mm, +/obj/item/ammo_box/magazine/m10mm, +/obj/item/ammo_box/magazine/sniper_rounds, +/obj/item/ammo_box/magazine/sniper_rounds, +/obj/item/ammo_box/magazine/sniper_rounds, /obj/item/ammo_box/magazine/sniper_rounds, /obj/item/ammo_box/magazine/sniper_rounds, /obj/item/ammo_box/magazine/sniper_rounds, /turf/open/floor/plasteel/grimy, /area/ruin/powered/syndicate_lava_base) -"az" = ( +"aA" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plasteel/podhatch{ tag = "icon-podhatch (SOUTHEAST)"; @@ -185,7 +189,7 @@ dir = 6 }, /area/ruin/powered/syndicate_lava_base) -"aA" = ( +"aB" = ( /obj/item/stack/sheet/metal{ amount = 50 }, @@ -198,7 +202,7 @@ dir = 10 }, /area/ruin/powered/syndicate_lava_base) -"aB" = ( +"aC" = ( /obj/structure/table/wood, /obj/item/weapon/paper_bin, /obj/item/weapon/pen, @@ -206,18 +210,18 @@ icon_state = "wood-broken4" }, /area/ruin/powered/syndicate_lava_base) -"aC" = ( +"aD" = ( /obj/structure/table/wood, /obj/item/weapon/storage/box/drinkingglasses, /turf/open/floor/wood, /area/ruin/powered/syndicate_lava_base) -"aD" = ( +"aE" = ( /obj/structure/table/wood, /obj/item/toy/nuke, /obj/item/weapon/book/manual/nuclear, /turf/open/floor/wood, /area/ruin/powered/syndicate_lava_base) -"aE" = ( +"aF" = ( /obj/structure/table/wood, /obj/item/weapon/lighter{ pixel_y = 3 @@ -225,18 +229,18 @@ /obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate, /turf/open/floor/wood, /area/ruin/powered/syndicate_lava_base) -"aF" = ( +"aG" = ( /obj/structure/table/wood, /obj/item/weapon/storage/fancy/donut_box, /turf/open/floor/wood, /area/ruin/powered/syndicate_lava_base) -"aG" = ( +"aH" = ( /obj/structure/extinguisher_cabinet{ pixel_x = 26 }, /turf/open/floor/wood, /area/ruin/powered/syndicate_lava_base) -"aH" = ( +"aI" = ( /obj/effect/mob_spawn/human/lavaland_syndicate/comms{ tag = "icon-sleeper_s (EAST)"; icon_state = "sleeper_s"; @@ -244,26 +248,26 @@ }, /turf/open/floor/plasteel/grimy, /area/ruin/powered/syndicate_lava_base) -"aI" = ( +"aJ" = ( /obj/structure/sign/nosmoking_2, /turf/closed/wall/mineral/plastitanium, /area/ruin/powered/syndicate_lava_base) -"aJ" = ( +"aK" = ( /obj/structure/closet/crate/bin, /obj/item/trash/syndi_cakes, /turf/open/floor/plasteel/black, /area/ruin/powered/syndicate_lava_base) -"aK" = ( +"aL" = ( /obj/structure/chair/stool/bar, /turf/open/floor/plasteel/vault{ dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"aL" = ( +"aM" = ( /obj/structure/chair/stool/bar, /turf/open/floor/plasteel/black, /area/ruin/powered/syndicate_lava_base) -"aM" = ( +"aN" = ( /obj/structure/table/wood, /obj/item/weapon/lipstick/random{ pixel_x = 3; @@ -279,12 +283,12 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"aN" = ( +"aO" = ( /turf/open/floor/plasteel/vault{ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"aO" = ( +"aP" = ( /obj/structure/dresser, /obj/structure/mirror{ desc = "Mirror mirror on the wall, who is the most robust of them all?"; @@ -294,13 +298,13 @@ dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"aP" = ( +"aQ" = ( /obj/item/target, /turf/open/floor/plasteel/vault{ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"aQ" = ( +"aR" = ( /obj/structure/closet/emcloset{ anchored = 1 }, @@ -311,7 +315,7 @@ dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"aR" = ( +"aS" = ( /obj/item/weapon/twohanded/required/kirbyplants{ icon_state = "plant-21"; layer = 4.1 @@ -320,9 +324,6 @@ dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"aS" = ( -/turf/open/floor/plasteel/black, -/area/ruin/powered/syndicate_lava_base) "aT" = ( /obj/machinery/door/airlock/hatch{ name = "Dormitories"; @@ -402,11 +403,6 @@ }, /area/ruin/powered/syndicate_lava_base) "bb" = ( -/turf/open/floor/plasteel/vault{ - dir = 5 - }, -/area/ruin/powered/syndicate_lava_base) -"bc" = ( /obj/item/weapon/twohanded/required/kirbyplants{ icon_state = "plant-22" }, @@ -414,24 +410,24 @@ dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"bd" = ( +"bc" = ( /obj/structure/bookcase/random, /turf/open/floor/plasteel/vault{ dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"be" = ( +"bd" = ( /obj/item/weapon/twohanded/required/kirbyplants{ icon_state = "plant-21"; layer = 4.1 }, /turf/open/floor/plasteel/black, /area/ruin/powered/syndicate_lava_base) -"bf" = ( +"be" = ( /obj/structure/bookcase/random, /turf/open/floor/plasteel/black, /area/ruin/powered/syndicate_lava_base) -"bg" = ( +"bf" = ( /obj/structure/toilet{ tag = "icon-toilet00 (WEST)"; icon_state = "toilet00"; @@ -441,7 +437,7 @@ dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"bh" = ( +"bg" = ( /obj/machinery/door/airlock/hatch{ name = "Lounge"; req_access_txt = "150" @@ -450,13 +446,13 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"bi" = ( +"bh" = ( /obj/machinery/chem_dispenser, /turf/open/floor/plasteel/podhatch{ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"bj" = ( +"bi" = ( /obj/structure/table/reinforced, /obj/item/weapon/reagent_containers/glass/beaker/large, /obj/item/weapon/reagent_containers/glass/beaker, @@ -474,7 +470,7 @@ dir = 1 }, /area/ruin/powered/syndicate_lava_base) -"bk" = ( +"bj" = ( /obj/machinery/chem_master, /turf/open/floor/plasteel/podhatch{ tag = "icon-podhatch (EAST)"; @@ -482,7 +478,7 @@ dir = 4 }, /area/ruin/powered/syndicate_lava_base) -"bl" = ( +"bk" = ( /obj/structure/noticeboard{ pixel_y = 32 }, @@ -495,7 +491,7 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"bm" = ( +"bl" = ( /obj/structure/table/reinforced, /obj/item/weapon/clipboard, /obj/item/weapon/folder/white, @@ -509,7 +505,7 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"bn" = ( +"bm" = ( /obj/structure/table/reinforced, /obj/item/weapon/storage/box/beakers{ pixel_x = 3; @@ -522,17 +518,17 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"bo" = ( +"bn" = ( /turf/open/floor/plasteel/podhatch{ dir = 9 }, /area/ruin/powered/syndicate_lava_base) -"bp" = ( +"bo" = ( /turf/open/floor/plasteel/podhatch{ dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"bq" = ( +"bp" = ( /obj/structure/table/reinforced, /obj/machinery/reagentgrinder{ desc = "Used to grind things up into raw materials and liquids."; @@ -543,7 +539,7 @@ }, /turf/open/floor/plasteel/podhatch/corner, /area/ruin/powered/syndicate_lava_base) -"br" = ( +"bq" = ( /obj/structure/reagent_dispensers/virusfood{ pixel_y = 32 }, @@ -555,7 +551,7 @@ }, /turf/open/floor/plasteel/podhatch, /area/ruin/powered/syndicate_lava_base) -"bs" = ( +"br" = ( /obj/structure/extinguisher_cabinet{ pixel_x = 0; pixel_y = 32 @@ -563,7 +559,7 @@ /obj/machinery/computer/pandemic, /turf/open/floor/plasteel/podhatch, /area/ruin/powered/syndicate_lava_base) -"bt" = ( +"bs" = ( /obj/structure/table/reinforced, /obj/item/weapon/storage/box/beakers{ pixel_x = 3; @@ -572,7 +568,7 @@ /obj/item/weapon/storage/box/syringes, /turf/open/floor/plasteel/podhatch, /area/ruin/powered/syndicate_lava_base) -"bu" = ( +"bt" = ( /obj/structure/bed/roller, /obj/machinery/iv_drip, /obj/item/weapon/reagent_containers/blood/random, @@ -582,49 +578,49 @@ dir = 6 }, /area/ruin/powered/syndicate_lava_base) -"bv" = ( +"bu" = ( /obj/structure/grille, /obj/structure/window/reinforced/fulltile, /turf/open/floor/plating, /area/ruin/powered/syndicate_lava_base) -"bw" = ( +"bv" = ( /mob/living/carbon/monkey, /turf/open/floor/plasteel/vault{ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"bx" = ( +"bw" = ( /obj/structure/bed/roller, /turf/open/floor/plasteel/vault{ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"by" = ( +"bx" = ( /obj/structure/grille, /obj/structure/window/reinforced/fulltile, /turf/open/floor/plasteel/vault{ dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"bz" = ( +"by" = ( /mob/living/carbon/monkey, /turf/open/floor/plasteel/vault{ dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"bA" = ( +"bz" = ( /obj/structure/window/reinforced, /turf/open/floor/plasteel/vault{ dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"bB" = ( +"bA" = ( /obj/machinery/door/window/brigdoor, /turf/open/floor/plasteel/vault{ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"bC" = ( +"bB" = ( /obj/machinery/chem_heater, /obj/structure/extinguisher_cabinet{ pixel_x = -26 @@ -633,13 +629,13 @@ dir = 10 }, /area/ruin/powered/syndicate_lava_base) -"bD" = ( +"bC" = ( /obj/structure/chair/office/dark{ dir = 1 }, /turf/open/floor/plasteel/podhatch, /area/ruin/powered/syndicate_lava_base) -"bE" = ( +"bD" = ( /obj/structure/closet/crate/bin, /turf/open/floor/plasteel/podhatch{ tag = "icon-podhatch (SOUTHEAST)"; @@ -647,10 +643,10 @@ dir = 6 }, /area/ruin/powered/syndicate_lava_base) -"bF" = ( +"bE" = ( /turf/open/floor/plasteel/vault, /area/ruin/powered/syndicate_lava_base) -"bG" = ( +"bF" = ( /obj/item/device/assembly/igniter, /obj/item/device/assembly/igniter, /obj/item/device/assembly/igniter, @@ -671,7 +667,7 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"bH" = ( +"bG" = ( /obj/structure/table/reinforced, /obj/item/weapon/book/manual/wiki/infections, /obj/item/stack/sheet/mineral/silver{ @@ -683,7 +679,7 @@ dir = 4 }, /area/ruin/powered/syndicate_lava_base) -"bI" = ( +"bH" = ( /obj/structure/chair/office/dark{ dir = 8 }, @@ -691,14 +687,14 @@ dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"bJ" = ( +"bI" = ( /obj/machinery/door/airlock/hatch{ name = "Monkey Pen"; req_access_txt = "150" }, /turf/open/floor/plasteel/black, /area/ruin/powered/syndicate_lava_base) -"bK" = ( +"bJ" = ( /obj/structure/table/reinforced, /obj/item/weapon/gun/ballistic/automatic/c20r/toy/unrestricted, /obj/item/weapon/gun/ballistic/automatic/c20r/toy/unrestricted, @@ -706,7 +702,7 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"bL" = ( +"bK" = ( /obj/item/weapon/twohanded/required/kirbyplants{ icon_state = "plant-21"; layer = 4.1 @@ -715,7 +711,7 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"bM" = ( +"bL" = ( /obj/structure/table/reinforced, /obj/item/clothing/gloves/color/latex, /obj/item/clothing/gloves/color/latex, @@ -729,14 +725,22 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"bN" = ( -/obj/machinery/smartfridge/chemistry/virology/preloaded, +"bM" = ( +/obj/machinery/smartfridge/chemistry/virology, /turf/open/floor/plasteel/podhatch{ tag = "icon-podhatch (EAST)"; icon_state = "podhatch"; dir = 4 }, /area/ruin/powered/syndicate_lava_base) +"bN" = ( +/obj/machinery/vending/toyliberationstation{ + req_access_txt = "150" + }, +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/ruin/powered/syndicate_lava_base) "bO" = ( /obj/machinery/iv_drip, /obj/item/weapon/reagent_containers/blood/random, @@ -925,15 +929,10 @@ /turf/closed/wall/mineral/plastitanium, /area/ruin/powered/syndicate_lava_base) "cj" = ( -/turf/open/floor/plasteel/podhatch{ - dir = 8 - }, -/area/ruin/powered/syndicate_lava_base) -"ck" = ( /obj/structure/sign/biohazard, /turf/closed/wall/mineral/plastitanium, /area/ruin/powered/syndicate_lava_base) -"cl" = ( +"ck" = ( /obj/machinery/door/airlock/hatch{ name = "Virology Lab"; req_access_txt = "150" @@ -942,7 +941,7 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"cm" = ( +"cl" = ( /obj/structure/rack, /obj/item/ammo_box/foambox{ pixel_x = -3; @@ -957,7 +956,7 @@ dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"cn" = ( +"cm" = ( /obj/item/weapon/twohanded/required/kirbyplants{ icon_state = "plant-22" }, @@ -965,28 +964,28 @@ dir = 9 }, /area/ruin/powered/syndicate_lava_base) -"co" = ( +"cn" = ( /turf/open/floor/plasteel/podhatch{ tag = "icon-podhatch (NORTH)"; icon_state = "podhatch"; dir = 1 }, /area/ruin/powered/syndicate_lava_base) -"cp" = ( +"co" = ( /turf/open/floor/plasteel/podhatch/corner{ tag = "icon-podhatchcorner (EAST)"; icon_state = "podhatchcorner"; dir = 4 }, /area/ruin/powered/syndicate_lava_base) -"cq" = ( +"cp" = ( /turf/open/floor/plasteel/podhatch/corner{ tag = "icon-podhatchcorner (WEST)"; icon_state = "podhatchcorner"; dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"cr" = ( +"cq" = ( /obj/item/weapon/twohanded/required/kirbyplants{ icon_state = "plant-21"; layer = 4.1 @@ -995,13 +994,13 @@ dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"cs" = ( +"cr" = ( /obj/structure/grille, /obj/structure/window/reinforced/fulltile, /obj/structure/sign/bluecross_2, /turf/open/floor/plating, /area/ruin/powered/syndicate_lava_base) -"ct" = ( +"cs" = ( /obj/structure/table, /obj/item/weapon/storage/firstaid/regular{ pixel_x = 3; @@ -1014,7 +1013,7 @@ }, /turf/open/floor/plasteel/vault, /area/ruin/powered/syndicate_lava_base) -"cu" = ( +"ct" = ( /obj/machinery/sleeper/syndie{ dir = 8 }, @@ -1022,7 +1021,7 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"cv" = ( +"cu" = ( /obj/structure/closet/crate/secure, /obj/item/target, /obj/item/target, @@ -1036,41 +1035,38 @@ dir = 6 }, /area/ruin/powered/syndicate_lava_base) -"cw" = ( +"cv" = ( /turf/open/floor/plasteel/podhatch{ dir = 10 }, /area/ruin/powered/syndicate_lava_base) -"cx" = ( +"cw" = ( /turf/open/floor/plasteel/podhatch, /area/ruin/powered/syndicate_lava_base) -"cy" = ( +"cx" = ( /obj/structure/extinguisher_cabinet{ pixel_y = -32 }, /turf/open/floor/plasteel/podhatch, /area/ruin/powered/syndicate_lava_base) -"cz" = ( -/turf/open/floor/plasteel/podhatch, -/area/ruin/powered/syndicate_lava_base) -"cA" = ( +"cy" = ( /turf/open/floor/plasteel/podhatch/corner{ tag = "icon-podhatchcorner (NORTH)"; icon_state = "podhatchcorner"; dir = 1 }, /area/ruin/powered/syndicate_lava_base) -"cB" = ( +"cz" = ( /turf/open/floor/plasteel/podhatch/corner, /area/ruin/powered/syndicate_lava_base) -"cC" = ( +"cA" = ( /turf/open/floor/plasteel/podhatch{ tag = "icon-podhatch (SOUTHEAST)"; icon_state = "podhatch"; dir = 6 }, /area/ruin/powered/syndicate_lava_base) -"cD" = ( +"cB" = ( /obj/machinery/door/airlock/hatch{ name = "Infirmary"; req_access_txt = "150" @@ -1079,7 +1075,7 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"cE" = ( +"cC" = ( /obj/structure/bed/roller, /obj/machinery/iv_drip, /obj/item/weapon/reagent_containers/blood/random, @@ -1087,7 +1083,7 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"cF" = ( +"cD" = ( /obj/structure/grille, /obj/structure/window/reinforced/fulltile, /obj/machinery/door/poddoor/preopen{ @@ -1096,7 +1092,7 @@ }, /turf/open/floor/plating, /area/ruin/powered/syndicate_lava_base) -"cG" = ( +"cE" = ( /obj/machinery/door/airlock/hatch{ name = "Experimentation Room"; req_access_txt = "150" @@ -1105,7 +1101,7 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"cH" = ( +"cF" = ( /obj/machinery/door/airlock/hatch{ name = "Telecommunications Control"; req_access_txt = "150" @@ -1114,10 +1110,10 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"cI" = ( +"cG" = ( /turf/open/floor/engine, /area/ruin/powered/syndicate_lava_base) -"cJ" = ( +"cH" = ( /obj/structure/noticeboard{ pixel_y = 32 }, @@ -1125,7 +1121,7 @@ dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"cK" = ( +"cI" = ( /obj/structure/table, /obj/item/weapon/storage/toolbox/syndicate, /obj/item/device/multitool, @@ -1133,7 +1129,7 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"cL" = ( +"cJ" = ( /obj/item/weapon/surgicaldrill, /obj/item/weapon/circular_saw, /obj/structure/table/reinforced, @@ -1141,7 +1137,7 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"cM" = ( +"cK" = ( /obj/structure/sink{ dir = 4; icon_state = "sink"; @@ -1155,7 +1151,7 @@ dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"cN" = ( +"cL" = ( /obj/item/stack/cable_coil/white{ pixel_x = 3; pixel_y = 3 @@ -1167,14 +1163,14 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"cO" = ( +"cM" = ( /obj/structure/table/reinforced, /obj/item/device/flashlight/lamp, /turf/open/floor/plasteel/vault{ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"cP" = ( +"cN" = ( /obj/structure/table/reinforced, /obj/item/device/radio/intercom{ broadcasting = 0; @@ -1188,19 +1184,19 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"cQ" = ( +"cO" = ( /obj/machinery/computer/camera_advanced, /turf/open/floor/plasteel/vault{ dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"cR" = ( +"cP" = ( /obj/structure/filingcabinet/chestdrawer, /turf/open/floor/plasteel/vault{ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"cS" = ( +"cQ" = ( /obj/item/weapon/cautery, /obj/item/weapon/scalpel, /obj/structure/table/reinforced, @@ -1208,14 +1204,14 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"cT" = ( +"cR" = ( /obj/structure/table/optable, /obj/item/weapon/surgical_drapes, /turf/open/floor/plasteel/vault{ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"cU" = ( +"cS" = ( /obj/item/weapon/retractor, /obj/item/weapon/hemostat, /obj/structure/table/reinforced, @@ -1223,7 +1219,7 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"cV" = ( +"cT" = ( /obj/structure/sign/nosmoking_2{ pixel_x = 32 }, @@ -1231,7 +1227,7 @@ dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"cW" = ( +"cU" = ( /obj/item/weapon/twohanded/required/kirbyplants{ icon_state = "plant-22" }, @@ -1242,7 +1238,7 @@ dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"cX" = ( +"cV" = ( /obj/structure/table/reinforced, /obj/item/device/radio/intercom{ broadcasting = 1; @@ -1256,13 +1252,13 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"cY" = ( +"cW" = ( /obj/structure/sign/fire{ pixel_x = -32 }, /turf/open/floor/engine, /area/ruin/powered/syndicate_lava_base) -"cZ" = ( +"cX" = ( /obj/structure/table/reinforced, /obj/item/device/assembly/signaler, /obj/item/device/assembly/signaler, @@ -1273,7 +1269,7 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"da" = ( +"cY" = ( /obj/structure/table/reinforced, /obj/item/stack/sheet/plasteel{ amount = 15 @@ -1284,13 +1280,13 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"db" = ( +"cZ" = ( /obj/structure/filingcabinet/security, /turf/open/floor/plasteel/vault{ dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"dc" = ( +"da" = ( /obj/structure/table/reinforced, /obj/item/weapon/paper_bin, /obj/item/weapon/pen, @@ -1298,27 +1294,27 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"dd" = ( +"db" = ( /obj/machinery/computer/message_monitor, /obj/item/weapon/paper/monitorkey, /turf/open/floor/plasteel/vault{ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"de" = ( +"dc" = ( /turf/open/floor/plasteel/vault{ tag = "icon-vault (NORTHEAST)"; dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"df" = ( +"dd" = ( /obj/effect/baseturf_helper, /turf/open/floor/plasteel/vault{ tag = "icon-vault (NORTHEAST)"; dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"dg" = ( +"de" = ( /obj/machinery/button/door{ id = "lavalandsyndi"; name = "Syndicate Experimentor Lockdown Control"; @@ -1327,7 +1323,7 @@ }, /turf/open/floor/engine, /area/ruin/powered/syndicate_lava_base) -"dh" = ( +"df" = ( /obj/machinery/button/door{ id = "lavalandsyndi"; name = "Syndicate Experimentor Lockdown Control"; @@ -1338,7 +1334,7 @@ dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"di" = ( +"dg" = ( /obj/item/stack/sheet/mineral/plastitanium{ amount = 30 }, @@ -1350,16 +1346,16 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"dj" = ( +"dh" = ( /obj/structure/filingcabinet/medical, /turf/open/floor/plasteel/vault{ dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"dk" = ( +"di" = ( /turf/open/floor/circuit/green, /area/ruin/powered/syndicate_lava_base) -"dl" = ( +"dj" = ( /obj/machinery/door/poddoor/preopen{ id = "lavalandsyndi"; name = "Syndicate Research Experimentor Shutters" @@ -1372,7 +1368,7 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"dm" = ( +"dk" = ( /obj/item/stack/sheet/metal{ amount = 50 }, @@ -1389,7 +1385,16 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"dn" = ( +"dl" = ( +/obj/machinery/door/airlock/hatch{ + name = "Self Destruct Control"; + req_access_txt = "150" + }, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/ruin/powered/syndicate_lava_base) +"dm" = ( /obj/machinery/telecomms/relay/preset/ruskie{ use_power = 0 }, @@ -1398,7 +1403,7 @@ dir = 5 }, /area/ruin/powered/syndicate_lava_base) -"do" = ( +"dn" = ( /obj/machinery/door/airlock/hatch{ name = "Syndicate Recon Outpost"; req_access_txt = "150" @@ -1408,6 +1413,9 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) +"do" = ( +/turf/open/floor/circuit/red, +/area/ruin/powered/syndicate_lava_base) "dp" = ( /obj/machinery/door/airlock/hatch{ name = "Monkey Pen"; @@ -1434,6 +1442,10 @@ }, /area/ruin/powered/syndicate_lava_base) "ds" = ( +/obj/machinery/syndicatebomb/self_destruct, +/turf/open/floor/circuit/red, +/area/ruin/powered/syndicate_lava_base) +"dt" = ( /obj/structure/bed/roller, /obj/machinery/iv_drip, /mob/living/carbon/monkey, @@ -1441,85 +1453,12 @@ dir = 8 }, /area/ruin/powered/syndicate_lava_base) -"dt" = ( +"du" = ( /obj/structure/sign/securearea{ pixel_y = 32 }, /turf/open/floor/plating/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) -"du" = ( -/obj/item/weapon/bombcore/large/underwall, -/turf/closed/wall/mineral/plastitanium, -/area/ruin/powered/syndicate_lava_base) -"dv" = ( -/obj/item/weapon/bombcore/large/underwall, -/turf/closed/wall/mineral/plastitanium, -/area/ruin/powered/syndicate_lava_base) -"dw" = ( -/obj/item/weapon/bombcore/large/underwall, -/turf/closed/wall/mineral/plastitanium, -/area/ruin/powered/syndicate_lava_base) -"dx" = ( -/obj/item/weapon/bombcore/large/underwall, -/turf/closed/wall/mineral/plastitanium, -/area/ruin/powered/syndicate_lava_base) -"dy" = ( -/obj/item/weapon/bombcore/large/underwall, -/turf/closed/wall/mineral/plastitanium, -/area/ruin/powered/syndicate_lava_base) -"dz" = ( -/obj/item/weapon/bombcore/large/underwall, -/turf/closed/wall/mineral/plastitanium, -/area/ruin/powered/syndicate_lava_base) -"dA" = ( -/obj/item/weapon/bombcore/large/underwall, -/turf/closed/wall/mineral/plastitanium, -/area/ruin/powered/syndicate_lava_base) -"dB" = ( -/obj/item/weapon/bombcore/large/underwall, -/turf/closed/wall/mineral/plastitanium, -/area/ruin/powered/syndicate_lava_base) -"dC" = ( -/obj/item/weapon/bombcore/large/underwall, -/turf/closed/wall/mineral/plastitanium, -/area/ruin/powered/syndicate_lava_base) -"dD" = ( -/obj/item/weapon/bombcore/large/underwall, -/turf/closed/wall/mineral/plastitanium, -/area/ruin/powered/syndicate_lava_base) -"dE" = ( -/obj/item/weapon/bombcore/large/underwall, -/turf/closed/wall/mineral/plastitanium, -/area/ruin/powered/syndicate_lava_base) -"dF" = ( -/obj/machinery/door/airlock/hatch{ - name = "Self Destruct Control"; - req_access_txt = "150" - }, -/turf/open/floor/plasteel/vault{ - dir = 8 - }, -/area/ruin/powered/syndicate_lava_base) -"dG" = ( -/turf/open/floor/circuit/red, -/area/ruin/powered/syndicate_lava_base) -"dH" = ( -/obj/item/weapon/bombcore/large/underwall, -/turf/closed/wall/mineral/plastitanium, -/area/ruin/powered/syndicate_lava_base) -"dI" = ( -/turf/open/floor/circuit/red, -/area/ruin/powered/syndicate_lava_base) -"dJ" = ( -/obj/machinery/syndicatebomb/self_destruct, -/turf/open/floor/circuit/red, -/area/ruin/powered/syndicate_lava_base) -"dK" = ( -/turf/open/floor/circuit/red, -/area/ruin/powered/syndicate_lava_base) -"dL" = ( -/turf/open/floor/circuit/red, -/area/ruin/powered/syndicate_lava_base) (1,1,1) = {" aa @@ -1831,7 +1770,7 @@ ad ad ad ad -dD +ae ad ad ac @@ -1856,23 +1795,23 @@ ad ad ad ad -dw +ae ad ad ad ad ad ad -dA +ae ad ad -cI -cI -cI -cY -cI -cI -cI +cG +cG +cG +cW +cG +cG +cG ad ac ab @@ -1892,27 +1831,27 @@ ab ab ab ad -ap -ap -ap +aq +aq +aq aY -ap +aq aY -bA -bK -ap +bz +bJ +bN bV cf -cm -cv +cl +cu ad -cI -cI -cI -cI -cI -cI -cI +cG +cG +cG +cG +cG +cG +cG ad ab ab @@ -1932,27 +1871,27 @@ ab ab ab ad -ap -aP -aN -aN -aN -aN -bB -aN -ap -ap +aq +aQ +aO +aO +aO +aO +bA +aO +aq +aq cg -ap -ap -cF -cI -cI -cI -cI -cI -cI -cI +aq +aq +cD +cG +cG +cG +cG +cG +cG +cG ad ab ab @@ -1972,27 +1911,27 @@ ab ac ac ad -ap -ap -ap +aq +aq +aq aZ -ap +aq aZ -bA -bL -ap +bz +bK +aq bW ad -aR -ap +aS +aq ad -cI -cI -cI -cI -cI -cI -cI +cG +cG +cG +cG +cG +cG +cG ad ab ab @@ -2023,16 +1962,16 @@ ad ad ad ad -bv +bu cg ad -cI -cI -cI -cI -cI -cI -cI +cG +cG +cG +cG +cG +cG +cG ad ac ab @@ -2049,30 +1988,30 @@ ab ab ab ad -an -av -az -aI -aQ +ao +aw +aA +aJ +aR aU ba ad -bi -bC -aR +bh +bB +aS bO bO cf -cn -cw +cm +cv ad -cI -cI -cI -cI -cI -cI -cI +cG +cG +cG +cG +cG +cG +cG ad ac ab @@ -2089,30 +2028,30 @@ ab ab ab ad -ao ap -ao +aq ap +aq +aq ap -ao -ap +aq ad -bj -bD -ap -ao +bi +bC +aq ap +aq ch -co -cz +cn +cw ad -cI -cI -cI -cI -dg -cI -cI +cG +cG +cG +cG +de +cG +cG ad ac ac @@ -2129,31 +2068,31 @@ ab ab ac ad +aq ap -ao +aq ap -ao -ao ap -ao +aq +ap ad -bk -bE -ap -ap -ap +bj +bD +aq +aq +aq ci -co -cy +cn +cx ad cf -cF -cF -cF +cD +cD +cD ad -dl +dj ad -dH +ae ad ad ab @@ -2169,32 +2108,32 @@ ab ab ac ad +ar +ax +aB +ad +aS aq -aw -aA +bb ad -aR -ap -bc -ad -bl -bF -ap +bk +bE +aq bP bX ad -co -cz -dB -aR -cN -bG -cZ -dh -ap -cW -bv -ds +cn +cw +ae +aS +cL +bF +cX +df +aq +cU +bu +dt ad ab ab @@ -2216,25 +2155,25 @@ ad ad aV ad -dx -bm -bF -ap +ae +bl +bE +aq bQ bY -bv -co -cz -cG -ap -ap -ap -ap -ap -ap -ap +bu +cn +cw +cE +aq +aq +aq +aq +aq +aq +aq dp -aN +aO ad ab ab @@ -2248,33 +2187,33 @@ ab ab ab ad -ae -ar -ar -aB -aJ +af +as +as +aC +aK +aq ap -ao -bd +bc ad -bn -bG -bM +bm +bF +bL bR bZ ad -co -cz +cn +cw cf -ap -ap -cV -da -di -dm -aR -bv -ds +aq +aq +cT +cY +dg +dk +aS +bu +dt ad ab ab @@ -2288,23 +2227,23 @@ ab ab ab ad -af -ar -ar -aC -aK -ao +ag +as +as +aD +aL ap -be +aq +bd ad ad -bv -bv -bv +bu +bu +bu ad ad -co -cz +cn +cw ad ad ad @@ -2316,7 +2255,7 @@ ad ad ad ad -dt +du ab ab ab @@ -2328,34 +2267,34 @@ ab ab ab ad -ag -ar -ar -aD -aL +ah +as +as +aE +aM +aq ap -ao -ap -bh -bo +aq +bg +bn aY aY aY aY aY -cp -cA +co +cy aY aY aY aY aY aY -cw -do +cv +dn dq -aN -do +aO +dn ab ab ab @@ -2367,35 +2306,35 @@ ab ab ab ab -du +ae ad -ar -ar -aE -aK -ao +as +as +aF +aL ap -ao -bh -bp +aq +ap +bg +bo aZ aZ aZ aZ aZ -cq -cB +cp +cz aZ aZ aZ aZ aZ aZ -cC -do +cA +dn dr -aN -do +aO +dn ab ab ab @@ -2408,23 +2347,23 @@ ab ab ab ad -ah -ar -ar -aF -ao +ai +as +as +aG ap -ao -bc +aq +ap +bb ad ad -bv -bv -bv +bu +bu +bu ad ad -co -cz +cn +cw ad ad ad @@ -2436,7 +2375,7 @@ ad ad ad ad -dt +du ab ab ab @@ -2448,30 +2387,30 @@ ab ab ab ad -ai -ar -ar -aG +aj +as +as +aH +aq ap -ao -ap -bf +aq +be ad -bq -bH -bN +bp +bG +bM bS ca -ck -co -cz -dC -aR -ap -cW -db -dj -dE +cj +cn +cw +ae +aS +aq +cU +cZ +dh +ae ac ac ac @@ -2497,20 +2436,20 @@ ad aT ad ad -br -bI -ap -ap +bq +bH +aq +aq cb -cl -co -cz -cH +ck +cn +cw +cF +aq ap -ao -ao -ao ap +ap +aq ad ac ac @@ -2528,29 +2467,29 @@ ab ab ab ad -aj -as -ax -aH -aM +ak +at +ay +aI +aN ad -ap -aR +aq +aS ad -bs -ap -ao +br +aq ap +aq bP ad -co -cz +cn +cw cf -ap -cO -cX -dc -ap +aq +cM +cV +da +aq ad ad ad @@ -2568,33 +2507,33 @@ ab ab ab ad -ak -at -at -at -aN +al +au +au +au +aO aT -ap -ap +aq +aq ad -bt -ap -ao +bs +aq ap +aq cc -bv -co -cz +bu +cn +cw ad -cJ -cP -bI -dd -ap +cH +cN +bH +db +aq ad -ap -dI -ap +aq +do +aq ad ab ab @@ -2610,31 +2549,31 @@ ab ad ad ad -dv +ae ad ad ad +aq +aq +ad +bt +aq ap -ap -ad -bu -ap -ao bT cd -bv -co -cz +bu +cn +cw ad -ap -cQ -ap -ap -ap -dF -dG -dJ -dL +aq +cO +aq +aq +aq +dl +do +ds +do ad ab ab @@ -2648,33 +2587,33 @@ ab ab ab ad -al -at -at -at -aN +am +au +au +au +aO aT +aq +aq +ae +bu +bu ap -ap -dy -bv -bv -ao -by -by -dz -cr -cC +bx +bx +ae +cq +cA ad -cK -cR -aN -aN -bL +cI +cP +aO +aO +bK ad -ap -dK -ap +aq +do +aq ad ab ab @@ -2688,28 +2627,28 @@ ab ab ab ad -am -au -ay -au +an +av +az +av +aP +ad +aq +aS +ad +bv +bI +ap +bI aO ad -ap -aR -ad -bw -bJ -ao -bJ -aN -ad -cs -cD +cr +cB ad ad ad ad -cH +cF ad ad ad @@ -2737,21 +2676,21 @@ ad aW ad ad +bw +bx +ap bx -by -ao -by ce ad -ct -ap -ap -cL -cS +cs +aq +aq +cJ +cQ ad -de -dk -dk +dc +di +di ad ab ab @@ -2775,23 +2714,23 @@ ab ac ad aX -bg +bf ad -by -by -ao -by -by +bx +bx +ap +bx +bx ad -ap -ap -ap -ap -cT +aq +aq +aq +aq +cR ad -df -dk -dn +dd +di +dm ad ab ab @@ -2817,21 +2756,21 @@ ad ad ad ad -bx -bJ -ao +bw +bI +ap bU -aN +aO ad -cu -cE -cu -cM -cU +ct +cC +ct +cK +cS ad -de -dk -dk +dc +di +di ad ac ab @@ -2857,10 +2796,10 @@ ab ab ac ad -bz -by -ao by +bx +ap +bx ce ad ad diff --git a/_maps/basemap.dm b/_maps/basemap.dm index 1268d3a630..6d5747fa5c 100644 --- a/_maps/basemap.dm +++ b/_maps/basemap.dm @@ -1,7 +1,30 @@ -#ifndef ALL_MAPS -#include "map_files\generic\SpaceStation.dmm" -#include "map_files\generic\Centcomm.dmm" -#include "map_files\generic\Space.dmm" -#include "map_files\generic\SpaceDock.dmm" +#ifndef ALL_MAPS + +#include "map_files\generic\SpaceStation.dmm" +#include "map_files\generic\Centcomm.dmm" +#include "map_files\generic\Space.dmm" +#include "map_files\generic\SpaceDock.dmm" +#include "map_files\Mining\lavaland.dmm" + +#else + +#include "map_files\debug\runtimestation.dmm" +#include "map_files\Deltastation\DeltaStation2.dmm" +#include "map_files\MetaStation\MetaStation.dmm" +#include "map_files\OmegaStation\OmegaStation.dmm" +#include "map_files\PubbyStation\PubbyStation.dmm" +#include "map_files\TgStation\tgstation.2.1.3.dmm" +#include "map_files\Cerestation\cerestation.dmm" + +#include "map_files\generic\Centcomm.dmm" +#include "map_files\generic\SpaceStation.dmm" +#include "map_files\generic\Space.dmm" +#include "map_files\generic\SpaceDock.dmm" + #include "map_files\Mining\Lavaland.dmm" + +#ifdef TRAVISBUILDING +#include "templates.dm" +#endif + #endif \ No newline at end of file diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index b00c11274b..229d5755a1 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -1142,6 +1142,10 @@ /obj/effect/turf_decal/bot{ dir = 2 }, +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, /turf/open/floor/plasteel{ dir = 2 }, @@ -1338,6 +1342,13 @@ /obj/effect/turf_decal/bot{ dir = 2 }, +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, /turf/open/floor/plasteel{ dir = 2 }, @@ -1356,6 +1367,13 @@ /obj/effect/turf_decal/bot{ dir = 2 }, +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, /turf/open/floor/plasteel{ dir = 2 }, @@ -53772,6 +53790,10 @@ /obj/effect/turf_decal/bot{ dir = 2 }, +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, /turf/open/floor/plasteel{ dir = 2 }, @@ -112232,11 +112254,11 @@ btp cbv ccq bns -cjD -cjD -cjD -cjD -cnj +aof +aof +aof +aof +amw aaa aaa aaa @@ -112489,13 +112511,13 @@ ckS bky ccq cds -cjD +aof ckt cly cmw -cnj -cnj -cnj +amw +amw +amw aaa aaa aaf @@ -113003,13 +113025,13 @@ cbg bTr cct cdu -cjG +aqx cku clz cmx -cnj -cnj -cnj +amw +amw +amw aaa aaa aaf @@ -113260,11 +113282,11 @@ bky bky bky bky -cjD -cjD -cjD -cjD -cnj +aof +aof +aof +aof +amw aaa aaa aaa diff --git a/code/__DEFINES/MC.dm b/code/__DEFINES/MC.dm index c33543ac4e..f5879c52b1 100644 --- a/code/__DEFINES/MC.dm +++ b/code/__DEFINES/MC.dm @@ -1,12 +1,12 @@ -#define MC_TICK_CHECK ( ( world.tick_usage > GLOB.CURRENT_TICKLIMIT || src.state != SS_RUNNING ) ? pause() : 0 ) +#define MC_TICK_CHECK ( ( world.tick_usage > Master.current_ticklimit || src.state != SS_RUNNING ) ? pause() : 0 ) -#define MC_SPLIT_TICK_INIT(phase_count) var/original_tick_limit = GLOB.CURRENT_TICKLIMIT; var/split_tick_phases = ##phase_count +#define MC_SPLIT_TICK_INIT(phase_count) var/original_tick_limit = Master.current_ticklimit; var/split_tick_phases = ##phase_count #define MC_SPLIT_TICK \ if(split_tick_phases > 1){\ - GLOB.CURRENT_TICKLIMIT = ((original_tick_limit - world.tick_usage) / split_tick_phases) + world.tick_usage;\ + Master.current_ticklimit = ((original_tick_limit - world.tick_usage) / split_tick_phases) + world.tick_usage;\ --split_tick_phases;\ } else {\ - GLOB.CURRENT_TICKLIMIT = original_tick_limit;\ + Master.current_ticklimit = original_tick_limit;\ } // Used to smooth out costs to try and avoid oscillation. diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index a3570d840d..49e03bdbdf 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -80,6 +80,15 @@ #define AI_IDLE 2 #define AI_OFF 3 +#define ENVIRONMENT_SMASH_NONE 0 + +#define ENVIRONMENT_SMASH_STRUCTURES 1 + +#define ENVIRONMENT_SMASH_WALLS 2 + +#define ENVIRONMENT_SMASH_RWALLS 3 + + //SNPCs //AI defines #define INTERACTING 2 diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 69bc163234..834097bd44 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -39,4 +39,5 @@ #define STATUS_EFFECT_HISWRATH /datum/status_effect/his_wrath //His Wrath. -#define STATUS_EFFECT_SUMMONEDGHOST /datum/status_effect/cultghost //is a cult ghost and can't use manifest runes \ No newline at end of file +#define STATUS_EFFECT_SUMMONEDGHOST /datum/status_effect/cultghost //is a cult ghost and can't use manifest runes +#define STATUS_EFFECT_CRUSHERMARK /datum/status_effect/crusher_mark //if struck with a proto-kinetic crusher, takes a ton of damage diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 66f5960d98..8c8b360497 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -41,6 +41,7 @@ // Subsystem init_order, from highest priority to lowest priority // The numbers just define the ordering, they are meaningless otherwise. +#define INIT_ORDER_SERVER_MAINT 16 #define INIT_ORDER_JOBS 15 #define INIT_ORDER_EVENTS 14 #define INIT_ORDER_TICKER 13 diff --git a/code/__DEFINES/tick.dm b/code/__DEFINES/tick.dm index 0c8c17da6f..4c88fd643e 100644 --- a/code/__DEFINES/tick.dm +++ b/code/__DEFINES/tick.dm @@ -3,5 +3,5 @@ #define TICK_LIMIT_MC 70 #define TICK_LIMIT_MC_INIT_DEFAULT 98 -#define TICK_CHECK ( world.tick_usage > GLOB.CURRENT_TICKLIMIT ) +#define TICK_CHECK ( world.tick_usage > Master.current_ticklimit ) #define CHECK_TICK if TICK_CHECK stoplag() diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 43b657dd9c..6a4ec3456e 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -340,20 +340,20 @@ Proc for attack log creation, because really why not qdel(progbar) -//some additional checks as a callback for for do_afters that want to break on losing health or on the mob taking action -/mob/proc/break_do_after_checks(list/checked_health, check_clicks) - if(check_clicks && next_move > world.time) - return FALSE - return TRUE - -//pass a list in the format list("health" = mob's health var) to check health during this -/mob/living/break_do_after_checks(list/checked_health, check_clicks) - if(islist(checked_health)) - if(health < checked_health["health"]) - return FALSE - checked_health["health"] = health - return ..() - +//some additional checks as a callback for for do_afters that want to break on losing health or on the mob taking action +/mob/proc/break_do_after_checks(list/checked_health, check_clicks) + if(check_clicks && next_move > world.time) + return FALSE + return TRUE + +//pass a list in the format list("health" = mob's health var) to check health during this +/mob/living/break_do_after_checks(list/checked_health, check_clicks) + if(islist(checked_health)) + if(health < checked_health["health"]) + return FALSE + checked_health["health"] = health + return ..() + /proc/do_after(mob/user, delay, needhand = 1, atom/target = null, progress = 1, datum/callback/extra_checks = null) if(!user) return 0 diff --git a/code/__HELPERS/sorts/__main.dm b/code/__HELPERS/sorts/__main.dm index c26126c0a6..7da17da503 100644 --- a/code/__HELPERS/sorts/__main.dm +++ b/code/__HELPERS/sorts/__main.dm @@ -626,14 +626,13 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sortInstance, new()) var/val2 = fetchElement(L,cursor2) while(1) - if(call(cmp)(val1,val2) < 0) + if(call(cmp)(val1,val2) <= 0) if(++cursor1 >= end1) break val1 = fetchElement(L,cursor1) else moveElement(L,cursor2,cursor1) - ++cursor2 if(++cursor2 >= end2) break ++end1 @@ -653,4 +652,4 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sortInstance, new()) #undef MIN_GALLOP #undef MIN_MERGE -#undef fetchElement \ No newline at end of file +#undef fetchElement diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index f35a6eaa15..ea3811085b 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -723,7 +723,7 @@ Turf and target are seperate in case you want to teleport some distance from a t //Irregular objects var/icon/AMicon = icon(AM.icon, AM.icon_state) var/icon/AMiconheight = AMicon.Height() - var/icon/AMiconwidth = AMicon.Width() + var/icon/AMiconwidth = AMicon.Width() if(AMiconheight != world.icon_size || AMiconwidth != world.icon_size) pixel_x_offset += ((AMicon.Width()/world.icon_size)-1)*(world.icon_size*0.5) pixel_y_offset += ((AMicon.Height()/world.icon_size)-1)*(world.icon_size*0.5) @@ -1215,7 +1215,7 @@ proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types()) . += round(i*DELTA_CALC) sleep(i*world.tick_lag*DELTA_CALC) i *= 2 - while (world.tick_usage > min(TICK_LIMIT_TO_RUN, GLOB.CURRENT_TICKLIMIT)) + while (world.tick_usage > min(TICK_LIMIT_TO_RUN, Master.current_ticklimit)) #undef DELTA_CALC diff --git a/code/_globalvars/game_modes.dm b/code/_globalvars/game_modes.dm index 806ac576d4..f5b0d8a041 100644 --- a/code/_globalvars/game_modes.dm +++ b/code/_globalvars/game_modes.dm @@ -1,4 +1,4 @@ -GLOBAL_VAR_INIT(master_mode, "traitor") //"extended" +GLOBAL_VAR_INIT(master_mode, "traitor") //"extended" GLOBAL_VAR_INIT(secret_force_mode, "secret") // if this is anything but "secret", the secret rotation will forceably choose this mode GLOBAL_VAR_INIT(wavesecret, 0) // meteor mode, delays wave progression, terrible name diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 1241708b5c..bb41c82ddb 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -161,3 +161,4 @@ GLOBAL_LIST_INIT(numbers_as_words, list("One", "Two", "Three", "Four", return L GLOBAL_LIST_INIT(station_numerals, greek_letters + phonetic_alphabet + numbers_as_words + generate_number_strings()) +GLOBAL_LIST_INIT(admiral_messages, list("Do you know how expensive these stations are?","Stop wasting my time.","I was sleeping, thanks a lot.","Stand and fight you cowards!","You knew the risks coming in.","Stop being paranoid.","Whatever's broken just build a new one.","No.", "null","Error: No comment given.", "It's a good day to die!")) diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index 285746cbd7..fbe9584262 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -8,7 +8,7 @@ GLOBAL_VAR_INIT(fileaccess_timer, 0) GLOBAL_VAR_INIT(TAB, "    ") -GLOBAL_DATUM(data_core, /datum/datacore) +GLOBAL_DATUM_INIT(data_core, /datum/datacore, new) GLOBAL_VAR_INIT(CELLRATE, 0.002) // multiplier for watts per tick <> cell storage (eg: .002 means if there is a load of 1000 watts, 20 units will be taken from a cell per second) GLOBAL_VAR_INIT(CHARGELEVEL, 0.001) // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second) diff --git a/code/_onclick/autoclick.dm b/code/_onclick/autoclick.dm index 1ceeb182ed..7b6e2f108a 100644 --- a/code/_onclick/autoclick.dm +++ b/code/_onclick/autoclick.dm @@ -14,7 +14,7 @@ selected_target[1] = null /client/MouseDrag(src_object,atom/over_object,src_location,over_location,src_control,over_control,params) - if(selected_target[1] && over_object.IsAutoclickable()) + if(selected_target[1] && over_object && over_object.IsAutoclickable()) selected_target[1] = over_object selected_target[2] = params diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index ad4a84529b..a9f76f7f9d 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -1,149 +1,149 @@ -/* - Click code cleanup - ~Sayu -*/ - -// 1 decisecond click delay (above and beyond mob/next_move) -//This is mainly modified by click code, to modify click delays elsewhere, use next_move and changeNext_move() -/mob/var/next_click = 0 - -// THESE DO NOT EFFECT THE BASE 1 DECISECOND DELAY OF NEXT_CLICK -/mob/var/next_move_adjust = 0 //Amount to adjust action/click delays by, + or - -/mob/var/next_move_modifier = 1 //Value to multiply action/click delays by - - -//Delays the mob's next click/action by num deciseconds -// eg: 10-3 = 7 deciseconds of delay -// eg: 10*0.5 = 5 deciseconds of delay -// DOES NOT EFFECT THE BASE 1 DECISECOND DELAY OF NEXT_CLICK - -/mob/proc/changeNext_move(num) - next_move = world.time + ((num+next_move_adjust)*next_move_modifier) - - -/* - Before anything else, defer these calls to a per-mobtype handler. This allows us to - remove istype() spaghetti code, but requires the addition of other handler procs to simplify it. - - Alternately, you could hardcode every mob's variation in a flat ClickOn() proc; however, - that's a lot of code duplication and is hard to maintain. - - Note that this proc can be overridden, and is in the case of screen objects. -*/ -/atom/Click(location,control,params) - if(initialized) - usr.ClickOn(src, params) - -/atom/DblClick(location,control,params) - if(initialized) - usr.DblClickOn(src,params) - -/atom/MouseWheel(delta_x,delta_y,location,control,params) - if(initialized) - usr.MouseWheelOn(src, delta_x, delta_y, params) - -/* - Standard mob ClickOn() - Handles exceptions: Buildmode, middle click, modified clicks, mech actions - - After that, mostly just check your state, check whether you're holding an item, - check whether you're adjacent to the target, then pass off the click to whoever - is recieving it. - The most common are: - * mob/UnarmedAttack(atom,adjacent) - used here only when adjacent, with no item in hand; in the case of humans, checks gloves - * atom/attackby(item,user) - used only when adjacent - * item/afterattack(atom,user,adjacent,params) - used both ranged and adjacent - * mob/RangedAttack(atom,params) - used only ranged, only used for tk and laser eyes but could be changed -*/ -/mob/proc/ClickOn( atom/A, params ) - if(world.time <= next_click) - return - next_click = world.time + 1 - - if(client && client.click_intercept) - if(call(client.click_intercept, "InterceptClickOn")(src, params, A)) - return - - var/list/modifiers = params2list(params) - if(modifiers["shift"] && modifiers["middle"]) - ShiftMiddleClickOn(A) - return - if(modifiers["shift"] && modifiers["ctrl"]) - CtrlShiftClickOn(A) - return - if(modifiers["middle"]) - MiddleClickOn(A) - return - if(modifiers["shift"]) - ShiftClickOn(A) - return - if(modifiers["alt"]) // alt and alt-gr (rightalt) - AltClickOn(A) - return - if(modifiers["ctrl"]) - CtrlClickOn(A) - return - - if(incapacitated(ignore_restraints = 1)) - return - - face_atom(A) - - if(next_move > world.time) // in the year 2000... - return - +/* + Click code cleanup + ~Sayu +*/ + +// 1 decisecond click delay (above and beyond mob/next_move) +//This is mainly modified by click code, to modify click delays elsewhere, use next_move and changeNext_move() +/mob/var/next_click = 0 + +// THESE DO NOT EFFECT THE BASE 1 DECISECOND DELAY OF NEXT_CLICK +/mob/var/next_move_adjust = 0 //Amount to adjust action/click delays by, + or - +/mob/var/next_move_modifier = 1 //Value to multiply action/click delays by + + +//Delays the mob's next click/action by num deciseconds +// eg: 10-3 = 7 deciseconds of delay +// eg: 10*0.5 = 5 deciseconds of delay +// DOES NOT EFFECT THE BASE 1 DECISECOND DELAY OF NEXT_CLICK + +/mob/proc/changeNext_move(num) + next_move = world.time + ((num+next_move_adjust)*next_move_modifier) + + +/* + Before anything else, defer these calls to a per-mobtype handler. This allows us to + remove istype() spaghetti code, but requires the addition of other handler procs to simplify it. + + Alternately, you could hardcode every mob's variation in a flat ClickOn() proc; however, + that's a lot of code duplication and is hard to maintain. + + Note that this proc can be overridden, and is in the case of screen objects. +*/ +/atom/Click(location,control,params) + if(initialized) + usr.ClickOn(src, params) + +/atom/DblClick(location,control,params) + if(initialized) + usr.DblClickOn(src,params) + +/atom/MouseWheel(delta_x,delta_y,location,control,params) + if(initialized) + usr.MouseWheelOn(src, delta_x, delta_y, params) + +/* + Standard mob ClickOn() + Handles exceptions: Buildmode, middle click, modified clicks, mech actions + + After that, mostly just check your state, check whether you're holding an item, + check whether you're adjacent to the target, then pass off the click to whoever + is recieving it. + The most common are: + * mob/UnarmedAttack(atom,adjacent) - used here only when adjacent, with no item in hand; in the case of humans, checks gloves + * atom/attackby(item,user) - used only when adjacent + * item/afterattack(atom,user,adjacent,params) - used both ranged and adjacent + * mob/RangedAttack(atom,params) - used only ranged, only used for tk and laser eyes but could be changed +*/ +/mob/proc/ClickOn( atom/A, params ) + if(world.time <= next_click) + return + next_click = world.time + 1 + + if(client && client.click_intercept) + if(call(client.click_intercept, "InterceptClickOn")(src, params, A)) + return + + var/list/modifiers = params2list(params) + if(modifiers["shift"] && modifiers["middle"]) + ShiftMiddleClickOn(A) + return + if(modifiers["shift"] && modifiers["ctrl"]) + CtrlShiftClickOn(A) + return + if(modifiers["middle"]) + MiddleClickOn(A) + return + if(modifiers["shift"]) + ShiftClickOn(A) + return + if(modifiers["alt"]) // alt and alt-gr (rightalt) + AltClickOn(A) + return + if(modifiers["ctrl"]) + CtrlClickOn(A) + return + + if(incapacitated(ignore_restraints = 1)) + return + + face_atom(A) + + if(next_move > world.time) // in the year 2000... + return + if(A.IsObscured()) return - if(istype(loc,/obj/mecha)) - var/obj/mecha/M = loc - return M.click_action(A,src,params) - - if(restrained()) - changeNext_move(CLICK_CD_HANDCUFFED) //Doing shit in cuffs shall be vey slow - RestrainedClickOn(A) - return - - if(in_throw_mode) - throw_item(A) - return - - var/obj/item/W = get_active_held_item() - - if(W == A) - W.attack_self(src) - update_inv_hands() - return - - //These are always reachable. - //User itself, current loc, and user inventory - if(DirectAccess(A)) - if(W) - melee_item_attack_chain(src,W,A,params) - else - if(ismob(A)) - changeNext_move(CLICK_CD_MELEE) - UnarmedAttack(A) - return - - //Can't reach anything else in lockers or other weirdness - if(!loc.AllowClick()) - return - - //Standard reach turf to turf or reaching inside storage - if(CanReach(A,W)) - if(W) - melee_item_attack_chain(src,W,A,params) - else - if(ismob(A)) - changeNext_move(CLICK_CD_MELEE) - UnarmedAttack(A,1) - else - if(W) - W.afterattack(A,src,0,params) - else - RangedAttack(A,params) - + if(istype(loc,/obj/mecha)) + var/obj/mecha/M = loc + return M.click_action(A,src,params) + + if(restrained()) + changeNext_move(CLICK_CD_HANDCUFFED) //Doing shit in cuffs shall be vey slow + RestrainedClickOn(A) + return + + if(in_throw_mode) + throw_item(A) + return + + var/obj/item/W = get_active_held_item() + + if(W == A) + W.attack_self(src) + update_inv_hands() + return + + //These are always reachable. + //User itself, current loc, and user inventory + if(DirectAccess(A)) + if(W) + melee_item_attack_chain(src,W,A,params) + else + if(ismob(A)) + changeNext_move(CLICK_CD_MELEE) + UnarmedAttack(A) + return + + //Can't reach anything else in lockers or other weirdness + if(!loc.AllowClick()) + return + + //Standard reach turf to turf or reaching inside storage + if(CanReach(A,W)) + if(W) + melee_item_attack_chain(src,W,A,params) + else + if(ismob(A)) + changeNext_move(CLICK_CD_MELEE) + UnarmedAttack(A,1) + else + if(W) + W.afterattack(A,src,0,params) + else + RangedAttack(A,params) + //Is the atom obscured by a PREVENT_CLICK_UNDER object above it /atom/proc/IsObscured() if(!isturf(loc)) //This only makes sense for things directly on turfs for now @@ -162,306 +162,308 @@ return TRUE return FALSE -/atom/movable/proc/CanReach(atom/target,obj/item/tool,view_only = FALSE) - if(isturf(target) || isturf(target.loc) || DirectAccess(target)) //Directly accessible atoms - if(Adjacent(target) || (tool && CheckToolReach(src, target, tool.reach))) //Adjacent or reaching attacks - return TRUE - else - //Things inside storage insde another storage - //Eg Contents of a box in a backpack - var/atom/outer_storage = get_atom_on_turf(target) - if(outer_storage == target) //whatever that is we don't want infinite loop. - return FALSE - if(outer_storage && CanReach(outer_storage,tool) && outer_storage.CanReachStorage(target,src,view_only ? STORAGE_VIEW_DEPTH : INVENTORY_DEPTH)) - return TRUE - return FALSE - -//Can [target] in this container be reached by [user], can't be more than [depth] levels deep -/atom/proc/CanReachStorage(atom/target,user,depth) - return FALSE - -/obj/item/weapon/storage/CanReachStorage(atom/target,user,depth) - while(target && depth > 0) - target = target.loc - depth-- - if(target == src) - return TRUE - return FALSE - -/atom/movable/proc/DirectAccess(atom/target) - if(target == src) - return TRUE - if(target == loc) - return TRUE - -/mob/DirectAccess(atom/target) - if(..()) - return TRUE - if(target in contents) //This could probably use moving down and restricting to inventory only - return TRUE - return FALSE - -/mob/living/DirectAccess(atom/target) - if(..()) //Lightweight checks first - return TRUE - if(target in GetAllContents()) - return TRUE - -/atom/proc/AllowClick() - return FALSE - -/turf/AllowClick() - return TRUE - -/proc/CheckToolReach(atom/movable/here, atom/movable/there, reach) - if(!here || !there) - return - switch(reach) - if(0) - return FALSE - if(1) - return FALSE //here.Adjacent(there) - if(2 to INFINITY) - var/obj/dummy = new(get_turf(here)) - dummy.pass_flags |= PASSTABLE - dummy.invisibility = INVISIBILITY_ABSTRACT - for(var/i in 1 to reach) //Limit it to that many tries - var/turf/T = get_step(dummy, get_dir(dummy, there)) - if(dummy.CanReach(there)) - qdel(dummy) - return TRUE - if(!dummy.Move(T)) //we're blocked! - qdel(dummy) - return - qdel(dummy) - -// Default behavior: ignore double clicks (the second click that makes the doubleclick call already calls for a normal click) -/mob/proc/DblClickOn(atom/A, params) - return - - -/* - Translates into attack_hand, etc. - - Note: proximity_flag here is used to distinguish between normal usage (flag=1), - and usage when clicking on things telekinetically (flag=0). This proc will - not be called at ranged except with telekinesis. - - proximity_flag is not currently passed to attack_hand, and is instead used - in human click code to allow glove touches only at melee range. -*/ -/mob/proc/UnarmedAttack(atom/A, proximity_flag) - if(ismob(A)) - changeNext_move(CLICK_CD_MELEE) - return - -/* - Ranged unarmed attack: - - This currently is just a default for all mobs, involving - laser eyes and telekinesis. You could easily add exceptions - for things like ranged glove touches, spitting alien acid/neurotoxin, - animals lunging, etc. -*/ -/mob/proc/RangedAttack(atom/A, params) -/* - Restrained ClickOn - - Used when you are handcuffed and click things. - Not currently used by anything but could easily be. -*/ -/mob/proc/RestrainedClickOn(atom/A) - return - -/* - Middle click - Only used for swapping hands -*/ -/mob/proc/MiddleClickOn(atom/A) - return - -/mob/living/carbon/MiddleClickOn(atom/A) - if(!src.stat && src.mind && src.mind.changeling && src.mind.changeling.chosen_sting && (istype(A, /mob/living/carbon)) && (A != src)) - next_click = world.time + 5 - mind.changeling.chosen_sting.try_to_sting(src, A) - else - swap_hand() - -/mob/living/simple_animal/drone/MiddleClickOn(atom/A) - swap_hand() - -// In case of use break glass -/* -/atom/proc/MiddleClick(mob/M as mob) - return -*/ - -/* - Shift click - For most mobs, examine. - This is overridden in ai.dm -*/ -/mob/proc/ShiftClickOn(atom/A) - A.ShiftClick(src) - return -/atom/proc/ShiftClick(mob/user) - if(user.client && user.client.eye == user || user.client.eye == user.loc) - user.examinate(src) - return - -/* - Ctrl click - For most objects, pull -*/ - -/mob/proc/CtrlClickOn(atom/A) - A.CtrlClick(src) - return - -/atom/proc/CtrlClick(mob/user) - var/mob/living/ML = user - if(istype(ML)) - ML.pulled(src) - -/mob/living/carbon/human/CtrlClick(mob/user) - if(ishuman(user) && Adjacent(user)) - var/mob/living/carbon/human/H = user - H.dna.species.grab(H, src, H.martial_art) - H.next_click = world.time + CLICK_CD_MELEE - else - ..() -/* - Alt click - Unused except for AI -*/ -/mob/proc/AltClickOn(atom/A) - A.AltClick(src) - return - -/mob/living/carbon/AltClickOn(atom/A) - if(!src.stat && src.mind && src.mind.changeling && src.mind.changeling.chosen_sting && (istype(A, /mob/living/carbon)) && (A != src)) - next_click = world.time + 5 - mind.changeling.chosen_sting.try_to_sting(src, A) - else - ..() - -/atom/proc/AltClick(mob/user) - var/turf/T = get_turf(src) - if(T && user.TurfAdjacent(T)) - if(user.listed_turf == T) - user.listed_turf = null - else - user.listed_turf = T - user.client.statpanel = T.name - return - -/mob/proc/TurfAdjacent(turf/T) - return T.Adjacent(src) - -/* - Control+Shift click - Unused except for AI -*/ -/mob/proc/CtrlShiftClickOn(atom/A) - A.CtrlShiftClick(src) - return - -/mob/proc/ShiftMiddleClickOn(atom/A) - src.pointed(A) - return - -/atom/proc/CtrlShiftClick(mob/user) - return - -/* - Misc helpers - - Laser Eyes: as the name implies, handles this since nothing else does currently - face_atom: turns the mob towards what you clicked on -*/ -/mob/proc/LaserEyes(atom/A) - return - -/mob/living/LaserEyes(atom/A) - changeNext_move(CLICK_CD_RANGE) - var/turf/T = get_turf(src) - var/turf/U = get_turf(A) - - var/obj/item/projectile/beam/LE = new /obj/item/projectile/beam( loc ) - LE.icon = 'icons/effects/genetics.dmi' - LE.icon_state = "eyelasers" - playsound(usr.loc, 'sound/weapons/taser2.ogg', 75, 1) - - LE.firer = src - LE.def_zone = get_organ_target() - LE.original = A - LE.current = T - LE.yo = U.y - T.y - LE.xo = U.x - T.x - LE.fire() - -// Simple helper to face what you clicked on, in case it should be needed in more than one place -/mob/proc/face_atom(atom/A) - if( buckled || stat != CONSCIOUS || !A || !x || !y || !A.x || !A.y ) - return - var/dx = A.x - x - var/dy = A.y - y - if(!dx && !dy) // Wall items are graphically shifted but on the floor - if(A.pixel_y > 16) - setDir(NORTH) - else if(A.pixel_y < -16) - setDir(SOUTH) - else if(A.pixel_x > 16) - setDir(EAST) - else if(A.pixel_x < -16) - setDir(WEST) - return - - if(abs(dx) < abs(dy)) - if(dy > 0) - setDir(NORTH) - else - setDir(SOUTH) - else - if(dx > 0) - setDir(EAST) - else - setDir(WEST) - -/obj/screen/click_catcher - icon = 'icons/mob/screen_gen.dmi' - icon_state = "click_catcher" - plane = CLICKCATCHER_PLANE - mouse_opacity = 2 - screen_loc = "CENTER" - -/obj/screen/click_catcher/New() - ..() - transform = matrix(200, 0, 0, 0, 200, 0) - -/obj/screen/click_catcher/Click(location, control, params) - var/list/modifiers = params2list(params) - if(modifiers["middle"] && istype(usr, /mob/living/carbon)) - var/mob/living/carbon/C = usr - C.swap_hand() - else - var/turf/T = params2turf(modifiers["screen-loc"], get_turf(usr)) - if(T) - T.Click(location, control, params) - . = 1 - - -/* MouseWheelOn */ - -/mob/proc/MouseWheelOn(atom/A, delta_x, delta_y, params) - return - -/mob/dead/observer/MouseWheelOn(atom/A, delta_x, delta_y, params) - var/list/modifier = params2list(params) - if(modifier["shift"]) - var/view = 0 - if(delta_y > 0) - view = -1 - else - view = 1 - add_view_range(view) +/atom/movable/proc/CanReach(atom/target,obj/item/tool,view_only = FALSE) + if(isturf(target) || isturf(target.loc) || DirectAccess(target)) //Directly accessible atoms + if(Adjacent(target) || (tool && CheckToolReach(src, target, tool.reach))) //Adjacent or reaching attacks + return TRUE + else + //Things inside storage insde another storage + //Eg Contents of a box in a backpack + var/atom/outer_storage = get_atom_on_turf(target) + if(outer_storage == target) //whatever that is we don't want infinite loop. + return FALSE + if(outer_storage && CanReach(outer_storage,tool) && outer_storage.CanReachStorage(target,src,view_only ? STORAGE_VIEW_DEPTH : INVENTORY_DEPTH)) + return TRUE + return FALSE + +//Can [target] in this container be reached by [user], can't be more than [depth] levels deep +/atom/proc/CanReachStorage(atom/target,user,depth) + return FALSE + +/obj/item/weapon/storage/CanReachStorage(atom/target,user,depth) + while(target && depth > 0) + target = target.loc + depth-- + if(target == src) + return TRUE + return FALSE + +/atom/movable/proc/DirectAccess(atom/target) + if(target == src) + return TRUE + if(target == loc) + return TRUE + +/mob/DirectAccess(atom/target) + if(..()) + return TRUE + if(target in contents) //This could probably use moving down and restricting to inventory only + return TRUE + return FALSE + +/mob/living/DirectAccess(atom/target) + if(..()) //Lightweight checks first + return TRUE + if(target in GetAllContents()) + return TRUE + +/atom/proc/AllowClick() + return FALSE + +/turf/AllowClick() + return TRUE + +/proc/CheckToolReach(atom/movable/here, atom/movable/there, reach) + if(!here || !there) + return + switch(reach) + if(0) + return FALSE + if(1) + return FALSE //here.Adjacent(there) + if(2 to INFINITY) + var/obj/dummy = new(get_turf(here)) + dummy.pass_flags |= PASSTABLE + dummy.invisibility = INVISIBILITY_ABSTRACT + for(var/i in 1 to reach) //Limit it to that many tries + var/turf/T = get_step(dummy, get_dir(dummy, there)) + if(dummy.CanReach(there)) + qdel(dummy) + return TRUE + if(!dummy.Move(T)) //we're blocked! + qdel(dummy) + return + qdel(dummy) + +// Default behavior: ignore double clicks (the second click that makes the doubleclick call already calls for a normal click) +/mob/proc/DblClickOn(atom/A, params) + return + + +/* + Translates into attack_hand, etc. + + Note: proximity_flag here is used to distinguish between normal usage (flag=1), + and usage when clicking on things telekinetically (flag=0). This proc will + not be called at ranged except with telekinesis. + + proximity_flag is not currently passed to attack_hand, and is instead used + in human click code to allow glove touches only at melee range. +*/ +/mob/proc/UnarmedAttack(atom/A, proximity_flag) + if(ismob(A)) + changeNext_move(CLICK_CD_MELEE) + return + +/* + Ranged unarmed attack: + + This currently is just a default for all mobs, involving + laser eyes and telekinesis. You could easily add exceptions + for things like ranged glove touches, spitting alien acid/neurotoxin, + animals lunging, etc. +*/ +/mob/proc/RangedAttack(atom/A, params) +/* + Restrained ClickOn + + Used when you are handcuffed and click things. + Not currently used by anything but could easily be. +*/ +/mob/proc/RestrainedClickOn(atom/A) + return + +/* + Middle click + Only used for swapping hands +*/ +/mob/proc/MiddleClickOn(atom/A) + return + +/mob/living/carbon/MiddleClickOn(atom/A) + if(!src.stat && src.mind && src.mind.changeling && src.mind.changeling.chosen_sting && (istype(A, /mob/living/carbon)) && (A != src)) + next_click = world.time + 5 + mind.changeling.chosen_sting.try_to_sting(src, A) + else + swap_hand() + +/mob/living/simple_animal/drone/MiddleClickOn(atom/A) + swap_hand() + +// In case of use break glass +/* +/atom/proc/MiddleClick(mob/M as mob) + return +*/ + +/* + Shift click + For most mobs, examine. + This is overridden in ai.dm +*/ +/mob/proc/ShiftClickOn(atom/A) + A.ShiftClick(src) + return +/atom/proc/ShiftClick(mob/user) + if(user.client && user.client.eye == user || user.client.eye == user.loc) + user.examinate(src) + return + +/* + Ctrl click + For most objects, pull +*/ + +/mob/proc/CtrlClickOn(atom/A) + A.CtrlClick(src) + return + +/atom/proc/CtrlClick(mob/user) + var/mob/living/ML = user + if(istype(ML)) + ML.pulled(src) + +/mob/living/carbon/human/CtrlClick(mob/user) + if(ishuman(user) && Adjacent(user)) + if(world.time < user.next_move) + return FALSE + var/mob/living/carbon/human/H = user + H.dna.species.grab(H, src, H.mind.martial_art) + H.changeNext_move(CLICK_CD_MELEE) + else + ..() +/* + Alt click + Unused except for AI +*/ +/mob/proc/AltClickOn(atom/A) + A.AltClick(src) + return + +/mob/living/carbon/AltClickOn(atom/A) + if(!src.stat && src.mind && src.mind.changeling && src.mind.changeling.chosen_sting && (istype(A, /mob/living/carbon)) && (A != src)) + next_click = world.time + 5 + mind.changeling.chosen_sting.try_to_sting(src, A) + else + ..() + +/atom/proc/AltClick(mob/user) + var/turf/T = get_turf(src) + if(T && user.TurfAdjacent(T)) + if(user.listed_turf == T) + user.listed_turf = null + else + user.listed_turf = T + user.client.statpanel = T.name + return + +/mob/proc/TurfAdjacent(turf/T) + return T.Adjacent(src) + +/* + Control+Shift click + Unused except for AI +*/ +/mob/proc/CtrlShiftClickOn(atom/A) + A.CtrlShiftClick(src) + return + +/mob/proc/ShiftMiddleClickOn(atom/A) + src.pointed(A) + return + +/atom/proc/CtrlShiftClick(mob/user) + return + +/* + Misc helpers + + Laser Eyes: as the name implies, handles this since nothing else does currently + face_atom: turns the mob towards what you clicked on +*/ +/mob/proc/LaserEyes(atom/A) + return + +/mob/living/LaserEyes(atom/A) + changeNext_move(CLICK_CD_RANGE) + var/turf/T = get_turf(src) + var/turf/U = get_turf(A) + + var/obj/item/projectile/beam/LE = new /obj/item/projectile/beam( loc ) + LE.icon = 'icons/effects/genetics.dmi' + LE.icon_state = "eyelasers" + playsound(usr.loc, 'sound/weapons/taser2.ogg', 75, 1) + + LE.firer = src + LE.def_zone = get_organ_target() + LE.original = A + LE.current = T + LE.yo = U.y - T.y + LE.xo = U.x - T.x + LE.fire() + +// Simple helper to face what you clicked on, in case it should be needed in more than one place +/mob/proc/face_atom(atom/A) + if( buckled || stat != CONSCIOUS || !A || !x || !y || !A.x || !A.y ) + return + var/dx = A.x - x + var/dy = A.y - y + if(!dx && !dy) // Wall items are graphically shifted but on the floor + if(A.pixel_y > 16) + setDir(NORTH) + else if(A.pixel_y < -16) + setDir(SOUTH) + else if(A.pixel_x > 16) + setDir(EAST) + else if(A.pixel_x < -16) + setDir(WEST) + return + + if(abs(dx) < abs(dy)) + if(dy > 0) + setDir(NORTH) + else + setDir(SOUTH) + else + if(dx > 0) + setDir(EAST) + else + setDir(WEST) + +/obj/screen/click_catcher + icon = 'icons/mob/screen_gen.dmi' + icon_state = "click_catcher" + plane = CLICKCATCHER_PLANE + mouse_opacity = 2 + screen_loc = "CENTER" + +/obj/screen/click_catcher/New() + ..() + transform = matrix(200, 0, 0, 0, 200, 0) + +/obj/screen/click_catcher/Click(location, control, params) + var/list/modifiers = params2list(params) + if(modifiers["middle"] && istype(usr, /mob/living/carbon)) + var/mob/living/carbon/C = usr + C.swap_hand() + else + var/turf/T = params2turf(modifiers["screen-loc"], get_turf(usr)) + if(T) + T.Click(location, control, params) + . = 1 + + +/* MouseWheelOn */ + +/mob/proc/MouseWheelOn(atom/A, delta_x, delta_y, params) + return + +/mob/dead/observer/MouseWheelOn(atom/A, delta_x, delta_y, params) + var/list/modifier = params2list(params) + if(modifier["shift"]) + var/view = 0 + if(delta_y > 0) + view = -1 + else + view = 1 + add_view_range(view) diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 90b3983d82..c7ad66440e 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -13,7 +13,7 @@ /atom/proc/attack_tk(mob/user) if(user.stat) return - new /obj/effect/overlay/temp/telekinesis(loc) + new /obj/effect/temp_visual/telekinesis(loc) user.UnarmedAttack(src,0) // attack_hand, attack_paw, etc return @@ -163,7 +163,7 @@ /obj/item/tk_grab/proc/apply_focus_overlay() if(!focus) return - new /obj/effect/overlay/temp/telekinesis(get_turf(focus)) + new /obj/effect/temp_visual/telekinesis(get_turf(focus)) /obj/item/tk_grab/update_icon() cut_overlays() diff --git a/code/citadel/cit_arousal.dm b/code/citadel/cit_arousal.dm index d0268d0bec..a69411f32b 100644 --- a/code/citadel/cit_arousal.dm +++ b/code/citadel/cit_arousal.dm @@ -254,16 +254,34 @@ "You cum into [SC].", \ "You have relieved yourself.") finished = 1 - + + if(/obj/item/organ/genital/vagina) + var/obj/item/organ/genital/vagina/V = SG + if(!V.linked_womb) + src << "No womb!" + return + fluid_source = V.linked_womb.reagents + total_cum = fluid_source.total_volume + if(into_container)//into a glass or beaker or whatever + src.visible_message("[src] starts fingering their vagina over [SC].", \ + "You start fingering over [SC.name].", \ + "You start masturbating.") + if(do_after(src, mb_time, target = src) && in_range(src, SC)) + fluid_source.trans_to(SC, total_cum) + src.visible_message("[src] orgasms, [pick("cumming into", "emptying themself into")] [SC]!", \ + "You cum into [SC].", \ + "You have relieved yourself.") + finished = 1 + else//not into a container - src.visible_message("[src] starts [pick("jerking off","stroking")] their [pick(GLOB.dick_nouns)].", \ - "You start jerking off your [pick(GLOB.dick_nouns)].", \ + src.visible_message("[src] starts fingering their vagina.", \ + "You start fingering your vagina.", \ "You start masturbating.") if(do_after(src, mb_time, target = src)) if(total_cum > 5) fluid_source.reaction(src.loc, TOUCH, 1, 0) fluid_source.clear_reagents() - src.visible_message("[src] orgasms, [pick("shooting cum", "draining their balls")][istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!", \ + src.visible_message("[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!", \ "You cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""].", \ "You have relieved yourself.") finished = 1 diff --git a/code/citadel/cit_reagents.dm b/code/citadel/cit_reagents.dm index 794a3ad553..8718ebb19f 100644 --- a/code/citadel/cit_reagents.dm +++ b/code/citadel/cit_reagents.dm @@ -80,7 +80,7 @@ var/obj/effect/decal/cleanable/femcum/S = locate() in T if(!S) S = new(T) - S.reagents.add_reagent("semen", reac_volume) + S.reagents.add_reagent("femcum", reac_volume) if(data["blood_DNA"]) S.blood_DNA[data["blood_DNA"]] = data["blood_type"] @@ -219,4 +219,4 @@ results = list("anaphro+" = 1) required_reagents = list("anaphro" = 5, "acetone" = 1) required_temp = 300 - mix_message = "The mixture thickens and heats up slighty..." \ No newline at end of file + mix_message = "The mixture thickens and heats up slighty..." diff --git a/code/citadel/organs/womb.dm b/code/citadel/organs/womb.dm index 948bc33385..e1ea02a230 100644 --- a/code/citadel/organs/womb.dm +++ b/code/citadel/organs/womb.dm @@ -6,8 +6,28 @@ zone = "groin" slot = "womb" w_class = 3 + var/internal = FALSE fluid_id = "femcum" + producing = TRUE var/obj/item/organ/genital/vagina/linked_vag + +/obj/item/organ/genital/womb/Initialize() + . = ..() + reagents.add_reagent(fluid_id, fluid_max_volume) + +/obj/item/organ/genital/womb/on_life() + if(QDELETED(src)) + return + if(reagents && producing) + generate_femcum() + +/obj/item/organ/genital/womb/proc/generate_femcum() + reagents.maximum_volume = fluid_max_volume + update_link() + if(!linked_vag) + return FALSE + reagents.isolate_reagent(fluid_id)//remove old reagents if it changed and just clean up generally + reagents.add_reagent(fluid_id, (fluid_mult * fluid_rate))//generate the cum /obj/item/organ/genital/womb/update_link() if(owner) @@ -25,4 +45,4 @@ linked_vag = null /obj/item/organ/genital/womb/Destroy() - return ..() \ No newline at end of file + return ..() diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 43e5817db0..0f4ae021ad 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -14,15 +14,6 @@ GLOBAL_REAL(Master, /datum/controller/master) = new //Master -> SSPreInit -> GLOB -> world -> config -> SSInit -> Failsafe //GOT IT MEMORIZED? -GLOBAL_VAR_INIT(MC_restart_clear, 0) -GLOBAL_VAR_INIT(MC_restart_timeout, 0) -GLOBAL_VAR_INIT(MC_restart_count, 0) - - -//current tick limit, assigned by the queue controller before running a subsystem. -//used by check_tick as well so that the procs subsystems call can obey that SS's tick limits -GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING) - /datum/controller/master name = "Master" @@ -59,6 +50,14 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING) var/current_runlevel //for scheduling different subsystems for different stages of the round + var/static/restart_clear = 0 + var/static/restart_timeout = 0 + var/static/restart_count = 0 + + //current tick limit, assigned before running a subsystem. + //used by CHECK_TICK as well so that the procs subsystems call can obey that SS's tick limits + var/static/current_ticklimit = TICK_LIMIT_RUNNING + /datum/controller/master/New() // Highlander-style: there can only be one! Kill off the old and replace it with the new. subsystems = list() @@ -83,20 +82,21 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING) sortTim(subsystems, /proc/cmp_subsystem_init) reverseRange(subsystems) for(var/datum/controller/subsystem/ss in subsystems) + testing("Shutdown [ss.name] subsystem") ss.Shutdown() // Returns 1 if we created a new mc, 0 if we couldn't due to a recent restart, // -1 if we encountered a runtime trying to recreate it /proc/Recreate_MC() . = -1 //so if we runtime, things know we failed - if (world.time < GLOB.MC_restart_timeout) + if (world.time < Master.restart_timeout) return 0 - if (world.time < GLOB.MC_restart_clear) - GLOB.MC_restart_count *= 0.5 + if (world.time < Master.restart_clear) + Master.restart_count *= 0.5 - var/delay = 50 * ++GLOB.MC_restart_count - GLOB.MC_restart_timeout = world.time + delay - GLOB.MC_restart_clear = world.time + (delay * 2) + var/delay = 50 * ++Master.restart_count + Master.restart_timeout = world.time + delay + Master.restart_clear = world.time + (delay * 2) Master.processing = 0 //stop ticking this one try new/datum/controller/master() @@ -164,13 +164,13 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING) var/start_timeofday = REALTIMEOFDAY // Initialize subsystems. - GLOB.CURRENT_TICKLIMIT = config.tick_limit_mc_init + current_ticklimit = config.tick_limit_mc_init for (var/datum/controller/subsystem/SS in subsystems) if (SS.flags & SS_NO_INIT) continue SS.Initialize(REALTIMEOFDAY) CHECK_TICK - GLOB.CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING + current_ticklimit = TICK_LIMIT_RUNNING var/time = (REALTIMEOFDAY - start_timeofday) / 10 var/msg = "Initializations complete within [time] second[time == 1 ? "" : "s"]!" @@ -205,6 +205,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING) set waitfor = 0 if(delay) sleep(delay) + testing("Master starting processing") var/rtn = Loop() if (rtn > 0 || processing < 0) return //this was suppose to happen. @@ -275,7 +276,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING) while (1) tickdrift = max(0, MC_AVERAGE_FAST(tickdrift, (((REALTIMEOFDAY - init_timeofday) - (world.time - init_time)) / world.tick_lag))) if (processing <= 0) - GLOB.CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING + current_ticklimit = TICK_LIMIT_RUNNING sleep(10) continue @@ -283,7 +284,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING) // because sleeps are processed in the order received, so longer sleeps are more likely to run first if (world.tick_usage > TICK_LIMIT_MC) sleep_delta += 2 - GLOB.CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING * 0.5 + current_ticklimit = TICK_LIMIT_RUNNING * 0.5 sleep(world.tick_lag * (processing + sleep_delta)) continue @@ -321,7 +322,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING) if (!error_level) iteration++ error_level++ - GLOB.CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING + current_ticklimit = TICK_LIMIT_RUNNING sleep(10) continue @@ -333,7 +334,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING) if (!error_level) iteration++ error_level++ - GLOB.CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING + current_ticklimit = TICK_LIMIT_RUNNING sleep(10) continue error_level-- @@ -344,7 +345,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING) iteration++ last_run = world.time src.sleep_delta = MC_AVERAGE_FAST(src.sleep_delta, sleep_delta) - GLOB.CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING - (TICK_LIMIT_RUNNING * 0.25) //reserve the tail 1/4 of the next tick for the mc. + current_ticklimit = TICK_LIMIT_RUNNING - (TICK_LIMIT_RUNNING * 0.25) //reserve the tail 1/4 of the next tick for the mc. sleep(world.tick_lag * (processing + sleep_delta)) @@ -435,7 +436,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING) tick_precentage = max(tick_precentage*0.5, tick_precentage-queue_node.tick_overrun) - GLOB.CURRENT_TICKLIMIT = round(world.tick_usage + tick_precentage) + current_ticklimit = round(world.tick_usage + tick_precentage) if (!(queue_node_flags & SS_TICKER)) ran_non_ticker = TRUE diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index 0391f6ba70..48bdbad112 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -150,7 +150,7 @@ SUBSYSTEM_DEF(atoms) /datum/controller/subsystem/atoms/Shutdown() var/initlog = InitLog() if(initlog) - text2file("[GLOB.log_directory]/initialize.log", initlog) + text2file(initlog, "[GLOB.log_directory]/initialize.log") #undef BAD_INIT_QDEL_BEFORE #undef BAD_INIT_DIDNT_INIT diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm index b30bc41759..ecc5f3cc17 100644 --- a/code/controllers/subsystem/blackbox.dm +++ b/code/controllers/subsystem/blackbox.dm @@ -1,8 +1,9 @@ SUBSYSTEM_DEF(blackbox) name = "Blackbox" wait = 6000 - flags = SS_NO_TICK_CHECK - + flags = SS_NO_TICK_CHECK | SS_NO_INIT + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + var/list/msg_common = list() var/list/msg_science = list() var/list/msg_command = list() @@ -42,7 +43,6 @@ SUBSYSTEM_DEF(blackbox) msg_cargo = SSblackbox.msg_cargo msg_other = SSblackbox.msg_other - feedback = SSblackbox.feedback //no touchie @@ -55,6 +55,8 @@ SUBSYSTEM_DEF(blackbox) return FALSE /datum/controller/subsystem/blackbox/Shutdown() + set_val("ahelp_unresolved", GLOB.ahelp_tickets.active_tickets.len) + var/pda_msg_amt = 0 var/rc_msg_amt = 0 @@ -84,20 +86,16 @@ SUBSYSTEM_DEF(blackbox) if (!SSdbcore.Connect()) return - - var/sqlrowlist = "" + + var/list/sqlrowlist = list() 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 += list("time" = "Now()", "round_id" = GLOB.round_id, "var_name" = "'[sanitizeSQL(FV.get_variable())]'", "var_value" = FV.get_value(), "details" = "'[sanitizeSQL(FV.get_details())]'") - sqlrowlist += list(list("time" = "Now()", "round_id" = GLOB.round_id, "var_name" = "'[sanitizeSQL(FV.get_variable())]'", "var_value" = FV.get_value(), "details" = "'[sanitizeSQL(FV.get_details())]'")) - - if (sqlrowlist == "") + if (!length(sqlrowlist)) return - var/datum/DBQuery/query_feedback_save = SSdbcore.NewQuery("INSERT DELAYED IGNORE INTO [format_table_name("feedback")] VALUES " + sqlrowlist) - query_feedback_save.Execute() + SSdbcore.MassInsert(format_table_name("feedback"), sqlrowlist, ignore_errors = TRUE, delayed = TRUE) /datum/controller/subsystem/blackbox/proc/LogBroadcast(blackbox_msg, freq) switch(freq) diff --git a/code/controllers/subsystem/fields.dm b/code/controllers/subsystem/fields.dm deleted file mode 100644 index 8e9f387478..0000000000 --- a/code/controllers/subsystem/fields.dm +++ /dev/null @@ -1,27 +0,0 @@ - -SUBSYSTEM_DEF(fields) - name = "Fields" - wait = 2 - priority = 40 - flags = SS_KEEP_TIMING - var/list/datum/proximity_monitor/advanced/running = list() - var/list/datum/proximity_monitor/advanced/currentrun = list() - -/datum/controller/subsystem/fields/fire(resumed = 0) - if(!resumed) - src.currentrun = running.Copy() - var/list/currentrun = src.currentrun - while(currentrun.len) - var/datum/proximity_monitor/advanced/F = currentrun[currentrun.len] - currentrun.len-- - if(!F.requires_processing) - continue - F.process() - if(MC_TICK_CHECK) - return - -/datum/controller/subsystem/fields/proc/register_new_field(datum/proximity_monitor/advanced/F) - running += F - -/datum/controller/subsystem/fields/proc/unregister_field(datum/proximity_monitor/advanced/F) - running -= F diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 84d79009c0..2611bc53e6 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -61,7 +61,7 @@ SUBSYSTEM_DEF(garbage) for(var/path in sleptDestroy) dellog += "Path : [path] \n" dellog += "Sleeps : [sleptDestroy[path]] \n" - text2file("[GLOB.log_directory]/qdel.log", dellog.Join()) + text2file(dellog.Join(), "[GLOB.log_directory]/qdel.log") /datum/controller/subsystem/garbage/fire() HandleToBeQueued() diff --git a/code/controllers/subsystem/processing/fields.dm b/code/controllers/subsystem/processing/fields.dm new file mode 100644 index 0000000000..6a878fa142 --- /dev/null +++ b/code/controllers/subsystem/processing/fields.dm @@ -0,0 +1,6 @@ +PROCESSING_SUBSYSTEM_DEF(fields) + name = "Fields" + wait = 2 + priority = 40 + flags = SS_KEEP_TIMING | SS_NO_INIT + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME diff --git a/code/controllers/subsystem/server_maint.dm b/code/controllers/subsystem/server_maint.dm index a0ca6a7b67..2abd8b1c25 100644 --- a/code/controllers/subsystem/server_maint.dm +++ b/code/controllers/subsystem/server_maint.dm @@ -5,6 +5,7 @@ SUBSYSTEM_DEF(server_maint) wait = 6 flags = SS_POST_FIRE_TIMING priority = 10 + init_order = INIT_ORDER_SERVER_MAINT runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT var/list/currentrun @@ -16,7 +17,7 @@ SUBSYSTEM_DEF(server_maint) /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() @@ -37,4 +38,11 @@ SUBSYSTEM_DEF(server_maint) 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 +/datum/controller/subsystem/server_maint/Shutdown() + kick_clients_in_lobby("The round came to an end with you in the lobby.", TRUE) //second parameter ensures only afk clients are kicked + for(var/thing in GLOB.clients) + var/client/C = thing + if(C && config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite + C << link("byond://[config.server]") + +#undef PING_BUFFER_TIME \ No newline at end of file diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index a3d47b465e..61f93dcc1b 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -217,7 +217,27 @@ SUBSYSTEM_DEF(shuttle) 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.") + message_admins("[key_name_admin(user)] has called the shuttle. (TRIGGER CENTCOM RECALL)") + +/datum/controller/subsystem/shuttle/proc/centcom_recall(old_timer, admiral_message) + if(emergency.mode != SHUTTLE_CALL || emergency.timer != old_timer) + return + emergency.cancel(/area/centcom) + + if(!admiral_message) + admiral_message = pick(GLOB.admiral_messages) + var/intercepttext = "NanoTrasen Update: Request For Shuttle.
\ + To whom it may concern:

\ + We have taken note of the situation upon [station_name()] and have come to the \ + conclusion that it does not warrant the abandonment of the station.
\ + If you do not agree with our opinion we suggest that you open a direct \ + line with us and explain the nature of your crisis.

\ + This message has been automatically generated based upon readings from long \ + range diagnostic tools. To assure the quality of your request every finalized report \ + is reviewed by an on-call rear admiral.
\ + Rear Admiral's Notes: \ + [admiral_message]" + print_command_report(intercepttext, announce = TRUE) // Called when an emergency shuttle mobile docking port is // destroyed, which will only happen with admin intervention @@ -523,4 +543,3 @@ SUBSYSTEM_DEF(shuttle) for(var/obj/docking_port/mobile/M in mobile) if(M.is_in_shuttle_bounds(A)) return TRUE - \ No newline at end of file diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index e8d575a517..a54c74966a 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -20,6 +20,7 @@ SUBSYSTEM_DEF(ticker) var/login_music //music played in pregame lobby var/round_end_sound //music/jingle played when the world reboots + var/round_end_sound_sent = TRUE //If all clients have loaded it var/list/datum/mind/minds = list() //The characters in the game. Used for objective tracking. @@ -63,6 +64,7 @@ SUBSYSTEM_DEF(ticker) var/modevoted = FALSE //Have we sent a vote for the gamemode? /datum/controller/subsystem/ticker/Initialize(timeofday) + load_mode() var/list/music = world.file2list(ROUND_START_MUSIC_LIST, "\n") login_music = pick(music) @@ -637,9 +639,9 @@ SUBSYSTEM_DEF(ticker) sleep(50) if(mode.station_was_nuked) - world.Reboot("Station destroyed by Nuclear Device.", "end_proper", "nuke") + Reboot("Station destroyed by Nuclear Device.", "end_proper", "nuke") else - world.Reboot("Round ended.", "end_proper", "proper completion") + Reboot("Round ended.", "end_proper", "proper completion") /datum/controller/subsystem/ticker/proc/send_tip_of_the_round() var/m @@ -806,3 +808,69 @@ SUBSYSTEM_DEF(ticker) start_at = world.time + newtime else timeLeft = newtime + +/datum/controller/subsystem/ticker/proc/load_mode() + var/mode = trim(file2text("data/mode.txt")) + if(mode) + GLOB.master_mode = mode + else + GLOB.master_mode = "extended" + log_game("Saved mode is '[GLOB.master_mode]'") + +/datum/controller/subsystem/ticker/proc/save_mode(the_mode) + var/F = file("data/mode.txt") + fdel(F) + F << the_mode + +/datum/controller/subsystem/ticker/proc/SetRoundEndSound(the_sound) + set waitfor = FALSE + round_end_sound_sent = FALSE + round_end_sound = fcopy_rsc(the_sound) + for(var/thing in GLOB.clients) + var/client/C = thing + if (!C) + continue + C.Export("##action=load_rsc", round_end_sound) + round_end_sound_sent = TRUE + +/datum/controller/subsystem/ticker/proc/Reboot(reason, feedback_c, feedback_r, delay) + set waitfor = FALSE + if(usr && !check_rights(R_SERVER, TRUE)) + return + + if(!delay) + delay = config.round_end_countdown * 10 + + if(delay_end) + to_chat(world, "An admin has delayed the round end.") + return + + to_chat(world, "Rebooting World in [delay/10] [(delay >= 10 && delay < 20) ? "second" : "seconds"]. [reason]") + + var/start_wait = world.time + UNTIL(round_end_sound_sent && (world.time - start_wait) > (delay * 2)) //don't wait forever + sleep(delay - (world.time - start_wait)) + + if(delay_end) + to_chat(world, "Reboot was cancelled by an admin.") + return + + SSblackbox.set_details("[feedback_c]","[feedback_r]") + + log_game("Rebooting World. [reason]") + + world.Reboot() + +/datum/controller/subsystem/ticker/Shutdown() + if(!round_end_sound) + round_end_sound = pick(\ + 'sound/roundend/newroundsexy.ogg', + 'sound/roundend/apcdestroyed.ogg', + 'sound/roundend/bangindonk.ogg', + 'sound/roundend/leavingtg.ogg', + 'sound/roundend/its_only_game.ogg', + 'sound/roundend/yeehaw.ogg', + 'sound/roundend/disappointed.ogg'\ + ) + + world << sound(round_end_sound) \ No newline at end of file diff --git a/code/controllers/subsystem/title.dm b/code/controllers/subsystem/title.dm index d9f4ef9938..6c5466d8d9 100644 --- a/code/controllers/subsystem/title.dm +++ b/code/controllers/subsystem/title.dm @@ -55,6 +55,12 @@ SUBSYSTEM_DEF(title) var/F = file("data/previous_title.dat") F << file_path + for(var/thing in GLOB.clients) + if(!thing) + continue + var/obj/screen/splash/S = new(thing, FALSE) + S.Fade(FALSE,FALSE) + /datum/controller/subsystem/title/Recover() icon = SStitle.icon splash_turf = SStitle.splash_turf diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 99234b05ed..deea959c00 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -2,9 +2,9 @@ SUBSYSTEM_DEF(vote) name = "Vote" wait = 10 - flags = SS_KEEP_TIMING|SS_NO_INIT - - runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT + flags = SS_KEEP_TIMING|SS_NO_INIT + + runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT var/initiator = null var/started_time = null @@ -120,13 +120,13 @@ SUBSYSTEM_DEF(vote) if(SSticker && SSticker.mode)//Don't change the mode if the round already started. return message_admins("A vote has tried to change the gamemode, but the game has already started. Aborting.") GLOB.master_mode = . - world.save_mode(.) + SSticker.save_mode(.) to_chat(world, "The mode is now: [GLOB.master_mode]") log_admin("Gamemode has been voted for and switched to: [GLOB.master_mode].") if("gamemode") if(GLOB.master_mode != .) - world.save_mode(.) - if(SSticker.HasRoundStarted()) + SSticker.save_mode(.) + if(SSticker.HasRoundStarted()) restart = 1 else GLOB.master_mode = . @@ -137,7 +137,7 @@ SUBSYSTEM_DEF(vote) active_admins = 1 break if(!active_admins) - world.Reboot("Restart vote successful.", "end_error", "restart vote") + SSticker.Reboot("Restart vote successful.", "end_error", "restart vote") else to_chat(world, "Notice:Restart vote will not restart the server automatically because there are active admins on.") message_admins("A restart vote has passed, but there are active admins on with +server, so it has been canceled. If you wish, you may restart the server.") diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 834d6c864d..f4f4543ad3 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -36,7 +36,7 @@ Bonus /datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A) var/heal_amt = 0.5 if(M.toxloss > 0 && prob(20)) - new /obj/effect/overlay/temp/heal(get_turf(M), "#66FF99") + new /obj/effect/temp_visual/heal(get_turf(M), "#66FF99") M.adjustToxLoss(-heal_amt) return 1 @@ -67,7 +67,7 @@ Bonus /datum/symptom/heal/plus/Heal(mob/living/M, datum/disease/advance/A) var/heal_amt = 1 if(M.toxloss > 0 && prob(20)) - new /obj/effect/overlay/temp/heal(get_turf(M), "#00FF00") + new /obj/effect/temp_visual/heal(get_turf(M), "#00FF00") M.adjustToxLoss(-heal_amt) return 1 @@ -110,7 +110,7 @@ Bonus M.update_damage_overlays() if(prob(20)) - new /obj/effect/overlay/temp/heal(get_turf(M), "#FF3333") + new /obj/effect/temp_visual/heal(get_turf(M), "#FF3333") return 1 @@ -148,7 +148,7 @@ Bonus if(M.getCloneLoss() > 0) M.adjustCloneLoss(-1) M.take_bodypart_damage(0, 1) //Deals BURN damage, which is not cured by this symptom - new /obj/effect/overlay/temp/heal(get_turf(M), "#33FFCC") + new /obj/effect/temp_visual/heal(get_turf(M), "#33FFCC") if(!parts.len) return @@ -158,7 +158,7 @@ Bonus M.update_damage_overlays() if(prob(20)) - new /obj/effect/overlay/temp/heal(get_turf(M), "#CC1100") + new /obj/effect/temp_visual/heal(get_turf(M), "#CC1100") return 1 @@ -201,7 +201,7 @@ Bonus M.update_damage_overlays() if(prob(20)) - new /obj/effect/overlay/temp/heal(get_turf(M), "#FF9933") + new /obj/effect/temp_visual/heal(get_turf(M), "#FF9933") return 1 @@ -248,7 +248,7 @@ Bonus M.update_damage_overlays() if(prob(20)) - new /obj/effect/overlay/temp/heal(get_turf(M), "#CC6600") + new /obj/effect/temp_visual/heal(get_turf(M), "#CC6600") return 1 diff --git a/code/datums/martial.dm b/code/datums/martial.dm index b20bf556d5..fa02a2f092 100644 --- a/code/datums/martial.dm +++ b/code/datums/martial.dm @@ -79,681 +79,17 @@ /datum/martial_art/proc/teach(mob/living/carbon/human/H,make_temporary=0) if(make_temporary) temporary = 1 - if(temporary && H.martial_art) - if(!H.martial_art.allow_temp_override) + if(temporary && H.mind.martial_art) + if(!H.mind.martial_art.allow_temp_override) return - base = H.martial_art + base = H.mind.martial_art if(help_verb) H.verbs += help_verb - H.martial_art = src + H.mind.martial_art = src /datum/martial_art/proc/remove(mob/living/carbon/human/H) - if(H.martial_art != src) + if(H.mind.martial_art != src) return - H.martial_art = base + H.mind.martial_art = base if(help_verb) H.verbs -= help_verb - -/datum/martial_art/boxing - name = "Boxing" - -/datum/martial_art/boxing/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - to_chat(A, "Can't disarm while boxing!") - return 1 - -/datum/martial_art/boxing/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - to_chat(A, "Can't grab while boxing!") - return 1 - -/datum/martial_art/boxing/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - - A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) - - var/atk_verb = pick("left hook","right hook","straight punch") - - var/damage = rand(5, 8) + A.dna.species.punchdamagelow - if(!damage) - playsound(D.loc, A.dna.species.miss_sound, 25, 1, -1) - D.visible_message("[A] has attempted to [atk_verb] [D]!", \ - "[A] has attempted to [atk_verb] [D]!", null, COMBAT_MESSAGE_RANGE) - add_logs(A, D, "attempted to hit", atk_verb) - return 0 - - - var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected)) - var/armor_block = D.run_armor_check(affecting, "melee") - - playsound(D.loc, A.dna.species.attack_sound, 25, 1, -1) - - D.visible_message("[A] has [atk_verb]ed [D]!", \ - "[A] has [atk_verb]ed [D]!", null, COMBAT_MESSAGE_RANGE) - - D.apply_damage(damage, STAMINA, affecting, armor_block) - add_logs(A, D, "punched (boxing) ") - if(D.getStaminaLoss() > 50) - var/knockout_prob = D.getStaminaLoss() + rand(-15,15) - if((D.stat != DEAD) && prob(knockout_prob)) - D.visible_message("[A] has knocked [D] out with a haymaker!", \ - "[A] has knocked [D] out with a haymaker!") - D.apply_effect(10,WEAKEN,armor_block) - D.SetSleeping(5) - D.forcesay(GLOB.hit_appends) - add_logs(A, D, "knocked out (boxing) ") - else if(D.lying) - D.forcesay(GLOB.hit_appends) - return 1 - -/mob/living/carbon/human/proc/wrestling_help() - set name = "Recall Teachings" - set desc = "Remember how to wrestle." - set category = "Wrestling" - - to_chat(usr, "You flex your muscles and have a revelation...") - to_chat(usr, "Clinch: Grab. Passively gives you a chance to immediately aggressively grab someone. Not always successful.") - to_chat(usr, "Suplex: Disarm someone you are grabbing. Suplexes your target to the floor. Greatly injures them and leaves both you and your target on the floor.") - to_chat(usr, "Advanced grab: Grab. Passively causes stamina damage when grabbing someone.") - -#define TORNADO_COMBO "HHD" -#define THROWBACK_COMBO "DHD" -#define PLASMA_COMBO "HDDDH" - -/datum/martial_art/plasma_fist - name = "Plasma Fist" - help_verb = /mob/living/carbon/human/proc/plasma_fist_help - - -/datum/martial_art/plasma_fist/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(findtext(streak,TORNADO_COMBO)) - streak = "" - Tornado(A,D) - return 1 - if(findtext(streak,THROWBACK_COMBO)) - streak = "" - Throwback(A,D) - return 1 - if(findtext(streak,PLASMA_COMBO)) - streak = "" - Plasma(A,D) - return 1 - return 0 - -/datum/martial_art/plasma_fist/proc/TornadoAnimate(mob/living/carbon/human/A) - set waitfor = FALSE - for(var/i in list(NORTH,SOUTH,EAST,WEST,EAST,SOUTH,NORTH,SOUTH,EAST,WEST,EAST,SOUTH)) - if(!A) - break - A.setDir(i) - playsound(A.loc, 'sound/weapons/punch1.ogg', 15, 1, -1) - sleep(1) - -/datum/martial_art/plasma_fist/proc/Tornado(mob/living/carbon/human/A, mob/living/carbon/human/D) - A.say("TORNADO SWEEP!") - TornadoAnimate(A) - var/obj/effect/proc_holder/spell/aoe_turf/repulse/R = new(null) - var/list/turfs = list() - for(var/turf/T in range(1,A)) - turfs.Add(T) - R.cast(turfs) - add_logs(A, D, "tornado sweeped(Plasma Fist)") - return - -/datum/martial_art/plasma_fist/proc/Throwback(mob/living/carbon/human/A, mob/living/carbon/human/D) - D.visible_message("[A] has hit [D] with Plasma Punch!", \ - "[A] has hit [D] with Plasma Punch!") - playsound(D.loc, 'sound/weapons/punch1.ogg', 50, 1, -1) - var/atom/throw_target = get_edge_target_turf(D, get_dir(D, get_step_away(D, A))) - D.throw_at(throw_target, 200, 4,A) - A.say("HYAH!") - add_logs(A, D, "threw back (Plasma Fist)") - return - -/datum/martial_art/plasma_fist/proc/Plasma(mob/living/carbon/human/A, mob/living/carbon/human/D) - A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) - playsound(D.loc, 'sound/weapons/punch1.ogg', 50, 1, -1) - A.say("PLASMA FIST!") - D.visible_message("[A] has hit [D] with THE PLASMA FIST TECHNIQUE!", \ - "[A] has hit [D] with THE PLASMA FIST TECHNIQUE!") - D.gib() - add_logs(A, D, "gibbed (Plasma Fist)") - return - -/datum/martial_art/plasma_fist/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - add_to_streak("H",D) - if(check_streak(A,D)) - return 1 - basic_hit(A,D) - return 1 - -/datum/martial_art/plasma_fist/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - add_to_streak("D",D) - if(check_streak(A,D)) - return 1 - basic_hit(A,D) - return 1 - -/datum/martial_art/plasma_fist/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - add_to_streak("G",D) - if(check_streak(A,D)) - return 1 - basic_hit(A,D) - return 1 - -/mob/living/carbon/human/proc/plasma_fist_help() - set name = "Recall Teachings" - set desc = "Remember the martial techniques of the Plasma Fist." - set category = "Plasma Fist" - - to_chat(usr, "You clench your fists and have a flashback of knowledge...") - to_chat(usr, "Tornado Sweep: Harm Harm Disarm. Repulses target and everyone back.") - to_chat(usr, "Throwback: Disarm Harm Disarm. Throws the target and an item at them.") - to_chat(usr, "The Plasma Fist: Harm Disarm Disarm Disarm Harm. Knocks the brain out of the opponent and gibs their body.") - -//Used by the gang of the same name. Uses combos. Basic attacks bypass armor and never miss -#define WRIST_WRENCH_COMBO "DD" -#define BACK_KICK_COMBO "HG" -#define STOMACH_KNEE_COMBO "GH" -#define HEAD_KICK_COMBO "DHH" -#define ELBOW_DROP_COMBO "HDHDH" -/datum/martial_art/the_sleeping_carp - name = "The Sleeping Carp" - deflection_chance = 100 - no_guns = TRUE - allow_temp_override = FALSE - help_verb = /mob/living/carbon/human/proc/sleeping_carp_help - -/datum/martial_art/the_sleeping_carp/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(findtext(streak,WRIST_WRENCH_COMBO)) - streak = "" - wristWrench(A,D) - return 1 - if(findtext(streak,BACK_KICK_COMBO)) - streak = "" - backKick(A,D) - return 1 - if(findtext(streak,STOMACH_KNEE_COMBO)) - streak = "" - kneeStomach(A,D) - return 1 - if(findtext(streak,HEAD_KICK_COMBO)) - streak = "" - headKick(A,D) - return 1 - if(findtext(streak,ELBOW_DROP_COMBO)) - streak = "" - elbowDrop(A,D) - return 1 - return 0 - -/datum/martial_art/the_sleeping_carp/proc/wristWrench(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!D.stat && !D.stunned && !D.weakened) - A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) - D.visible_message("[A] grabs [D]'s wrist and wrenches it sideways!", \ - "[A] grabs your wrist and violently wrenches it to the side!") - playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - D.emote("scream") - D.drop_item() - D.apply_damage(5, BRUTE, pick("l_arm", "r_arm")) - D.Stun(3) - return 1 - add_logs(A, D, "wrist wrenched (Sleeping Carp)") - return basic_hit(A,D) - -/datum/martial_art/the_sleeping_carp/proc/backKick(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(A.dir == D.dir && !D.stat && !D.weakened) - A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) - D.visible_message("[A] kicks [D] in the back!", \ - "[A] kicks you in the back, making you stumble and fall!") - step_to(D,get_step(D,D.dir),1) - D.Weaken(4) - playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1) - return 1 - add_logs(A, D, "back-kicked (Sleeping Carp)") - return basic_hit(A,D) - -/datum/martial_art/the_sleeping_carp/proc/kneeStomach(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!D.stat && !D.weakened) - A.do_attack_animation(D, ATTACK_EFFECT_KICK) - D.visible_message("[A] knees [D] in the stomach!", \ - "[A] winds you with a knee in the stomach!") - D.audible_message("[D] gags!") - D.losebreath += 3 - D.Stun(2) - playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1) - return 1 - add_logs(A, D, "stomach kneed (Sleeping Carp)") - return basic_hit(A,D) - -/datum/martial_art/the_sleeping_carp/proc/headKick(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!D.stat && !D.weakened) - A.do_attack_animation(D, ATTACK_EFFECT_KICK) - D.visible_message("[A] kicks [D] in the head!", \ - "[A] kicks you in the jaw!") - D.apply_damage(20, BRUTE, "head") - D.drop_item() - playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1) - D.Stun(4) - return 1 - add_logs(A, D, "head kicked (Sleeping Carp)") - return basic_hit(A,D) - -/datum/martial_art/the_sleeping_carp/proc/elbowDrop(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(D.weakened || D.resting || D.stat) - A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) - D.visible_message("[A] elbow drops [D]!", \ - "[A] piledrives you with their elbow!") - if(D.stat) - D.death() //FINISH HIM! - D.apply_damage(50, BRUTE, "chest") - playsound(get_turf(D), 'sound/weapons/punch1.ogg', 75, 1, -1) - return 1 - add_logs(A, D, "elbow dropped (Sleeping Carp)") - return basic_hit(A,D) - -/datum/martial_art/the_sleeping_carp/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - add_to_streak("G",D) - if(check_streak(A,D)) - return 1 - if(A.grab_state >= GRAB_AGGRESSIVE) - D.grabbedby(A, 1) - else - A.start_pulling(D, 1) - if(A.pulling) - D.drop_all_held_items() - D.stop_pulling() - if(A.a_intent == INTENT_GRAB) - add_logs(A, D, "grabbed", addition="aggressively") - A.grab_state = GRAB_AGGRESSIVE //Instant aggressive grab - else - add_logs(A, D, "grabbed", addition="passively") - A.grab_state = GRAB_PASSIVE - return 1 - -/datum/martial_art/the_sleeping_carp/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - add_to_streak("H",D) - if(check_streak(A,D)) - return 1 - A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) - var/atk_verb = pick("punches", "kicks", "chops", "hits", "slams") - D.visible_message("[A] [atk_verb] [D]!", \ - "[A] [atk_verb] you!") - D.apply_damage(rand(10,15), BRUTE) - playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, 1, -1) - if(prob(D.getBruteLoss()) && !D.lying) - D.visible_message("[D] stumbles and falls!", "The blow sends you to the ground!") - D.Weaken(4) - add_logs(A, D, "[atk_verb] (Sleeping Carp)") - return 1 - - -/datum/martial_art/the_sleeping_carp/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - add_to_streak("D",D) - if(check_streak(A,D)) - return 1 - return ..() - -/mob/living/carbon/human/proc/sleeping_carp_help() - set name = "Recall Teachings" - set desc = "Remember the martial techniques of the Sleeping Carp clan." - set category = "Sleeping Carp" - - to_chat(usr, "You retreat inward and recall the teachings of the Sleeping Carp...") - - to_chat(usr, "Wrist Wrench: Disarm Disarm. Forces opponent to drop item in hand.") - to_chat(usr, "Back Kick: Harm Grab. Opponent must be facing away. Knocks down.") - to_chat(usr, "Stomach Knee: Grab Harm. Knocks the wind out of opponent and stuns.") - to_chat(usr, "Head Kick: Disarm Harm Harm. Decent damage, forces opponent to drop item in hand.") - to_chat(usr, "Elbow Drop: Harm Disarm Harm Disarm Harm. Opponent must be on the ground. Deals huge damage, instantly kills anyone in critical condition.") - -//CQC -#define SLAM_COMBO "GH" -#define KICK_COMBO "HH" -#define RESTRAIN_COMBO "GG" -#define PRESSURE_COMBO "DG" -#define CONSECUTIVE_COMBO "DDH" -/datum/martial_art/cqc - name = "CQC" - help_verb = /mob/living/carbon/human/proc/CQC_help - block_chance = 75 - -/datum/martial_art/cqc/proc/drop_restraining() - restraining = 0 - -/datum/martial_art/cqc/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(findtext(streak,SLAM_COMBO)) - streak = "" - Slam(A,D) - return 1 - if(findtext(streak,KICK_COMBO)) - streak = "" - Kick(A,D) - return 1 - if(findtext(streak,RESTRAIN_COMBO)) - streak = "" - Restrain(A,D) - return 1 - if(findtext(streak,PRESSURE_COMBO)) - streak = "" - Pressure(A,D) - return 1 - if(findtext(streak,CONSECUTIVE_COMBO)) - streak = "" - Consecutive(A,D) - return 0 - -/datum/martial_art/cqc/proc/Slam(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!D.stat || !D.weakened) - D.visible_message("[A] slams [D] into the ground!", \ - "[A] slams you into the ground!") - playsound(get_turf(A), 'sound/weapons/slam.ogg', 50, 1, -1) - D.apply_damage(10, BRUTE) - D.Weaken(6) - add_logs(A, D, "cqc slammed") - return 1 - -/datum/martial_art/cqc/proc/Kick(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!D.stat || !D.weakened) - D.visible_message("[A] kicks [D] back!", \ - "[A] kicks you back!") - playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1) - var/atom/throw_target = get_edge_target_turf(D, A.dir) - D.throw_at(throw_target, 1, 14, A) - D.apply_damage(10, BRUTE) - add_logs(A, D, "cqc kicked") - if(D.weakened && !D.stat) - D.visible_message("[A] kicks [D]'s head, knocking them out!", \ - "[A] kicks your head, knocking you out!") - playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1) - D.SetSleeping(15) - D.adjustBrainLoss(25) - return 1 - -/datum/martial_art/cqc/proc/Pressure(mob/living/carbon/human/A, mob/living/carbon/human/D) - D.visible_message("[A] forces their arm on [D]'s neck!") - D.adjustStaminaLoss(60) - playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1) - return 1 - -/datum/martial_art/cqc/proc/Restrain(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(restraining) - return - if(!D.stat) - D.visible_message("[A] locks [D] into a restraining position!", \ - "[A] locks you into a restraining position!") - D.adjustStaminaLoss(20) - D.Stun(5) - restraining = 1 - addtimer(CALLBACK(src, .proc/drop_restraining), 50, TIMER_UNIQUE) - return 1 - -/datum/martial_art/cqc/proc/Consecutive(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!D.stat) - D.visible_message("[A] strikes [D]'s abdomen, neck and back consecutively", \ - "[A] strikes your abdomen, neck and back consecutively!") - playsound(get_turf(D), 'sound/weapons/cqchit2.ogg', 50, 1, -1) - var/obj/item/I = D.get_active_held_item() - if(I && D.drop_item()) - A.put_in_hands(I) - D.adjustStaminaLoss(50) - D.apply_damage(25, BRUTE) - return 1 - -/datum/martial_art/cqc/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - add_to_streak("G",D) - if(check_streak(A,D)) - return 1 - if(A.grab_state >= GRAB_AGGRESSIVE) - D.grabbedby(A, 1) - else - A.start_pulling(D, 1) - if(A.pulling) - D.stop_pulling() - add_logs(A, D, "grabbed", addition="aggressively") - A.grab_state = GRAB_AGGRESSIVE //Instant aggressive grab - - return 1 - -/datum/martial_art/cqc/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - add_to_streak("H",D) - if(check_streak(A,D)) - return 1 - add_logs(A, D, "CQC'd") - A.do_attack_animation(D) - var/picked_hit_type = pick("CQC'd", "Big Bossed") - var/bonus_damage = 13 - if(D.weakened || D.resting || D.lying) - bonus_damage += 5 - picked_hit_type = "stomps on" - D.apply_damage(bonus_damage, BRUTE) - if(picked_hit_type == "kicks" || picked_hit_type == "stomps on") - playsound(get_turf(D), 'sound/weapons/cqchit2.ogg', 50, 1, -1) - else - playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1) - D.visible_message("[A] [picked_hit_type] [D]!", \ - "[A] [picked_hit_type] you!") - add_logs(A, D, "[picked_hit_type] with CQC") - if(A.resting && !D.stat && !D.weakened) - D.visible_message("[A] leg sweeps [D]!", \ - "[A] leg sweeps you!") - playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1) - D.apply_damage(10, BRUTE) - D.Weaken(3) - add_logs(A, D, "cqc sweeped") - return 1 - -/datum/martial_art/cqc/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - add_to_streak("D",D) - var/obj/item/I = null - if(check_streak(A,D)) - return 1 - if(prob(65)) - if(!D.stat || !D.weakened || !restraining) - I = D.get_active_held_item() - D.visible_message("[A] strikes [D]'s jaw with their hand!", \ - "[A] strikes your jaw, disorienting you!") - playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1) - if(I && D.drop_item()) - A.put_in_hands(I) - D.Jitter(2) - D.apply_damage(5, BRUTE) - else - D.visible_message("[A] attempted to disarm [D]!", \ - "[A] attempted to disarm [D]!") - playsound(D, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - add_logs(A, D, "disarmed with CQC", "[I ? " grabbing \the [I]" : ""]") - if(restraining && A.pulling == D) - D.visible_message("[A] puts [D] into a chokehold!", \ - "[A] puts you into a chokehold!") - D.SetSleeping(20) - restraining = 0 - if(A.grab_state < GRAB_NECK) - A.grab_state = GRAB_NECK - else - restraining = 0 - return 0 - return 1 - -/mob/living/carbon/human/proc/CQC_help() - set name = "Remember The Basics" - set desc = "You try to remember some of the basics of CQC." - set category = "CQC" - - to_chat(usr, "You try to remember some of the basics of CQC.") - - to_chat(usr, "Slam: Grab Harm. Slam opponent into the ground, weakens and knocks down.") - to_chat(usr, "CQC Kick: Harm Disarm Harm. Knocks opponent away. Knocks out stunned or weakened opponents.") - to_chat(usr, "Restrain: Grab Grab. Locks opponents into a restraining position, disarm to knock them out with a choke hold.") - to_chat(usr, "Pressure: Disarm Grab. Decent stamina damage.") - to_chat(usr, "Consecutive CQC: Disarm Disarm Harm. Mainly offensive move, huge damage and decent stamina damage.") - - to_chat(usr, "In addition, by having your throw mode on when being attacked, you enter an active defense mode where you have a chance to block and sometimes even counter attacks done to you.") - -//ITEMS - -/obj/item/clothing/gloves/boxing - var/datum/martial_art/boxing/style = new - -/obj/item/clothing/gloves/boxing/equipped(mob/user, slot) - if(!ishuman(user)) - return - if(slot == slot_gloves) - var/mob/living/carbon/human/H = user - style.teach(H,1) - return - -/obj/item/clothing/gloves/boxing/dropped(mob/user) - if(!ishuman(user)) - return - var/mob/living/carbon/human/H = user - if(H.get_item_by_slot(slot_gloves) == src) - style.remove(H) - return - -/obj/item/weapon/storage/belt/champion/wrestling - name = "Wrestling Belt" - var/datum/martial_art/wrestling/style = new - -/obj/item/weapon/storage/belt/champion/wrestling/equipped(mob/user, slot) - if(!ishuman(user)) - return - if(slot == slot_belt) - var/mob/living/carbon/human/H = user - style.teach(H,1) - return - -/obj/item/weapon/storage/belt/champion/wrestling/dropped(mob/user) - if(!ishuman(user)) - return - var/mob/living/carbon/human/H = user - if(H.get_item_by_slot(slot_belt) == src) - style.remove(H) - return - -/obj/item/weapon/plasma_fist_scroll - name = "frayed scroll" - desc = "An aged and frayed scrap of paper written in shifting runes. There are hand-drawn illustrations of pugilism." - icon = 'icons/obj/wizard.dmi' - icon_state ="scroll2" - var/used = 0 - -/obj/item/weapon/plasma_fist_scroll/attack_self(mob/user) - if(!ishuman(user)) - return - if(!used) - var/mob/living/carbon/human/H = user - var/datum/martial_art/plasma_fist/F = new/datum/martial_art/plasma_fist(null) - F.teach(H) - to_chat(H, "You have learned the ancient martial art of Plasma Fist.") - used = 1 - desc = "It's completely blank." - name = "empty scroll" - icon_state = "blankscroll" - -/obj/item/weapon/cqc_manual - name = "old manual" - desc = "A small, black manual. There are drawn instructions of tactical hand-to-hand combat." - icon = 'icons/obj/library.dmi' - icon_state ="cqcmanual" - -/obj/item/weapon/cqc_manual/attack_self(mob/living/carbon/human/user) - if(!istype(user) || !user) - return - to_chat(user, "You remember the basics of CQC.") - var/datum/martial_art/cqc/D = new(null) - D.teach(user) - user.drop_item() - visible_message("[src] beeps ominously, and a moment later it bursts up in flames.") - new /obj/effect/decal/cleanable/ash(get_turf(src)) - qdel(src) - -/obj/item/weapon/sleeping_carp_scroll - name = "mysterious scroll" - desc = "A scroll filled with strange markings. It seems to be drawings of some sort of martial art." - icon = 'icons/obj/wizard.dmi' - icon_state = "scroll2" - -/obj/item/weapon/sleeping_carp_scroll/attack_self(mob/living/carbon/human/user) - if(!istype(user) || !user) - return - var/message = "You have learned the ancient martial art of the Sleeping Carp! Your hand-to-hand combat has become much more effective, and you are now able to deflect any projectiles \ - directed toward you. However, you are also unable to use any ranged weaponry. You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab." - to_chat(user, message) - var/datum/martial_art/the_sleeping_carp/theSleepingCarp = new(null) - theSleepingCarp.teach(user) - user.drop_item() - visible_message("[src] lights up in fire and quickly burns to ash.") - new /obj/effect/decal/cleanable/ash(get_turf(src)) - qdel(src) - -/obj/item/weapon/twohanded/bostaff - name = "bo staff" - desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts. Can be wielded to both kill and incapacitate." - force = 10 - w_class = WEIGHT_CLASS_BULKY - slot_flags = SLOT_BACK - force_unwielded = 10 - force_wielded = 24 - throwforce = 20 - throw_speed = 2 - attack_verb = list("smashed", "slammed", "whacked", "thwacked") - icon = 'icons/obj/weapons.dmi' - icon_state = "bostaff0" - block_chance = 50 - -/obj/item/weapon/twohanded/bostaff/update_icon() - icon_state = "bostaff[wielded]" - return - -/obj/item/weapon/twohanded/bostaff/attack(mob/target, mob/living/user) - add_fingerprint(user) - if((CLUMSY in user.disabilities) && prob(50)) - to_chat(user, "You club yourself over the head with [src].") - user.Weaken(3) - if(ishuman(user)) - var/mob/living/carbon/human/H = user - H.apply_damage(2*force, BRUTE, "head") - else - user.take_bodypart_damage(2*force) - return - if(iscyborg(target)) - return ..() - if(!isliving(target)) - return ..() - var/mob/living/carbon/C = target - if(C.stat) - to_chat(user, "It would be dishonorable to attack a foe while they cannot retaliate.") - return - if(user.a_intent == INTENT_DISARM) - if(!wielded) - return ..() - if(!ishuman(target)) - return ..() - var/mob/living/carbon/human/H = target - var/list/fluffmessages = list("[user] clubs [H] with [src]!", \ - "[user] smacks [H] with the butt of [src]!", \ - "[user] broadsides [H] with [src]!", \ - "[user] smashes [H]'s head with [src]!", \ - "[user] beats [H] with front of [src]!", \ - "[user] twirls and slams [H] with [src]!") - H.visible_message("[pick(fluffmessages)]", \ - "[pick(fluffmessages)]") - playsound(get_turf(user), 'sound/effects/woodhit.ogg', 75, 1, -1) - H.adjustStaminaLoss(rand(13,20)) - if(prob(10)) - H.visible_message("[H] collapses!", \ - "Your legs give out!") - H.Weaken(4) - if(H.staminaloss && !H.sleeping) - var/total_health = (H.health - H.staminaloss) - if(total_health <= HEALTH_THRESHOLD_CRIT && !H.stat) - H.visible_message("[user] delivers a heavy hit to [H]'s head, knocking them out cold!", \ - "[user] knocks you unconscious!") - H.SetSleeping(30) - H.adjustBrainLoss(25) - else - return ..() - -/obj/item/weapon/twohanded/bostaff/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance) - if(wielded) - return ..() - return 0 - diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm new file mode 100644 index 0000000000..6a3a059890 --- /dev/null +++ b/code/datums/martial/boxing.dm @@ -0,0 +1,67 @@ +/datum/martial_art/boxing + name = "Boxing" + +/datum/martial_art/boxing/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + to_chat(A, "Can't disarm while boxing!") + return 1 + +/datum/martial_art/boxing/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + to_chat(A, "Can't grab while boxing!") + return 1 + +/datum/martial_art/boxing/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + + A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) + + var/atk_verb = pick("left hook","right hook","straight punch") + + var/damage = rand(5, 8) + A.dna.species.punchdamagelow + if(!damage) + playsound(D.loc, A.dna.species.miss_sound, 25, 1, -1) + D.visible_message("[A] has attempted to [atk_verb] [D]!", \ + "[A] has attempted to [atk_verb] [D]!", null, COMBAT_MESSAGE_RANGE) + add_logs(A, D, "attempted to hit", atk_verb) + return 0 + + + var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected)) + var/armor_block = D.run_armor_check(affecting, "melee") + + playsound(D.loc, A.dna.species.attack_sound, 25, 1, -1) + + D.visible_message("[A] has [atk_verb]ed [D]!", \ + "[A] has [atk_verb]ed [D]!", null, COMBAT_MESSAGE_RANGE) + + D.apply_damage(damage, STAMINA, affecting, armor_block) + add_logs(A, D, "punched (boxing) ") + if(D.getStaminaLoss() > 50) + var/knockout_prob = D.getStaminaLoss() + rand(-15,15) + if((D.stat != DEAD) && prob(knockout_prob)) + D.visible_message("[A] has knocked [D] out with a haymaker!", \ + "[A] has knocked [D] out with a haymaker!") + D.apply_effect(10,WEAKEN,armor_block) + D.SetSleeping(5) + D.forcesay(GLOB.hit_appends) + add_logs(A, D, "knocked out (boxing) ") + else if(D.lying) + D.forcesay(GLOB.hit_appends) + return 1 + +/obj/item/clothing/gloves/boxing + var/datum/martial_art/boxing/style = new + +/obj/item/clothing/gloves/boxing/equipped(mob/user, slot) + if(!ishuman(user)) + return + if(slot == slot_gloves) + var/mob/living/carbon/human/H = user + style.teach(H,1) + return + +/obj/item/clothing/gloves/boxing/dropped(mob/user) + if(!ishuman(user)) + return + var/mob/living/carbon/human/H = user + if(H.get_item_by_slot(slot_gloves) == src) + style.remove(H) + return diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm new file mode 100644 index 0000000000..ebb570fa0c --- /dev/null +++ b/code/datums/martial/cqc.dm @@ -0,0 +1,199 @@ +#define SLAM_COMBO "GH" +#define KICK_COMBO "HH" +#define RESTRAIN_COMBO "GG" +#define PRESSURE_COMBO "DG" +#define CONSECUTIVE_COMBO "DDH" + +/datum/martial_art/cqc + name = "CQC" + help_verb = /mob/living/carbon/human/proc/CQC_help + block_chance = 75 + +/datum/martial_art/cqc/proc/drop_restraining() + restraining = 0 + +/datum/martial_art/cqc/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(findtext(streak,SLAM_COMBO)) + streak = "" + Slam(A,D) + return 1 + if(findtext(streak,KICK_COMBO)) + streak = "" + Kick(A,D) + return 1 + if(findtext(streak,RESTRAIN_COMBO)) + streak = "" + Restrain(A,D) + return 1 + if(findtext(streak,PRESSURE_COMBO)) + streak = "" + Pressure(A,D) + return 1 + if(findtext(streak,CONSECUTIVE_COMBO)) + streak = "" + Consecutive(A,D) + return 0 + +/datum/martial_art/cqc/proc/Slam(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(!D.stat || !D.weakened) + D.visible_message("[A] slams [D] into the ground!", \ + "[A] slams you into the ground!") + playsound(get_turf(A), 'sound/weapons/slam.ogg', 50, 1, -1) + D.apply_damage(10, BRUTE) + D.Weaken(6) + add_logs(A, D, "cqc slammed") + return 1 + +/datum/martial_art/cqc/proc/Kick(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(!D.stat || !D.weakened) + D.visible_message("[A] kicks [D] back!", \ + "[A] kicks you back!") + playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1) + var/atom/throw_target = get_edge_target_turf(D, A.dir) + D.throw_at(throw_target, 1, 14, A) + D.apply_damage(10, BRUTE) + add_logs(A, D, "cqc kicked") + if(D.weakened && !D.stat) + D.visible_message("[A] kicks [D]'s head, knocking them out!", \ + "[A] kicks your head, knocking you out!") + playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1) + D.SetSleeping(15) + D.adjustBrainLoss(25) + return 1 + +/datum/martial_art/cqc/proc/Pressure(mob/living/carbon/human/A, mob/living/carbon/human/D) + D.visible_message("[A] forces their arm on [D]'s neck!") + D.adjustStaminaLoss(60) + playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1) + return 1 + +/datum/martial_art/cqc/proc/Restrain(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(restraining) + return + if(!D.stat) + D.visible_message("[A] locks [D] into a restraining position!", \ + "[A] locks you into a restraining position!") + D.adjustStaminaLoss(20) + D.Stun(5) + restraining = 1 + addtimer(CALLBACK(src, .proc/drop_restraining), 50, TIMER_UNIQUE) + return 1 + +/datum/martial_art/cqc/proc/Consecutive(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(!D.stat) + D.visible_message("[A] strikes [D]'s abdomen, neck and back consecutively", \ + "[A] strikes your abdomen, neck and back consecutively!") + playsound(get_turf(D), 'sound/weapons/cqchit2.ogg', 50, 1, -1) + var/obj/item/I = D.get_active_held_item() + if(I && D.drop_item()) + A.put_in_hands(I) + D.adjustStaminaLoss(50) + D.apply_damage(25, BRUTE) + return 1 + +/datum/martial_art/cqc/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + add_to_streak("G",D) + if(check_streak(A,D)) + return 1 + if(A.grab_state >= GRAB_AGGRESSIVE) + D.grabbedby(A, 1) + else + A.start_pulling(D, 1) + if(A.pulling) + D.stop_pulling() + add_logs(A, D, "grabbed", addition="aggressively") + A.grab_state = GRAB_AGGRESSIVE //Instant aggressive grab + + return 1 + +/datum/martial_art/cqc/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + add_to_streak("H",D) + if(check_streak(A,D)) + return 1 + add_logs(A, D, "CQC'd") + A.do_attack_animation(D) + var/picked_hit_type = pick("CQC'd", "Big Bossed") + var/bonus_damage = 13 + if(D.weakened || D.resting || D.lying) + bonus_damage += 5 + picked_hit_type = "stomps on" + D.apply_damage(bonus_damage, BRUTE) + if(picked_hit_type == "kicks" || picked_hit_type == "stomps on") + playsound(get_turf(D), 'sound/weapons/cqchit2.ogg', 50, 1, -1) + else + playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1) + D.visible_message("[A] [picked_hit_type] [D]!", \ + "[A] [picked_hit_type] you!") + add_logs(A, D, "[picked_hit_type] with CQC") + if(A.resting && !D.stat && !D.weakened) + D.visible_message("[A] leg sweeps [D]!", \ + "[A] leg sweeps you!") + playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1) + D.apply_damage(10, BRUTE) + D.Weaken(3) + add_logs(A, D, "cqc sweeped") + return 1 + +/datum/martial_art/cqc/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + add_to_streak("D",D) + var/obj/item/I = null + if(check_streak(A,D)) + return 1 + if(prob(65)) + if(!D.stat || !D.weakened || !restraining) + I = D.get_active_held_item() + D.visible_message("[A] strikes [D]'s jaw with their hand!", \ + "[A] strikes your jaw, disorienting you!") + playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1) + if(I && D.drop_item()) + A.put_in_hands(I) + D.Jitter(2) + D.apply_damage(5, BRUTE) + else + D.visible_message("[A] attempted to disarm [D]!", \ + "[A] attempted to disarm [D]!") + playsound(D, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + add_logs(A, D, "disarmed with CQC", "[I ? " grabbing \the [I]" : ""]") + if(restraining && A.pulling == D) + D.visible_message("[A] puts [D] into a chokehold!", \ + "[A] puts you into a chokehold!") + D.SetSleeping(20) + restraining = 0 + if(A.grab_state < GRAB_NECK) + A.grab_state = GRAB_NECK + else + restraining = 0 + return 0 + return 1 + +/mob/living/carbon/human/proc/CQC_help() + set name = "Remember The Basics" + set desc = "You try to remember some of the basics of CQC." + set category = "CQC" + + to_chat(usr, "You try to remember some of the basics of CQC.") + + to_chat(usr, "Slam: Grab Harm. Slam opponent into the ground, weakens and knocks down.") + to_chat(usr, "CQC Kick: Harm Disarm Harm. Knocks opponent away. Knocks out stunned or weakened opponents.") + to_chat(usr, "Restrain: Grab Grab. Locks opponents into a restraining position, disarm to knock them out with a choke hold.") + to_chat(usr, "Pressure: Disarm Grab. Decent stamina damage.") + to_chat(usr, "Consecutive CQC: Disarm Disarm Harm. Mainly offensive move, huge damage and decent stamina damage.") + + to_chat(usr, "In addition, by having your throw mode on when being attacked, you enter an active defense mode where you have a chance to block and sometimes even counter attacks done to you.") + +/obj/item/weapon/cqc_manual + name = "old manual" + desc = "A small, black manual. There are drawn instructions of tactical hand-to-hand combat." + icon = 'icons/obj/library.dmi' + icon_state ="cqcmanual" + +/obj/item/weapon/cqc_manual/attack_self(mob/living/carbon/human/user) + if(!istype(user) || !user) + return + to_chat(user, "You remember the basics of CQC.") + var/datum/martial_art/cqc/D = new(null) + D.teach(user) + user.drop_item() + visible_message("[src] beeps ominously, and a moment later it bursts up in flames.") + new /obj/effect/decal/cleanable/ash(get_turf(src)) + qdel(src) diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index 5bc9b0588b..eb5f74b411 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -13,12 +13,12 @@ to_chat(owner, "You can't use Krav Maga while you're incapacitated.") return var/mob/living/carbon/human/H = owner - if (H.martial_art.streak == "neck_chop") + if (H.mind.martial_art.streak == "neck_chop") owner.visible_message("[owner] assumes a neutral stance.", "Your next attack is cleared.") - H.martial_art.streak = "" + H.mind.martial_art.streak = "" else owner.visible_message("[owner] assumes the Neck Chop stance!", "Your next attack will be a Neck Chop.") - H.martial_art.streak = "neck_chop" + H.mind.martial_art.streak = "neck_chop" /datum/action/leg_sweep name = "Leg Sweep - Trips the victim, knocking them down for a brief moment." @@ -29,12 +29,12 @@ to_chat(owner, "You can't use Krav Maga while you're incapacitated.") return var/mob/living/carbon/human/H = owner - if (H.martial_art.streak == "leg_sweep") + if (H.mind.martial_art.streak == "leg_sweep") owner.visible_message("[owner] assumes a neutral stance.", "Your next attack is cleared.") - H.martial_art.streak = "" + H.mind.martial_art.streak = "" else owner.visible_message("[owner] assumes the Leg Sweep stance!", "Your next attack will be a Leg Sweep.") - H.martial_art.streak = "leg_sweep" + H.mind.martial_art.streak = "leg_sweep" /datum/action/lung_punch//referred to internally as 'quick choke' name = "Lung Punch - Delivers a strong punch just above the victim's abdomen, constraining the lungs. The victim will be unable to breathe for a short time." @@ -45,12 +45,12 @@ to_chat(owner, "You can't use Krav Maga while you're incapacitated.") return var/mob/living/carbon/human/H = owner - if (H.martial_art.streak == "quick_choke") + if (H.mind.martial_art.streak == "quick_choke") owner.visible_message("[owner] assumes a neutral stance.", "Your next attack is cleared.") - H.martial_art.streak = "" + H.mind.martial_art.streak = "" else owner.visible_message("[owner] assumes the Lung Punch stance!", "Your next attack will be a Lung Punch.") - H.martial_art.streak = "quick_choke"//internal name for lung punch + H.mind.martial_art.streak = "quick_choke"//internal name for lung punch /datum/martial_art/krav_maga/teach(var/mob/living/carbon/human/H,var/make_temporary=0) ..() diff --git a/code/datums/martial/plasma_fist.dm b/code/datums/martial/plasma_fist.dm new file mode 100644 index 0000000000..c79ef032ee --- /dev/null +++ b/code/datums/martial/plasma_fist.dm @@ -0,0 +1,114 @@ +#define TORNADO_COMBO "HHD" +#define THROWBACK_COMBO "DHD" +#define PLASMA_COMBO "HDDDH" + +/datum/martial_art/plasma_fist + name = "Plasma Fist" + help_verb = /mob/living/carbon/human/proc/plasma_fist_help + + +/datum/martial_art/plasma_fist/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(findtext(streak,TORNADO_COMBO)) + streak = "" + Tornado(A,D) + return 1 + if(findtext(streak,THROWBACK_COMBO)) + streak = "" + Throwback(A,D) + return 1 + if(findtext(streak,PLASMA_COMBO)) + streak = "" + Plasma(A,D) + return 1 + return 0 + +/datum/martial_art/plasma_fist/proc/TornadoAnimate(mob/living/carbon/human/A) + set waitfor = FALSE + for(var/i in list(NORTH,SOUTH,EAST,WEST,EAST,SOUTH,NORTH,SOUTH,EAST,WEST,EAST,SOUTH)) + if(!A) + break + A.setDir(i) + playsound(A.loc, 'sound/weapons/punch1.ogg', 15, 1, -1) + sleep(1) + +/datum/martial_art/plasma_fist/proc/Tornado(mob/living/carbon/human/A, mob/living/carbon/human/D) + A.say("TORNADO SWEEP!") + TornadoAnimate(A) + var/obj/effect/proc_holder/spell/aoe_turf/repulse/R = new(null) + var/list/turfs = list() + for(var/turf/T in range(1,A)) + turfs.Add(T) + R.cast(turfs) + add_logs(A, D, "tornado sweeped(Plasma Fist)") + return + +/datum/martial_art/plasma_fist/proc/Throwback(mob/living/carbon/human/A, mob/living/carbon/human/D) + D.visible_message("[A] has hit [D] with Plasma Punch!", \ + "[A] has hit [D] with Plasma Punch!") + playsound(D.loc, 'sound/weapons/punch1.ogg', 50, 1, -1) + var/atom/throw_target = get_edge_target_turf(D, get_dir(D, get_step_away(D, A))) + D.throw_at(throw_target, 200, 4,A) + A.say("HYAH!") + add_logs(A, D, "threw back (Plasma Fist)") + return + +/datum/martial_art/plasma_fist/proc/Plasma(mob/living/carbon/human/A, mob/living/carbon/human/D) + A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) + playsound(D.loc, 'sound/weapons/punch1.ogg', 50, 1, -1) + A.say("PLASMA FIST!") + D.visible_message("[A] has hit [D] with THE PLASMA FIST TECHNIQUE!", \ + "[A] has hit [D] with THE PLASMA FIST TECHNIQUE!") + D.gib() + add_logs(A, D, "gibbed (Plasma Fist)") + return + +/datum/martial_art/plasma_fist/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + add_to_streak("H",D) + if(check_streak(A,D)) + return 1 + basic_hit(A,D) + return 1 + +/datum/martial_art/plasma_fist/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + add_to_streak("D",D) + if(check_streak(A,D)) + return 1 + basic_hit(A,D) + return 1 + +/datum/martial_art/plasma_fist/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + add_to_streak("G",D) + if(check_streak(A,D)) + return 1 + basic_hit(A,D) + return 1 + +/mob/living/carbon/human/proc/plasma_fist_help() + set name = "Recall Teachings" + set desc = "Remember the martial techniques of the Plasma Fist." + set category = "Plasma Fist" + + to_chat(usr, "You clench your fists and have a flashback of knowledge...") + to_chat(usr, "Tornado Sweep: Harm Harm Disarm. Repulses target and everyone back.") + to_chat(usr, "Throwback: Disarm Harm Disarm. Throws the target and an item at them.") + to_chat(usr, "The Plasma Fist: Harm Disarm Disarm Disarm Harm. Knocks the brain out of the opponent and gibs their body.") + +/obj/item/weapon/plasma_fist_scroll + name = "frayed scroll" + desc = "An aged and frayed scrap of paper written in shifting runes. There are hand-drawn illustrations of pugilism." + icon = 'icons/obj/wizard.dmi' + icon_state ="scroll2" + var/used = 0 + +/obj/item/weapon/plasma_fist_scroll/attack_self(mob/user) + if(!ishuman(user)) + return + if(!used) + var/mob/living/carbon/human/H = user + var/datum/martial_art/plasma_fist/F = new/datum/martial_art/plasma_fist(null) + F.teach(H) + to_chat(H, "You have learned the ancient martial art of Plasma Fist.") + used = 1 + desc = "It's completely blank." + name = "empty scroll" + icon_state = "blankscroll" diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm new file mode 100644 index 0000000000..f079d2a7db --- /dev/null +++ b/code/datums/martial/sleeping_carp.dm @@ -0,0 +1,247 @@ +#define WRIST_WRENCH_COMBO "DD" +#define BACK_KICK_COMBO "HG" +#define STOMACH_KNEE_COMBO "GH" +#define HEAD_KICK_COMBO "DHH" +#define ELBOW_DROP_COMBO "HDHDH" + +/datum/martial_art/the_sleeping_carp + name = "The Sleeping Carp" + deflection_chance = 100 + no_guns = TRUE + allow_temp_override = FALSE + help_verb = /mob/living/carbon/human/proc/sleeping_carp_help + +/datum/martial_art/the_sleeping_carp/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(findtext(streak,WRIST_WRENCH_COMBO)) + streak = "" + wristWrench(A,D) + return 1 + if(findtext(streak,BACK_KICK_COMBO)) + streak = "" + backKick(A,D) + return 1 + if(findtext(streak,STOMACH_KNEE_COMBO)) + streak = "" + kneeStomach(A,D) + return 1 + if(findtext(streak,HEAD_KICK_COMBO)) + streak = "" + headKick(A,D) + return 1 + if(findtext(streak,ELBOW_DROP_COMBO)) + streak = "" + elbowDrop(A,D) + return 1 + return 0 + +/datum/martial_art/the_sleeping_carp/proc/wristWrench(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(!D.stat && !D.stunned && !D.weakened) + A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) + D.visible_message("[A] grabs [D]'s wrist and wrenches it sideways!", \ + "[A] grabs your wrist and violently wrenches it to the side!") + playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + D.emote("scream") + D.drop_item() + D.apply_damage(5, BRUTE, pick("l_arm", "r_arm")) + D.Stun(3) + return 1 + add_logs(A, D, "wrist wrenched (Sleeping Carp)") + return basic_hit(A,D) + +/datum/martial_art/the_sleeping_carp/proc/backKick(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(A.dir == D.dir && !D.stat && !D.weakened) + A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) + D.visible_message("[A] kicks [D] in the back!", \ + "[A] kicks you in the back, making you stumble and fall!") + step_to(D,get_step(D,D.dir),1) + D.Weaken(4) + playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1) + return 1 + add_logs(A, D, "back-kicked (Sleeping Carp)") + return basic_hit(A,D) + +/datum/martial_art/the_sleeping_carp/proc/kneeStomach(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(!D.stat && !D.weakened) + A.do_attack_animation(D, ATTACK_EFFECT_KICK) + D.visible_message("[A] knees [D] in the stomach!", \ + "[A] winds you with a knee in the stomach!") + D.audible_message("[D] gags!") + D.losebreath += 3 + D.Stun(2) + playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1) + return 1 + add_logs(A, D, "stomach kneed (Sleeping Carp)") + return basic_hit(A,D) + +/datum/martial_art/the_sleeping_carp/proc/headKick(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(!D.stat && !D.weakened) + A.do_attack_animation(D, ATTACK_EFFECT_KICK) + D.visible_message("[A] kicks [D] in the head!", \ + "[A] kicks you in the jaw!") + D.apply_damage(20, BRUTE, "head") + D.drop_item() + playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1) + D.Stun(4) + return 1 + add_logs(A, D, "head kicked (Sleeping Carp)") + return basic_hit(A,D) + +/datum/martial_art/the_sleeping_carp/proc/elbowDrop(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(D.weakened || D.resting || D.stat) + A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) + D.visible_message("[A] elbow drops [D]!", \ + "[A] piledrives you with their elbow!") + if(D.stat) + D.death() //FINISH HIM! + D.apply_damage(50, BRUTE, "chest") + playsound(get_turf(D), 'sound/weapons/punch1.ogg', 75, 1, -1) + return 1 + add_logs(A, D, "elbow dropped (Sleeping Carp)") + return basic_hit(A,D) + +/datum/martial_art/the_sleeping_carp/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + add_to_streak("G",D) + if(check_streak(A,D)) + return 1 + if(A.grab_state >= GRAB_AGGRESSIVE) + D.grabbedby(A, 1) + else + A.start_pulling(D, 1) + if(A.pulling) + D.drop_all_held_items() + D.stop_pulling() + if(A.a_intent == INTENT_GRAB) + add_logs(A, D, "grabbed", addition="aggressively") + A.grab_state = GRAB_AGGRESSIVE //Instant aggressive grab + else + add_logs(A, D, "grabbed", addition="passively") + A.grab_state = GRAB_PASSIVE + return 1 + +/datum/martial_art/the_sleeping_carp/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + add_to_streak("H",D) + if(check_streak(A,D)) + return 1 + A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) + var/atk_verb = pick("punches", "kicks", "chops", "hits", "slams") + D.visible_message("[A] [atk_verb] [D]!", \ + "[A] [atk_verb] you!") + D.apply_damage(rand(10,15), BRUTE) + playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, 1, -1) + if(prob(D.getBruteLoss()) && !D.lying) + D.visible_message("[D] stumbles and falls!", "The blow sends you to the ground!") + D.Weaken(4) + add_logs(A, D, "[atk_verb] (Sleeping Carp)") + return 1 + + +/datum/martial_art/the_sleeping_carp/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + add_to_streak("D",D) + if(check_streak(A,D)) + return 1 + return ..() + +/mob/living/carbon/human/proc/sleeping_carp_help() + set name = "Recall Teachings" + set desc = "Remember the martial techniques of the Sleeping Carp clan." + set category = "Sleeping Carp" + + to_chat(usr, "You retreat inward and recall the teachings of the Sleeping Carp...") + + to_chat(usr, "Wrist Wrench: Disarm Disarm. Forces opponent to drop item in hand.") + to_chat(usr, "Back Kick: Harm Grab. Opponent must be facing away. Knocks down.") + to_chat(usr, "Stomach Knee: Grab Harm. Knocks the wind out of opponent and stuns.") + to_chat(usr, "Head Kick: Disarm Harm Harm. Decent damage, forces opponent to drop item in hand.") + to_chat(usr, "Elbow Drop: Harm Disarm Harm Disarm Harm. Opponent must be on the ground. Deals huge damage, instantly kills anyone in critical condition.") + +/obj/item/weapon/sleeping_carp_scroll + name = "mysterious scroll" + desc = "A scroll filled with strange markings. It seems to be drawings of some sort of martial art." + icon = 'icons/obj/wizard.dmi' + icon_state = "scroll2" + +/obj/item/weapon/sleeping_carp_scroll/attack_self(mob/living/carbon/human/user) + if(!istype(user) || !user) + return + var/message = "You have learned the ancient martial art of the Sleeping Carp! Your hand-to-hand combat has become much more effective, and you are now able to deflect any projectiles \ + directed toward you. However, you are also unable to use any ranged weaponry. You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab." + to_chat(user, message) + var/datum/martial_art/the_sleeping_carp/theSleepingCarp = new(null) + theSleepingCarp.teach(user) + user.drop_item() + visible_message("[src] lights up in fire and quickly burns to ash.") + new /obj/effect/decal/cleanable/ash(get_turf(src)) + qdel(src) + +/obj/item/weapon/twohanded/bostaff + name = "bo staff" + desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts. Can be wielded to both kill and incapacitate." + force = 10 + w_class = WEIGHT_CLASS_BULKY + slot_flags = SLOT_BACK + force_unwielded = 10 + force_wielded = 24 + throwforce = 20 + throw_speed = 2 + attack_verb = list("smashed", "slammed", "whacked", "thwacked") + icon = 'icons/obj/weapons.dmi' + icon_state = "bostaff0" + block_chance = 50 + +/obj/item/weapon/twohanded/bostaff/update_icon() + icon_state = "bostaff[wielded]" + return + +/obj/item/weapon/twohanded/bostaff/attack(mob/target, mob/living/user) + add_fingerprint(user) + if((CLUMSY in user.disabilities) && prob(50)) + to_chat(user, "You club yourself over the head with [src].") + user.Weaken(3) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + H.apply_damage(2*force, BRUTE, "head") + else + user.take_bodypart_damage(2*force) + return + if(iscyborg(target)) + return ..() + if(!isliving(target)) + return ..() + var/mob/living/carbon/C = target + if(C.stat) + to_chat(user, "It would be dishonorable to attack a foe while they cannot retaliate.") + return + if(user.a_intent == INTENT_DISARM) + if(!wielded) + return ..() + if(!ishuman(target)) + return ..() + var/mob/living/carbon/human/H = target + var/list/fluffmessages = list("[user] clubs [H] with [src]!", \ + "[user] smacks [H] with the butt of [src]!", \ + "[user] broadsides [H] with [src]!", \ + "[user] smashes [H]'s head with [src]!", \ + "[user] beats [H] with front of [src]!", \ + "[user] twirls and slams [H] with [src]!") + H.visible_message("[pick(fluffmessages)]", \ + "[pick(fluffmessages)]") + playsound(get_turf(user), 'sound/effects/woodhit.ogg', 75, 1, -1) + H.adjustStaminaLoss(rand(13,20)) + if(prob(10)) + H.visible_message("[H] collapses!", \ + "Your legs give out!") + H.Weaken(4) + if(H.staminaloss && !H.sleeping) + var/total_health = (H.health - H.staminaloss) + if(total_health <= HEALTH_THRESHOLD_CRIT && !H.stat) + H.visible_message("[user] delivers a heavy hit to [H]'s head, knocking them out cold!", \ + "[user] knocks you unconscious!") + H.SetSleeping(30) + H.adjustBrainLoss(25) + else + return ..() + +/obj/item/weapon/twohanded/bostaff/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance) + if(wielded) + return ..() + return 0 diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm index 5554ceeaeb..fc1c7a9b6d 100644 --- a/code/datums/martial/wrestling.dm +++ b/code/datums/martial/wrestling.dm @@ -1,3 +1,13 @@ +/mob/living/carbon/human/proc/wrestling_help() + set name = "Recall Teachings" + set desc = "Remember how to wrestle." + set category = "Wrestling" + + to_chat(usr, "You flex your muscles and have a revelation...") + to_chat(usr, "Clinch: Grab. Passively gives you a chance to immediately aggressively grab someone. Not always successful.") + to_chat(usr, "Suplex: Disarm someone you are grabbing. Suplexes your target to the floor. Greatly injures them and leaves both you and your target on the floor.") + to_chat(usr, "Advanced grab: Grab. Passively causes stamina damage when grabbing someone.") + /datum/martial_art/wrestling name = "Wrestling" var/datum/action/slam/slam = new/datum/action/slam() @@ -40,7 +50,7 @@ return owner.visible_message("[owner] prepares to BODY SLAM!", "Your next attack will be a BODY SLAM.") var/mob/living/carbon/human/H = owner - H.martial_art.streak = "slam" + H.mind.martial_art.streak = "slam" /datum/action/throw_wrassle name = "Throw (Cinch) - Spin a cinched opponent around and throw them." @@ -52,7 +62,7 @@ return owner.visible_message("[owner] prepares to THROW!", "Your next attack will be a THROW.") var/mob/living/carbon/human/H = owner - H.martial_art.streak = "throw" + H.mind.martial_art.streak = "throw" /datum/action/kick name = "Kick - A powerful kick, sends people flying away from you. Also useful for escaping from bad situations." @@ -64,7 +74,7 @@ return owner.visible_message("[owner] prepares to KICK!", "Your next attack will be a KICK.") var/mob/living/carbon/human/H = owner - H.martial_art.streak = "kick" + H.mind.martial_art.streak = "kick" /datum/action/strike name = "Strike - Hit a neaby opponent with a quick attack." @@ -76,7 +86,7 @@ return owner.visible_message("[owner] prepares to STRIKE!", "Your next attack will be a STRIKE.") var/mob/living/carbon/human/H = owner - H.martial_art.streak = "strike" + H.mind.martial_art.streak = "strike" /datum/action/drop name = "Drop - Smash down onto an opponent." @@ -88,7 +98,7 @@ return owner.visible_message("[owner] prepares to LEG DROP!", "Your next attack will be a LEG DROP.") var/mob/living/carbon/human/H = owner - H.martial_art.streak = "drop" + H.mind.martial_art.streak = "drop" /datum/martial_art/wrestling/teach(var/mob/living/carbon/human/H,var/make_temporary=0) ..() @@ -430,3 +440,23 @@ D.Stun(rand(3,5)) add_logs(A, D, "cinched") return 1 + +/obj/item/weapon/storage/belt/champion/wrestling + name = "Wrestling Belt" + var/datum/martial_art/wrestling/style = new + +/obj/item/weapon/storage/belt/champion/wrestling/equipped(mob/user, slot) + if(!ishuman(user)) + return + if(slot == slot_belt) + var/mob/living/carbon/human/H = user + style.teach(H,1) + return + +/obj/item/weapon/storage/belt/champion/wrestling/dropped(mob/user) + if(!ishuman(user)) + return + var/mob/living/carbon/human/H = user + if(H.get_item_by_slot(slot_belt) == src) + style.remove(H) + return diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 04bec0a7a4..7f7310665b 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -50,7 +50,8 @@ var/datum/faction/faction //associated faction var/datum/changeling/changeling //changeling holder var/linglink - + var/datum/martial_art/martial_art = null + var/static/default_martial_art = new/datum/martial_art var/miming = 0 // Mime's vow of silence var/list/antag_datums var/antag_hud_icon_state = null //this mind's ANTAG_HUD should have this icon_state diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 5b7d015e19..f24ad5f7c3 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -166,4 +166,30 @@ /datum/status_effect/cultghost //is a cult ghost and can't use manifest runes id = "cult_ghost" duration = -1 - alert_type = null \ No newline at end of file + alert_type = null +/datum/status_effect/crusher_mark + id = "crusher_mark" + duration = 30 //if you leave for 30 seconds you lose the mark, deal with it + status_type = STATUS_EFFECT_REPLACE + alert_type = null + var/mutable_appearance/marked_underlay + var/obj/item/weapon/twohanded/required/mining_hammer/hammer_synced + +/datum/status_effect/crusher_mark/on_apply() + if(owner.mob_size >= MOB_SIZE_LARGE) + marked_underlay = mutable_appearance('icons/effects/effects.dmi', "shield2") + marked_underlay.pixel_x = -owner.pixel_x + marked_underlay.pixel_y = -owner.pixel_y + owner.underlays += marked_underlay + return FALSE + +/datum/status_effect/crusher_mark/Destroy() + hammer_synced = null + if(owner) + owner.underlays -= marked_underlay + QDEL_NULL(marked_underlay) + return ..() + +/datum/status_effect/crusher_mark/be_replaced() + owner.underlays -= marked_underlay //if this is being called, we should have an owner at this point. + ..() diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index 46853995cb..4f36685439 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -32,7 +32,7 @@ /mob/living/simple_animal/hostile/blob/blob_act(obj/structure/blob/B) if(stat != DEAD && health < maxHealth) for(var/i in 1 to 2) - var/obj/effect/overlay/temp/heal/H = new /obj/effect/overlay/temp/heal(get_turf(src)) //hello yes you are being healed + var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(src)) //hello yes you are being healed if(overmind) H.color = overmind.blob_reagent_datum.complementary_color else @@ -91,7 +91,7 @@ melee_damage_lower = 2 melee_damage_upper = 4 obj_damage = 20 - environment_smash = 1 + environment_smash = ENVIRONMENT_SMASH_STRUCTURES attacktext = "hits" attack_sound = 'sound/weapons/genhit1.ogg' movement_type = FLYING diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index f9eb16c7a9..e80e92337e 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -140,7 +140,7 @@ loc.blob_act(src) //don't ask how a wall got on top of the core, just eat it /obj/structure/blob/proc/blob_attack_animation(atom/A = null, controller) //visually attacks an atom - var/obj/effect/overlay/temp/blob/O = new /obj/effect/overlay/temp/blob(src.loc) + var/obj/effect/temp_visual/blob/O = new /obj/effect/temp_visual/blob(src.loc) O.setDir(dir) if(controller) var/mob/camera/blob/BO = controller @@ -208,7 +208,7 @@ if(overmind) overmind.blob_reagent_datum.emp_reaction(src, severity) if(prob(100 - severity * 30)) - new /obj/effect/overlay/temp/emp(get_turf(src)) + new /obj/effect/temp_visual/emp(get_turf(src)) /obj/structure/blob/tesla_act(power) ..() diff --git a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm index cf709f09b0..7d8c3eb1f9 100644 --- a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm +++ b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm @@ -73,7 +73,7 @@ L.visible_message("[src] appears around [L] in a burst of light!", \ "[target_flashed ? "An unseen force":"The glowing sigil around you"] holds you in place!") L.Stun(5) - new /obj/effect/overlay/temp/ratvar/sigil/transgression(get_turf(src)) + new /obj/effect/temp_visual/ratvar/sigil/transgression(get_turf(src)) qdel(src) @@ -102,7 +102,7 @@ L.visible_message("[src] begins to glow a piercing magenta!", "You feel something start to invade your mind...") var/oldcolor = color animate(src, color = "#AF0AAF", time = convert_time) - var/obj/effect/overlay/temp/ratvar/sigil/glow + var/obj/effect/temp_visual/ratvar/sigil/glow if(glow_type) glow = new glow_type(get_turf(src)) animate(glow, alpha = 255, time = convert_time) @@ -158,7 +158,7 @@ light_color = "#A97F1B" delete_on_finish = FALSE sigil_name = "Sigil of Accession" - glow_type = /obj/effect/overlay/temp/ratvar/sigil/accession + glow_type = /obj/effect/temp_visual/ratvar/sigil/accession resist_string = "glows bright orange" /obj/effect/clockwork/sigil/submission/accession/post_channel(mob/living/L) @@ -321,14 +321,14 @@ while(L && (!is_servant_of_ratvar(L) || (is_servant_of_ratvar(L) && (GLOB.ratvar_awakens || vitality))) && get_turf(L) == get_turf(src)) sigil_active = TRUE if(animation_number >= 4) - new /obj/effect/overlay/temp/ratvar/sigil/vitality(get_turf(src)) + new /obj/effect/temp_visual/ratvar/sigil/vitality(get_turf(src)) animation_number = 0 animation_number++ if(!is_servant_of_ratvar(L)) var/vitality_drained = 0 if(L.stat == DEAD) vitality_drained = L.maxHealth - var/obj/effect/overlay/temp/ratvar/sigil/vitality/V = new /obj/effect/overlay/temp/ratvar/sigil/vitality(get_turf(src)) + var/obj/effect/temp_visual/ratvar/sigil/vitality/V = new /obj/effect/temp_visual/ratvar/sigil/vitality(get_turf(src)) animate(V, alpha = 0, transform = matrix()*2, time = 8) playsound(L, 'sound/magic/WandODeath.ogg', 50, 1) L.visible_message("[L] collapses in on [L.p_them()]self as [src] flares bright blue!") @@ -356,7 +356,7 @@ if(ghost) ghost.reenter_corpse() L.revive(1, 1) - var/obj/effect/overlay/temp/ratvar/sigil/vitality/V = new /obj/effect/overlay/temp/ratvar/sigil/vitality(get_turf(src)) + var/obj/effect/temp_visual/ratvar/sigil/vitality/V = new /obj/effect/temp_visual/ratvar/sigil/vitality(get_turf(src)) animate(V, alpha = 0, transform = matrix()*2, time = 8) playsound(L, 'sound/magic/Staff_Healing.ogg', 50, 1) L.visible_message("[L] suddenly gets back up, [GLOB.ratvar_awakens ? "[L.p_their()] body dripping blue ichor":"even as [src] scatters into blue sparks around [L.p_them()]"]!", \ diff --git a/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm b/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm index 120ed0ff60..ec35ae4c5b 100644 --- a/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm +++ b/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm @@ -124,15 +124,15 @@ /proc/get_component_animation_type(id) switch(id) if(BELLIGERENT_EYE) - return /obj/effect/overlay/temp/ratvar/component + return /obj/effect/temp_visual/ratvar/component if(VANGUARD_COGWHEEL) - return /obj/effect/overlay/temp/ratvar/component/cogwheel + return /obj/effect/temp_visual/ratvar/component/cogwheel if(GEIS_CAPACITOR) - return /obj/effect/overlay/temp/ratvar/component/capacitor + return /obj/effect/temp_visual/ratvar/component/capacitor if(REPLICANT_ALLOY) - return /obj/effect/overlay/temp/ratvar/component/alloy + return /obj/effect/temp_visual/ratvar/component/alloy if(HIEROPHANT_ANSIBLE) - return /obj/effect/overlay/temp/ratvar/component/ansible + return /obj/effect/temp_visual/ratvar/component/ansible else return null diff --git a/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm b/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm index 5ede091ca4..3e7d0f3779 100644 --- a/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm +++ b/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm @@ -5,60 +5,60 @@ //otherwise, return literally any non-list thing but preferably FALSE //returning TRUE won't produce the "cannot be proselytized" message and will still prevent proselytizing -/atom/proc/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/atom/proc/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) return FALSE //Turf conversion -/turf/closed/wall/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) //four sheets of metal +/turf/closed/wall/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) //four sheets of metal return list("operation_time" = 50, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL - (POWER_METAL * 4), "spawn_dir" = SOUTH) -/turf/closed/wall/mineral/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) //two sheets of metal +/turf/closed/wall/mineral/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) //two sheets of metal return list("operation_time" = 50, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL - (POWER_METAL * 2), "spawn_dir" = SOUTH) -/turf/closed/wall/mineral/iron/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) //two sheets of metal, five rods +/turf/closed/wall/mineral/iron/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) //two sheets of metal, five rods return list("operation_time" = 50, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL - (POWER_METAL * 2) - (POWER_ROD * 5), "spawn_dir" = SOUTH) -/turf/closed/wall/mineral/cult/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) //no metal +/turf/closed/wall/mineral/cult/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) //no metal return list("operation_time" = 80, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL, "spawn_dir" = SOUTH) -/turf/closed/wall/shuttle/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) //two sheets of metal +/turf/closed/wall/shuttle/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) //two sheets of metal return list("operation_time" = 50, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL - (POWER_METAL * 2), "spawn_dir" = SOUTH) -/turf/closed/wall/r_wall/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/turf/closed/wall/r_wall/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) return FALSE -/turf/closed/wall/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/turf/closed/wall/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) return list("operation_time" = 50, "new_obj_type" = /turf/open/floor/clockwork, "power_cost" = -POWER_WALL_MINUS_FLOOR, "spawn_dir" = SOUTH) -/turf/open/floor/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/turf/open/floor/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) if(floor_tile == /obj/item/stack/tile/plasteel) new floor_tile(src) make_plating() playsound(src, 'sound/items/Crowbar.ogg', 10, 1) //clink return list("operation_time" = 30, "new_obj_type" = /turf/open/floor/clockwork, "power_cost" = POWER_FLOOR, "spawn_dir" = SOUTH) -/turf/open/floor/plating/asteroid/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/turf/open/floor/plating/asteroid/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) return FALSE -/turf/open/floor/plating/ashplanet/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/turf/open/floor/plating/ashplanet/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) return FALSE -/turf/open/floor/plating/lava/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/turf/open/floor/plating/lava/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) return FALSE -/turf/open/floor/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/turf/open/floor/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) if(locate(/obj/structure/table) in src) return FALSE if(is_blocked_turf(src, TRUE)) to_chat(user, "Something is in the way, preventing you from proselytizing [src] into a clockwork wall.") return TRUE var/operation_time = 100 - if(!GLOB.ratvar_awakens && proselytizer.speed_multiplier > 0) //if ratvar isn't awake, this always takes 10 seconds + if(proselytizer.speed_multiplier > 0) operation_time /= proselytizer.speed_multiplier return list("operation_time" = operation_time, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_MINUS_FLOOR, "spawn_dir" = SOUTH) //False wall conversion -/obj/structure/falsewall/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/structure/falsewall/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) var/cost = POWER_WALL_MINUS_FLOOR if(ispath(mineral, /obj/item/stack/sheet/metal)) cost -= (POWER_METAL * (2 + mineral_amount)) //four sheets of metal, plus an assumption that the girder is also two @@ -66,17 +66,17 @@ cost -= (POWER_METAL * 2) //anything that doesn't use metal just has the girder return list("operation_time" = 50, "new_obj_type" = /obj/structure/falsewall/brass, "power_cost" = cost, "spawn_dir" = SOUTH) -/obj/structure/falsewall/iron/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) //two sheets of metal, two rods; special assumption +/obj/structure/falsewall/iron/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) //two sheets of metal, two rods; special assumption return list("operation_time" = 50, "new_obj_type" = /obj/structure/falsewall/brass, "power_cost" = POWER_WALL_MINUS_FLOOR - (POWER_METAL * 2) - (POWER_ROD * 2), "spawn_dir" = SOUTH) -/obj/structure/falsewall/reinforced/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/structure/falsewall/reinforced/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) return FALSE -/obj/structure/falsewall/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/structure/falsewall/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) return FALSE //Metal conversion -/obj/item/stack/tile/plasteel/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/item/stack/tile/plasteel/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) if(source) return FALSE var/amount_temp = get_amount() @@ -90,7 +90,7 @@ no_delete = TRUE use(amount_temp) amount_temp *= 12.5 //each tile is 12.5 power so this is 2 tiles to 25 power - return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -amount_temp, "spawn_dir" = SOUTH, "no_target_deletion" = no_delete) + return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -amount_temp, "spawn_dir" = SOUTH, "no_target_deletion" = no_delete) if(amount_temp >= 20) var/sheets_to_make = round(amount_temp * 0.05) //and 20 to 1 brass var/used = sheets_to_make * 20 @@ -104,11 +104,11 @@ to_chat(user, "You need at least 20 floor tiles to convert into brass.") return TRUE -/obj/item/stack/rods/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/item/stack/rods/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) if(source) return FALSE if(proselytizer.metal_to_power) - return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_ROD), "spawn_dir" = SOUTH) + return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_ROD), "spawn_dir" = SOUTH) if(get_amount() >= 10) var/sheets_to_make = round(get_amount() * 0.1) var/used = sheets_to_make * 10 @@ -122,11 +122,11 @@ to_chat(user, "You need at least 10 rods to convert into brass.") return TRUE -/obj/item/stack/sheet/metal/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/item/stack/sheet/metal/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) if(source) return FALSE if(proselytizer.metal_to_power) - return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_METAL), "spawn_dir" = SOUTH) + return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_METAL), "spawn_dir" = SOUTH) if(get_amount() >= 5) var/sheets_to_make = round(get_amount() * 0.2) var/used = sheets_to_make * 5 @@ -140,11 +140,11 @@ to_chat(user, "You need at least 5 sheets of metal to convert into brass.") return TRUE -/obj/item/stack/sheet/plasteel/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/item/stack/sheet/plasteel/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) if(source) return FALSE if(proselytizer.metal_to_power) - return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_PLASTEEL), "spawn_dir" = SOUTH) + return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_PLASTEEL), "spawn_dir" = SOUTH) if(get_amount() >= 2) var/sheets_to_make = round(get_amount() * 0.5) var/used = sheets_to_make * 2 @@ -159,23 +159,23 @@ return TRUE //Brass directly to power -/obj/item/stack/tile/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/item/stack/tile/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) if(source) return FALSE - return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_FLOOR), "spawn_dir" = SOUTH) + return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_FLOOR), "spawn_dir" = SOUTH) //Airlock conversion -/obj/machinery/door/airlock/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/machinery/door/airlock/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) var/doortype = /obj/machinery/door/airlock/clockwork if(glass) doortype = /obj/machinery/door/airlock/clockwork/brass return list("operation_time" = 60, "new_obj_type" = doortype, "power_cost" = POWER_WALL_TOTAL, "spawn_dir" = dir) -/obj/machinery/door/airlock/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/machinery/door/airlock/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) return FALSE //Table conversion -/obj/structure/table/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/structure/table/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) var/prosel_cost = POWER_STANDARD if(framestack == /obj/item/stack/rods) prosel_cost -= POWER_ROD*framestackamount @@ -187,10 +187,10 @@ prosel_cost -= POWER_PLASTEEL*buildstackamount return list("operation_time" = 20, "new_obj_type" = /obj/structure/table/reinforced/brass, "power_cost" = prosel_cost, "spawn_dir" = SOUTH) -/obj/structure/table/reinforced/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/structure/table/reinforced/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) return FALSE -/obj/structure/table_frame/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/structure/table_frame/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) var/prosel_cost = POWER_FLOOR if(framestack == /obj/item/stack/rods) prosel_cost -= POWER_ROD*framestackamount @@ -198,11 +198,11 @@ prosel_cost -= POWER_FLOOR*framestackamount return list("operation_time" = 10, "new_obj_type" = /obj/structure/table_frame/brass, "power_cost" = prosel_cost, "spawn_dir" = SOUTH) -/obj/structure/table_frame/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/structure/table_frame/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) return FALSE //Window conversion -/obj/structure/window/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/structure/window/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) var/windowtype = /obj/structure/window/reinforced/clockwork var/new_dir = TRUE var/prosel_time = 15 @@ -220,18 +220,18 @@ INVOKE_ASYNC(proselytizer, /obj/item/clockwork/clockwork_proselytizer.proc/proselytize, G, user) return list("operation_time" = prosel_time, "new_obj_type" = windowtype, "power_cost" = prosel_cost, "spawn_dir" = dir, "dir_in_new" = new_dir) -/obj/structure/window/reinforced/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/structure/window/reinforced/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) return FALSE //Windoor conversion -/obj/machinery/door/window/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/machinery/door/window/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) return list("operation_time" = 30, "new_obj_type" = /obj/machinery/door/window/clockwork, "power_cost" = POWER_STANDARD, "spawn_dir" = dir, "dir_in_new" = TRUE) -/obj/machinery/door/window/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/machinery/door/window/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) return FALSE //Grille conversion -/obj/structure/grille/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/structure/grille/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) var/grilletype = /obj/structure/grille/ratvar var/prosel_time = 15 if(broken) @@ -239,32 +239,32 @@ prosel_time = 5 return list("operation_time" = prosel_time, "new_obj_type" = grilletype, "power_cost" = 0, "spawn_dir" = dir) -/obj/structure/grille/ratvar/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/structure/grille/ratvar/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) return FALSE //Lattice conversion -/obj/structure/lattice/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/structure/lattice/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) return list("operation_time" = 0, "new_obj_type" = /obj/structure/lattice/clockwork, "power_cost" = 0, "spawn_dir" = SOUTH, "no_target_deletion" = TRUE) -/obj/structure/lattice/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/structure/lattice/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) ratvar_act() //just in case we're the wrong type for some reason?? return FALSE -/obj/structure/lattice/catwalk/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/structure/lattice/catwalk/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) return list("operation_time" = 0, "new_obj_type" = /obj/structure/lattice/catwalk/clockwork, "power_cost" = 0, "spawn_dir" = SOUTH, "no_target_deletion" = TRUE) -/obj/structure/lattice/catwalk/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/structure/lattice/catwalk/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) return FALSE //Girder conversion -/obj/structure/girder/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/structure/girder/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) var/prosel_cost = POWER_GEAR - (POWER_METAL * 2) if(state == GIRDER_REINF_STRUTS || state == GIRDER_REINF) prosel_cost -= POWER_PLASTEEL return list("operation_time" = 20, "new_obj_type" = /obj/structure/destructible/clockwork/wall_gear, "power_cost" = prosel_cost, "spawn_dir" = SOUTH) //Hitting a clockwork structure will try to repair it. -/obj/structure/destructible/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/structure/destructible/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) . = TRUE var/list/repair_values = list() if(!proselytizer.proselytizer_repair_checks(repair_values, src, user)) @@ -287,7 +287,7 @@ "You finish repairing [src]. It is now at [obj_integrity]/[max_integrity] integrity.") //Hitting a sigil of transmission will try to charge from it. -/obj/effect/clockwork/sigil/transmission/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/obj/effect/clockwork/sigil/transmission/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) . = TRUE var/list/charge_values = list() if(!proselytizer.sigil_charge_checks(charge_values, src, user)) @@ -337,7 +337,7 @@ adjustHealth(-amount) //Hitting a ratvar'd silicon will also try to repair it. -/mob/living/silicon/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/mob/living/silicon/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) . = TRUE if(health == maxHealth) //if we're at maximum health, prosel the turf under us return FALSE @@ -346,7 +346,7 @@ "You finish repairin[src == user ? "g yourself. You are":"g [src]. [p_they(TRUE)] [p_are()]"] now at [abs(HEALTH_THRESHOLD_DEAD - health)]/[abs(HEALTH_THRESHOLD_DEAD - maxHealth)] health.") //Same with clockwork mobs. -/mob/living/simple_animal/hostile/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/mob/living/simple_animal/hostile/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) . = TRUE if(health == maxHealth) //if we're at maximum health, prosel the turf under us return FALSE @@ -355,7 +355,7 @@ "You finish repairin[src == user ? "g yourself. You are":"g [src]. [p_they(TRUE)] [p_are()]"] now at [health]/[maxHealth] health.") //Cogscarabs get special interaction because they're drones and have innate self-heals/revives. -/mob/living/simple_animal/drone/cogscarab/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) +/mob/living/simple_animal/drone/cogscarab/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) . = TRUE if(stat == DEAD) try_reactivate(user) //if we're at maximum health, prosel the turf under us @@ -374,36 +374,17 @@ proselytizer.repairing = null //Convert shards and gear bits directly to power -/obj/item/clockwork/alloy_shards/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent, power_amount) - if(!power_amount) - power_amount = -POWER_STANDARD - if(proselytizer.can_use_power(power_amount)) - var/obj/effect/overlay/temp/ratvar/beam/itemconsume/B = new /obj/effect/overlay/temp/ratvar/beam/itemconsume(get_turf(src)) - B.pixel_x = pixel_x - B.pixel_y = pixel_y - if(!silent) //looper no looping - for(var/obj/item/clockwork/alloy_shards/S in get_turf(src)) //convert all other shards in the turf if we can - if(S == src) - continue //we want the shards to be proselytized after the main shard, thus this delay - addtimer(CALLBACK(proselytizer, /obj/item/clockwork/clockwork_proselytizer.proc/proselytize, S, user, TRUE), 0) - return list("operation_time" = 0, "new_obj_type" = null, "power_cost" = power_amount, "spawn_dir" = SOUTH) +/obj/item/clockwork/alloy_shards/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) + return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -POWER_STANDARD, "spawn_dir" = SOUTH) -/obj/item/clockwork/alloy_shards/medium/gear_bit/large/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent, power_amount) - if(!power_amount) - power_amount = -(CLOCKCULT_POWER_UNIT*0.08) - return ..() +/obj/item/clockwork/alloy_shards/medium/gear_bit/large/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) + return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -(CLOCKCULT_POWER_UNIT*0.08), "spawn_dir" = SOUTH) -/obj/item/clockwork/alloy_shards/large/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent, power_amount) - if(!power_amount) - power_amount = -(CLOCKCULT_POWER_UNIT*0.06) - return ..() +/obj/item/clockwork/alloy_shards/large/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) + return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -(CLOCKCULT_POWER_UNIT*0.06), "spawn_dir" = SOUTH) -/obj/item/clockwork/alloy_shards/medium/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent, power_amount) - if(!power_amount) - power_amount = -(CLOCKCULT_POWER_UNIT*0.04) - return ..() +/obj/item/clockwork/alloy_shards/medium/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) + return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -(CLOCKCULT_POWER_UNIT*0.04), "spawn_dir" = SOUTH) -/obj/item/clockwork/alloy_shards/small/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent, power_amount) - if(!power_amount) - power_amount = -(CLOCKCULT_POWER_UNIT*0.02) - return ..() +/obj/item/clockwork/alloy_shards/small/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) + return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -(CLOCKCULT_POWER_UNIT*0.02), "spawn_dir" = SOUTH) \ No newline at end of file diff --git a/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm b/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm index 57a68078df..ccf7aead44 100644 --- a/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm +++ b/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm @@ -124,7 +124,7 @@ L.adjustToxLoss(totaldamage * 0.5, TRUE, TRUE) var/healseverity = max(round(totaldamage*0.05, 1), 1) //shows the general severity of the damage you just healed, 1 glow per 20 for(var/i in 1 to healseverity) - new /obj/effect/overlay/temp/heal(targetturf, "#1E8CE1") + new /obj/effect/temp_visual/heal(targetturf, "#1E8CE1") clockwork_say(ranged_ability_user, text2ratvar("Mend wounded flesh!")) add_logs(ranged_ability_user, L, "healed with Sentinel's Compromise") else @@ -173,7 +173,7 @@ if(usable_power > 0 && C.cell.use(usable_power)) multiplier += (usable_power * 0.001) qdel(VC) - new/obj/effect/overlay/temp/ratvar/volt_hit/true(targetturf, ranged_ability_user, multiplier) + new/obj/effect/temp_visual/ratvar/volt_hit/true(targetturf, ranged_ability_user, multiplier) add_logs(ranged_ability_user, targetturf, "fired a volt ray") remove_ranged_ability() diff --git a/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm b/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm index 976cd1cb4b..a54b019d53 100644 --- a/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm +++ b/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm @@ -96,13 +96,13 @@ impale_cooldown = world.time + initial(impale_cooldown) attack_cooldown = world.time + initial(attack_cooldown) //can't attack until we're done impaling if(target) - new /obj/effect/overlay/temp/dir_setting/bloodsplatter(get_turf(target), get_dir(user, target)) + new /obj/effect/temp_visual/dir_setting/bloodsplatter(get_turf(target), get_dir(user, target)) target.Stun(2) //brief stun to_chat(user, "You prepare to remove your ratvarian spear from [target]...") var/remove_verb = pick("pull", "yank", "drag") if(do_after(user, 10, 1, target)) var/turf/T = get_turf(target) - var/obj/effect/overlay/temp/dir_setting/bloodsplatter/B = new /obj/effect/overlay/temp/dir_setting/bloodsplatter(T, get_dir(target, user)) + var/obj/effect/temp_visual/dir_setting/bloodsplatter/B = new /obj/effect/temp_visual/dir_setting/bloodsplatter(T, get_dir(target, user)) playsound(T, 'sound/misc/splort.ogg', 200, 1) playsound(T, 'sound/weapons/pierce.ogg', 200, 1) if(target.stat != CONSCIOUS) @@ -151,5 +151,5 @@ T = get_turf(src) if(T) //make sure we're not in null or something T.visible_message("[src] [pick("cracks in two and fades away", "snaps in two and dematerializes")]!") - new /obj/effect/overlay/temp/ratvar/spearbreak(T) + new /obj/effect/temp_visual/ratvar/spearbreak(T) qdel(src) diff --git a/code/game/gamemodes/clock_cult/clock_mobs/clockwork_marauder.dm b/code/game/gamemodes/clock_cult/clock_mobs/clockwork_marauder.dm index 6006c25724..376526febb 100644 --- a/code/game/gamemodes/clock_cult/clock_mobs/clockwork_marauder.dm +++ b/code/game/gamemodes/clock_cult/clock_mobs/clockwork_marauder.dm @@ -150,7 +150,7 @@ if(iscarbon(host)) resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - host.health) / abs(HEALTH_THRESHOLD_DEAD - host.maxHealth)) * 100) if(GLOB.ratvar_awakens || resulthealth <= MARAUDER_EMERGE_THRESHOLD) - new /obj/effect/overlay/temp/heal(host.loc, "#AF0AAF") + new /obj/effect/temp_visual/heal(host.loc, "#AF0AAF") host.heal_ordered_damage(4, damage_heal_order) /mob/living/simple_animal/hostile/clockwork/marauder/adjustHealth(amount, updating_health = TRUE, forced = FALSE) diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm index bc5ec1b9d8..9efb9a8eb2 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm @@ -114,7 +114,7 @@ for(var/i in 1 to heal_attempts) if(S.health < S.maxHealth) S.adjustHealth(-heal_amount) - new /obj/effect/overlay/temp/heal(T, "#1E8CE1") + new /obj/effect/temp_visual/heal(T, "#1E8CE1") if(i == heal_attempts && S.health >= S.maxHealth) //we finished healing on the last tick, give them the message to_chat(S, "\"[text2ratvar(pick(heal_finish_messages))]\"") break @@ -129,7 +129,7 @@ for(var/i in 1 to heal_attempts) if(S.health < S.maxHealth) S.heal_ordered_damage(heal_amount, damage_heal_order) - new /obj/effect/overlay/temp/heal(T, "#1E8CE1") + new /obj/effect/temp_visual/heal(T, "#1E8CE1") if(i == heal_attempts && S.health >= S.maxHealth) to_chat(S, "\"[text2ratvar(pick(heal_finish_messages))]\"") break @@ -158,7 +158,7 @@ for(var/i in 1 to heal_ticks) if(H.health < H.maxHealth) H.heal_ordered_damage(heal_amount, damage_heal_order) - new /obj/effect/overlay/temp/heal(T, "#1E8CE1") + new /obj/effect/temp_visual/heal(T, "#1E8CE1") if(i == heal_ticks && H.health >= H.maxHealth) to_chat(H, "\"[text2ratvar(pick(heal_finish_messages))]\"") break @@ -174,10 +174,10 @@ if(C.obj_integrity < C.max_integrity) C.obj_integrity = min(C.obj_integrity + 5, C.max_integrity) C.update_icon() - new /obj/effect/overlay/temp/heal(T, "#1E8CE1") + new /obj/effect/temp_visual/heal(T, "#1E8CE1") else break - new /obj/effect/overlay/temp/ratvar/mending_mantra(get_turf(invoker)) + new /obj/effect/temp_visual/ratvar/mending_mantra(get_turf(invoker)) return TRUE @@ -389,7 +389,7 @@ usable_power = min(Floor(C.cell.charge * 0.2, MIN_CLOCKCULT_POWER), 1000) - prev_power if(usable_power > 0 && C.cell.use(usable_power)) multiplier += (usable_power * 0.0005) - var/obj/effect/overlay/temp/ratvar/volt_hit/VH = new /obj/effect/overlay/temp/ratvar/volt_hit(get_turf(invoker), null, multiplier) + var/obj/effect/temp_visual/ratvar/volt_hit/VH = new /obj/effect/temp_visual/ratvar/volt_hit(get_turf(invoker), null, multiplier) invoker.visible_message("[invoker] is struck by [invoker.p_their()] own [VH.name]!", "You're struck by your own [VH.name]!") invoker.adjustFireLoss(VH.damage) //you have to fail all five blasts to die to this playsound(invoker, 'sound/machines/defib_zap.ogg', VH.damage, 1, -1) diff --git a/code/game/gamemodes/clock_cult/clock_structure.dm b/code/game/gamemodes/clock_cult/clock_structure.dm index 0a193e7558..64c7135971 100644 --- a/code/game/gamemodes/clock_cult/clock_structure.dm +++ b/code/game/gamemodes/clock_cult/clock_structure.dm @@ -131,7 +131,7 @@ if(anchored && unanchored_icon) anchored = FALSE update_anchored(null, obj_integrity > max_integrity * 0.25) - new /obj/effect/overlay/temp/emp(loc) + new /obj/effect/temp_visual/emp(loc) //for the ark and Ratvar @@ -222,7 +222,7 @@ /obj/structure/destructible/clockwork/powered/emp_act(severity) if(forced_disable(TRUE)) - new /obj/effect/overlay/temp/emp(loc) + new /obj/effect/temp_visual/emp(loc) /obj/structure/destructible/clockwork/powered/proc/total_accessable_power() //how much power we have and can use if(!needs_power || GLOB.ratvar_awakens) 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 1203c7119a..84098fca57 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm @@ -31,7 +31,7 @@ return /obj/structure/destructible/clockwork/geis_binding/emp_act(severity) - new /obj/effect/overlay/temp/emp(loc) + new /obj/effect/temp_visual/emp(loc) qdel(src) /obj/structure/destructible/clockwork/geis_binding/post_buckle_mob(mob/living/M) @@ -54,8 +54,8 @@ if(!can_resist) repair_and_interrupt() else - var/obj/effect/overlay/temp/ratvar/geis_binding/G = new /obj/effect/overlay/temp/ratvar/geis_binding(M.loc) - var/obj/effect/overlay/temp/ratvar/geis_binding/T = new /obj/effect/overlay/temp/ratvar/geis_binding/top(M.loc) + var/obj/effect/temp_visual/ratvar/geis_binding/G = new /obj/effect/temp_visual/ratvar/geis_binding(M.loc) + var/obj/effect/temp_visual/ratvar/geis_binding/T = new /obj/effect/temp_visual/ratvar/geis_binding/top(M.loc) G.layer = mob_layer - 0.01 T.layer = mob_layer + 0.01 G.alpha = alpha @@ -93,10 +93,10 @@ var/mob/living/carbon/C = L C.silent += 4 visible_message("[src] flares brightly!") - var/obj/effect/overlay/temp/ratvar/geis_binding/G1 = new /obj/effect/overlay/temp/ratvar/geis_binding(loc) - var/obj/effect/overlay/temp/ratvar/geis_binding/G2 = new /obj/effect/overlay/temp/ratvar/geis_binding(loc) - var/obj/effect/overlay/temp/ratvar/geis_binding/T1 = new /obj/effect/overlay/temp/ratvar/geis_binding/top(loc) - var/obj/effect/overlay/temp/ratvar/geis_binding/T2 = new /obj/effect/overlay/temp/ratvar/geis_binding/top(loc) + var/obj/effect/temp_visual/ratvar/geis_binding/G1 = new /obj/effect/temp_visual/ratvar/geis_binding(loc) + var/obj/effect/temp_visual/ratvar/geis_binding/G2 = new /obj/effect/temp_visual/ratvar/geis_binding(loc) + var/obj/effect/temp_visual/ratvar/geis_binding/T1 = new /obj/effect/temp_visual/ratvar/geis_binding/top(loc) + var/obj/effect/temp_visual/ratvar/geis_binding/T2 = new /obj/effect/temp_visual/ratvar/geis_binding/top(loc) G1.layer = mob_layer - 0.01 G2.layer = mob_layer - 0.01 T1.layer = mob_layer + 0.01 diff --git a/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm b/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm index c4415dfed8..9c7b5e9518 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm @@ -87,7 +87,7 @@ var/obj/mecha/M = target M.take_damage(damage_per_tick * get_efficiency_mod(), BURN, "melee", 1, get_dir(src, M)) - new /obj/effect/overlay/temp/ratvar/ocular_warden(get_turf(target)) + new /obj/effect/temp_visual/ratvar/ocular_warden(get_turf(target)) setDir(get_dir(get_turf(src), get_turf(target))) if(!target) diff --git a/code/game/gamemodes/clock_cult/clock_structures/wall_gear.dm b/code/game/gamemodes/clock_cult/clock_structures/wall_gear.dm index 94bf35b6a7..8dc2fb06f0 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/wall_gear.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/wall_gear.dm @@ -19,7 +19,7 @@ /obj/structure/destructible/clockwork/wall_gear/Initialize() . = ..() - new /obj/effect/overlay/temp/ratvar/gear(get_turf(src)) + new /obj/effect/temp_visual/ratvar/gear(get_turf(src)) /obj/structure/destructible/clockwork/wall_gear/emp_act(severity) return diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm index 098fbcdf26..6651f68556 100644 --- a/code/game/gamemodes/cult/cult_comms.dm +++ b/code/game/gamemodes/cult/cult_comms.dm @@ -177,13 +177,13 @@ var/turf/mobloc = get_turf(B.current) switch(i) if(1) - new /obj/effect/overlay/temp/cult/sparks(mobloc, B.current.dir) + new /obj/effect/temp_visual/cult/sparks(mobloc, B.current.dir) playsound(mobloc, "sparks", 50, 1) if(2) - new /obj/effect/overlay/temp/dir_setting/cult/phase/out(mobloc, B.current.dir) + new /obj/effect/temp_visual/dir_setting/cult/phase/out(mobloc, B.current.dir) playsound(mobloc, "sparks", 75, 1) if(3) - new /obj/effect/overlay/temp/dir_setting/cult/phase(mobloc, B.current.dir) + new /obj/effect/temp_visual/dir_setting/cult/phase(mobloc, B.current.dir) playsound(mobloc, "sparks", 100, 1) if(4) playsound(mobloc, 'sound/magic/exit_blood.ogg', 100, 1) @@ -193,7 +193,7 @@ var/obj/item/device/soulstone/S = B.current.loc S.release_shades(owner) B.current.setDir(SOUTH) - new /obj/effect/overlay/temp/cult/blood(final) + new /obj/effect/temp_visual/cult/blood(final) addtimer(CALLBACK(B.current, /mob/.proc/reckon, final), 10) else return @@ -201,7 +201,7 @@ Remove(owner) /mob/proc/reckon(turf/final) - new /obj/effect/overlay/temp/cult/blood/out(get_turf(src)) + new /obj/effect/temp_visual/cult/blood/out(get_turf(src)) forceMove(final) /datum/action/innate/cult/master/finalreck/proc/chant(chant_number) diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 62559379c5..4be11267ef 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -204,7 +204,7 @@ if(current_charges) owner.visible_message("\The [attack_text] is deflected in a burst of blood-red sparks!") current_charges-- - new /obj/effect/overlay/temp/cult/sparks(get_turf(owner)) + new /obj/effect/temp_visual/cult/sparks(get_turf(owner)) if(!current_charges) owner.visible_message("The runed shield around [owner] suddenly disappears!") owner.update_inv_wear_suit() @@ -356,14 +356,14 @@ if(uses <= 0) icon_state ="shifter_drained" playsound(mobloc, "sparks", 50, 1) - new /obj/effect/overlay/temp/dir_setting/cult/phase/out(mobloc, C.dir) + new /obj/effect/temp_visual/dir_setting/cult/phase/out(mobloc, C.dir) var/atom/movable/pulled = handle_teleport_grab(destination, C) C.forceMove(destination) if(pulled) C.start_pulling(pulled) //forcemove resets pulls, so we need to re-pull - new /obj/effect/overlay/temp/dir_setting/cult/phase(destination, C.dir) + new /obj/effect/temp_visual/dir_setting/cult/phase(destination, C.dir) playsound(destination, 'sound/effects/phasein.ogg', 25, 1) playsound(destination, "sparks", 50, 1) @@ -375,8 +375,8 @@ desc = "Used by veteran cultists to instantly transport items to their needful bretheren." w_class = WEIGHT_CLASS_SMALL brightness_on = 1 - icon_state = "torch-on" - item_state = "torch-on" + icon_state = "torch" + item_state = "torch" color = "#ff0000" on_damage = 15 slot_flags = null diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index 51c622858d..63e5b97b9e 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -152,7 +152,7 @@ for(var/mob/living/L in range(5, src)) if(iscultist(L) || isshade(L) || isconstruct(L)) if(L.health != L.maxHealth) - new /obj/effect/overlay/temp/heal(get_turf(src), "#960000") + new /obj/effect/temp_visual/heal(get_turf(src), "#960000") if(ishuman(L)) L.adjustBruteLoss(-1, 0) L.adjustFireLoss(-1, 0) @@ -190,7 +190,7 @@ else var/turf/open/floor/engine/cult/F = safepick(cultturfs) if(F) - new /obj/effect/overlay/temp/cult/turf/floor(F) + new /obj/effect/temp_visual/cult/turf/floor(F) else // Are we in space or something? No cult turfs or // convertable turfs? diff --git a/code/game/gamemodes/cult/rune_spawn_action.dm b/code/game/gamemodes/cult/rune_spawn_action.dm index beffe924bc..7412a5d6bb 100644 --- a/code/game/gamemodes/cult/rune_spawn_action.dm +++ b/code/game/gamemodes/cult/rune_spawn_action.dm @@ -7,9 +7,9 @@ var/scribe_time = 100 var/damage_interrupt = TRUE var/action_interrupt = TRUE - var/obj/effect/overlay/temp/cult/rune_spawn/rune_word_type - var/obj/effect/overlay/temp/cult/rune_spawn/rune_innerring_type - var/obj/effect/overlay/temp/cult/rune_spawn/rune_center_type + var/obj/effect/temp_visual/cult/rune_spawn/rune_word_type + var/obj/effect/temp_visual/cult/rune_spawn/rune_innerring_type + var/obj/effect/temp_visual/cult/rune_spawn/rune_center_type var/rune_color /datum/action/innate/cult/create_rune/IsAvailable() @@ -27,15 +27,15 @@ if(!chosen_keyword) return //the outer ring is always the same across all runes - var/obj/effect/overlay/temp/cult/rune_spawn/R1 = new(owner.loc, scribe_time, rune_color) + var/obj/effect/temp_visual/cult/rune_spawn/R1 = new(owner.loc, scribe_time, rune_color) //the rest are not always the same, so we need types for em - var/obj/effect/overlay/temp/cult/rune_spawn/R2 + var/obj/effect/temp_visual/cult/rune_spawn/R2 if(rune_word_type) R2 = new rune_word_type(owner.loc, scribe_time, rune_color) - var/obj/effect/overlay/temp/cult/rune_spawn/R3 + var/obj/effect/temp_visual/cult/rune_spawn/R3 if(rune_innerring_type) R3 = new rune_innerring_type(owner.loc, scribe_time, rune_color) - var/obj/effect/overlay/temp/cult/rune_spawn/R4 + var/obj/effect/temp_visual/cult/rune_spawn/R4 if(rune_center_type) R4 = new rune_center_type(owner.loc, scribe_time, rune_color) @@ -64,7 +64,7 @@ /datum/action/innate/cult/create_rune/tele button_icon_state = "telerune" rune_type = /obj/effect/rune/teleport - rune_word_type = /obj/effect/overlay/temp/cult/rune_spawn/rune2 - rune_innerring_type = /obj/effect/overlay/temp/cult/rune_spawn/rune2/inner - rune_center_type = /obj/effect/overlay/temp/cult/rune_spawn/rune2/center + rune_word_type = /obj/effect/temp_visual/cult/rune_spawn/rune2 + rune_innerring_type = /obj/effect/temp_visual/cult/rune_spawn/rune2/inner + rune_center_type = /obj/effect/temp_visual/cult/rune_spawn/rune2/center rune_color = RUNE_COLOR_TELEPORT diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 9de8c237bc..e3b990bfef 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -410,7 +410,7 @@ structure_check() searches for nearby cultist structures required for the invoca else GLOB.sacrificed += sacrificial - new /obj/effect/overlay/temp/cult/sac(get_turf(src)) + new /obj/effect/temp_visual/cult/sac(get_turf(src)) for(var/M in invokers) if(big_sac) to_chat(M, "\"Yes! This is the one I desire! You have done well.\"") diff --git a/code/game/gamemodes/devil/imp/imp.dm b/code/game/gamemodes/devil/imp/imp.dm index 602fbf765e..70ed6dfc1d 100644 --- a/code/game/gamemodes/devil/imp/imp.dm +++ b/code/game/gamemodes/devil/imp/imp.dm @@ -25,7 +25,7 @@ maxHealth = 200 health = 200 healable = 0 - environment_smash = 1 + environment_smash = ENVIRONMENT_SMASH_STRUCTURES obj_damage = 40 melee_damage_lower = 10 melee_damage_upper = 15 diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm index 46f651d359..bb4bf455dc 100644 --- a/code/game/gamemodes/gang/gang.dm +++ b/code/game/gamemodes/gang/gang.dm @@ -2,7 +2,8 @@ //Gang War Game Mode GLOBAL_LIST_INIT(gang_name_pool, list("Clandestine", "Prima", "Zero-G", "Max", "Blasto", "Waffle", "North", "Omni", "Newton", "Cyber", "Donk", "Gene", "Gib", "Tunnel", "Diablo", "Psyke", "Osiron", "Sirius", "Sleeping Carp")) -GLOBAL_LIST_INIT(gang_colors_pool, list("red","orange","yellow","green","blue","purple")) +GLOBAL_LIST_INIT(gang_colors_pool, list("red","orange","yellow","green","blue","purple", "white")) +GLOBAL_LIST_INIT(gang_outfit_pool, list(/obj/item/clothing/suit/jacket/leather,/obj/item/clothing/suit/jacket/leather/overcoat,/obj/item/clothing/suit/jacket/puffer,/obj/item/clothing/suit/jacket/miljacket,/obj/item/clothing/suit/jacket/puffer,/obj/item/clothing/suit/pirate,/obj/item/clothing/suit/poncho,/obj/item/clothing/suit/apron/overalls,/obj/item/clothing/suit/jacket/letterman)) /datum/game_mode var/list/datum/gang/gangs = list() @@ -164,6 +165,8 @@ GLOBAL_LIST_INIT(gang_colors_pool, list("red","orange","yellow","green","blue"," /////////////////////////////////////////// /datum/game_mode/proc/add_gangster(datum/mind/gangster_mind, datum/gang/G, check = 1) if(!G || (gangster_mind in get_all_gangsters()) || (gangster_mind.enslaved_to && !is_gangster(gangster_mind.enslaved_to))) + if(is_in_gang(gangster_mind.current, G.name) && !(gangster_mind in get_gang_bosses())) + return 3 return 0 if(check && gangster_mind.current.isloyal()) //Check to see if the potential gangster is implanted return 1 @@ -193,6 +196,10 @@ GLOBAL_LIST_INIT(gang_colors_pool, list("red","orange","yellow","green","blue"," //////////////////////////////////////////////////////////////////// /datum/game_mode/proc/remove_gangster(datum/mind/gangster_mind, beingborged, silent, remove_bosses=0) var/datum/gang/gang = gangster_mind.gang_datum + for(var/obj/O in gangster_mind.current.contents) + if(istype(O, /obj/item/device/gangtool/soldier)) + qdel(O) + if(!gang) return 0 @@ -325,3 +332,4 @@ GLOBAL_LIST_INIT(gang_colors_pool, list("red","orange","yellow","green","blue"," SSticker.station_explosion_cinematic(1,"gang war", null) SSticker.mode.explosion_in_progress = 0 SSticker.force_ending = TRUE + diff --git a/code/game/gamemodes/gang/gang_datum.dm b/code/game/gamemodes/gang/gang_datum.dm index ba455e94e5..0ff9ef4f2d 100644 --- a/code/game/gamemodes/gang/gang_datum.dm +++ b/code/game/gamemodes/gang/gang_datum.dm @@ -15,33 +15,91 @@ var/list/territory_lost = list() var/recalls = 1 var/dom_attempts = 2 - var/points = 15 + var/inner_outfit + var/outer_outfit var/datum/atom_hud/antag/gang/ganghud var/is_deconvertible = TRUE //Can you deconvert normal gangsters from the gang var/domination_timer var/is_dominating - var/item_list - var/item_category_list - var/buyable_items = list( + var/boss_item_list + var/boss_category_list + var/static/list/boss_items = list( /datum/gang_item/function/gang_ping, /datum/gang_item/function/recall, - /datum/gang_item/function/outfit, + + /datum/gang_item/clothing/under, + /datum/gang_item/clothing/suit, + /datum/gang_item/clothing/hat, + /datum/gang_item/clothing/neck, + /datum/gang_item/clothing/shoes, + /datum/gang_item/clothing/mask, + /datum/gang_item/clothing/hands, + /datum/gang_item/clothing/belt, + + /datum/gang_item/weapon/shuriken, /datum/gang_item/weapon/switchblade, + /datum/gang_item/weapon/improvised, + /datum/gang_item/weapon/ammo/improvised_ammo, + /datum/gang_item/weapon/surplus, + /datum/gang_item/weapon/ammo/surplus_ammo, /datum/gang_item/weapon/pistol, /datum/gang_item/weapon/ammo/pistol_ammo, + /datum/gang_item/weapon/sniper, + /datum/gang_item/weapon/ammo/sniper_ammo, + /datum/gang_item/weapon/machinegun, /datum/gang_item/weapon/uzi, /datum/gang_item/weapon/ammo/uzi_ammo, + /datum/gang_item/equipment/sharpener, /datum/gang_item/equipment/spraycan, + /datum/gang_item/equipment/sharpener, + /datum/gang_item/equipment/emp, /datum/gang_item/equipment/c4, + /datum/gang_item/equipment/frag, + /datum/gang_item/equipment/stimpack, /datum/gang_item/equipment/implant_breaker, + /datum/gang_item/equipment/wetwork_boots, /datum/gang_item/equipment/pen, - /datum/gang_item/equipment/gangtool, - /datum/gang_item/equipment/necklace, /datum/gang_item/equipment/dominator ) + var/reg_item_list + var/reg_category_list + var/static/list/soldier_items = list( + /datum/gang_item/clothing/under, + /datum/gang_item/clothing/suit, + /datum/gang_item/clothing/hat, + /datum/gang_item/clothing/neck, + /datum/gang_item/clothing/shoes, + /datum/gang_item/clothing/mask, + /datum/gang_item/clothing/hands, + /datum/gang_item/clothing/belt, + + /datum/gang_item/weapon/shuriken, + /datum/gang_item/weapon/switchblade, + /datum/gang_item/weapon/improvised, + /datum/gang_item/weapon/ammo/improvised_ammo, + /datum/gang_item/weapon/surplus, + /datum/gang_item/weapon/ammo/surplus_ammo, + /datum/gang_item/weapon/pistol, + /datum/gang_item/weapon/ammo/pistol_ammo, + /datum/gang_item/weapon/sniper, + /datum/gang_item/weapon/ammo/sniper_ammo, + /datum/gang_item/weapon/machinegun, + /datum/gang_item/weapon/uzi, + /datum/gang_item/weapon/ammo/uzi_ammo, + /datum/gang_item/equipment/sharpener, + /datum/gang_item/equipment/spraycan, + /datum/gang_item/equipment/sharpener, + /datum/gang_item/equipment/emp, + /datum/gang_item/equipment/c4, + /datum/gang_item/equipment/frag, + /datum/gang_item/equipment/stimpack, + /datum/gang_item/equipment/implant_breaker, + /datum/gang_item/equipment/wetwork_boots, + ) + /datum/gang/New(loc,gangname) if(!GLOB.gang_colors_pool.len) message_admins("WARNING: Maximum number of gangs have been exceeded!") @@ -53,36 +111,56 @@ switch(color) if("red") color_hex = "#DA0000" + inner_outfit = pick(/obj/item/clothing/under/color/red, /obj/item/clothing/under/lawyer/red) if("orange") color_hex = "#FF9300" + inner_outfit = pick(/obj/item/clothing/under/color/orange, /obj/item/clothing/under/geisha) if("yellow") color_hex = "#FFF200" + inner_outfit = pick(/obj/item/clothing/under/color/yellow, /obj/item/clothing/under/burial, /obj/item/clothing/under/suit_jacket/tan) if("green") color_hex = "#A8E61D" + inner_outfit = pick(/obj/item/clothing/under/color/green, /obj/item/clothing/under/syndicate/camo, /obj/item/clothing/under/suit_jacket/green) if("blue") color_hex = "#00B7EF" + inner_outfit = pick(/obj/item/clothing/under/color/blue, /obj/item/clothing/under/suit_jacket/navy) if("purple") color_hex = "#DA00FF" + inner_outfit = pick(/obj/item/clothing/under/color/lightpurple, /obj/item/clothing/under/lawyer/purpsuit) + if("white") + color_hex = "#FFFFFF" + inner_outfit = pick(/obj/item/clothing/under/color/white, /obj/item/clothing/under/suit_jacket/white) name = (gangname ? gangname : pick(GLOB.gang_name_pool)) GLOB.gang_name_pool -= name - + outer_outfit = pick(GLOB.gang_outfit_pool) ganghud = new() ganghud.color = color_hex log_game("The [name] Gang has been created. Their gang color is [color].") build_item_list() /datum/gang/proc/build_item_list() - item_list = list() - item_category_list = list() - for(var/V in buyable_items) - var/datum/gang_item/G = new V() - item_list[G.id] = G - var/list/Cat = item_category_list[G.category] + boss_item_list = list() + boss_category_list = list() + for(var/B in boss_items) + var/datum/gang_item/G = new B() + boss_item_list[G.id] = G + var/list/Cat = boss_category_list[G.category] if(Cat) Cat += G else - item_category_list[G.category] = list(G) + boss_category_list[G.category] = list(G) + + reg_item_list = list() + reg_category_list = list() + for(var/S in soldier_items) + var/datum/gang_item/G = new S() + reg_item_list[G.id] = G + var/list/Cat = reg_category_list[G.category] + if(Cat) + Cat += G + else + reg_category_list[G.category] = list(G) /datum/gang/proc/add_gang_hud(datum/mind/recruit_mind) ganghud.join_hud(recruit_mind.current) @@ -103,52 +181,6 @@ /datum/gang/proc/domination_time_remaining() var/diff = domination_timer - world.time return diff / 10 -//////////////////////////////////////////// OUTFITS - - -//Used by recallers when purchasing a gang outfit. First time a gang outfit is purchased the buyer decides a gang style which is stored so gang outfits are uniform -/datum/gang/proc/gang_outfit(mob/living/carbon/user,obj/item/device/gangtool/gangtool) - if(!user || !gangtool) - return 0 - if(!gangtool.can_use(user)) - return 0 - - var/gang_style_list = list("Gang Colors","Black Suits","White Suits","Leather Jackets","Leather Overcoats","Puffer Jackets","Military Jackets","Tactical Turtlenecks","Soviet Uniforms") - if(!style && (user.mind in SSticker.mode.get_gang_bosses())) //Only the boss gets to pick a style - style = input("Pick an outfit style.", "Pick Style") as null|anything in gang_style_list - - if(gangtool.can_use(user) && (gangtool.outfits >= 1)) - var/outfit_path - switch(style) - if(null || "Gang Colors") - outfit_path = text2path("/obj/item/clothing/under/color/[color]") - if("Black Suits") - outfit_path = /obj/item/clothing/under/suit_jacket/charcoal - if("White Suits") - outfit_path = /obj/item/clothing/under/suit_jacket/white - if("Puffer Jackets") - outfit_path = /obj/item/clothing/suit/jacket/puffer - if("Leather Jackets") - outfit_path = /obj/item/clothing/suit/jacket/leather - if("Leather Overcoats") - outfit_path = /obj/item/clothing/suit/jacket/leather/overcoat - if("Military Jackets") - outfit_path = /obj/item/clothing/suit/jacket/miljacket - if("Soviet Uniforms") - outfit_path = /obj/item/clothing/under/soviet - if("Tactical Turtlenecks") - outfit_path = /obj/item/clothing/under/syndicate - - if(outfit_path) - var/obj/item/clothing/outfit = new outfit_path(user.loc) - outfit.armor = list(melee = 20, bullet = 30, laser = 10, energy = 10, bomb = 20, bio = 0, rad = 0, fire = 30, acid = 30) - outfit.desc += " Tailored for the [name] Gang to offer the wearer moderate protection against ballistics and physical trauma." - outfit.gang = src - user.put_in_hands(outfit) - return 1 - - return 0 - //////////////////////////////////////////// MESSAGING @@ -186,45 +218,7 @@ lost_names += "[territory_lost[area]]" territory -= area - //Count uniformed gangsters - var/uniformed = 0 - for(var/datum/mind/gangmind in (gangsters|bosses)) - if(ishuman(gangmind.current)) - var/mob/living/carbon/human/gangster = gangmind.current - //Gangster must be alive and on station - if((gangster.stat == DEAD) || (gangster.z > ZLEVEL_STATION)) - continue - - var/obj/item/clothing/outfit - var/obj/item/clothing/gang_outfit - if(gangster.w_uniform) - outfit = gangster.w_uniform - if(outfit.gang == src) - gang_outfit = outfit - if(gangster.wear_suit) - outfit = gangster.wear_suit - if(outfit.gang == src) - gang_outfit = outfit - - if(gang_outfit) - to_chat(gangster, "The [src] Gang's influence grows as you wear [gang_outfit].") - uniformed ++ - //Calculate and report influence growth - var/message = "[src] Gang Status Report:
*---------*
" - if(is_dominating) - var/seconds_remaining = domination_time_remaining() - var/new_time = max(180, seconds_remaining - (uniformed * 4) - (territory.len * 2)) - if(new_time < seconds_remaining) - message += "Takeover shortened by [seconds_remaining - new_time] seconds for defending [territory.len] territories and [uniformed] uniformed gangsters.
" - set_domination_time(new_time) - message += "[seconds_remaining] seconds remain in hostile takeover.
" - else - var/points_new = min(999,points + 15 + (uniformed * 2) + territory.len) - if(points_new != points) - message += "Gang influence has increased by [points_new - points] for defending [territory.len] territories and [uniformed] uniformed gangsters.
" - points = points_new - message += "Your gang now has [points] influence.
" //Process new territories for(var/area in territory_new) @@ -234,27 +228,69 @@ territory += area //Report territory changes + var/message = "[src] Gang Status Report:.
*---------*
" message += "[territory_new.len] new territories:
[added_names]
" message += "[territory_lost.len] territories lost:
[lost_names]
" - //Clear the lists territory_new = list() territory_lost = list() - var/control = round((territory.len/GLOB.start_state.num_territories)*100, 1) - message += "Your gang now has [control]% control of the station.
*---------*" - message_gangtools(message) - - //Increase outfit stock - for(var/obj/item/device/gangtool/tool in gangtools) - tool.outfits = min(tool.outfits+1,5) + var/sbonus = sqrt(LAZYLEN(territory)) // Bonus given to soldier's for the gang's total territory + message += "Your gang now has [control]% control of the station.
*---------*
" + if(is_dominating) + var/seconds_remaining = domination_time_remaining() + var/new_time = max(180, seconds_remaining - (territory.len * 2)) + if(new_time < seconds_remaining) + message += "Takeover shortened by [seconds_remaining - new_time] seconds for defending [territory.len] territories.
" + set_domination_time(new_time) + message += "[seconds_remaining] seconds remain in hostile takeover.
" + else + for(var/obj/item/device/gangtool/G in gangtools) + var/pmessage = message + var/points_new = 0 + if(istype(G, /obj/item/device/gangtool/soldier)) + points_new = max(0,round(3 - G.points/10)) + (sbonus) + (LAZYLEN(G.tags)/2) // Soldier points + pmessage += "Your influence has increased by [round(sbonus)] from your gang holding [LAZYLEN(territory)] territories, and a bonus of [round(LAZYLEN(G.tags)/2)] for territories you have personally marked and kept intact.
" + else + points_new = max(0,round(5 - G.points/10)) + LAZYLEN(territory) // Boss points, more focused on big picture + pmessage += "Your influence has increased by [round(points_new)] from your gang holding [territory.len] territories
" + G.points += points_new + var/mob/living/carbon/human/ganger = get(G.loc, /mob/living) + var/points_newer = 0 + var/static/inner = inner_outfit + var/static/outer = outer_outfit + if(ishuman(ganger) && ganger.mind in (gangsters|bosses)) + for(var/obj/C in ganger.contents) + if(C.type == inner_outfit) + points_newer += 2 + continue + if(C.type == outer_outfit) + points_newer += 2 + continue + switch(C.type) + if(/obj/item/clothing/neck/necklace/dope) + points_newer += 2 + if(/obj/item/clothing/head/collectable/petehat/gang) + points_newer += 4 + if(/obj/item/clothing/shoes/gang) + points_newer += 6 + if(/obj/item/clothing/mask/gskull) + points_newer += 5 + if(/obj/item/clothing/gloves/gang) + points_newer += 3 + if(/obj/item/weapon/storage/belt/military/gang) + points_newer += 4 + if(points_newer) + G.points += points_newer + pmessage += "Your influential choice of clothing has further increased your influence by [points_newer] points.
" + pmessage += "You now have [G.points] influence.
" + to_chat(ganger, "\icon[G] [pmessage]") //Multiverse /datum/gang/multiverse dom_attempts = 0 - points = 0 fighting_style = "multiverse" is_deconvertible = FALSE @@ -263,4 +299,4 @@ ganghud = new() /datum/gang/multiverse/income() - return \ No newline at end of file + return diff --git a/code/game/gamemodes/gang/gang_items.dm b/code/game/gamemodes/gang/gang_items.dm index d626aa3b9a..aec9b040cd 100644 --- a/code/game/gamemodes/gang/gang_items.dm +++ b/code/game/gamemodes/gang/gang_items.dm @@ -6,14 +6,12 @@ var/category var/id + /datum/gang_item/proc/purchase(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool, check_canbuy = TRUE) if(check_canbuy && !can_buy(user, gang, gangtool)) return FALSE var/real_cost = get_cost(user, gang, gangtool) - if(gang && real_cost) - gang.message_gangtools("A [get_name_display(user, gang, gangtool)] was purchased by [user.real_name] for [real_cost] Influence.") - log_game("A [id] was purchased by [key_name(user)] ([gang.name] Gang) for [real_cost] Influence.") - gang.points -= real_cost + gangtool.points -= real_cost spawn_item(user, gang, gangtool) return TRUE @@ -25,7 +23,7 @@ to_chat(user, spawn_msg) /datum/gang_item/proc/can_buy(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - return gang && (gang.points >= get_cost(user, gang, gangtool)) && can_see(user, gang, gangtool) + return gang && (gangtool.points >= get_cost(user, gang, gangtool)) && can_see(user, gang, gangtool) /datum/gang_item/proc/can_see(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) return TRUE @@ -78,23 +76,104 @@ gangtool.recall(user) -/datum/gang_item/function/outfit - name = "Create Armored Gang Outfit" - id = "outfit" +/////////////////// +//CLOTHING +/////////////////// -/datum/gang_item/function/outfit/can_buy(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - return gangtool && (gangtool.outfits > 0) && ..() +/datum/gang_item/clothing + category = "Purchase Influence-Enhancing Clothes:" + +/datum/gang_item/clothing/under + name = "Gang Uniform" + id = "under" + cost = 1 + +/datum/gang_item/clothing/under/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) + if(gang.inner_outfit) + var/obj/item/O = new gang.inner_outfit(user.loc) + user.put_in_hands(O) + to_chat(user, " This is your gang's official uniform, wearing it will increase your influence") + +/datum/gang_item/clothing/suit + name = "Gang Armored Outerwear" + id = "suit" + cost = 1 + +/datum/gang_item/clothing/suit/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) + if(gang.outer_outfit) + var/obj/item/O = new gang.outer_outfit(user.loc) + O.armor = list(melee = 20, bullet = 35, laser = 10, energy = 10, bomb = 30, bio = 0, rad = 0, fire = 30, acid = 30) + O.desc += " Tailored for the [gang.name] Gang to offer the wearer moderate protection against ballistics and physical trauma." + user.put_in_hands(O) + to_chat(user, " This is your gang's official outerwear, wearing it will increase your influence") + + +/datum/gang_item/clothing/hat + name = "Pimp Hat" + id = "hat" + cost = 18 + item_path = /obj/item/clothing/head/collectable/petehat/gang + +/obj/item/clothing/head/collectable/petehat/gang + name = "pimpin' hat" + desc = "The undisputed king of style." + +/datum/gang_item/clothing/mask + name = "Golden Death Mask" + id = "mask" + cost = 20 + item_path = /obj/item/clothing/mask/gskull + +/obj/item/clothing/mask/gskull + name = "golden death mask" + icon_state = "gskull" + desc = "Strike terror, and envy, into the hearts of your enemies." + + +/datum/gang_item/clothing/shoes + name = "Bling Boots" + id = "boots" + cost = 25 + item_path = /obj/item/clothing/shoes/gang + +/obj/item/clothing/shoes/gang + name = "blinged-out boots" + desc = "Stand aside peasants." + icon_state = "bling" + +/datum/gang_item/clothing/neck + name = "Gold Necklace" + id = "necklace" + cost = 10 + item_path = /obj/item/clothing/neck/necklace/dope + + +/datum/gang_item/clothing/hands + name = "Decorative Brass Knuckles" + id = "hand" + cost = 12 + item_path = /obj/item/clothing/gloves/gang + +/obj/item/clothing/gloves/gang + name = "braggadocio's brass knuckles" + desc = "Purely decorative, don't find out the hard way." + icon_state = "knuckles" + w_class = 3 + +/datum/gang_item/clothing/belt + name = "Badass Belt" + id = "belt" + cost = 15 + item_path = /obj/item/weapon/storage/belt/military/gang + +/obj/item/weapon/storage/belt/military/gang + name = "badass belt" + icon_state = "gangbelt" + item_state = "gang" + desc = "The belt buckle simply reads 'BAMF'." + storage_slots = 1 -/datum/gang_item/function/outfit/get_cost_display(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - if(gangtool && !gangtool.outfits) - return "(Restocking)" - return ..() -/datum/gang_item/function/outfit/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - if(gang && gang.gang_outfit(user, gangtool)) - to_chat(user, "Gang Outfits can act as armor with moderate protection against ballistic and melee attacks. Every gangster wearing one will also help grow your gang's influence.") - if(gangtool) - gangtool.outfits -= 1 /////////////////// //WEAPONS @@ -120,10 +199,34 @@ cost = 5 item_path = /obj/item/weapon/switchblade +/datum/gang_item/weapon/surplus + name = "Surplus Rifle" + id = "surplus" + cost = 8 + item_path = /obj/item/weapon/gun/ballistic/automatic/surplus + +/datum/gang_item/weapon/ammo/surplus_ammo + name = "Surplus Rifle Ammo" + id = "surplus_ammo" + cost = 5 + item_path = /obj/item/ammo_box/magazine/m10mm/rifle + +/datum/gang_item/weapon/improvised + name = "Sawn-Off Improvised Shotgun" + id = "sawn" + cost = 6 + item_path = /obj/item/weapon/gun/ballistic/revolver/doublebarrel/improvised/sawn + +/datum/gang_item/weapon/ammo/improvised_ammo + name = "Box of Buckshot" + id = "buckshot" + cost = 5 + item_path = /obj/item/weapon/storage/box/lethalshot + /datum/gang_item/weapon/pistol name = "10mm Pistol" id = "pistol" - cost = 25 + cost = 30 item_path = /obj/item/weapon/gun/ballistic/automatic/pistol /datum/gang_item/weapon/ammo/pistol_ammo @@ -144,12 +247,19 @@ cost = 15 item_path = /obj/item/ammo_box/magazine/sniper_rounds +/datum/gang_item/weapon/machinegun + name = "Mounted Machine Gun" + id = "MG" + cost = 50 + item_path = /obj/machinery/manned_turret + spawn_msg = "The mounted machine gun features enhanced responsiveness. Hold down on the trigger while firing to control where you're shooting." + /datum/gang_item/weapon/uzi name = "Uzi SMG" id = "uzi" cost = 60 item_path = /obj/item/weapon/gun/ballistic/automatic/mini_uzi - id = "uzi" + /datum/gang_item/weapon/ammo/uzi_ammo name = "Uzi Ammo" @@ -157,7 +267,6 @@ cost = 40 item_path = /obj/item/ammo_box/magazine/uzim9mm - /////////////////// //EQUIPMENT /////////////////// @@ -178,12 +287,6 @@ cost = 3 item_path = /obj/item/weapon/sharpener -/datum/gang_item/equipment/necklace - name = "Gold Necklace" - id = "necklace" - cost = 1 - item_path = /obj/item/clothing/neck/necklace/dope - /datum/gang_item/equipment/emp name = "EMP Grenade" @@ -200,13 +303,13 @@ /datum/gang_item/equipment/frag name = "Fragmentation Grenade" id = "frag nade" - cost = 10 + cost = 18 item_path = /obj/item/weapon/grenade/syndieminibomb/concussion/frag /datum/gang_item/equipment/stimpack name = "Black Market Stimulants" id = "stimpack" - cost = 15 + cost = 12 item_path = /obj/item/weapon/reagent_containers/syringe/stimulants /datum/gang_item/equipment/implant_breaker @@ -223,6 +326,18 @@ if(spawn_msg) to_chat(user, spawn_msg) +/datum/gang_item/equipment/wetwork_boots + name = "Wetwork boots" + id = "wetwork" + cost = 20 + item_path = /obj/item/clothing/shoes/combat/gang + +/obj/item/clothing/shoes/combat/gang + name = "Wetwork boots" + desc = "A gang's best hitmen are prepared for anything." + permeability_coefficient = 0.01 + flags = NOSLIP + /datum/gang_item/equipment/pen name = "Recruitment Pen" id = "pen" @@ -316,4 +431,4 @@ return ..() /datum/gang_item/equipment/dominator/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - new item_path(user.loc) \ No newline at end of file + new item_path(user.loc) diff --git a/code/game/gamemodes/gang/gang_pen.dm b/code/game/gamemodes/gang/gang_pen.dm index 930c612d14..d60a3cb57b 100644 --- a/code/game/gamemodes/gang/gang_pen.dm +++ b/code/game/gamemodes/gang/gang_pen.dm @@ -25,7 +25,16 @@ var/datum/gang/G = user.mind.gang_datum var/recruitable = SSticker.mode.add_gangster(M.mind,G) switch(recruitable) + if(3) + for(var/obj/O in M.contents) + if(istype(O, /obj/item/device/gangtool/soldier)) + to_chat(user, "This gangster already has an uplink!") + return + new /obj/item/device/gangtool/soldier(M) + to_chat(user, "You inject [M] with a new gangtool!") + cooldown(G) if(2) + new /obj/item/device/gangtool/soldier(M) M.Paralyse(5) cooldown(G) if(1) @@ -57,4 +66,4 @@ cooldown = 0 icon_state = "pen" var/mob/M = get(src, /mob) - to_chat(M, "\icon[src] [src][(src.loc == M)?(""):(" in your [src.loc]")] vibrates softly. It is ready to be used again.") \ No newline at end of file + to_chat(M, "\icon[src] [src][(src.loc == M)?(""):(" in your [src.loc]")] vibrates softly. It is ready to be used again.") diff --git a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm index c8c98e5d47..ad2da7b502 100644 --- a/code/game/gamemodes/gang/recaller.dm +++ b/code/game/gamemodes/gang/recaller.dm @@ -12,9 +12,11 @@ origin_tech = "programming=5;bluespace=2;syndicate=5" var/datum/gang/gang //Which gang uses this? var/recalling = 0 - var/outfits = 3 + var/outfits = 2 var/free_pen = 0 var/promotable = 0 + var/points = 15 + var/list/tags = list() /obj/item/device/gangtool/Initialize() //Initialize supply point income if it hasn't already been started ..() @@ -48,14 +50,14 @@ var/isboss = (user.mind == gang.bosses[1]) dat += "Registration: [gang.name] Gang [isboss ? "Boss" : "Lieutenant"]
" dat += "Organization Size: [gang.gangsters.len + gang.bosses.len] | Station Control: [round((gang.territory.len/GLOB.start_state.num_territories)*100, 1)]%
" - dat += "Gang Influence: [gang.points]
" - dat += "Time until Influence grows: [(gang.points >= 999) ? ("--:--") : (time2text(SSticker.mode.gang_points.next_point_time - world.time, "mm:ss"))]
" + dat += "Your Influence: [points]
" + dat += "Time until Influence grows: [time2text(SSticker.mode.gang_points.next_point_time - world.time, "mm:ss")]
" dat += "
" - for(var/cat in gang.item_category_list) + for(var/cat in gang.boss_category_list) dat += "[cat]
" - for(var/V in gang.item_category_list[cat]) + for(var/V in gang.boss_category_list[cat]) var/datum/gang_item/G = V if(!G.can_see(user, gang, src)) continue @@ -76,7 +78,7 @@ dat += "Refresh
" - var/datum/browser/popup = new(user, "gangtool", "Welcome to GangTool v3.4", 340, 625) + var/datum/browser/popup = new(user, "gangtool", "Welcome to GangTool v3.5", 340, 625) popup.set_content(dat) popup.open() @@ -95,7 +97,7 @@ return if(href_list["purchase"]) - var/datum/gang_item/G = gang.item_list[href_list["purchase"]] + var/datum/gang_item/G = gang.boss_item_list[href_list["purchase"]] if(G && G.can_buy(usr, gang, src)) G.purchase(usr, gang, src, FALSE) @@ -168,7 +170,7 @@ if(recalling) to_chat(usr, "Error: Recall already in progress.") return 0 - + if(!gang.recalls) to_chat(usr, "Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts.") @@ -212,7 +214,7 @@ userturf = get_turf(user) if(userturf.z == 1) //Check one more time that they are on station. if(SSshuttle.cancelEvac(user)) - gang.recalls -= 1 + gang.recalls -= 1 return 1 to_chat(loc, "\icon[src]No response recieved. Emergency shuttle cannot be recalled at this time.") @@ -227,18 +229,103 @@ return 0 if(!user.mind) return 0 - - if(gang) //If it's already registered, only let the gang's bosses use this - if(user.mind in gang.bosses) - return 1 - else //If it's not registered, any gangster can use this to register - if(user.mind in SSticker.mode.get_all_gangsters()) - return 1 - + if(gang && (user.mind in gang.bosses)) //If it's already registered, only let the gang's bosses use this + return 1 + else if(user.mind in SSticker.mode.get_all_gangsters()) // For soldiers and potential LT's + return 1 return 0 /obj/item/device/gangtool/spare outfits = 1 /obj/item/device/gangtool/spare/lt - promotable = 1 \ No newline at end of file + promotable = 1 + +///////////// Internal tool used by gang regulars /////////// + +/obj/item/device/gangtool/soldier + points = 5 + +/obj/item/device/gangtool/soldier/New(mob/user) + . = ..() + gang = user.mind.gang_datum + gang.gangtools += src + var/datum/action/innate/gang/tool/GT = new + GT.Grant(user, src, gang) + +/obj/item/device/gangtool/soldier/attack_self(mob/user) + if (!can_use(user)) + return + var/dat + if(gang.is_dominating) + dat += "
Takeover In Progress:
[gang.domination_time_remaining()] seconds remain
" + dat += "Registration: [gang.name] - Foot Soldier
" + dat += "Organization Size: [gang.gangsters.len + gang.bosses.len] | Station Control: [round((gang.territory.len/GLOB.start_state.num_territories)*100, 1)]%
" + dat += "Your Influence: [points]
" + if(LAZYLEN(tags)) + dat += "Your tags generate bonus influence for you.
You have tagged the following territories:" + for(var/obj/effect/decal/cleanable/crayon/gang/T in tags) + dat += " [T.territory] -" + else + dat += "You have not personally tagged any territory for your gang. Use a spray can to mark your territory and receive bonus influence." + dat += "
Time until Influence grows: [time2text(SSticker.mode.gang_points.next_point_time - world.time, "mm:ss")]
" + dat += "
" + for(var/cat in gang.reg_category_list) + dat += "[cat]
" + for(var/V in gang.reg_category_list[cat]) + var/datum/gang_item/G = V + if(!G.can_see(user, gang, src)) + continue + + var/cost = G.get_cost_display(user, gang, src) + if(cost) + dat += cost + " " + + var/toAdd = G.get_name_display(user, gang, src) + if(G.can_buy(user, gang, src)) + toAdd = "[toAdd]" + dat += toAdd + var/extra = G.get_extra_info(user, gang, src) + if(extra) + dat += "
[extra]" + dat += "
" + dat += "
" + + dat += "Refresh
" + + var/datum/browser/popup = new(user, "gangtool", "Welcome to GangTool v3.5", 340, 625) + popup.set_content(dat) + popup.open() + +/obj/item/device/gangtool/soldier/Topic(href, href_list) + if(!can_use(usr)) + return + if(href_list["purchase"]) + var/datum/gang_item/G = gang.reg_item_list[href_list["purchase"]] + if(G && G.can_buy(usr, gang, src)) + G.purchase(usr, gang, src, FALSE) + + attack_self(usr) + +/datum/action/innate/gang + background_icon_state = "bg_spell" + +/datum/action/innate/gang/IsAvailable() + if(!owner.mind || !owner.mind in SSticker.mode.get_all_gangsters()) + return 0 + return ..() + +/datum/action/innate/gang/tool + name = "Personal Gang Tool" + desc = "An implanted gang tool that lets you purchase gear" + background_icon_state = "bg_mime" + button_icon_state = "bolt_action" + var/obj/item/device/gangtool/soldier/GT + +/datum/action/innate/gang/tool/Grant(mob/user, obj/reg, datum/gang/G) + . = ..() + GT = reg + button.color = G.color + +/datum/action/innate/gang/tool/Activate() + GT.attack_self(owner) diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 8f90cd892d..9def30992e 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -328,7 +328,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event /obj/effect/meteor/tunguska/Move() . = ..() if(.) - new /obj/effect/overlay/temp/revenant(get_turf(src)) + new /obj/effect/temp_visual/revenant(get_turf(src)) /obj/effect/meteor/tunguska/meteor_effect() ..() diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index d7ab46cb9c..de11c2ed94 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -64,7 +64,7 @@ stealth_active = 1 if(ishuman(loc)) var/mob/living/carbon/human/M = loc - new /obj/effect/overlay/temp/dir_setting/ninja/cloak(get_turf(M), M.dir) + new /obj/effect/temp_visual/dir_setting/ninja/cloak(get_turf(M), M.dir) M.name_override = disguise.name M.icon = disguise.icon M.icon_state = disguise.icon_state @@ -78,7 +78,7 @@ stealth_active = 0 if(ishuman(loc)) var/mob/living/carbon/human/M = loc - new /obj/effect/overlay/temp/dir_setting/ninja(get_turf(M), M.dir) + new /obj/effect/temp_visual/dir_setting/ninja(get_turf(M), M.dir) M.name_override = null M.cut_overlays() M.regenerate_icons() diff --git a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm index 083e610587..a12515a625 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm @@ -16,38 +16,38 @@ flick("alien-pad", src) for(var/mob/living/target in loc) target.forceMove(teleport_target) - new /obj/effect/overlay/temp/dir_setting/ninja(get_turf(target), target.dir) + new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir) to_chat(target, "The instability of the warp leaves you disoriented!") target.Stun(3) /obj/machinery/abductor/pad/proc/Retrieve(mob/living/target) flick("alien-pad", src) - new /obj/effect/overlay/temp/dir_setting/ninja(get_turf(target), target.dir) + new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir) Warp(target) /obj/machinery/abductor/pad/proc/MobToLoc(place,mob/living/target) - new /obj/effect/overlay/temp/teleport_abductor(place) + new /obj/effect/temp_visual/teleport_abductor(place) sleep(80) flick("alien-pad", src) target.forceMove(place) - new /obj/effect/overlay/temp/dir_setting/ninja(get_turf(target), target.dir) + new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir) /obj/machinery/abductor/pad/proc/PadToLoc(place) - new /obj/effect/overlay/temp/teleport_abductor(place) + new /obj/effect/temp_visual/teleport_abductor(place) sleep(80) flick("alien-pad", src) for(var/mob/living/target in get_turf(src)) target.forceMove(place) - new /obj/effect/overlay/temp/dir_setting/ninja(get_turf(target), target.dir) + new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir) -/obj/effect/overlay/temp/teleport_abductor +/obj/effect/temp_visual/teleport_abductor name = "Huh" icon = 'icons/obj/abductor.dmi' icon_state = "teleport" duration = 80 -/obj/effect/overlay/temp/teleport_abductor/Initialize() +/obj/effect/temp_visual/teleport_abductor/Initialize() . = ..() var/datum/effect_system/spark_spread/S = new S.set_up(10,0,loc) diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 3b315bb668..5212b82e51 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -83,7 +83,7 @@ damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD) obj_damage = 0 - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE attacktext = "shocks" attack_sound = 'sound/effects/EMPulse.ogg' friendly = "pinches" @@ -435,7 +435,7 @@ resources += resource_gain do_attack_animation(target) changeNext_move(CLICK_CD_MELEE) - var/obj/effect/overlay/temp/swarmer/integrate/I = new /obj/effect/overlay/temp/swarmer/integrate(get_turf(target)) + var/obj/effect/temp_visual/swarmer/integrate/I = new /obj/effect/temp_visual/swarmer/integrate(get_turf(target)) I.pixel_x = target.pixel_x I.pixel_y = target.pixel_y I.pixel_z = target.pixel_z @@ -452,7 +452,7 @@ /mob/living/simple_animal/hostile/swarmer/proc/DisIntegrate(atom/movable/target) - new /obj/effect/overlay/temp/swarmer/disintegration(get_turf(target)) + new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target)) do_attack_animation(target) changeNext_move(CLICK_CD_MELEE) target.ex_act(3) @@ -497,7 +497,7 @@ /mob/living/simple_animal/hostile/swarmer/proc/DismantleMachine(obj/machinery/target) do_attack_animation(target) to_chat(src, "We begin to dismantle this machine. We will need to be uninterrupted.") - var/obj/effect/overlay/temp/swarmer/dismantle/D = new /obj/effect/overlay/temp/swarmer/dismantle(get_turf(target)) + var/obj/effect/temp_visual/swarmer/dismantle/D = new /obj/effect/temp_visual/swarmer/dismantle(get_turf(target)) D.pixel_x = target.pixel_x D.pixel_y = target.pixel_y D.pixel_z = target.pixel_z @@ -507,7 +507,7 @@ M.amount = 5 for(var/obj/item/I in target.component_parts) I.loc = M.loc - var/obj/effect/overlay/temp/swarmer/disintegration/N = new /obj/effect/overlay/temp/swarmer/disintegration(get_turf(target)) + var/obj/effect/temp_visual/swarmer/disintegration/N = new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target)) N.pixel_x = target.pixel_x N.pixel_y = target.pixel_y N.pixel_z = target.pixel_z @@ -519,23 +519,23 @@ qdel(target) -/obj/effect/overlay/temp/swarmer //temporary swarmer visual feedback objects +/obj/effect/temp_visual/swarmer //temporary swarmer visual feedback objects icon = 'icons/mob/swarmer.dmi' layer = BELOW_MOB_LAYER -/obj/effect/overlay/temp/swarmer/disintegration +/obj/effect/temp_visual/swarmer/disintegration icon_state = "disintegrate" duration = 10 -/obj/effect/overlay/temp/swarmer/disintegration/Initialize() +/obj/effect/temp_visual/swarmer/disintegration/Initialize() . = ..() playsound(loc, "sparks", 100, 1) -/obj/effect/overlay/temp/swarmer/dismantle +/obj/effect/temp_visual/swarmer/dismantle icon_state = "dismantle" duration = 25 -/obj/effect/overlay/temp/swarmer/integrate +/obj/effect/temp_visual/swarmer/integrate icon_state = "integrate" duration = 5 diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm index a4e9d9482e..0d8093905e 100644 --- a/code/game/gamemodes/miniantags/morph/morph.dm +++ b/code/game/gamemodes/miniantags/morph/morph.dm @@ -35,7 +35,12 @@ var/morphed = 0 var/atom/movable/form = null var/morph_time = 0 - + var/static/list/blacklist_typecache = typecacheof(list( + /obj/screen, + /obj/singularity, + /mob/living/simple_animal/hostile/morph, + /obj/effect)) + var/playstyle_string = "You are a morph, an abomination of science created primarily with changeling cells. \ You may take the form of anything nearby by shift-clicking it. This process will alert any nearby \ observers, and can only be performed once every five seconds. While morphed, you move faster, but do \ @@ -67,13 +72,7 @@ ..() /mob/living/simple_animal/hostile/morph/proc/allowed(atom/movable/A) // make it into property/proc ? not sure if worth it - if(istype(A,/obj/screen)) - return 0 - if(istype(A,/obj/singularity)) - return 0 - if(istype(A,/mob/living/simple_animal/hostile/morph)) - return 0 - return 1 + return !is_type_in_typecache(A, blacklist_typecache) /mob/living/simple_animal/hostile/morph/proc/eat(atom/movable/A) if(A && A.loc != src) @@ -100,6 +99,7 @@ visible_message("[src] suddenly twists and changes shape, becoming a copy of [target]!", \ "You twist your body and assume the form of [target].") appearance = target.appearance + copy_overlays(target) alpha = max(alpha, 150) //fucking chameleons transform = initial(transform) pixel_y = initial(pixel_y) diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm index 580515d4ec..ed51fb4caa 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm @@ -202,7 +202,7 @@ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread s.set_up(4, 0, L) s.start() - new /obj/effect/overlay/temp/revenant(L.loc) + new /obj/effect/temp_visual/revenant(L.loc) sleep(20) if(!L.on) //wait, wait, don't shock me return @@ -237,7 +237,7 @@ /obj/effect/proc_holder/spell/aoe_turf/revenant/defile/proc/defile(turf/T) if(T.flags & NOJAUNT) T.flags -= NOJAUNT - new /obj/effect/overlay/temp/revenant(T) + new /obj/effect/temp_visual/revenant(T) if(!istype(T, /turf/open/floor/plating) && !istype(T, /turf/open/floor/engine/cult) && isfloorturf(T) && prob(15)) var/turf/open/floor/floor = T if(floor.intact && floor.floor_tile) @@ -246,10 +246,10 @@ floor.burnt = 0 floor.make_plating(1) if(T.type == /turf/closed/wall && prob(15)) - new /obj/effect/overlay/temp/revenant(T) + new /obj/effect/temp_visual/revenant(T) T.ChangeTurf(/turf/closed/wall/rust) if(T.type == /turf/closed/wall/r_wall && prob(10)) - new /obj/effect/overlay/temp/revenant(T) + new /obj/effect/temp_visual/revenant(T) T.ChangeTurf(/turf/closed/wall/r_wall/rust) for(var/obj/structure/closet/closet in T.contents) closet.open() @@ -261,7 +261,7 @@ for(var/obj/structure/window/window in T) window.take_damage(rand(30,80)) if(window && window.fulltile) - new /obj/effect/overlay/temp/revenant/cracks(window.loc) + new /obj/effect/temp_visual/revenant/cracks(window.loc) for(var/obj/machinery/light/light in T) light.flicker(20) //spooky @@ -284,7 +284,7 @@ /obj/effect/proc_holder/spell/aoe_turf/revenant/malfunction/proc/malfunction(turf/T, mob/user) for(var/mob/living/simple_animal/bot/bot in T) if(!bot.emagged) - new /obj/effect/overlay/temp/revenant(bot.loc) + new /obj/effect/temp_visual/revenant(bot.loc) bot.locked = 0 bot.open = 1 bot.emag_act() @@ -292,21 +292,21 @@ if(human == user) continue to_chat(human, "You feel [pick("your sense of direction flicker out", "a stabbing pain in your head", "your mind fill with static")].") - new /obj/effect/overlay/temp/revenant(human.loc) + new /obj/effect/temp_visual/revenant(human.loc) human.emp_act(1) for(var/obj/thing in T) if(istype(thing, /obj/machinery/dominator) || istype(thing, /obj/machinery/power/apc) || istype(thing, /obj/machinery/power/smes)) //Doesn't work on dominators, SMES and APCs, to prevent kekkery continue if(prob(20)) if(prob(50)) - new /obj/effect/overlay/temp/revenant(thing.loc) + new /obj/effect/temp_visual/revenant(thing.loc) thing.emag_act(null) else if(!istype(thing, /obj/machinery/clonepod)) //I hate everything but mostly the fact there's no better way to do this without just not affecting it at all thing.emp_act(1) for(var/mob/living/silicon/robot/S in T) //Only works on cyborgs, not AI playsound(S, 'sound/machines/warning-buzzer.ogg', 50, 1) - new /obj/effect/overlay/temp/revenant(S.loc) + new /obj/effect/temp_visual/revenant(S.loc) S.spark_system.start() S.emp_act(1) @@ -329,7 +329,7 @@ for(var/mob/living/mob in T) if(mob == user) continue - new /obj/effect/overlay/temp/revenant(mob.loc) + new /obj/effect/temp_visual/revenant(mob.loc) if(iscarbon(mob)) if(ishuman(mob)) var/mob/living/carbon/human/H = mob @@ -350,14 +350,14 @@ mob.adjustToxLoss(5) for(var/obj/structure/spacevine/vine in T) //Fucking with botanists, the ability. vine.add_atom_colour("#823abb", TEMPORARY_COLOUR_PRIORITY) - new /obj/effect/overlay/temp/revenant(vine.loc) + new /obj/effect/temp_visual/revenant(vine.loc) QDEL_IN(vine, 10) for(var/obj/structure/glowshroom/shroom in T) shroom.add_atom_colour("#823abb", TEMPORARY_COLOUR_PRIORITY) - new /obj/effect/overlay/temp/revenant(shroom.loc) + new /obj/effect/temp_visual/revenant(shroom.loc) QDEL_IN(shroom, 10) for(var/obj/machinery/hydroponics/tray in T) - new /obj/effect/overlay/temp/revenant(tray.loc) + new /obj/effect/temp_visual/revenant(tray.loc) tray.pestlevel = rand(8, 10) tray.weedlevel = rand(8, 10) tray.toxic = rand(45, 55) diff --git a/code/game/gamemodes/miniantags/revenant/revenant_blight.dm b/code/game/gamemodes/miniantags/revenant/revenant_blight.dm index 8b766aad37..913efb34ce 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant_blight.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant_blight.dm @@ -33,11 +33,11 @@ to_chat(affected_mob, "You suddenly feel [pick("sick and tired", "disoriented", "tired and confused", "nauseated", "faint", "dizzy")]...") affected_mob.confused += 8 affected_mob.adjustStaminaLoss(8) - new /obj/effect/overlay/temp/revenant(affected_mob.loc) + new /obj/effect/temp_visual/revenant(affected_mob.loc) if(stagedamage < stage) stagedamage++ affected_mob.adjustToxLoss(stage*2) //should, normally, do about 30 toxin damage. - new /obj/effect/overlay/temp/revenant(affected_mob.loc) + new /obj/effect/temp_visual/revenant(affected_mob.loc) if(prob(45)) affected_mob.adjustStaminaLoss(stage) ..() //So we don't increase a stage before applying the stage damage. @@ -56,7 +56,7 @@ finalstage = TRUE to_chat(affected_mob, "You feel like [pick("nothing's worth it anymore", "nobody ever needed your help", "nothing you did mattered", "everything you tried to do was worthless")].") affected_mob.adjustStaminaLoss(45) - new /obj/effect/overlay/temp/revenant(affected_mob.loc) + new /obj/effect/temp_visual/revenant(affected_mob.loc) if(affected_mob.dna && affected_mob.dna.species) affected_mob.dna.species.handle_mutant_bodyparts(affected_mob,"#1d2953") affected_mob.dna.species.handle_hair(affected_mob,"#1d2953") diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm index 53e92c639d..432bdadfff 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm @@ -27,7 +27,7 @@ maxHealth = 200 health = 200 healable = 0 - environment_smash = 1 + environment_smash = ENVIRONMENT_SMASH_STRUCTURES obj_damage = 50 melee_damage_lower = 30 melee_damage_upper = 30 diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 1f01b38860..5964983b09 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -459,8 +459,7 @@ var/datum/game_mode/nuclear/NM = SSticker.mode NM.nukes_left -- if(!SSticker.mode.check_finished())//If the mode does not deal with the nuke going off so just reboot because everyone is stuck as is - spawn() - world.Reboot("Station destroyed by Nuclear Device.", "end_error", "nuke - unhandled ending") + SSticker.Reboot("Station destroyed by Nuclear Device.", "end_error", "nuke - unhandled ending") /* diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 137514d1e3..f89833d315 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -175,6 +175,7 @@ continue var/mob/living/carbon/human/H = X if(H.stat == DEAD) + H.dust(TRUE) spooky_scaries.Remove(X) continue listclearnulls(spooky_scaries) @@ -584,7 +585,7 @@ var/turf/T = get_turf(user) playsound(T,'sound/magic/WarpWhistle.ogg', 200, 1) user.canmove = 0 - new /obj/effect/overlay/temp/tornado(T) + new /obj/effect/temp_visual/tornado(T) sleep(20) if(interrupted(user)) return @@ -602,7 +603,7 @@ T = potential_T break breakout += 1 - new /obj/effect/overlay/temp/tornado(T) + new /obj/effect/temp_visual/tornado(T) sleep(20) if(interrupted(user)) return @@ -620,7 +621,7 @@ last_user.canmove = 1 return ..() -/obj/effect/overlay/temp/tornado +/obj/effect/temp_visual/tornado icon = 'icons/obj/wizard.dmi' icon_state = "tornado" name = "tornado" @@ -630,6 +631,6 @@ duration = 40 pixel_x = 500 -/obj/effect/overlay/temp/tornado/Initialize() +/obj/effect/temp_visual/tornado/Initialize() . = ..() animate(src, pixel_x = -500, time = 40) diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 3e36776773..8632243b67 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -236,7 +236,7 @@ /obj/machinery/disco/proc/hierofunk() for(var/i in 1 to 10) - spawn_atom_to_turf(/obj/effect/overlay/temp/hierophant/telegraph/edge, src, 1, FALSE) + spawn_atom_to_turf(/obj/effect/temp_visual/hierophant/telegraph/edge, src, 1, FALSE) sleep(5) /obj/machinery/disco/proc/lights_spin() diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 18d60559bd..7f914971b2 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -363,7 +363,7 @@ assemblytype = /obj/structure/door_assembly/door_assembly_cult hackProof = 1 aiControlDisabled = 1 - var/openingoverlaytype = /obj/effect/overlay/temp/cult/door + var/openingoverlaytype = /obj/effect/temp_visual/cult/door var/friendly = FALSE /obj/machinery/door/airlock/cult/New() @@ -380,7 +380,7 @@ new openingoverlaytype(loc) return 1 else - new /obj/effect/overlay/temp/cult/sac(loc) + new /obj/effect/temp_visual/cult/sac(loc) var/atom/throwtarget throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(M, src))) M << pick(sound('sound/hallucinations/turn_around1.ogg',0,1,50), sound('sound/hallucinations/turn_around2.ogg',0,1,50)) @@ -407,7 +407,7 @@ icon = 'icons/obj/doors/airlocks/cult/unruned/cult.dmi' overlays_file = 'icons/obj/doors/airlocks/cult/unruned/overlays.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_cult/unruned - openingoverlaytype = /obj/effect/overlay/temp/cult/door/unruned + openingoverlaytype = /obj/effect/temp_visual/cult/door/unruned /obj/machinery/door/airlock/cult/unruned/friendly friendly = TRUE @@ -438,8 +438,8 @@ /obj/machinery/door/airlock/clockwork/New() ..() var/turf/T = get_turf(src) - new /obj/effect/overlay/temp/ratvar/door(T) - new /obj/effect/overlay/temp/ratvar/beam/door(T) + new /obj/effect/temp_visual/ratvar/door(T) + new /obj/effect/temp_visual/ratvar/beam/door(T) change_construction_value(5) /obj/machinery/door/airlock/clockwork/Destroy() diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 99cdc1adc3..c03738fd0b 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -328,7 +328,7 @@ /obj/machinery/door/window/clockwork/setDir(direct) if(!made_glow) - var/obj/effect/E = new /obj/effect/overlay/temp/ratvar/door/window(get_turf(src)) + var/obj/effect/E = new /obj/effect/temp_visual/ratvar/door/window(get_turf(src)) E.setDir(direct) made_glow = TRUE ..() diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 96b0029134..a224efd91c 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -159,7 +159,7 @@ Class Procs: /obj/machinery/emp_act(severity) if(use_power && !stat) use_power(7500/severity) - new /obj/effect/overlay/temp/emp(loc) + new /obj/effect/temp_visual/emp(loc) ..() /obj/machinery/proc/open_machine(drop = 1) diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 6bab77fd6f..22c6c57b17 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -1,9 +1,9 @@ #define TURRET_STUN 0 #define TURRET_LETHAL 1 -#define POPUP_ANIM_TIME 5 -#define POPDOWN_ANIM_TIME 5 //Be sure to change the icon animation at the same time or it'll look bad - +#define POPUP_ANIM_TIME 5 +#define POPDOWN_ANIM_TIME 5 //Be sure to change the icon animation at the same time or it'll look bad + /obj/machinery/porta_turret name = "turret" icon = 'icons/obj/turrets.dmi' @@ -87,9 +87,9 @@ if(has_cover) cover = new /obj/machinery/porta_turret_cover(loc) cover.parent_turret = src - underlays += image('icons/obj/turrets.dmi',icon_state = "basedark") + underlays += image('icons/obj/turrets.dmi',icon_state = "basedark") if(!has_cover) - INVOKE_ASYNC(src, .proc/popUp) + INVOKE_ASYNC(src, .proc/popUp) /obj/machinery/porta_turret/update_icon() cut_overlays() @@ -368,10 +368,10 @@ var/list/targets = list() var/turretview = view(scan_range, base) for(var/A in turretview) - var/atom/AA = A - if(AA.invisibility>SEE_INVISIBLE_LIVING) - continue - + var/atom/AA = A + if(AA.invisibility>SEE_INVISIBLE_LIVING) + continue + if(check_anomalies)//if it's set to check for simple animals if(istype(A, /mob/living/simple_animal)) var/mob/living/simple_animal/SA = A @@ -426,7 +426,7 @@ raising = 1 if(cover) flick("popup", cover) - sleep(POPUP_ANIM_TIME) + sleep(POPUP_ANIM_TIME) raising = 0 if(cover) cover.icon_state = "openTurretCover" @@ -442,7 +442,7 @@ raising = 1 if(cover) flick("popdown", cover) - sleep(POPDOWN_ANIM_TIME) + sleep(POPDOWN_ANIM_TIME) raising = 0 if(cover) cover.icon_state = "turretCover" @@ -553,6 +553,7 @@ use_power = 0 has_cover = 0 scan_range = 9 + req_access = list(GLOB.access_syndicate) stun_projectile = /obj/item/projectile/bullet lethal_projectile = /obj/item/projectile/bullet lethal_projectile_sound = 'sound/weapons/Gunshot.ogg' @@ -569,6 +570,8 @@ return 10 //Syndicate turrets shoot everything not in their faction /obj/machinery/porta_turret/syndicate/pod + max_integrity = 40 + integrity_failure = 20 obj_integrity = 40 stun_projectile = /obj/item/projectile/bullet/weakbullet3 lethal_projectile = /obj/item/projectile/bullet/weakbullet3 @@ -792,7 +795,7 @@ /obj/item/wallframe/turret_control name = "turret control frame" desc = "Used for building turret control panels" - icon_state = "apc" + icon_state = "apc" result_path = /obj/machinery/turretid materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT) @@ -921,3 +924,170 @@ on = 0 spawn(100) on = 1 + +/////// MANNED TURRET //////// + +/obj/machinery/manned_turret + name = "machine gun turret" + desc = "While the trigger is held down, this gun will redistribute recoil to allow its user to easily shift targets." + icon = 'icons/obj/turrets.dmi' + icon_state = "machinegun" + can_buckle = TRUE + density = TRUE + max_integrity = 100 + obj_integrity = 100 + buckle_lying = 0 + layer = ABOVE_MOB_LAYER + var/view_range = 10 + var/cooldown = 0 + var/projectile_type = /obj/item/projectile/bullet/weakbullet3 + var/rate_of_fire = 1 + var/number_of_shots = 40 + var/cooldown_duration = 90 + var/atom/target + var/turf/target_turf + var/warned = FALSE + +//BUCKLE HOOKS + +/obj/machinery/manned_turret/unbuckle_mob(mob/living/buckled_mob,force = 0) + playsound(src,'sound/mecha/mechmove01.ogg', 50, 1) + for(var/obj/item/I in buckled_mob.held_items) + if(istype(I, /obj/item/gun_control)) + qdel(I) + if(istype(buckled_mob)) + buckled_mob.pixel_x = 0 + buckled_mob.pixel_y = 0 + if(buckled_mob.client) + buckled_mob.client.change_view(world.view) + anchored = FALSE + . = ..() + +/obj/machinery/manned_turret/user_buckle_mob(mob/living/M, mob/living/carbon/user) + if(user.incapacitated() || !istype(user)) + return + M.forceMove(get_turf(src)) + ..() + for(var/V in M.held_items) + var/obj/item/I = V + if(istype(I)) + if(M.dropItemToGround(I)) + var/obj/item/gun_control/TC = new /obj/item/gun_control(src) + M.put_in_hands(TC) + else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand + var/obj/item/gun_control/TC = new /obj/item/gun_control(src) + M.put_in_hands(TC) + M.pixel_y = 14 + layer = ABOVE_MOB_LAYER + setDir(SOUTH) + playsound(src,'sound/mecha/mechmove01.ogg', 50, 1) + anchored = TRUE + if(user.client) + user.client.change_view(view_range) + +/obj/item/gun_control + name = "turret controls" + icon = 'icons/obj/weapons.dmi' + icon_state = "offhand" + w_class = WEIGHT_CLASS_HUGE + flags = ABSTRACT | NODROP + resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF | NOBLUDGEON + var/obj/machinery/manned_turret/turret + +/obj/item/gun_control/New(obj/machinery/manned_turret/MT) + if(MT) + turret = MT + else + qdel(src) + +/obj/item/gun_control/CanItemAutoclick() + return 1 + +/obj/item/gun_control/afterattack(atom/targeted_atom, mob/user) + ..() + var/obj/machinery/manned_turret/E = user.buckled + E.setDir(get_dir(E,targeted_atom)) + user.setDir(E.dir) + switch(E.dir) + if(NORTH) + E.layer = BELOW_MOB_LAYER + user.pixel_x = 0 + user.pixel_y = -14 + if(NORTHEAST) + E.layer = BELOW_MOB_LAYER + user.pixel_x = -8 + user.pixel_y = -4 + if(EAST) + E.layer = ABOVE_MOB_LAYER + user.pixel_x = -14 + user.pixel_y = 0 + if(SOUTHEAST) + E.layer = BELOW_MOB_LAYER + user.pixel_x = -8 + user.pixel_y = 4 + if(SOUTH) + E.layer = ABOVE_MOB_LAYER + user.pixel_x = 0 + user.pixel_y = 14 + if(SOUTHWEST) + E.layer = BELOW_MOB_LAYER + user.pixel_x = 8 + user.pixel_y = 4 + if(WEST) + E.layer = ABOVE_MOB_LAYER + user.pixel_x = 14 + user.pixel_y = 0 + if(NORTHWEST) + E.layer = BELOW_MOB_LAYER + user.pixel_x = 8 + user.pixel_y = -4 + E.checkfire(targeted_atom, user) + +/obj/machinery/manned_turret/proc/checkfire(atom/targeted_atom, mob/user) + target = targeted_atom + if(target == user || target == get_turf(src)) + return + if(world.time < cooldown) + if(!warned && world.time > (cooldown - cooldown_duration + rate_of_fire*number_of_shots)) // To capture the window where one is done firing + warned = TRUE + playsound(src, 'sound/weapons/sear.ogg', 100, 1) + return + else + cooldown = world.time + cooldown_duration + warned = FALSE + INVOKE_ASYNC(src, /obj/machinery/manned_turret/.proc/volley) + +/obj/machinery/manned_turret/proc/volley() + target_turf = get_turf(target) + for(var/i in 1 to number_of_shots) + addtimer(CALLBACK(src, /obj/machinery/manned_turret/.proc/fire_helper), i*rate_of_fire) + + +/obj/machinery/manned_turret/proc/fire_helper() + if(!src) + return + var/turf/targets_from = get_turf(src) + if(QDELETED(target)) + target = target_turf + var/obj/item/projectile/P = new projectile_type(targets_from) + P.current = targets_from + P.starting = targets_from + P.firer = src + P.original = target + playsound(src, 'sound/weapons/Gunshot_smg.ogg', 75, 1) + P.yo = target.y - targets_from.y + rand(-1,1) + P.xo = target.x - targets_from.x + rand(-1,1) + P.fire() + +/obj/machinery/manned_turret/ultimate // Admin-only proof of concept for autoclicker automatics + name = "Infinity Gun" + view_range = 12 + projectile_type = /obj/item/projectile/bullet/weakbullet3 + + +/obj/machinery/manned_turret/ultimate/checkfire(atom/targeted_atom, mob/user) + target = targeted_atom + if(target == user || target == get_turf(src)) + return + target_turf = get_turf(target) + fire_helper(target_turf) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index ebe4c79730..6c86899cf0 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -1152,6 +1152,32 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C premium = list(/obj/item/clothing/under/suit_jacket/checkered=1,/obj/item/clothing/head/mailman=1,/obj/item/clothing/under/rank/mailman=1,/obj/item/clothing/suit/jacket/leather=1,/obj/item/clothing/suit/jacket/leather/overcoat=1,/obj/item/clothing/under/pants/mustangjeans=1,/obj/item/clothing/neck/necklace/dope=3,/obj/item/clothing/suit/jacket/letterman_nanotrasen=1) refill_canister = /obj/item/weapon/vending_refill/clothing +/obj/machinery/vending/toyliberationstation + name = "\improper Syndicate Donksoft Toy Vendor" + desc = "A ages 8 and up approved vendor that dispenses toys. If you were to find the right wires, you can unlock the adult mode setting!" + icon_state = "syndi" + req_access_txt = "1" + product_slogans = "Get your cool toys today!;Trigger a valid hunter today!;Quality toy weapons for cheap prices!;Give them to HoPs for all access!;Give them to HoS to get perma briged!" + product_ads = "Feel robust with your toys!;Express your inner child today!;Toy weapons don't kill people, but valid hunters do!;Who needs responsibilities when you have toy weapons?;Make your next murder FUN!" + vend_reply = "Come back for more!" + products = list(/obj/item/weapon/gun/ballistic/automatic/toy/unrestricted = 10, + /obj/item/weapon/gun/ballistic/automatic/toy/pistol/unrestricted = 10, + /obj/item/weapon/gun/ballistic/shotgun/toy/unrestricted = 10, + /obj/item/toy/sword = 10, /obj/item/ammo_box/foambox = 20, + /obj/item/toy/foamblade = 10, + /obj/item/toy/syndicateballoon = 10, + /obj/item/clothing/suit/syndicatefake = 5, + /obj/item/clothing/head/syndicatefake = 5) //OPS IN DORMS oh wait it's just a assistant + contraband = list(/obj/item/weapon/gun/ballistic/shotgun/toy/crossbow = 10, //Congrats, you unlocked the +18 setting! + /obj/item/weapon/gun/ballistic/automatic/c20r/toy/unrestricted = 10, + /obj/item/weapon/gun/ballistic/automatic/l6_saw/toy/unrestricted = 10, + /obj/item/ammo_box/foambox/riot = 20, + /obj/item/toy/katana = 10, + /obj/item/weapon/twohanded/dualsaber/toy = 5, + /obj/item/toy/cards/deck/syndicate = 10) //Gambling and it hurts, making it a +18 item + armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50) + resistance_flags = FIRE_PROOF + #undef STANDARD_CHARGE #undef CONTRABAND_CHARGE #undef COIN_CHARGE diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm index 61151f086f..dbee8bd677 100644 --- a/code/game/mecha/equipment/tools/mining_tools.dm +++ b/code/game/mecha/equipment/tools/mining_tools.dm @@ -64,12 +64,9 @@ /obj/item/mecha_parts/mecha_equipment/drill/proc/move_ores() - if(locate(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) in chassis.equipment) - var/obj/structure/ore_box/ore_box = locate(/obj/structure/ore_box) in chassis:cargo - if(ore_box) - for(var/obj/item/weapon/ore/ore in range(1, chassis)) - if(get_dir(chassis,ore)&chassis.dir) - ore.Move(ore_box) + if(locate(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) in chassis.equipment && istype(chassis, /obj/mecha/working/ripley)) + var/obj/mecha/working/ripley/R = chassis //we could assume that it's a ripley because it has a clamp, but that's ~unsafe~ and ~bad practice~ + R.collect_ore() /obj/item/mecha_parts/mecha_equipment/drill/can_attach(obj/mecha/M as obj) if(..()) @@ -109,36 +106,19 @@ icon_state = "mecha_analyzer" selectable = 0 equip_cooldown = 30 - var/scanning = 0 + var/scanning_time = 0 /obj/item/mecha_parts/mecha_equipment/mining_scanner/New() ..() START_PROCESSING(SSobj, src) -/obj/item/mecha_parts/mecha_equipment/mining_scanner/attach(obj/mecha/M) - ..() - M.occupant_sight_flags |= SEE_TURFS - if(M.occupant) - M.occupant.update_sight() - -/obj/item/mecha_parts/mecha_equipment/mining_scanner/detach() - chassis.occupant_sight_flags &= ~SEE_TURFS - if(chassis.occupant) - chassis.occupant.update_sight() - return ..() - /obj/item/mecha_parts/mecha_equipment/mining_scanner/process() if(!loc) STOP_PROCESSING(SSobj, src) qdel(src) - if(scanning) - return - if(istype(loc,/obj/mecha/working)) + if(istype(loc,/obj/mecha/working) && scanning_time <= world.time) var/obj/mecha/working/mecha = loc if(!mecha.occupant) return - var/list/L = list(mecha.occupant) - scanning = 1 - mineral_scan_pulse(L,get_turf(loc)) - spawn(equip_cooldown) - scanning = 0 + scanning_time = world.time + equip_cooldown + mineral_scan_pulse(get_turf(src)) diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 1d7d9072c9..1cd46f24ea 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -8,7 +8,7 @@ var/variance = 0 var/randomspread = 0 //use random spread for machineguns, instead of shotgun scatter var/projectile_delay = 0 - var/firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect //the visual effect appearing when the weapon is fired. + var/firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect //the visual effect appearing when the weapon is fired. /obj/item/mecha_parts/mecha_equipment/weapon/can_attach(obj/mecha/combat/M) if(..()) @@ -60,7 +60,7 @@ //Base energy weapon type /obj/item/mecha_parts/mecha_equipment/weapon/energy name = "general energy weapon" - firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect/energy + firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy /obj/item/mecha_parts/mecha_equipment/weapon/energy/get_shot_amount() return min(round(chassis.cell.charge / energy_drain), projectiles_per_shot) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 25ba38c51c..66cc6be38a 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -37,7 +37,6 @@ var/list/facing_modifiers = list(FRONT_ARMOUR = 1.5, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.5) var/obj/item/weapon/stock_parts/cell/cell var/state = 0 - var/cell_power_remaining = 1 // 0 - no power, 1 - 100% power in cell. Starts as 1 so putting any cell into empty mech doesn't deplete charge from it var/list/log = new var/last_message = 0 var/add_req_access = 1 diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index ccb7901d63..94f68c66d0 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -213,7 +213,6 @@ clearInternalDamage(MECHA_INT_TEMP_CONTROL) to_chat(user, "You repair the damaged temperature controller.") else if(state==3 && cell) - cell_power_remaining = max(0.1, cell.charge/cell.maxcharge) //10% charge or whatever is remaining in the current cell cell.forceMove(loc) cell = null state = 4 @@ -232,7 +231,6 @@ var/obj/item/weapon/stock_parts/cell/C = W to_chat(user, "You install the powercell.") C.forceMove(src) - C.use(max(0, C.charge - C.maxcharge*cell_power_remaining)) //Set inserted cell's power to saved percentage if that's higher cell = C log_message("Powercell installed") else diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index aca6b7a778..a752811fe7 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -19,12 +19,17 @@ /obj/mecha/working/ripley/Move() . = ..() - if(. && (locate(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) in equipment)) + if(.) + collect_ore() + update_pressure() + +/obj/mecha/working/ripley/proc/collect_ore() + if(locate(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) in equipment) var/obj/structure/ore_box/ore_box = locate(/obj/structure/ore_box) in cargo if(ore_box) - for(var/obj/item/weapon/ore/ore in get_turf(src)) - ore.Move(ore_box) - update_pressure() + for(var/obj/item/weapon/ore/ore in range(1, src)) + if(ore.Adjacent(src) && ((get_dir(src, ore) & dir) || ore.loc == loc)) //we can reach it and it's in front of us? grab it! + ore.forceMove(ore_box) /obj/mecha/working/ripley/Destroy() for(var/i=1, i <= hides, i++) diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index af205fd132..53ecfc8d62 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -8,7 +8,7 @@ /obj/effect/decal/cleanable/crayon/Initialize(mapload, main = "#FFFFFF", var/type = "rune1", var/e_name = "rune", var/rotation = 0, var/alt_icon = null) ..() - + name = e_name desc = "A [name] vandalizing the station." if(type == "poseur tag") @@ -30,22 +30,25 @@ layer = HIGH_OBJ_LAYER //Harder to hide do_icon_rotate = FALSE //These are designed to always face south, so no rotation please. var/datum/gang/gang + var/obj/item/device/gangtool/linked_tool + var/area/territory -/obj/effect/decal/cleanable/crayon/gang/Initialize(mapload, var/datum/gang/G, var/e_name = "gang tag", var/rotation = 0) +/obj/effect/decal/cleanable/crayon/gang/Initialize(mapload, var/datum/gang/G, var/e_name = "gang tag", var/rotation = 0, var/mob/user) if(!type || !G) qdel(src) - - var/area/territory = get_area(src) + territory = get_area(src) gang = G var/newcolor = G.color_hex icon_state = G.name G.territory_new |= list(territory.type = territory.name) - + linked_tool = locate(/obj/item/device/gangtool) in user.contents + if(linked_tool) + linked_tool.tags += src ..(mapload, newcolor, icon_state, e_name, rotation) /obj/effect/decal/cleanable/crayon/gang/Destroy() - var/area/territory = get_area(src) - + if(linked_tool) + linked_tool.tags -= src if(gang) gang.territory -= territory.type gang.territory_new -= territory.type diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm index c2146daa82..e03325fb93 100644 --- a/code/game/objects/effects/decals/misc.dm +++ b/code/game/objects/effects/decals/misc.dm @@ -1,11 +1,11 @@ -/obj/effect/overlay/temp/point +/obj/effect/temp_visual/point name = "pointer" icon = 'icons/mob/screen_gen.dmi' icon_state = "arrow" layer = POINT_LAYER duration = 25 -/obj/effect/overlay/temp/point/Initialize(mapload, set_invis = 0) +/obj/effect/temp_visual/point/Initialize(mapload, set_invis = 0) ..() var/atom/old_loc = loc loc = get_turf(src) diff --git a/code/game/objects/effects/proximity.dm b/code/game/objects/effects/proximity.dm index bfa6cd8fa9..62471505d0 100644 --- a/code/game/objects/effects/proximity.dm +++ b/code/game/objects/effects/proximity.dm @@ -93,6 +93,4 @@ /obj/effect/abstract/proximity_checker/Crossed(atom/movable/AM) set waitfor = FALSE - var/atom/H = monitor.host - testing("HasProx: [H] -> [AM]") - H.HasProximity(AM) + monitor.host.HasProximity(AM) diff --git a/code/game/objects/effects/spawners/xeno_egg_delivery.dm b/code/game/objects/effects/spawners/xeno_egg_delivery.dm index 91db494d9b..a452dae749 100644 --- a/code/game/objects/effects/spawners/xeno_egg_delivery.dm +++ b/code/game/objects/effects/spawners/xeno_egg_delivery.dm @@ -10,7 +10,7 @@ var/area/A = get_area(T) new /obj/structure/alien/egg(T) - new /obj/effect/overlay/temp/gravpush(T) + new /obj/effect/temp_visual/gravpush(T) playsound(T, 'sound/items/party_horn.ogg', 50, 1, -1) message_admins("An alien egg has been delivered to [A] at [ADMIN_COORDJMP(T)].") diff --git a/code/game/objects/effects/temporary_visuals/clockcult.dm b/code/game/objects/effects/temporary_visuals/clockcult.dm index 65c9d30e47..1eae2a3c64 100644 --- a/code/game/objects/effects/temporary_visuals/clockcult.dm +++ b/code/game/objects/effects/temporary_visuals/clockcult.dm @@ -1,68 +1,68 @@ -//temporary visual effects(/obj/effect/overlay/temp) used by clockcult stuff -/obj/effect/overlay/temp/ratvar +//temporary visual effects(/obj/effect/temp_visual) used by clockcult stuff +/obj/effect/temp_visual/ratvar name = "ratvar's light" icon = 'icons/effects/clockwork_effects.dmi' duration = 8 randomdir = 0 layer = ABOVE_NORMAL_TURF_LAYER -/obj/effect/overlay/temp/ratvar/door +/obj/effect/temp_visual/ratvar/door icon_state = "ratvardoorglow" layer = CLOSED_DOOR_LAYER //above closed doors -/obj/effect/overlay/temp/ratvar/door/window +/obj/effect/temp_visual/ratvar/door/window icon_state = "ratvarwindoorglow" layer = ABOVE_WINDOW_LAYER -/obj/effect/overlay/temp/ratvar/beam +/obj/effect/temp_visual/ratvar/beam icon_state = "ratvarbeamglow" -/obj/effect/overlay/temp/ratvar/beam/door +/obj/effect/temp_visual/ratvar/beam/door layer = CLOSED_DOOR_LAYER -/obj/effect/overlay/temp/ratvar/beam/grille +/obj/effect/temp_visual/ratvar/beam/grille layer = BELOW_OBJ_LAYER -/obj/effect/overlay/temp/ratvar/beam/itemconsume +/obj/effect/temp_visual/ratvar/beam/itemconsume layer = HIGH_OBJ_LAYER -/obj/effect/overlay/temp/ratvar/beam/falsewall +/obj/effect/temp_visual/ratvar/beam/falsewall layer = OBJ_LAYER -/obj/effect/overlay/temp/ratvar/beam/catwalk +/obj/effect/temp_visual/ratvar/beam/catwalk layer = LATTICE_LAYER -/obj/effect/overlay/temp/ratvar/wall +/obj/effect/temp_visual/ratvar/wall icon_state = "ratvarwallglow" -/obj/effect/overlay/temp/ratvar/wall/false +/obj/effect/temp_visual/ratvar/wall/false layer = OBJ_LAYER -/obj/effect/overlay/temp/ratvar/floor +/obj/effect/temp_visual/ratvar/floor icon_state = "ratvarfloorglow" -/obj/effect/overlay/temp/ratvar/floor/catwalk +/obj/effect/temp_visual/ratvar/floor/catwalk layer = LATTICE_LAYER -/obj/effect/overlay/temp/ratvar/window +/obj/effect/temp_visual/ratvar/window icon_state = "ratvarwindowglow" layer = ABOVE_OBJ_LAYER -/obj/effect/overlay/temp/ratvar/window/single +/obj/effect/temp_visual/ratvar/window/single icon_state = "ratvarwindowglow_s" -/obj/effect/overlay/temp/ratvar/gear +/obj/effect/temp_visual/ratvar/gear icon_state = "ratvargearglow" layer = BELOW_OBJ_LAYER -/obj/effect/overlay/temp/ratvar/grille +/obj/effect/temp_visual/ratvar/grille icon_state = "ratvargrilleglow" layer = BELOW_OBJ_LAYER -/obj/effect/overlay/temp/ratvar/grille/broken +/obj/effect/temp_visual/ratvar/grille/broken icon_state = "ratvarbrokengrilleglow" -/obj/effect/overlay/temp/ratvar/mending_mantra +/obj/effect/temp_visual/ratvar/mending_mantra layer = ABOVE_MOB_LAYER duration = 20 alpha = 200 @@ -70,7 +70,7 @@ light_range = 1.5 light_color = "#1E8CE1" -/obj/effect/overlay/temp/ratvar/mending_mantra/Initialize(mapload) +/obj/effect/temp_visual/ratvar/mending_mantra/Initialize(mapload) . = ..() transform = matrix()*2 var/matrix/M = transform @@ -78,7 +78,7 @@ animate(src, alpha = 20, time = duration, easing = BOUNCE_EASING, flags = ANIMATION_PARALLEL) animate(src, transform = M, time = duration, flags = ANIMATION_PARALLEL) -/obj/effect/overlay/temp/ratvar/volt_hit +/obj/effect/temp_visual/ratvar/volt_hit name = "volt blast" layer = ABOVE_MOB_LAYER duration = 5 @@ -89,13 +89,13 @@ var/mob/user var/damage = 20 -/obj/effect/overlay/temp/ratvar/volt_hit/Initialize(mapload, caster, multiplier) +/obj/effect/temp_visual/ratvar/volt_hit/Initialize(mapload, caster, multiplier) if(multiplier) damage *= multiplier duration = max(round(damage * 0.2), 1) . = ..() -/obj/effect/overlay/temp/ratvar/volt_hit/true/Initialize(mapload, caster, multiplier) +/obj/effect/temp_visual/ratvar/volt_hit/true/Initialize(mapload, caster, multiplier) . = ..() user = caster if(user) @@ -104,7 +104,7 @@ transform = M INVOKE_ASYNC(src, .proc/volthit) -/obj/effect/overlay/temp/ratvar/volt_hit/proc/volthit() +/obj/effect/temp_visual/ratvar/volt_hit/proc/volthit() if(user) Beam(get_turf(user), "volt_ray", time=duration, maxdistance=8, beam_type=/obj/effect/ebeam/volt_ray) var/hit_amount = 0 @@ -134,61 +134,61 @@ else playsound(src, "sparks", 50, 1) -/obj/effect/overlay/temp/ratvar/ocular_warden +/obj/effect/temp_visual/ratvar/ocular_warden name = "warden's gaze" layer = ABOVE_MOB_LAYER icon_state = "warden_gaze" duration = 3 -/obj/effect/overlay/temp/ratvar/ocular_warden/Initialize() +/obj/effect/temp_visual/ratvar/ocular_warden/Initialize() . = ..() pixel_x = rand(-8, 8) pixel_y = rand(-10, 10) animate(src, alpha = 0, time = 3, easing = EASE_OUT) -/obj/effect/overlay/temp/ratvar/spearbreak +/obj/effect/temp_visual/ratvar/spearbreak icon = 'icons/effects/64x64.dmi' icon_state = "ratvarspearbreak" layer = BELOW_MOB_LAYER pixel_y = -16 pixel_x = -16 -/obj/effect/overlay/temp/ratvar/geis_binding +/obj/effect/temp_visual/ratvar/geis_binding icon_state = "geisbinding" -/obj/effect/overlay/temp/ratvar/geis_binding/top +/obj/effect/temp_visual/ratvar/geis_binding/top icon_state = "geisbinding_top" -/obj/effect/overlay/temp/ratvar/component +/obj/effect/temp_visual/ratvar/component icon = 'icons/obj/clockwork_objects.dmi' icon_state = "belligerent_eye" layer = ABOVE_MOB_LAYER duration = 10 -/obj/effect/overlay/temp/ratvar/component/Initialize() +/obj/effect/temp_visual/ratvar/component/Initialize() . = ..() transform = matrix()*0.75 pixel_x = rand(-10, 10) pixel_y = rand(-10, -2) animate(src, pixel_y = pixel_y + 10, alpha = 50, time = 10, easing = EASE_OUT) -/obj/effect/overlay/temp/ratvar/component/cogwheel +/obj/effect/temp_visual/ratvar/component/cogwheel icon_state = "vanguard_cogwheel" -/obj/effect/overlay/temp/ratvar/component/capacitor +/obj/effect/temp_visual/ratvar/component/capacitor icon_state = "geis_capacitor" -/obj/effect/overlay/temp/ratvar/component/alloy +/obj/effect/temp_visual/ratvar/component/alloy icon_state = "replicant_alloy" -/obj/effect/overlay/temp/ratvar/component/ansible +/obj/effect/temp_visual/ratvar/component/ansible icon_state = "hierophant_ansible" -/obj/effect/overlay/temp/ratvar/sigil +/obj/effect/temp_visual/ratvar/sigil name = "glowing circle" icon_state = "sigildull" -/obj/effect/overlay/temp/ratvar/sigil/transgression +/obj/effect/temp_visual/ratvar/sigil/transgression color = "#FAE48C" layer = ABOVE_MOB_LAYER duration = 70 @@ -196,13 +196,13 @@ light_power = 2 light_color = "#FAE48C" -/obj/effect/overlay/temp/ratvar/sigil/transgression/Initialize() +/obj/effect/temp_visual/ratvar/sigil/transgression/Initialize() . = ..() var/oldtransform = transform animate(src, transform = matrix()*2, time = 5) animate(transform = oldtransform, alpha = 0, time = 65) -/obj/effect/overlay/temp/ratvar/sigil/vitality +/obj/effect/temp_visual/ratvar/sigil/vitality color = "#1E8CE1" icon_state = "sigilactivepulse" layer = ABOVE_MOB_LAYER @@ -210,7 +210,7 @@ light_power = 0.5 light_color = "#1E8CE1" -/obj/effect/overlay/temp/ratvar/sigil/accession +/obj/effect/temp_visual/ratvar/sigil/accession color = "#AF0AAF" layer = ABOVE_MOB_LAYER duration = 70 diff --git a/code/game/objects/effects/temporary_visuals/cult.dm b/code/game/objects/effects/temporary_visuals/cult.dm index ad3f84fe06..78cc50cfc1 100644 --- a/code/game/objects/effects/temporary_visuals/cult.dm +++ b/code/game/objects/effects/temporary_visuals/cult.dm @@ -1,58 +1,58 @@ -//temporary visual effects(/obj/effect/overlay/temp) used by cult stuff -/obj/effect/overlay/temp/cult +//temporary visual effects(/obj/effect/temp_visual) used by cult stuff +/obj/effect/temp_visual/cult icon = 'icons/effects/cult_effects.dmi' randomdir = 0 duration = 10 -/obj/effect/overlay/temp/cult/sparks +/obj/effect/temp_visual/cult/sparks randomdir = 1 name = "blood sparks" icon_state = "bloodsparkles" -/obj/effect/overlay/temp/cult/blood // The traditional teleport +/obj/effect/temp_visual/cult/blood // The traditional teleport name = "blood jaunt" duration = 12 icon_state = "bloodin" -/obj/effect/overlay/temp/cult/blood/out +/obj/effect/temp_visual/cult/blood/out icon_state = "bloodout" -/obj/effect/overlay/temp/dir_setting/cult/phase // The veil shifter teleport +/obj/effect/temp_visual/dir_setting/cult/phase // The veil shifter teleport name = "phase glow" duration = 7 icon_state = "cultin" -/obj/effect/overlay/temp/dir_setting/cult/phase/out +/obj/effect/temp_visual/dir_setting/cult/phase/out icon_state = "cultout" -/obj/effect/overlay/temp/cult/sac +/obj/effect/temp_visual/cult/sac name = "maw of Nar-Sie" icon_state = "sacconsume" -/obj/effect/overlay/temp/cult/door +/obj/effect/temp_visual/cult/door name = "unholy glow" icon_state = "doorglow" layer = CLOSED_FIREDOOR_LAYER //above closed doors -/obj/effect/overlay/temp/cult/door/unruned +/obj/effect/temp_visual/cult/door/unruned icon_state = "unruneddoorglow" -/obj/effect/overlay/temp/cult/turf +/obj/effect/temp_visual/cult/turf name = "unholy glow" icon_state = "wallglow" layer = ABOVE_NORMAL_TURF_LAYER -/obj/effect/overlay/temp/cult/turf/floor +/obj/effect/temp_visual/cult/turf/floor icon_state = "floorglow" duration = 5 //visuals for runes being magically created -/obj/effect/overlay/temp/cult/rune_spawn +/obj/effect/temp_visual/cult/rune_spawn icon_state = "runeouter" alpha = 0 var/turnedness = 179 //179 turns counterclockwise, 181 turns clockwise -/obj/effect/overlay/temp/cult/rune_spawn/Initialize(mapload, set_duration, set_color) +/obj/effect/temp_visual/cult/rune_spawn/Initialize(mapload, set_duration, set_color) if(isnum(set_duration)) duration = set_duration if(set_color) @@ -66,79 +66,79 @@ animate(src, alpha = 255, time = duration, easing = BOUNCE_EASING, flags = ANIMATION_PARALLEL) animate(src, transform = oldtransform, time = duration, flags = ANIMATION_PARALLEL) -/obj/effect/overlay/temp/cult/rune_spawn/rune1 +/obj/effect/temp_visual/cult/rune_spawn/rune1 icon_state = "rune1words" turnedness = 181 -/obj/effect/overlay/temp/cult/rune_spawn/rune1/inner +/obj/effect/temp_visual/cult/rune_spawn/rune1/inner icon_state = "rune1inner" turnedness = 179 -/obj/effect/overlay/temp/cult/rune_spawn/rune1/center +/obj/effect/temp_visual/cult/rune_spawn/rune1/center icon_state = "rune1center" -/obj/effect/overlay/temp/cult/rune_spawn/rune2 +/obj/effect/temp_visual/cult/rune_spawn/rune2 icon_state = "rune2words" turnedness = 181 -/obj/effect/overlay/temp/cult/rune_spawn/rune2/inner +/obj/effect/temp_visual/cult/rune_spawn/rune2/inner icon_state = "rune2inner" turnedness = 179 -/obj/effect/overlay/temp/cult/rune_spawn/rune2/center +/obj/effect/temp_visual/cult/rune_spawn/rune2/center icon_state = "rune2center" -/obj/effect/overlay/temp/cult/rune_spawn/rune3 +/obj/effect/temp_visual/cult/rune_spawn/rune3 icon_state = "rune3words" turnedness = 181 -/obj/effect/overlay/temp/cult/rune_spawn/rune3/inner +/obj/effect/temp_visual/cult/rune_spawn/rune3/inner icon_state = "rune3inner" turnedness = 179 -/obj/effect/overlay/temp/cult/rune_spawn/rune3/center +/obj/effect/temp_visual/cult/rune_spawn/rune3/center icon_state = "rune3center" -/obj/effect/overlay/temp/cult/rune_spawn/rune4 +/obj/effect/temp_visual/cult/rune_spawn/rune4 icon_state = "rune4words" turnedness = 181 -/obj/effect/overlay/temp/cult/rune_spawn/rune4/inner +/obj/effect/temp_visual/cult/rune_spawn/rune4/inner icon_state = "rune4inner" turnedness = 179 -/obj/effect/overlay/temp/cult/rune_spawn/rune4/center +/obj/effect/temp_visual/cult/rune_spawn/rune4/center icon_state = "rune4center" -/obj/effect/overlay/temp/cult/rune_spawn/rune5 +/obj/effect/temp_visual/cult/rune_spawn/rune5 icon_state = "rune5words" turnedness = 181 -/obj/effect/overlay/temp/cult/rune_spawn/rune5/inner +/obj/effect/temp_visual/cult/rune_spawn/rune5/inner icon_state = "rune5inner" turnedness = 179 -/obj/effect/overlay/temp/cult/rune_spawn/rune5/center +/obj/effect/temp_visual/cult/rune_spawn/rune5/center icon_state = "rune5center" -/obj/effect/overlay/temp/cult/rune_spawn/rune6 +/obj/effect/temp_visual/cult/rune_spawn/rune6 icon_state = "rune6words" turnedness = 181 -/obj/effect/overlay/temp/cult/rune_spawn/rune6/inner +/obj/effect/temp_visual/cult/rune_spawn/rune6/inner icon_state = "rune6inner" turnedness = 179 -/obj/effect/overlay/temp/cult/rune_spawn/rune6/center +/obj/effect/temp_visual/cult/rune_spawn/rune6/center icon_state = "rune6center" -/obj/effect/overlay/temp/cult/rune_spawn/rune7 +/obj/effect/temp_visual/cult/rune_spawn/rune7 icon_state = "rune7words" turnedness = 181 -/obj/effect/overlay/temp/cult/rune_spawn/rune7/inner +/obj/effect/temp_visual/cult/rune_spawn/rune7/inner icon_state = "rune7inner" turnedness = 179 -/obj/effect/overlay/temp/cult/rune_spawn/rune7/center +/obj/effect/temp_visual/cult/rune_spawn/rune7/center icon_state = "rune7center" diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 2ceea0aced..c3cf2a5103 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -1,12 +1,12 @@ //unsorted miscellaneous temporary visuals -/obj/effect/overlay/temp/dir_setting/bloodsplatter +/obj/effect/temp_visual/dir_setting/bloodsplatter icon = 'icons/effects/blood.dmi' duration = 5 randomdir = FALSE layer = BELOW_MOB_LAYER var/splatter_type = "splatter" -/obj/effect/overlay/temp/dir_setting/bloodsplatter/Initialize(mapload, set_dir) +/obj/effect/temp_visual/dir_setting/bloodsplatter/Initialize(mapload, set_dir) if(set_dir in GLOB.diagonals) icon_state = "[splatter_type][pick(1, 2, 6)]" else @@ -40,22 +40,22 @@ layer = ABOVE_MOB_LAYER animate(src, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = duration) -/obj/effect/overlay/temp/dir_setting/bloodsplatter/xenosplatter +/obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter splatter_type = "xsplatter" -/obj/effect/overlay/temp/dir_setting/speedbike_trail +/obj/effect/temp_visual/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 +/obj/effect/temp_visual/dir_setting/firing_effect icon = 'icons/effects/effects.dmi' icon_state = "firing_effect" duration = 2 -/obj/effect/overlay/temp/dir_setting/firing_effect/setDir(newdir) +/obj/effect/temp_visual/dir_setting/firing_effect/setDir(newdir) switch(newdir) if(NORTH) layer = BELOW_MOB_LAYER @@ -69,84 +69,84 @@ pixel_y = rand(-1,1) ..() -/obj/effect/overlay/temp/dir_setting/firing_effect/energy +/obj/effect/temp_visual/dir_setting/firing_effect/energy icon_state = "firing_effect_energy" duration = 3 -/obj/effect/overlay/temp/dir_setting/firing_effect/magic +/obj/effect/temp_visual/dir_setting/firing_effect/magic icon_state = "shieldsparkles" duration = 3 -/obj/effect/overlay/temp/dir_setting/ninja +/obj/effect/temp_visual/dir_setting/ninja name = "ninja shadow" icon = 'icons/mob/mob.dmi' icon_state = "uncloak" duration = 9 -/obj/effect/overlay/temp/dir_setting/ninja/cloak +/obj/effect/temp_visual/dir_setting/ninja/cloak icon_state = "cloak" -/obj/effect/overlay/temp/dir_setting/ninja/shadow +/obj/effect/temp_visual/dir_setting/ninja/shadow icon_state = "shadow" -/obj/effect/overlay/temp/dir_setting/ninja/phase +/obj/effect/temp_visual/dir_setting/ninja/phase name = "ninja energy" icon_state = "phasein" -/obj/effect/overlay/temp/dir_setting/ninja/phase/out +/obj/effect/temp_visual/dir_setting/ninja/phase/out icon_state = "phaseout" -/obj/effect/overlay/temp/dir_setting/wraith +/obj/effect/temp_visual/dir_setting/wraith name = "blood" icon = 'icons/mob/mob.dmi' icon_state = "phase_shift2" duration = 12 -/obj/effect/overlay/temp/dir_setting/wraith/out +/obj/effect/temp_visual/dir_setting/wraith/out icon_state = "phase_shift" -/obj/effect/overlay/temp/dir_setting/tailsweep +/obj/effect/temp_visual/dir_setting/tailsweep icon_state = "tailsweep" duration = 4 -/obj/effect/overlay/temp/wizard +/obj/effect/temp_visual/wizard name = "water" icon = 'icons/mob/mob.dmi' icon_state = "reappear" duration = 5 -/obj/effect/overlay/temp/wizard/out +/obj/effect/temp_visual/wizard/out icon_state = "liquify" duration = 12 -/obj/effect/overlay/temp/monkeyify +/obj/effect/temp_visual/monkeyify icon = 'icons/mob/mob.dmi' icon_state = "h2monkey" duration = 22 -/obj/effect/overlay/temp/monkeyify/humanify +/obj/effect/temp_visual/monkeyify/humanify icon_state = "monkey2h" -/obj/effect/overlay/temp/borgflash +/obj/effect/temp_visual/borgflash icon = 'icons/mob/mob.dmi' icon_state = "blspell" duration = 5 -/obj/effect/overlay/temp/guardian +/obj/effect/temp_visual/guardian randomdir = 0 -/obj/effect/overlay/temp/guardian/phase +/obj/effect/temp_visual/guardian/phase duration = 5 icon_state = "phasein" -/obj/effect/overlay/temp/guardian/phase/out +/obj/effect/temp_visual/guardian/phase/out icon_state = "phaseout" -/obj/effect/overlay/temp/decoy +/obj/effect/temp_visual/decoy desc = "It's a decoy!" duration = 15 -/obj/effect/overlay/temp/decoy/Initialize(mapload, atom/mimiced_atom) +/obj/effect/temp_visual/decoy/Initialize(mapload, atom/mimiced_atom) . = ..() alpha = initial(alpha) if(mimiced_atom) @@ -155,95 +155,95 @@ setDir(mimiced_atom.dir) mouse_opacity = 0 -/obj/effect/overlay/temp/decoy/fading/Initialize(mapload, atom/mimiced_atom) +/obj/effect/temp_visual/decoy/fading/Initialize(mapload, atom/mimiced_atom) . = ..() animate(src, alpha = 0, time = duration) -/obj/effect/overlay/temp/decoy/fading/fivesecond +/obj/effect/temp_visual/decoy/fading/fivesecond duration = 50 -/obj/effect/overlay/temp/small_smoke +/obj/effect/temp_visual/small_smoke icon_state = "smoke" duration = 50 -/obj/effect/overlay/temp/fire +/obj/effect/temp_visual/fire icon = 'icons/effects/fire.dmi' icon_state = "3" duration = 20 -/obj/effect/overlay/temp/revenant +/obj/effect/temp_visual/revenant name = "spooky lights" icon_state = "purplesparkles" -/obj/effect/overlay/temp/revenant/cracks +/obj/effect/temp_visual/revenant/cracks name = "glowing cracks" icon_state = "purplecrack" duration = 6 -/obj/effect/overlay/temp/gravpush +/obj/effect/temp_visual/gravpush name = "gravity wave" icon_state = "shieldsparkles" duration = 5 -/obj/effect/overlay/temp/telekinesis +/obj/effect/temp_visual/telekinesis name = "telekinetic force" icon_state = "empdisable" duration = 5 -/obj/effect/overlay/temp/emp +/obj/effect/temp_visual/emp name = "emp sparks" icon_state = "empdisable" -/obj/effect/overlay/temp/emp/pulse +/obj/effect/temp_visual/emp/pulse name = "emp pulse" icon_state = "emppulse" duration = 8 randomdir = 0 -/obj/effect/overlay/temp/gib_animation +/obj/effect/temp_visual/gib_animation icon = 'icons/mob/mob.dmi' duration = 15 -/obj/effect/overlay/temp/gib_animation/Initialize(mapload, gib_icon) +/obj/effect/temp_visual/gib_animation/Initialize(mapload, gib_icon) icon_state = gib_icon // Needs to be before ..() so icon is correct . = ..() -/obj/effect/overlay/temp/gib_animation/animal +/obj/effect/temp_visual/gib_animation/animal icon = 'icons/mob/animal.dmi' -/obj/effect/overlay/temp/dust_animation +/obj/effect/temp_visual/dust_animation icon = 'icons/mob/mob.dmi' duration = 15 -/obj/effect/overlay/temp/dust_animation/Initialize(mapload, dust_icon) +/obj/effect/temp_visual/dust_animation/Initialize(mapload, dust_icon) icon_state = dust_icon // Before ..() so the correct icon is flick()'d . = ..() -/obj/effect/overlay/temp/mummy_animation +/obj/effect/temp_visual/mummy_animation icon = 'icons/mob/mob.dmi' icon_state = "mummy_revive" duration = 20 -/obj/effect/overlay/temp/heal //color is white by default, set to whatever is needed +/obj/effect/temp_visual/heal //color is white by default, set to whatever is needed name = "healing glow" icon_state = "heal" duration = 15 -/obj/effect/overlay/temp/heal/Initialize(mapload, set_color) +/obj/effect/temp_visual/heal/Initialize(mapload, set_color) if(set_color) add_atom_colour(set_color, FIXED_COLOUR_PRIORITY) . = ..() pixel_x = rand(-12, 12) pixel_y = rand(-9, 0) -/obj/effect/overlay/temp/kinetic_blast +/obj/effect/temp_visual/kinetic_blast name = "kinetic explosion" icon = 'icons/obj/projectiles.dmi' icon_state = "kinetic_blast" layer = ABOVE_ALL_MOB_LAYER duration = 4 -/obj/effect/overlay/temp/explosion +/obj/effect/temp_visual/explosion name = "explosion" icon = 'icons/effects/96x96.dmi' icon_state = "explosion" @@ -251,22 +251,22 @@ pixel_y = -32 duration = 8 -/obj/effect/overlay/temp/explosion/fast +/obj/effect/temp_visual/explosion/fast icon_state = "explosionfast" duration = 4 -/obj/effect/overlay/temp/blob +/obj/effect/temp_visual/blob name = "blob" icon_state = "blob_attack" alpha = 140 randomdir = 0 duration = 6 -/obj/effect/overlay/temp/impact_effect +/obj/effect/temp_visual/impact_effect icon_state = "impact_bullet" duration = 5 -/obj/effect/overlay/temp/impact_effect/Initialize(mapload, atom/target, obj/item/projectile/P) +/obj/effect/temp_visual/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) @@ -275,37 +275,37 @@ pixel_y = target.pixel_y + rand(-4,4) . = ..() -/obj/effect/overlay/temp/impact_effect/red_laser +/obj/effect/temp_visual/impact_effect/red_laser icon_state = "impact_laser" duration = 4 -/obj/effect/overlay/temp/impact_effect/red_laser/wall +/obj/effect/temp_visual/impact_effect/red_laser/wall icon_state = "impact_laser_wall" duration = 10 -/obj/effect/overlay/temp/impact_effect/blue_laser +/obj/effect/temp_visual/impact_effect/blue_laser icon_state = "impact_laser_blue" duration = 4 -/obj/effect/overlay/temp/impact_effect/green_laser +/obj/effect/temp_visual/impact_effect/green_laser icon_state = "impact_laser_green" duration = 4 -/obj/effect/overlay/temp/impact_effect/purple_laser +/obj/effect/temp_visual/impact_effect/purple_laser icon_state = "impact_laser_purple" duration = 4 -/obj/effect/overlay/temp/impact_effect/ion +/obj/effect/temp_visual/impact_effect/ion icon_state = "shieldsparkles" duration = 6 -/obj/effect/overlay/temp/heart +/obj/effect/temp_visual/heart name = "heart" icon = 'icons/mob/animal.dmi' icon_state = "heart" duration = 25 -/obj/effect/overlay/temp/heart/Initialize(mapload) +/obj/effect/temp_visual/heart/Initialize(mapload) . = ..() pixel_x = rand(-4,4) pixel_y = rand(-4,4) diff --git a/code/game/objects/effects/temporary_visuals/temporary_visual.dm b/code/game/objects/effects/temporary_visuals/temporary_visual.dm index 8c7a178bd6..44b9b91224 100644 --- a/code/game/objects/effects/temporary_visuals/temporary_visual.dm +++ b/code/game/objects/effects/temporary_visuals/temporary_visual.dm @@ -1,5 +1,5 @@ //temporary visual effects -/obj/effect/overlay/temp +/obj/effect/temp_visual icon_state = "nothing" anchored = 1 layer = ABOVE_MOB_LAYER @@ -8,30 +8,30 @@ var/randomdir = TRUE var/timerid -/obj/effect/overlay/temp/Initialize() +/obj/effect/temp_visual/Initialize() . = ..() if(randomdir) setDir(pick(GLOB.cardinal)) timerid = QDEL_IN(src, duration) -/obj/effect/overlay/temp/Destroy() +/obj/effect/temp_visual/Destroy() . = ..() deltimer(timerid) -/obj/effect/overlay/temp/singularity_act() +/obj/effect/temp_visual/singularity_act() return -/obj/effect/overlay/temp/singularity_pull() +/obj/effect/temp_visual/singularity_pull() return -/obj/effect/overlay/temp/ex_act() +/obj/effect/temp_visual/ex_act() return -/obj/effect/overlay/temp/dir_setting +/obj/effect/temp_visual/dir_setting randomdir = FALSE -/obj/effect/overlay/temp/dir_setting/Initialize(mapload, set_dir) +/obj/effect/temp_visual/dir_setting/Initialize(mapload, set_dir) if(set_dir) setDir(set_dir) . = ..() diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm index 3aaa24ce60..f7d04941ed 100644 --- a/code/game/objects/empulse.dm +++ b/code/game/objects/empulse.dm @@ -9,7 +9,7 @@ log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ") if(heavy_range > 1) - new /obj/effect/overlay/temp/emp/pulse(epicenter) + new /obj/effect/temp_visual/emp/pulse(epicenter) if(heavy_range > light_range) light_range = heavy_range diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index af8b9341f9..0c29ee3f9f 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -68,6 +68,7 @@ var/pre_noise = FALSE var/post_noise = FALSE + /obj/item/toy/crayon/suicide_act(mob/user) user.visible_message("[user] is jamming [src] up [user.p_their()] nose and into [user.p_their()] brain. It looks like [user.p_theyre()] trying to commit suicide!") return (BRUTELOSS|OXYLOSS) @@ -422,7 +423,7 @@ var/gangID = user.mind.gang_datum var/area/territory = get_area(target) - new /obj/effect/decal/cleanable/crayon/gang(target,gangID,"graffiti",0) + new /obj/effect/decal/cleanable/crayon/gang(target,gangID,"graffiti",0,user) to_chat(user, "You tagged [territory] for your gang!") /obj/item/toy/crayon/red diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 0e4f7200bb..3ab826ec41 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -56,13 +56,13 @@ qdel(active_dummy) active_dummy = null to_chat(usr, "You deactivate \the [src].") - new /obj/effect/overlay/temp/emp/pulse(get_turf(src)) + new /obj/effect/temp_visual/emp/pulse(get_turf(src)) else playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6) var/obj/effect/dummy/chameleon/C = new/obj/effect/dummy/chameleon(usr.loc) C.activate(usr, saved_appearance, src) to_chat(usr, "You activate \the [src].") - new /obj/effect/overlay/temp/emp/pulse(get_turf(src)) + new /obj/effect/temp_visual/emp/pulse(get_turf(src)) /obj/item/device/chameleon/proc/disrupt(delete_dummy = 1) if(active_dummy) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 9131c02240..bc3c43202c 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -162,18 +162,18 @@ return var/T = get_turf(target) if(locate(/mob/living) in T) - new /obj/effect/overlay/temp/medical_holosign(T,user) //produce a holographic glow + new /obj/effect/temp_visual/medical_holosign(T,user) //produce a holographic glow holo_cooldown = world.time + 100 return ..() -/obj/effect/overlay/temp/medical_holosign +/obj/effect/temp_visual/medical_holosign name = "medical holosign" desc = "A small holographic glow that indicates a medic is coming to treat a patient." icon_state = "medi_holo" duration = 30 -/obj/effect/overlay/temp/medical_holosign/Initialize(mapload, creator) +/obj/effect/temp_visual/medical_holosign/Initialize(mapload, creator) . = ..() playsound(loc, 'sound/machines/ping.ogg', 50, 0) //make some noise! if(creator) diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 14e4f5a01c..9c14a4376a 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -196,13 +196,6 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \ user.visible_message("[user] starts cutting hair off \the [src].", "You start cutting the hair off \the [src]...", "You hear the sound of a knife rubbing against flesh.") if(do_after(user,50, target = src)) to_chat(user, "You cut the hair from this [src.singular_name].") - //Try locating an exisitng stack on the tile and add to there if possible - for(var/obj/item/stack/sheet/hairlesshide/HS in user.loc) - if(HS.amount < 50) - HS.amount++ - use(1) - break - //If it gets to here it means it did not find a suitable stack on the tile. var/obj/item/stack/sheet/hairlesshide/HS = new(user.loc) HS.amount = 1 use(1) @@ -230,3 +223,9 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \ HS.amount = 1 wetness = initial(wetness) src.use(1) + +/obj/item/stack/sheet/wetleather/microwave_act(obj/machinery/microwave/MW) + ..() + var/obj/item/stack/sheet/leather/L = new(loc) + L.amount = amount + qdel(src) diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index c50ef26b81..ecc8d3a362 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -50,7 +50,8 @@ M.dna.uni_identity = merge_text(M.dna.uni_identity, fields["UI"]) M.updateappearance(mutations_overlay_update=1) log_attack(log_msg) - return TRUE + return TRUE + return FALSE /obj/item/weapon/dnainjector/attack(mob/target, mob/user) if(!user.IsAdvancedToolUser()) @@ -77,9 +78,9 @@ add_logs(user, target, "injected", src) - if(!inject(target, user)) //Now we actually do the heavy lifting. - to_chat(user, "It appears that [target] does not have compatible DNA.") - + if(!inject(target, user)) //Now we actually do the heavy lifting. + to_chat(user, "It appears that [target] does not have compatible DNA.") + used = 1 icon_state = "dnainjector0" desc += " This one is used up." @@ -307,11 +308,11 @@ /obj/item/weapon/dnainjector/timed/inject(mob/living/carbon/M, mob/user) prepare() + if(M.stat == DEAD) //prevents dead people from having their DNA changed + to_chat(user, "You can't modify [M]'s DNA while [M.p_theyre()] dead.") + return FALSE if(M.has_dna() && !(M.disabilities & NOCLONE)) - if(M.stat == DEAD) //prevents dead people from having their DNA changed - to_chat(user, "You can't modify [M]'s DNA while [M.p_theyre()] dead.") - return M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2)) var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]" var/endtime = world.time+duration @@ -352,9 +353,9 @@ M.updateappearance(mutations_overlay_update=1) M.dna.temporary_mutations[UI_CHANGED] = endtime log_attack(log_msg) + return TRUE else - to_chat(user, "It appears that [M] does not have compatible DNA.") - return + return FALSE /obj/item/weapon/dnainjector/timed/hulk name = "\improper DNA injector (Hulk)" diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index a5f5eb6133..81ccd127c8 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -48,27 +48,27 @@ /obj/item/weapon/grenade/attack_self(mob/user) if(!active) if(clown_check(user)) - preprime(user) + preprime(user) if(iscarbon(user)) var/mob/living/carbon/C = user C.throw_mode_on() -/obj/item/weapon/grenade/proc/preprime(mob/user) - if(user) - to_chat(user, "You prime the [name]! [det_time/10] seconds!") - playsound(loc, 'sound/weapons/armbomb.ogg', 60, 1) - active = TRUE - icon_state = initial(icon_state) + "_active" - add_fingerprint(user) - var/turf/bombturf = get_turf(src) - var/area/A = get_area(bombturf) - if(user) - var/message = "[ADMIN_LOOKUPFLW(user)]) has primed a [name] for detonation at [ADMIN_COORDJMP(bombturf)]" - GLOB.bombers += message - message_admins(message) - log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] [COORD(bombturf)].") - - addtimer(CALLBACK(src, .proc/prime), det_time) +/obj/item/weapon/grenade/proc/preprime(mob/user) + if(user) + to_chat(user, "You prime the [name]! [det_time/10] seconds!") + playsound(loc, 'sound/weapons/armbomb.ogg', 60, 1) + active = TRUE + icon_state = initial(icon_state) + "_active" + add_fingerprint(user) + var/turf/bombturf = get_turf(src) + var/area/A = get_area(bombturf) + if(user) + var/message = "[ADMIN_LOOKUPFLW(user)]) has primed a [name] for detonation at [ADMIN_COORDJMP(bombturf)]" + GLOB.bombers += message + message_admins(message) + log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] [COORD(bombturf)].") + + addtimer(CALLBACK(src, .proc/prime), det_time) /obj/item/weapon/grenade/proc/prime() @@ -108,4 +108,4 @@ if(damage && attack_type == PROJECTILE_ATTACK && prob(15)) owner.visible_message("[attack_text] hits [owner]'s [src], setting it off! What a shot!") prime() - return 1 //It hit the grenade, not them + return 1 //It hit the grenade, not them diff --git a/code/game/objects/items/weapons/implants/implant_krav_maga.dm b/code/game/objects/items/weapons/implants/implant_krav_maga.dm index 1db7601255..60823f3279 100644 --- a/code/game/objects/items/weapons/implants/implant_krav_maga.dm +++ b/code/game/objects/items/weapons/implants/implant_krav_maga.dm @@ -19,7 +19,9 @@ var/mob/living/carbon/human/H = imp_in if(!ishuman(H)) return - if(istype(H.martial_art, /datum/martial_art/krav_maga)) + if(!H.mind) + return + if(istype(H.mind.martial_art, /datum/martial_art/krav_maga)) style.remove(H) else style.teach(H,1) diff --git a/code/game/objects/items/weapons/powerfist.dm b/code/game/objects/items/weapons/powerfist.dm index 1f5a229864..7b26c58a5d 100644 --- a/code/game/objects/items/weapons/powerfist.dm +++ b/code/game/objects/items/weapons/powerfist.dm @@ -80,7 +80,7 @@ target.apply_damage(force * fisto_setting, BRUTE) target.visible_message("[user]'s powerfist lets out a loud hiss as they punch [target.name]!", \ "You cry out in pain as [user]'s punch flings you backwards!") - new /obj/effect/overlay/temp/kinetic_blast(target.loc) + new /obj/effect/temp_visual/kinetic_blast(target.loc) playsound(loc, 'sound/weapons/resonator_blast.ogg', 50, 1) playsound(loc, 'sound/weapons/genhit2.ogg', 50, 1) diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 5b1c641383..f2e9ca9fc6 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -247,10 +247,10 @@ ) /obj/item/weapon/storage/belt/military - name = "military belt" - desc = "A syndicate belt designed to be used by boarding parties. Its style is modeled after the hardsuits they wear." - icon_state = "militarybelt" - item_state = "military" + name = "chest rig" + desc = "A set of tactical webbing worn by Syndicate boarding parties." + icon_state = "explorer1" + item_state = "explorer1" max_w_class = WEIGHT_CLASS_SMALL /obj/item/weapon/storage/belt/military/abductor diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm old mode 100755 new mode 100644 index 4ffa4a9b89..97548b97d6 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -140,8 +140,8 @@ item_state = "plasmaman_tank_belt" slot_flags = SLOT_BELT force = 5 - volume = 3 - w_class = WEIGHT_CLASS_SMALL //thanks i forgot this + volume = 3 + w_class = WEIGHT_CLASS_SMALL //thanks i forgot this /obj/item/weapon/tank/internals/plasmaman/belt/full/New() ..() diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 98a52994e9..9d24b44f33 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -106,7 +106,7 @@ new /obj/item/device/flashlight/seclite(src) new /obj/item/clothing/gloves/krav_maga/sec(src) new /obj/item/weapon/door_remote/head_of_security(src) - new /obj/item/weapon/gun/ballistic/shotgun/automatic/dual_tube(src) + new /obj/item/weapon/gun/ballistic/shotgun/automatic/combat/compact(src) /obj/structure/closet/secure_closet/security name = "security officer's locker" diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 389ae40e88..43e0de52a1 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -331,8 +331,8 @@ /obj/structure/falsewall/brass/New(loc) ..() var/turf/T = get_turf(src) - new /obj/effect/overlay/temp/ratvar/wall/false(T) - new /obj/effect/overlay/temp/ratvar/beam/falsewall(T) + new /obj/effect/temp_visual/ratvar/wall/false(T) + new /obj/effect/temp_visual/ratvar/beam/falsewall(T) change_construction_value(4) /obj/structure/falsewall/brass/Destroy() diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index 05414f0a4d..91fbf13e3c 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -152,6 +152,8 @@ var/transfer_choice = alert("Transfer your soul to [src]? (Warning, your old body will die!)",,"Yes","No") if(transfer_choice != "Yes") return + if(QDELETED(src) || uses <= 0) + return log_game("[user.ckey] golem-swapped into [src]") user.visible_message("A faint light leaves [user], moving to [src] and animating it!","You leave your old body behind, and transfer into [src]!") create(ckey = user.ckey, flavour = FALSE, name = user.real_name) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 2dc159d482..64d93e914e 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -254,10 +254,10 @@ /obj/structure/grille/ratvar/New() ..() if(broken) - new /obj/effect/overlay/temp/ratvar/grille/broken(get_turf(src)) + new /obj/effect/temp_visual/ratvar/grille/broken(get_turf(src)) else - new /obj/effect/overlay/temp/ratvar/grille(get_turf(src)) - new /obj/effect/overlay/temp/ratvar/beam/grille(get_turf(src)) + new /obj/effect/temp_visual/ratvar/grille(get_turf(src)) + new /obj/effect/temp_visual/ratvar/beam/grille(get_turf(src)) /obj/structure/grille/ratvar/narsie_act() take_damage(rand(1, 3), BRUTE) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index ba9e5f8a33..2f6b03bef1 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -102,8 +102,8 @@ /obj/structure/lattice/catwalk/clockwork/Initialize(mapload) ..() - new /obj/effect/overlay/temp/ratvar/floor/catwalk(loc) - new /obj/effect/overlay/temp/ratvar/beam/catwalk(loc) + new /obj/effect/temp_visual/ratvar/floor/catwalk(loc) + new /obj/effect/temp_visual/ratvar/beam/catwalk(loc) /obj/structure/lattice/catwalk/clockwork/ratvar_act() return diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index f594c4b513..0c11418003 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -545,7 +545,7 @@ qdel(I) var/amount_of_gears = 2 if(fulltile) - new /obj/effect/overlay/temp/ratvar/window(get_turf(src)) + new /obj/effect/temp_visual/ratvar/window(get_turf(src)) amount_of_gears = 4 for(var/i in 1 to amount_of_gears) debris += new/obj/item/clockwork/alloy_shards/medium/gear_bit() @@ -553,7 +553,7 @@ /obj/structure/window/reinforced/clockwork/setDir(direct) if(!made_glow) - var/obj/effect/E = new /obj/effect/overlay/temp/ratvar/window/single(get_turf(src)) + var/obj/effect/E = new /obj/effect/temp_visual/ratvar/window/single(get_turf(src)) E.setDir(direct) made_glow = TRUE ..() diff --git a/code/game/turfs/simulated/chasm.dm b/code/game/turfs/simulated/chasm.dm index 8b24a4c816..4f22487537 100644 --- a/code/game/turfs/simulated/chasm.dm +++ b/code/game/turfs/simulated/chasm.dm @@ -111,6 +111,9 @@ initial_gas_mix = "o2=14;n2=23;TEMP=300" planetary_atmos = TRUE baseturf = /turf/open/chasm/straight_down/lava_land_surface + light_range = 1.9 //slightly less range than lava + light_power = 0.65 //less bright, too + light_color = LIGHT_COLOR_LAVA //let's just say you're falling into lava, that makes sense right /turf/open/chasm/straight_down/lava_land_surface/drop(atom/movable/AM) //Make sure the item is still there after our sleep diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index 9144cbc871..810a77fc42 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -133,8 +133,8 @@ /turf/open/floor/clockwork/Initialize() ..() - new /obj/effect/overlay/temp/ratvar/floor(src) - new /obj/effect/overlay/temp/ratvar/beam(src) + new /obj/effect/temp_visual/ratvar/floor(src) + new /obj/effect/temp_visual/ratvar/beam(src) realappearence = new /obj/effect/clockwork/overlay/floor(src) realappearence.linked = src change_construction_value(1) diff --git a/code/game/turfs/simulated/floor/reinf_floor.dm b/code/game/turfs/simulated/floor/reinf_floor.dm index 9c40b8276f..544d637571 100644 --- a/code/game/turfs/simulated/floor/reinf_floor.dm +++ b/code/game/turfs/simulated/floor/reinf_floor.dm @@ -108,7 +108,7 @@ /turf/open/floor/engine/cult/Initialize() ..() - new /obj/effect/overlay/temp/cult/turf/floor(src) + new /obj/effect/temp_visual/cult/turf/floor(src) realappearence = new /obj/effect/clockwork/overlay/floor/bloodcult(src) realappearence.linked = src diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index 54f3ad5ad5..708427a11a 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -73,6 +73,8 @@ for(i in 1 to mineralAmt) new mineralType(src) SSblackbox.add_details("ore_mined",mineralType) + for(var/obj/effect/temp_visual/mining_overlay/M in src) + qdel(M) ChangeTurf(turf_type, defer_change) addtimer(CALLBACK(src, .proc/AfterChange), 1, TIMER_UNIQUE) playsound(src, 'sound/effects/break_stone.ogg', 50, 1) //beautiful destruction diff --git a/code/game/turfs/simulated/wall/misc_walls.dm b/code/game/turfs/simulated/wall/misc_walls.dm index 9fa69fc6a7..21015e82d0 100644 --- a/code/game/turfs/simulated/wall/misc_walls.dm +++ b/code/game/turfs/simulated/wall/misc_walls.dm @@ -10,7 +10,7 @@ girder_type = /obj/structure/girder/cult /turf/closed/wall/mineral/cult/Initialize() - new /obj/effect/overlay/temp/cult/turf(src) + new /obj/effect/temp_visual/cult/turf(src) . = ..() /turf/closed/wall/mineral/cult/devastate_wall() @@ -39,11 +39,11 @@ desc = "A cold stone wall engraved with indecipherable symbols. Studying them causes your head to pound." /turf/closed/wall/mineral/cult/artificer/break_wall() - new /obj/effect/overlay/temp/cult/turf(get_turf(src)) + new /obj/effect/temp_visual/cult/turf(get_turf(src)) return null //excuse me we want no runed metal here /turf/closed/wall/mineral/cult/artificer/devastate_wall() - new /obj/effect/overlay/temp/cult/turf(get_turf(src)) + new /obj/effect/temp_visual/cult/turf(get_turf(src)) //Clockwork wall: Causes nearby tinkerer's caches to generate components. /turf/closed/wall/clockwork @@ -60,8 +60,8 @@ /turf/closed/wall/clockwork/Initialize() ..() - new /obj/effect/overlay/temp/ratvar/wall(src) - new /obj/effect/overlay/temp/ratvar/beam(src) + new /obj/effect/temp_visual/ratvar/wall(src) + new /obj/effect/temp_visual/ratvar/beam(src) realappearence = new /obj/effect/clockwork/overlay/wall(src) realappearence.linked = src change_construction_value(5) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index ac8162bc08..f8329b1f69 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -419,13 +419,18 @@ set desc="Restarts the world immediately" if (!usr.client.holder) return - var/confirm = alert("Restart the game world?", "Restart", "Yes", "Cancel") - if(confirm == "Cancel") - return - if(confirm == "Yes") - SSticker.delay_end = 0 + + var/list/options = list("Regular Restart", "Hard Restart (No Delay/Feeback Reason)", "Hardest Restart (No actions, just reboot)") + var result = input(usr, "Select reboot method", "World Reboot", options[1]) as null|anything in options + if(result) 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) + switch(result) + if("Regular Restart") + SSticker.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "end_error", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", 10) + if("Hard Restart (No Delay, No Feeback Reason)") + world.Reboot() + if("Hardest Restart (No actions, just reboot)") + world.Reboot(fast_track = TRUE) /datum/admins/proc/end_round() set category = "Server" diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm index b886232e00..d288c63483 100644 --- a/code/modules/admin/fun_balloon.dm +++ b/code/modules/admin/fun_balloon.dm @@ -60,7 +60,7 @@ message_admins("[key_name_admin(ghost)] has taken control of ([key_name_admin(body)])") body.ghostize(0) body.key = ghost.key - new /obj/effect/overlay/temp/gravpush(get_turf(body)) + new /obj/effect/temp_visual/gravpush(get_turf(body)) /obj/effect/fun_balloon/sentience/emergency_shuttle name = "shuttle sentience fun balloon" @@ -79,7 +79,7 @@ /obj/effect/fun_balloon/scatter/effect() for(var/mob/living/M in range(effect_range, get_turf(src))) var/turf/T = find_safe_turf() - new /obj/effect/overlay/temp/gravpush(get_turf(M)) + new /obj/effect/temp_visual/gravpush(get_turf(M)) M.forceMove(T) to_chat(M, "Pop!") diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 06f6e5e993..dcdf1538fe 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -442,7 +442,7 @@ dat += "" for(var/datum/gang/G in SSticker.mode.gangs) - dat += "
" + dat += "
[G.name] Gang: [G.points] Influence | [round((G.territory.len/GLOB.start_state.num_territories)*100, 1)]% Control
" for(var/datum/mind/N in G.bosses) var/mob/M = N.current if(!M) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index c1780e4a34..4756318ee7 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -282,6 +282,11 @@ message_admins("[key_name_admin(usr)] edited the Emergency Shuttle's timeleft to [timer] seconds.") href_list["secrets"] = "check_antagonist" + else if(href_list["trigger_centcom_recall"]) + if(!check_rights(R_ADMIN)) + return + + usr.client.trigger_centcom_recall() else if(href_list["toggle_continuous"]) if(!check_rights(R_ADMIN)) return @@ -1170,7 +1175,7 @@ if(!check_rights(R_ADMIN)) return - if(SSticker.HasRoundStarted()) + if(SSticker.HasRoundStarted()) return alert(usr, "The game has already started.", null, null, null, null) var/dat = {"What mode do you wish to play?
"} for(var/mode in config.modes) @@ -1184,7 +1189,7 @@ if(!check_rights(R_ADMIN)) return - if(SSticker.HasRoundStarted()) + if(SSticker.HasRoundStarted()) return alert(usr, "The game has already started.", null, null, null, null) if(GLOB.master_mode != "secret") return alert(usr, "The game mode has to be secret!", null, null, null, null) @@ -1199,21 +1204,21 @@ if(!check_rights(R_ADMIN|R_SERVER)) return - if (SSticker.HasRoundStarted()) + if (SSticker.HasRoundStarted()) return alert(usr, "The game has already started.", null, null, null, null) GLOB.master_mode = href_list["c_mode2"] log_admin("[key_name(usr)] set the mode as [GLOB.master_mode].") message_admins("[key_name_admin(usr)] set the mode as [GLOB.master_mode].") to_chat(world, "The mode is now: [GLOB.master_mode]") Game() // updates the main game menu - world.save_mode(GLOB.master_mode) + SSticker.save_mode(GLOB.master_mode) .(href, list("c_mode"=1)) else if(href_list["f_secret2"]) if(!check_rights(R_ADMIN|R_SERVER)) return - if(SSticker.HasRoundStarted()) + if(SSticker.HasRoundStarted()) return alert(usr, "The game has already started.", null, null, null, null) if(GLOB.master_mode != "secret") return alert(usr, "The game mode has to be secret!", null, null, null, null) @@ -1511,17 +1516,6 @@ usr.client.cmd_admin_animalize(M) - else if(href_list["gangpoints"]) - var/datum/gang/G = locate(href_list["gangpoints"]) in SSticker.mode.gangs - if(G) - var/newpoints = input("Set [G.name ] Gang's influence.","Set Influence",G.points) as null|num - if(!newpoints) - return - message_admins("[key_name_admin(usr)] changed the [G.name] Gang's influence from [G.points] to [newpoints].") - log_admin("[key_name(usr)] changed the [G.name] Gang's influence from [G.points] to [newpoints].") - G.points = newpoints - G.message_gangtools("Your gang now has [G.points] influence.") - else if(href_list["adminplayeropts"]) var/mob/M = locate(href_list["adminplayeropts"]) show_player_panel(M) @@ -1799,18 +1793,18 @@ if(!check_rights(R_ADMIN)) return - var/mob/M = locate(href_list["languagemenu"]) in GLOB.mob_list - if(!ismob(M)) - to_chat(usr, "This can only be used on instances of type /mob.") + var/mob/M = locate(href_list["languagemenu"]) in GLOB.mob_list + if(!ismob(M)) + to_chat(usr, "This can only be used on instances of type /mob.") return - var/datum/language_holder/H = M.get_language_holder() - H.open_language_menu(usr) + var/datum/language_holder/H = M.get_language_holder() + H.open_language_menu(usr) else if(href_list["traitor"]) if(!check_rights(R_ADMIN)) return - if(!SSticker.HasRoundStarted()) + if(!SSticker.HasRoundStarted()) alert("The game hasn't started yet!") return @@ -2161,7 +2155,7 @@ else if(href_list["kick_all_from_lobby"]) if(!check_rights(R_ADMIN)) return - if(SSticker.IsRoundInProgress()) + 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") @@ -2242,20 +2236,20 @@ if(href_list["viewruntime_backto"]) error_viewer.show_to(owner, locate(href_list["viewruntime_backto"]), href_list["viewruntime_linear"]) else - error_viewer.show_to(owner, null, href_list["viewruntime_linear"]) - else if(href_list["showrelatedacc"]) - var/client/C = locate(href_list["client"]) in GLOB.clients - var/list/thing_to_check - if(href_list["showrelatedacc"] == "cid") - thing_to_check = C.related_accounts_cid - else - thing_to_check = C.related_accounts_ip - thing_to_check = splittext(thing_to_check, ", ") - - - var/dat = "Related accounts by [uppertext(href_list["showrelatedacc"])]:
" - for(var/thing in thing_to_check) - dat += "[thing]
" - - usr << browse(dat, "size=420x300") - + error_viewer.show_to(owner, null, href_list["viewruntime_linear"]) + else if(href_list["showrelatedacc"]) + var/client/C = locate(href_list["client"]) in GLOB.clients + var/list/thing_to_check + if(href_list["showrelatedacc"] == "cid") + thing_to_check = C.related_accounts_cid + else + thing_to_check = C.related_accounts_ip + thing_to_check = splittext(thing_to_check, ", ") + + + var/dat = "Related accounts by [uppertext(href_list["showrelatedacc"])]:
" + for(var/thing in thing_to_check) + dat += "[thing]
" + + usr << browse(dat, "size=420x300") + diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 2397f6c4a5..f359085941 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -52,10 +52,7 @@ if(!check_rights(R_SOUNDS)) return - if(SSticker) - SSticker.round_end_sound = fcopy_rsc(S) - else - return + SSticker.SetRoundEndSound(S) 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]") diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index b82d1f65e2..09dfcf4d69 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -1194,3 +1194,16 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits message_admins(msg) admin_ticket_log(target, msg) log_admin("[key_name(usr)] punished [key_name(target)] with [punishment].") + + +/client/proc/trigger_centcom_recall() + if(!holder) + return + var/message = pick(GLOB.admiral_messages) + message = input("Enter message from the on-call admiral to be put in the recall report.", "Admiral Message", message) as text|null + + if(!message) + return + + message_admins("[key_name_admin(usr)] triggered a Centcom recall, with the admiral message of: [message]") + log_game("[key_name(usr)] triggered a Centcom recall, with the message of: [message]") \ No newline at end of file diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index 6928139829..6f68a962dd 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -172,11 +172,11 @@ /obj/item/device/assembly/flash/cyborg/attack(mob/living/M, mob/user) ..() - new /obj/effect/overlay/temp/borgflash(get_turf(src)) + new /obj/effect/temp_visual/borgflash(get_turf(src)) /obj/item/device/assembly/flash/cyborg/attack_self(mob/user) ..() - new /obj/effect/overlay/temp/borgflash(get_turf(src)) + new /obj/effect/temp_visual/borgflash(get_turf(src)) /obj/item/device/assembly/flash/cyborg/attackby(obj/item/weapon/W, mob/user, params) return diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index bd9f3e35df..a403210242 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -19,7 +19,7 @@ /obj/machinery/meter/Initialize(mapload) . = ..() SSair.atmos_machinery += src - if (mapload && !target) + if (!target) target = locate(/obj/machinery/atmospherics/pipe) in loc /obj/machinery/meter/Destroy() diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 93b9b6b3f9..b06c9a5579 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -433,7 +433,7 @@ /obj/item/projectile/beam/ctf/red icon_state = "laser" - impact_effect_type = /obj/effect/overlay/temp/impact_effect/red_laser + impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser // BLUE TEAM GUNS @@ -448,7 +448,7 @@ /obj/item/projectile/beam/ctf/blue icon_state = "bluelaser" - impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser + impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser /datum/outfit/ctf name = "CTF" diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 0d5e93fba7..d236558ddf 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -672,3 +672,7 @@ GLOBAL_LIST(external_rsc_urls) CRASH("change_view called without argument.") view = new_size + +/client/proc/AnnouncePR(announcement) + if(prefs && prefs.chat_toggles & CHAT_PULLR) + to_chat(src, announcement) \ No newline at end of file diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index f287870ef6..8a943b4c26 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -271,6 +271,8 @@ BLIND // can't see anything /obj/item/clothing/head name = "head" icon = 'icons/obj/clothing/hats.dmi' + icon_state = "top_hat" + item_state = "that" body_parts_covered = HEAD slot_flags = SLOT_HEAD var/blockTracking = 0 //For AI tracking diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm index 6a9ac41a0d..2f70c3bfdf 100644 --- a/code/modules/clothing/glasses/engine_goggles.dm +++ b/code/modules/clothing/glasses/engine_goggles.dm @@ -7,25 +7,34 @@ actions_types = list(/datum/action/item_action/toggle_mode) origin_tech = "materials=3;magnets=3;engineering=3;plasmatech=3" - var/mode = 0 //0 - regular mesons mode 1 - t-ray mode + mode = FALSE //FALSE - regular mesons mode TRUE - t-ray mode var/range = 1 -/obj/item/clothing/glasses/meson/engine/attack_self(mob/user) +/obj/item/clothing/glasses/meson/engine/toggle_mode(mob/user, voluntary) + var/turf/T = get_turf(src) + if(T && T.z == ZLEVEL_MINING && mode) + if(picked_excuse) + to_chat(user, "Due to [picked_excuse], the [name] cannot currently be swapped to \[Meson] mode.") + return mode = !mode if(mode) - START_PROCESSING(SSobj, src) vision_flags = 0 darkness_view = 2 invis_view = SEE_INVISIBLE_LIVING lighting_alpha = null - to_chat(user, "You toggle the goggles' scanning mode to \[T-Ray].") + if(voluntary) + to_chat(user, "You toggle the goggles' scanning mode to \[T-Ray].") + else + to_chat(user, "The goggles abruptly toggle to \[T-Ray] mode!") else - STOP_PROCESSING(SSobj, src) vision_flags = SEE_TURFS darkness_view = 1 lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE - to_chat(loc, "You toggle the goggles' scanning mode to \[Meson].") + if(voluntary) + to_chat(user, "You toggle the goggles' scanning mode to \[Meson].") + else + to_chat(user, "The goggles abruptly toggle to \[Meson] mode!") if(ishuman(user)) var/mob/living/carbon/human/H = user @@ -37,8 +46,14 @@ var/datum/action/A = X A.UpdateButtonIcon() +/obj/item/clothing/glasses/meson/engine/attack_self(mob/user) + toggle_mode(user, TRUE) + /obj/item/clothing/glasses/meson/engine/process() if(!mode) + var/turf/T = get_turf(src) + if(T && T.z == ZLEVEL_MINING) + toggle_mode(loc) return if(!ishuman(loc)) @@ -47,7 +62,6 @@ var/mob/living/carbon/human/user = loc if(user.glasses != src) return - scan() /obj/item/clothing/glasses/meson/engine/proc/scan() @@ -89,13 +103,17 @@ icon_state = "trayson-tray_off" origin_tech = "materials=3;magnets=2;engineering=2" - mode = 1 - var/on = 0 + mode = TRUE + var/on = FALSE vision_flags = 0 darkness_view = 2 invis_view = SEE_INVISIBLE_LIVING range = 2 +/obj/item/clothing/glasses/meson/engine/tray/Initialize() + . = ..() + picked_excuse = null + /obj/item/clothing/glasses/meson/engine/tray/process() if(!on) return @@ -108,15 +126,10 @@ if(user.glasses == src) user.update_inv_glasses() -/obj/item/clothing/glasses/meson/engine/tray/attack_self(mob/user) +/obj/item/clothing/glasses/meson/engine/tray/toggle_mode(mob/user, voluntary) on = !on - if(on) - START_PROCESSING(SSobj, src) - to_chat(user, "You turn the goggles on.") - else - STOP_PROCESSING(SSobj, src) - to_chat(user, "You turn the goggles off.") + to_chat(user, "[voluntary ? "You turn the goggles":"The goggles turn"] [on ? "on":"off"][voluntary ? ".":"!"]") update_icon() for(var/X in actions) diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 2f6089bc56..1cc0cc6163 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -31,14 +31,60 @@ /obj/item/clothing/glasses/meson name = "Optical Meson Scanner" - desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition." + desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting conditions." icon_state = "meson" item_state = "meson" origin_tech = "magnets=1;engineering=2" darkness_view = 2 vision_flags = SEE_TURFS - lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE glass_colour_type = /datum/client_colour/glass_colour/lightgreen + var/static/list/meson_mining_failure_excuses = list("seismic activity", "excessive lava", "ambient radiation", "electromagnetic storms", "bluespace disruption", \ + "gravity", "dust", "dense rock", "ash", "badly understood science", "radiant heat") + var/picked_excuse + var/mode = FALSE //if FALSE, is in normal meson mode. + +/obj/item/clothing/glasses/meson/Initialize() + . = ..() + picked_excuse = pick(meson_mining_failure_excuses) + START_PROCESSING(SSobj, src) + +/obj/item/clothing/glasses/meson/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/clothing/glasses/meson/examine(mob/user) + ..() + var/turf/T = get_turf(src) + if(T && T.z == ZLEVEL_MINING && mode && picked_excuse) + to_chat(user, "Due to [picked_excuse], these Meson Scanners will not be able to display terrain layouts in this area.") + +/obj/item/clothing/glasses/meson/proc/toggle_mode(mob/user) + if(vision_flags & SEE_TURFS) + mode = TRUE + vision_flags &= ~SEE_TURFS + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(picked_excuse) + to_chat(H, "Due to [picked_excuse], your Meson Scanners will not be able to display terrain layouts in this area.") + if(H.glasses == src) + H.update_sight() + else if(!(vision_flags & SEE_TURFS)) + mode = FALSE + vision_flags |= SEE_TURFS + if(ishuman(user)) + var/mob/living/carbon/human/H = user + to_chat(H, "Your Meson Scanners have reactivated.") + if(H.glasses == src) + H.update_sight() + +/obj/item/clothing/glasses/meson/process() + var/turf/T = get_turf(src) + if(T && T.z == ZLEVEL_MINING) + if(!mode) + toggle_mode(loc) + else if(mode) + toggle_mode(loc) /obj/item/clothing/glasses/meson/night name = "Night Vision Optical Meson Scanner" @@ -47,7 +93,7 @@ item_state = "nvgmeson" origin_tech = "magnets=4;engineering=5;plasmatech=4" darkness_view = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE glass_colour_type = /datum/client_colour/glass_colour/green /obj/item/clothing/glasses/meson/gar diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index a8ed4d2100..1cadd5cc0d 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -14,14 +14,14 @@ /obj/item/clothing/suit/armor/vest name = "armor vest" - desc = "A slim armored vest that protects against most types of damage." + desc = "A slim Type I armored vest that provides decent protection against most types of damage." icon_state = "armoralt" item_state = "armoralt" blood_overlay_type = "armor" dog_fashion = /datum/dog_fashion/back /obj/item/clothing/suit/armor/vest/alt - desc = "An armored vest that protects against most types of damage." + desc = "A Type I armored vest that provides decent protection against most types of damage." icon_state = "armor" item_state = "armor" @@ -31,7 +31,7 @@ /obj/item/clothing/suit/armor/hos name = "armored greatcoat" - desc = "A greatcoat enchanced with a special alloy for some protection and style for those with a commanding presence." + desc = "A greatcoat enhanced with a special alloy for some extra protection and style for those with a commanding presence." icon_state = "hos" item_state = "greatcoat" body_parts_covered = CHEST|GROIN|ARMS|LEGS @@ -77,7 +77,7 @@ /obj/item/clothing/suit/armor/vest/capcarapace name = "captain's carapace" - desc = "An armored vest reinforced with ceramic plates and pauldrons to provide additional protection whilst still offering maximum mobility and flexibility. Issued only to the station's finest, although it does chafe your nipples." + desc = "An fireproof armored chestpiece reinforced with ceramic plates and plasteel pauldrons to provide additional protection whilst still offering maximum mobility and flexibility. Issued only to the station's finest, although it does chafe your nipples." icon_state = "capcarapace" item_state = "armor" body_parts_covered = CHEST|GROIN @@ -93,7 +93,7 @@ /obj/item/clothing/suit/armor/riot name = "riot suit" - desc = "A suit of armor with heavy padding to protect against melee attacks." + desc = "A suit of semi-flexible polycarbonate body armor with heavy padding to protect against melee attacks." icon_state = "riot" item_state = "swat_suit" body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS @@ -115,7 +115,7 @@ /obj/item/clothing/suit/armor/bulletproof name = "bulletproof armor" - desc = "A bulletproof vest that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent." + desc = "A Type III heavy bulletproof vest that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent." icon_state = "bulletproof" item_state = "armor" blood_overlay_type = "armor" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 6aedfc13e6..8a06ebd0da 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -211,6 +211,14 @@ item_state = "black_suit_fem" item_color = "black_suit_fem" +/obj/item/clothing/under/suit_jacket/green + name = "green suit" + desc = "A green suit and yellow necktie. Baller." + icon_state = "green_suit" + item_state = "dg_suit" + item_color = "green_suit" + can_adjust = 0 + /obj/item/clothing/under/suit_jacket/red name = "red suit" desc = "A red suit and blue tie. Somewhat formal." diff --git a/code/modules/fields/fields.dm b/code/modules/fields/fields.dm index 4e18e45e9a..0e15d24e03 100644 --- a/code/modules/fields/fields.dm +++ b/code/modules/fields/fields.dm @@ -28,7 +28,6 @@ var/square_depth_up = 0 var/square_depth_down = 0 //Processing - var/requires_processing = FALSE var/process_inner_turfs = FALSE //Don't do this unless it's absolutely necessary var/process_edge_turfs = FALSE //Don't do this either unless it's absolutely necessary, you can just track what things are inside manually or on the initial setup. var/setup_edge_turfs = FALSE //Setup edge turfs/all field turfs. Set either or both to ON when you need it, it's defaulting to off unless you do to save CPU. @@ -40,11 +39,7 @@ var/list/turf/field_turfs_new = list() var/list/turf/edge_turfs_new = list() -/datum/proximity_monitor/advanced/New() - SSfields.register_new_field(src) - /datum/proximity_monitor/advanced/Destroy() - SSfields.unregister_field(src) full_cleanup() return ..() diff --git a/code/modules/fields/peaceborg_dampener.dm b/code/modules/fields/peaceborg_dampener.dm index 9cfc34f127..5d2d2829a9 100644 --- a/code/modules/fields/peaceborg_dampener.dm +++ b/code/modules/fields/peaceborg_dampener.dm @@ -3,7 +3,6 @@ //Only use square radius for this! /datum/proximity_monitor/advanced/peaceborg_dampener name = "\improper Hyperkinetic Dampener Field" - requires_processing = TRUE setup_edge_turfs = TRUE setup_field_turfs = TRUE field_shape = FIELD_SHAPE_RADIUS_SQUARE @@ -22,10 +21,15 @@ use_host_turf = TRUE /datum/proximity_monitor/advanced/peaceborg_dampener/New() + START_PROCESSING(SSfields, src) tracked = list() staging = list() ..() +/datum/proximity_monitor/advanced/peaceborg_dampener/Destroy() + STOP_PROCESSING(SSfields, src) + return ..() + /datum/proximity_monitor/advanced/peaceborg_dampener/process() if(!istype(projector)) qdel(src) diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm index 84bf984ca9..918f179591 100644 --- a/code/modules/language/language_holder.dm +++ b/code/modules/language/language_holder.dm @@ -125,7 +125,7 @@ /datum/language_holder/synthetic languages = list(/datum/language/common) - shadow_languages = list(/datum/language/machine, /datum/language/draconic) + shadow_languages = list(/datum/language/common, /datum/language/machine, /datum/language/draconic) /datum/language_holder/universal/New() ..() diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index dc443cf265..68665e2d81 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -270,7 +270,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums if(5) dat += "

Upload a New Title

" if(!scanner) - findscanner(9) + scanner = findscanner(9) if(!scanner) dat += "No scanner found within wireless network range.
" else if(!scanner.cache) @@ -314,7 +314,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums popup.open() /obj/machinery/computer/libraryconsole/bookmanagement/proc/findscanner(viewrange) - for(var/obj/machinery/libraryscanner/S in range(viewrange)) + for(var/obj/machinery/libraryscanner/S in range(viewrange, get_turf(src))) return S return null diff --git a/code/modules/mining/equipment.dm b/code/modules/mining/equipment.dm index dd8766bdc9..a9315b7bea 100644 --- a/code/modules/mining/equipment.dm +++ b/code/modules/mining/equipment.dm @@ -169,7 +169,7 @@ icon = 'icons/obj/mining.dmi' icon_state = "resonator" item_state = "resonator" - desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It can also be activated without a target to create a field at the user's location, to act as a delayed time trap. It's more effective in a vacuum." + desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It's more effective in a vacuum." w_class = WEIGHT_CLASS_NORMAL force = 15 throwforce = 10 @@ -188,18 +188,6 @@ fieldlimit = 6 quick_burst_mod = 1 -/obj/item/weapon/resonator/proc/CreateResonance(target, creator) - var/turf/T = get_turf(target) - var/obj/effect/resonance/R = locate(/obj/effect/resonance) in T - if(R) - R.resonance_damage *= quick_burst_mod - R.burst() - return - if(fields.len < fieldlimit) - playsound(src,'sound/weapons/resonator_fire.ogg',50,1) - var/obj/effect/resonance/RE = new(T, creator, burst_time, src) - fields += RE - /obj/item/weapon/resonator/attack_self(mob/user) if(burst_time == 50) burst_time = 30 @@ -208,57 +196,76 @@ burst_time = 50 to_chat(user, "You set the resonator's fields to detonate after 5 seconds.") -/obj/item/weapon/resonator/afterattack(atom/target, mob/user, proximity_flag) - if(proximity_flag) - if(!check_allowed_items(target, 1)) - return +/obj/item/weapon/resonator/proc/CreateResonance(target, mob/user) + var/turf/T = get_turf(target) + var/obj/effect/temp_visual/resonance/R = locate(/obj/effect/temp_visual/resonance) in T + if(R) + R.damage_multiplier = quick_burst_mod + R.burst() + return + if(LAZYLEN(fields) < fieldlimit) + new /obj/effect/temp_visual/resonance(T, user, src, burst_time) user.changeNext_move(CLICK_CD_MELEE) - CreateResonance(target, user) -/obj/effect/resonance +/obj/item/weapon/resonator/pre_attackby(atom/target, mob/user, params) + if(check_allowed_items(target, 1)) + CreateResonance(target, user) + return TRUE + +/obj/effect/temp_visual/resonance name = "resonance field" desc = "A resonating field that significantly damages anything inside of it when the field eventually ruptures. More damaging in low pressure environments." - icon = 'icons/effects/effects.dmi' icon_state = "shield1" layer = ABOVE_ALL_MOB_LAYER - anchored = TRUE - mouse_opacity = 0 + duration = 50 var/resonance_damage = 20 + var/damage_multiplier = 1 var/creator var/obj/item/weapon/resonator/res -/obj/effect/resonance/New(loc, set_creator, timetoburst, set_resonator) - ..() +/obj/effect/temp_visual/resonance/Initialize(mapload, set_creator, set_resonator, set_duration) + duration = set_duration + . = ..() creator = set_creator res = set_resonator - check_pressure() - addtimer(CALLBACK(src, .proc/burst), timetoburst) + if(res) + res.fields += src + playsound(src,'sound/weapons/resonator_fire.ogg',50,1) + transform = matrix()*0.75 + animate(src, transform = matrix()*1.5, time = duration) + deltimer(timerid) + timerid = addtimer(CALLBACK(src, .proc/burst), duration, TIMER_STOPPABLE) -/obj/effect/resonance/Destroy() +/obj/effect/temp_visual/resonance/Destroy() if(res) res.fields -= src + res = null + creator = null . = ..() -/obj/effect/resonance/proc/check_pressure() - var/turf/proj_turf = get_turf(src) +/obj/effect/temp_visual/resonance/proc/check_pressure(turf/proj_turf) + if(!proj_turf) + proj_turf = get_turf(src) if(!istype(proj_turf)) return var/datum/gas_mixture/environment = proj_turf.return_air() var/pressure = environment.return_pressure() + resonance_damage = initial(resonance_damage) if(pressure < 50) name = "strong [initial(name)]" - resonance_damage = 60 + resonance_damage *= 3 else name = initial(name) - resonance_damage = initial(resonance_damage) + resonance_damage *= damage_multiplier -/obj/effect/resonance/proc/burst() - check_pressure() +/obj/effect/temp_visual/resonance/proc/burst() var/turf/T = get_turf(src) - playsound(src,'sound/weapons/resonator_blast.ogg',50,1) + new /obj/effect/temp_visual/resonance_crush(T) if(ismineralturf(T)) var/turf/closed/mineral/M = T M.gets_drilled(creator) + check_pressure(T) + playsound(T,'sound/weapons/resonator_blast.ogg',50,1) for(var/mob/living/L in T) if(creator) add_logs(creator, L, "used a resonator field on", "resonator") @@ -266,6 +273,16 @@ L.apply_damage(resonance_damage, BRUTE) qdel(src) +/obj/effect/temp_visual/resonance_crush + icon_state = "shield1" + layer = ABOVE_ALL_MOB_LAYER + duration = 4 + +/obj/effect/temp_visual/resonance_crush/Initialize() + . = ..() + transform = matrix()*1.5 + animate(src, transform = matrix()*0.1, alpha = 50, time = 4) + /**********************Facehugger toy**********************/ /obj/item/clothing/mask/facehugger/toy @@ -345,28 +362,23 @@ /**********************Mining Scanners**********************/ /obj/item/device/mining_scanner - desc = "A scanner that checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results." + desc = "A scanner that checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations." name = "manual mining scanner" icon_state = "mining1" item_state = "analyzer" w_class = WEIGHT_CLASS_SMALL flags = CONDUCT slot_flags = SLOT_BELT - var/cooldown = 0 + var/cooldown = 35 + var/current_cooldown = 0 origin_tech = "engineering=1;magnets=1" /obj/item/device/mining_scanner/attack_self(mob/user) if(!user.client) return - if(!cooldown) - cooldown = TRUE - addtimer(CALLBACK(src, .proc/clear_cooldown), 40) - var/list/mobs = list() - mobs |= user - mineral_scan_pulse(mobs, get_turf(user)) - -/obj/item/device/mining_scanner/proc/clear_cooldown() - cooldown = FALSE + if(current_cooldown <= world.time) + current_cooldown = world.time + cooldown + mineral_scan_pulse(get_turf(user)) //Debug item to identify all ore spread quickly @@ -379,7 +391,7 @@ qdel(src) /obj/item/device/t_scanner/adv_mining_scanner - desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear meson scanners for optimal results. This one has an extended range." + desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. This one has an extended range." name = "advanced automatic mining scanner" icon_state = "mining0" item_state = "analyzer" @@ -387,77 +399,47 @@ flags = CONDUCT slot_flags = SLOT_BELT var/cooldown = 35 - var/on_cooldown = 0 + var/current_cooldown = 0 var/range = 7 - var/meson = TRUE origin_tech = "engineering=3;magnets=3" -/obj/item/device/t_scanner/adv_mining_scanner/material - meson = FALSE - desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results. This one has an extended range." - /obj/item/device/t_scanner/adv_mining_scanner/lesser name = "automatic mining scanner" - desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear meson scanners for optimal results." + desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations." range = 4 cooldown = 50 -/obj/item/device/t_scanner/adv_mining_scanner/lesser/material - desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results." - meson = FALSE - /obj/item/device/t_scanner/adv_mining_scanner/scan() - if(!on_cooldown) - on_cooldown = 1 - spawn(cooldown) - on_cooldown = 0 + if(current_cooldown <= world.time) + current_cooldown = world.time + cooldown var/turf/t = get_turf(src) - var/list/mobs = recursive_mob_check(t, 1,0,0) - if(!mobs.len) - return - if(meson) - mineral_scan_pulse(mobs, t, range) - else - mineral_scan_pulse_material(mobs, t, range) + mineral_scan_pulse(t, range) -//For use with mesons -/proc/mineral_scan_pulse(list/mobs, turf/T, range = world.view) +/proc/mineral_scan_pulse(turf/T, range = world.view) var/list/minerals = list() for(var/turf/closed/mineral/M in range(range, T)) if(M.scan_state) minerals += M - if(minerals.len) - for(var/mob/user in mobs) - if(user.client) - var/client/C = user.client - for(var/turf/closed/mineral/M in minerals) - var/turf/F = get_turf(M) - var/image/I = image('icons/turf/smoothrocks.dmi', loc = F, icon_state = M.scan_state, layer = FLASH_LAYER) - I.plane = FULLSCREEN_PLANE - C.images += I - spawn(30) - if(C) - C.images -= I - -//For use with material scanners -/proc/mineral_scan_pulse_material(list/mobs, turf/T, range = world.view) - var/list/minerals = list() - for(var/turf/closed/mineral/M in range(range, T)) - if(M.scan_state) - minerals += M - if(minerals.len) + if(LAZYLEN(minerals)) for(var/turf/closed/mineral/M in minerals) - var/obj/effect/overlay/temp/mining_overlay/C = new /obj/effect/overlay/temp/mining_overlay(M) + var/obj/effect/temp_visual/mining_overlay/oldC = locate(/obj/effect/temp_visual/mining_overlay) in M + if(oldC) + qdel(oldC) + var/obj/effect/temp_visual/mining_overlay/C = new /obj/effect/temp_visual/mining_overlay(M) C.icon_state = M.scan_state -/obj/effect/overlay/temp/mining_overlay +/obj/effect/temp_visual/mining_overlay + plane = FULLSCREEN_PLANE layer = FLASH_LAYER - icon = 'icons/turf/smoothrocks.dmi' - anchored = 1 - mouse_opacity = 0 - duration = 30 - pixel_x = -4 - pixel_y = -4 + icon = 'icons/effects/ore_visuals.dmi' + appearance_flags = 0 //to avoid having TILE_BOUND in the flags, so that the 480x480 icon states let you see it no matter where you are + duration = 35 + pixel_x = -224 + pixel_y = -224 + +/obj/effect/temp_visual/mining_overlay/Initialize() + . = ..() + animate(src, alpha = 0, time = duration, easing = EASE_IN) /**********************Xeno Warning Sign**********************/ @@ -510,79 +492,66 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("smashed", "crushed", "cleaved", "chopped", "pulped") sharpness = IS_SHARP - var/charged = 1 - var/charge_time = 16 - var/atom/mark = null - var/mutable_appearance/marked_underlay + var/charged = TRUE + var/charge_time = 14 /obj/item/projectile/destabilizer name = "destabilizing force" icon_state = "pulse1" + nodamage = TRUE damage = 0 //We're just here to mark people. This is still a melee weapon. damage_type = BRUTE flag = "bomb" range = 6 - var/obj/item/weapon/twohanded/required/mining_hammer/hammer_synced = null log_override = TRUE + var/obj/item/weapon/twohanded/required/mining_hammer/hammer_synced + +/obj/item/projectile/destabilizer/Destroy() + hammer_synced = null + return ..() /obj/item/projectile/destabilizer/on_hit(atom/target, blocked = 0) - if(hammer_synced) - if(hammer_synced.mark == target) - return ..() - if(isliving(target)) - 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 - 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 - new /obj/effect/overlay/temp/kinetic_blast(M) - M.gets_drilled(firer) + if(isliving(target)) + var/mob/living/L = target + var/datum/status_effect/crusher_mark/CM = L.apply_status_effect(STATUS_EFFECT_CRUSHERMARK) + CM.hammer_synced = hammer_synced + var/target_turf = get_turf(target) + if(ismineralturf(target_turf)) + var/turf/closed/mineral/M = target_turf + new /obj/effect/temp_visual/kinetic_blast(M) + M.gets_drilled(firer) ..() /obj/item/weapon/twohanded/required/mining_hammer/afterattack(atom/target, mob/user, proximity_flag) if(!proximity_flag && charged)//Mark a target, or mine a tile. - var/turf/proj_turf = get_turf(src) + var/turf/proj_turf = user.loc if(!isturf(proj_turf)) return - var/datum/gas_mixture/environment = proj_turf.return_air() - var/pressure = environment.return_pressure() - if(pressure > 50) - playsound(user, 'sound/weapons/empty.ogg', 100, 1) - return - var/obj/item/projectile/destabilizer/D = new /obj/item/projectile/destabilizer(user.loc) - D.preparePixelProjectile(target,get_turf(target), user) + var/obj/item/projectile/destabilizer/D = new /obj/item/projectile/destabilizer(proj_turf) + D.preparePixelProjectile(target, get_turf(target), user) D.hammer_synced = src playsound(user, 'sound/weapons/plasma_cutter.ogg', 100, 1) D.fire() - charged = 0 + charged = FALSE icon_state = "mining_hammer1_uncharged" addtimer(CALLBACK(src, .proc/Recharge), charge_time) return - if(proximity_flag && target == mark && isliving(target)) + if(proximity_flag && isliving(target)) var/mob/living/L = target - new /obj/effect/overlay/temp/kinetic_blast(get_turf(L)) - mark = 0 - if(L.mob_size >= MOB_SIZE_LARGE) - 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)) - L.apply_damage(80, BRUTE, blocked = def_check) - playsound(user, 'sound/weapons/Kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong - else - L.apply_damage(50, BRUTE, blocked = def_check) + var/datum/status_effect/crusher_mark/CM = L.has_status_effect(STATUS_EFFECT_CRUSHERMARK) + if(!CM || CM.hammer_synced != src || !L.remove_status_effect(STATUS_EFFECT_CRUSHERMARK)) + return + new /obj/effect/temp_visual/kinetic_blast(get_turf(L)) + var/backstab_dir = get_dir(user, L) + var/def_check = L.getarmor(type = "bomb") + if((user.dir & backstab_dir) && (L.dir & backstab_dir)) + L.apply_damage(80, BRUTE, blocked = def_check) + playsound(user, 'sound/weapons/Kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong + else + L.apply_damage(50, BRUTE, blocked = def_check) /obj/item/weapon/twohanded/required/mining_hammer/proc/Recharge() if(!charged) - charged = 1 + charged = TRUE icon_state = "mining_hammer1" playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 9e4996135d..8a3f4ee633 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -673,7 +673,7 @@ if(!istype(T)) return if(!istype(T, turf_type)) - var/obj/effect/overlay/temp/lavastaff/L = new /obj/effect/overlay/temp/lavastaff(T) + var/obj/effect/temp_visual/lavastaff/L = new /obj/effect/temp_visual/lavastaff(T) L.alpha = 0 animate(L, alpha = 255, time = create_delay) user.visible_message("[user] points [src] at [T]!") @@ -696,7 +696,7 @@ timer = world.time + reset_cooldown playsound(T,'sound/magic/Fireball.ogg', 200, 1) -/obj/effect/overlay/temp/lavastaff +/obj/effect/temp_visual/lavastaff icon_state = "lavastaff_warn" duration = 50 @@ -821,7 +821,7 @@ timer = world.time + cooldown_time if(isliving(target) && chaser_timer <= world.time) //living and chasers off cooldown? fire one! chaser_timer = world.time + chaser_cooldown - var/obj/effect/overlay/temp/hierophant/chaser/C = new(get_turf(user), user, target, chaser_speed, friendly_fire_check) + var/obj/effect/temp_visual/hierophant/chaser/C = new(get_turf(user), user, target, chaser_speed, friendly_fire_check) C.damage = 30 C.monster_damage_boost = FALSE add_logs(user, target, "fired a chaser at", src) @@ -878,7 +878,7 @@ if(do_after(user, 50, target = user) && !beacon) var/turf/T = get_turf(user) playsound(T,'sound/magic/Blind.ogg', 200, 1, -4) - new /obj/effect/overlay/temp/hierophant/telegraph/teleport(T, user) + new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, user) beacon = new/obj/effect/hierophant(T) user.update_action_buttons_icon() user.visible_message("[user] places a strange machine beneath [user.p_their()] feet!", \ @@ -905,8 +905,8 @@ timer = world.time + 50 INVOKE_ASYNC(src, .proc/prepare_icon_update) beacon.icon_state = "hierophant_tele_on" - var/obj/effect/overlay/temp/hierophant/telegraph/edge/TE1 = new /obj/effect/overlay/temp/hierophant/telegraph/edge(user.loc) - var/obj/effect/overlay/temp/hierophant/telegraph/edge/TE2 = new /obj/effect/overlay/temp/hierophant/telegraph/edge(beacon.loc) + var/obj/effect/temp_visual/hierophant/telegraph/edge/TE1 = new /obj/effect/temp_visual/hierophant/telegraph/edge(user.loc) + var/obj/effect/temp_visual/hierophant/telegraph/edge/TE2 = new /obj/effect/temp_visual/hierophant/telegraph/edge(beacon.loc) if(do_after(user, 40, target = user) && user && beacon) var/turf/T = get_turf(beacon) var/turf/source = get_turf(user) @@ -918,8 +918,8 @@ INVOKE_ASYNC(src, .proc/prepare_icon_update) beacon.icon_state = "hierophant_tele_off" return - new /obj/effect/overlay/temp/hierophant/telegraph(T, user) - new /obj/effect/overlay/temp/hierophant/telegraph(source, user) + new /obj/effect/temp_visual/hierophant/telegraph(T, user) + new /obj/effect/temp_visual/hierophant/telegraph(source, user) playsound(T,'sound/magic/Wand_Teleport.ogg', 200, 1) playsound(source,'sound/machines/AirlockOpen.ogg', 200, 1) if(!do_after(user, 3, target = user) || !user || !beacon || QDELETED(beacon)) //no walking away shitlord @@ -940,13 +940,13 @@ beacon.icon_state = "hierophant_tele_off" return add_logs(user, beacon, "teleported self from ([source.x],[source.y],[source.z]) to") - new /obj/effect/overlay/temp/hierophant/telegraph/teleport(T, user) - new /obj/effect/overlay/temp/hierophant/telegraph/teleport(source, user) + new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, user) + new /obj/effect/temp_visual/hierophant/telegraph/teleport(source, user) for(var/t in RANGE_TURFS(1, T)) - var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, user, TRUE) //No friendly fire, this is a utility tool + var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, user, TRUE) //blasts produced will not hurt allies B.damage = 30 for(var/t in RANGE_TURFS(1, source)) - var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, user, TRUE) + var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, user, TRUE) //but absolutely will hurt enemies B.damage = 30 for(var/mob/living/L in range(1, source)) INVOKE_ASYNC(src, .proc/teleport_mob, source, L, T, user) //regardless, take all mobs near us along @@ -991,10 +991,10 @@ /obj/item/weapon/hierophant_club/proc/cardinal_blasts(turf/T, mob/living/user) //fire cardinal cross blasts with a delay if(!T) return - new /obj/effect/overlay/temp/hierophant/telegraph/cardinal(T, user) + new /obj/effect/temp_visual/hierophant/telegraph/cardinal(T, user) playsound(T,'sound/effects/bin_close.ogg', 200, 1) sleep(2) - new /obj/effect/overlay/temp/hierophant/blast(T, user, friendly_fire_check) + new /obj/effect/temp_visual/hierophant/blast(T, user, friendly_fire_check) for(var/d in GLOB.cardinal) INVOKE_ASYNC(src, .proc/blast_wall, T, d, user) @@ -1007,18 +1007,15 @@ for(var/i in 1 to range) if(!J) return - var/obj/effect/overlay/temp/hierophant/blast/B = new(J, user, friendly_fire_check) - B.damage = 30 - B.monster_damage_boost = FALSE + new /obj/effect/temp_visual/hierophant/blast(J, user, friendly_fire_check) previousturf = J J = get_step(previousturf, dir) /obj/item/weapon/hierophant_club/proc/aoe_burst(turf/T, mob/living/user) //make a 3x3 blast around a target if(!T) return - new /obj/effect/overlay/temp/hierophant/telegraph(T, user) + new /obj/effect/temp_visual/hierophant/telegraph(T, user) playsound(T,'sound/effects/bin_close.ogg', 200, 1) sleep(2) for(var/t in RANGE_TURFS(1, T)) - var/obj/effect/overlay/temp/hierophant/blast/B = new(t, user, friendly_fire_check) - B.damage = 15 //keeps monster damage boost due to lower damage + new /obj/effect/temp_visual/hierophant/blast(t, user, friendly_fire_check) diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index ae0ad90dfe..371fb11fec 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -19,7 +19,7 @@ new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/weapon/hivelordstabilizer, 400), new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 400), new /datum/data/mining_equipment("Shelter Capsule", /obj/item/weapon/survivalcapsule, 400), - new /datum/data/mining_equipment("GAR scanners", /obj/item/clothing/glasses/meson/gar, 500), + new /datum/data/mining_equipment("GAR Meson Scanners", /obj/item/clothing/glasses/meson/gar, 500), new /datum/data/mining_equipment("Explorer's Webbing", /obj/item/weapon/storage/belt/mining, 500), new /datum/data/mining_equipment("Survival Medipen", /obj/item/weapon/reagent_containers/hypospray/medipen/survival, 500), new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/weapon/storage/firstaid/brute, 600), diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index cef87fc57d..7ee5ed51c7 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -24,7 +24,7 @@ melee_damage_lower = 15 melee_damage_upper = 15 obj_damage = 0 - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE check_friendly_fire = 1 stop_automated_movement_when_pulled = 1 attacktext = "drills" @@ -44,7 +44,6 @@ var/light_on = 0 var/datum/action/innate/minedrone/toggle_light/toggle_light_action - var/datum/action/innate/minedrone/toggle_meson_vision/toggle_meson_vision_action var/datum/action/innate/minedrone/toggle_mode/toggle_mode_action var/datum/action/innate/minedrone/dump_ore/dump_ore_action @@ -52,8 +51,6 @@ ..() toggle_light_action = new() toggle_light_action.Grant(src) - toggle_meson_vision_action = new() - toggle_meson_vision_action.Grant(src) toggle_mode_action = new() toggle_mode_action.Grant(src) dump_ore_action = new() @@ -189,23 +186,6 @@ user.light_on = !user.light_on to_chat(user, "You toggle your light [user.light_on ? "on" : "off"].") -/datum/action/innate/minedrone/toggle_meson_vision - name = "Toggle Meson Vision" - button_icon_state = "meson" - -/datum/action/innate/minedrone/toggle_meson_vision/Activate() - var/mob/living/simple_animal/hostile/mining_drone/user = owner - if(user.sight & SEE_TURFS) - user.sight &= ~SEE_TURFS - user.lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE - else - user.sight |= SEE_TURFS - user.lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE - - user.sync_lighting_plane_alpha() - - to_chat(user, "You toggle your meson vision [(user.sight & SEE_TURFS) ? "on" : "off"].") - /datum/action/innate/minedrone/toggle_mode name = "Toggle Mode" button_icon_state = "mech_cycle_equip_off" diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm index 9cb2965dfc..8118476c69 100644 --- a/code/modules/mob/living/carbon/alien/death.dm +++ b/code/modules/mob/living/carbon/alien/death.dm @@ -5,10 +5,10 @@ new /obj/effect/gibspawner/xenobodypartless(loc,viruses) /mob/living/carbon/alien/gib_animation() - new /obj/effect/overlay/temp/gib_animation(loc, "gibbed-a") + new /obj/effect/temp_visual/gib_animation(loc, "gibbed-a") /mob/living/carbon/alien/spawn_dust() new /obj/effect/decal/remains/xeno(loc) /mob/living/carbon/alien/dust_animation() - new /obj/effect/overlay/temp/dust_animation(loc, "dust-a") + new /obj/effect/temp_visual/dust_animation(loc, "dust-a") diff --git a/code/modules/mob/living/carbon/alien/larva/death.dm b/code/modules/mob/living/carbon/alien/larva/death.dm index 26634d86dd..4d337606f5 100644 --- a/code/modules/mob/living/carbon/alien/larva/death.dm +++ b/code/modules/mob/living/carbon/alien/larva/death.dm @@ -13,10 +13,10 @@ new /obj/effect/gibspawner/larvabodypartless(loc,viruses) /mob/living/carbon/alien/larva/gib_animation() - new /obj/effect/overlay/temp/gib_animation(loc, "gibbed-l") + new /obj/effect/temp_visual/gib_animation(loc, "gibbed-l") /mob/living/carbon/alien/larva/spawn_dust() new /obj/effect/decal/remains/xeno(loc) /mob/living/carbon/alien/larva/dust_animation() - new /obj/effect/overlay/temp/dust_animation(loc, "dust-l") + new /obj/effect/temp_visual/dust_animation(loc, "dust-l") diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index e272680418..c17126656f 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -1,8 +1,8 @@ /mob/living/carbon/human/gib_animation() - new /obj/effect/overlay/temp/gib_animation(loc, "gibbed-h") + new /obj/effect/temp_visual/gib_animation(loc, "gibbed-h") /mob/living/carbon/human/dust_animation() - new /obj/effect/overlay/temp/dust_animation(loc, "dust-h") + new /obj/effect/temp_visual/dust_animation(loc, "dust-h") /mob/living/carbon/human/spawn_gibs(with_bodyparts) if(with_bodyparts) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index be7e851a8e..8f597f5531 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -36,7 +36,8 @@ //initialise organs create_internal_organs() - martial_art = default_martial_art + if(mind) + mind.martial_art = mind.default_martial_art handcrafting = new() diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 0623921d63..46f5bc3d4f 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -40,12 +40,13 @@ if(spec_return) return spec_return - if(martial_art && martial_art.deflection_chance) //Some martial arts users can deflect projectiles! - if(prob(martial_art.deflection_chance)) - if(!lying && dna && !dna.check_mutation(HULK)) //But only if they're not lying down, and hulks can't do it - visible_message("[src] deflects the projectile; [p_they()] can't be hit with ranged weapons!", "You deflect the projectile!") - playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1) - return 0 + if(mind) + if(mind.martial_art && mind.martial_art.deflection_chance) //Some martial arts users can deflect projectiles! + if(prob(mind.martial_art.deflection_chance)) + if(!lying && dna && !dna.check_mutation(HULK)) //But only if they're not lying down, and hulks can't do it + visible_message("[src] deflects the projectile; [p_they()] can't be hit with ranged weapons!", "You deflect the projectile!") + playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1) + return 0 if(!(P.original == src && P.firer == src)) //can't block or reflect when shooting yourself if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)) @@ -103,10 +104,11 @@ return 0 /mob/living/carbon/human/proc/check_block() - if(martial_art && martial_art.block_chance \ - && prob(martial_art.block_chance) && in_throw_mode \ - && !stat && !weakened && !stunned) - return TRUE + if(mind) + if(mind.martial_art && mind.martial_art.block_chance \ + && prob(mind.martial_art.block_chance) && in_throw_mode \ + && !stat && !weakened && !stunned) + return TRUE return FALSE /mob/living/carbon/human/hitby(atom/movable/AM, skipcatch = 0, hitpush = 1, blocked = 0) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index f697215a4a..c1f5075b43 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -39,9 +39,6 @@ var/bleed_rate = 0 //how much are we bleeding var/bleedsuppress = 0 //for stopping bloodloss, eventually this will be limb-based like bleeding - var/datum/martial_art/martial_art = null - var/static/default_martial_art = new/datum/martial_art - var/name_override //For temporary visible name changes var/drunkenness = 0 //Overall drunkenness - check handle_alcohol() in life.dm for effects diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 3a4b241f10..0620ebd062 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -144,9 +144,9 @@ if(NOGUNS in src.dna.species.species_traits) to_chat(src, "Your fingers don't fit in the trigger guard!") return 0 - - if(martial_art && martial_art.no_guns) //great dishonor to famiry - to_chat(src, "Use of ranged weaponry would bring dishonor to the clan.") - return 0 + if(mind) + if(mind.martial_art && mind.martial_art.no_guns) //great dishonor to famiry + to_chat(src, "Use of ranged weaponry would bring dishonor to the clan.") + return 0 return . diff --git a/code/modules/mob/living/carbon/human/login.dm b/code/modules/mob/living/carbon/human/login.dm new file mode 100644 index 0000000000..1ac24cffa9 --- /dev/null +++ b/code/modules/mob/living/carbon/human/login.dm @@ -0,0 +1,9 @@ +/mob/living/carbon/human/Login() + ..() + if(src.martial_art == default_martial_art && mind.stored_martial_art) //If the mind has a martial art stored and the body has the default one. + src.mind.stored_martial_art.teach(src) //Running teach so that it deals with help verbs. + else if(src.martial_art != default_martial_art && src.martial_art != mind.stored_martial_art) //If the body has a martial art which is not the default one and is not stored in the mind. + if(src.martial_art_owner != mind) + src.martial_art.remove(src) + else + src.mind.stored_martial_art = src.martial_art diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index b3f436ec68..cf92de53e1 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1304,7 +1304,7 @@ /datum/species/proc/spec_hitby(atom/movable/AM, mob/living/carbon/human/H) return -/datum/species/proc/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style = M.martial_art) +/datum/species/proc/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style) if(!istype(M)) return CHECK_DNA_AND_SPECIES(M) @@ -1312,6 +1312,8 @@ if(!istype(M)) //sanity check for drones. return + if(M.mind) + attacker_style = M.mind.martial_art if((M != H) && M.a_intent != INTENT_HELP && H.check_shields(0, M.name, attack_type = UNARMED_ATTACK)) add_logs(M, H, "attempted to touch") H.visible_message("[M] attempted to touch [H]!") diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index aba76f570a..09c566e6a4 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -406,7 +406,7 @@ else reactive_teleport(H) -/datum/species/golem/bluespace/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style = M.martial_art) +/datum/species/golem/bluespace/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style) ..() if(world.time > last_teleport + teleport_cooldown && M != H && M.a_intent != INTENT_HELP) reactive_teleport(H) @@ -490,7 +490,7 @@ var/golem_name = "[uppertext(clown_name)]" return golem_name -/datum/species/golem/bananium/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style = M.martial_art) +/datum/species/golem/bananium/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style) ..() if(world.time > last_banana + banana_cooldown && M != H && M.a_intent != INTENT_HELP) new/obj/item/weapon/grown/bananapeel/specialpeel(get_turf(H)) @@ -664,7 +664,7 @@ return invisibility = INVISIBILITY_MAXIMUM //disappear before the animation - new /obj/effect/overlay/temp/mummy_animation(get_turf(src)) + new /obj/effect/temp_visual/mummy_animation(get_turf(src)) if(cloth_golem.revive(full_heal = TRUE, admin_revive = TRUE)) cloth_golem.grab_ghost() //won't pull if it's a suicide sleep(20) diff --git a/code/modules/mob/living/carbon/monkey/death.dm b/code/modules/mob/living/carbon/monkey/death.dm index b8867af9e9..8eeadd6608 100644 --- a/code/modules/mob/living/carbon/monkey/death.dm +++ b/code/modules/mob/living/carbon/monkey/death.dm @@ -1,5 +1,5 @@ /mob/living/carbon/monkey/gib_animation() - new /obj/effect/overlay/temp/gib_animation(loc, "gibbed-m") + new /obj/effect/temp_visual/gib_animation(loc, "gibbed-m") /mob/living/carbon/monkey/dust_animation() - new /obj/effect/overlay/temp/dust_animation(loc, "dust-m") + new /obj/effect/temp_visual/dust_animation(loc, "dust-m") diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index 6376ae4857..7baa1a3912 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -1,6 +1,6 @@ /mob/living/silicon/robot/gib_animation() - new /obj/effect/overlay/temp/gib_animation(loc, "gibbed-r") + new /obj/effect/temp_visual/gib_animation(loc, "gibbed-r") /mob/living/silicon/robot/dust() if(mmi) @@ -11,7 +11,7 @@ new /obj/effect/decal/remains/robot(loc) /mob/living/silicon/robot/dust_animation() - new /obj/effect/overlay/temp/dust_animation(loc, "dust-r") + new /obj/effect/temp_visual/dust_animation(loc, "dust-r") /mob/living/silicon/robot/death(gibbed) if(stat == DEAD) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 4fbe56361e..cdbb5e77aa 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -198,9 +198,9 @@ /obj/item/weapon/robot_module/proc/do_transform_animation() var/mob/living/silicon/robot/R = loc R.notransform = TRUE - var/obj/effect/overlay/temp/decoy/fading/fivesecond/ANM = new /obj/effect/overlay/temp/decoy/fading/fivesecond(R.loc, R) + var/obj/effect/temp_visual/decoy/fading/fivesecond/ANM = new /obj/effect/temp_visual/decoy/fading/fivesecond(R.loc, R) ANM.layer = R.layer - 0.01 - new /obj/effect/overlay/temp/small_smoke(R.loc) + new /obj/effect/temp_visual/small_smoke(R.loc) if(R.hat) R.hat.forceMove(get_turf(R)) R.hat = null @@ -526,7 +526,6 @@ name = "Miner" basic_modules = list( /obj/item/device/assembly/flash/cyborg, - /obj/item/borg/sight/meson, /obj/item/weapon/storage/bag/ore/cyborg, /obj/item/weapon/pickaxe/drill/cyborg, /obj/item/weapon/shovel, diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 25a2f83266..5b17ab7d6e 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -299,7 +299,7 @@ /mob/living/simple_animal/bot/emp_act(severity) var/was_on = on stat |= EMPED - new /obj/effect/overlay/temp/emp(loc) + new /obj/effect/temp_visual/emp(loc) if(paicard) paicard.emp_act(severity) src.visible_message("[paicard] is flies out of [bot_name]!","You are forcefully ejected from [bot_name]!") diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index 32db638542..4a79476bf0 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -9,7 +9,7 @@ maxHealth = 100 damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) obj_damage = 60 - environment_smash = 2 //Walls can't stop THE LAW + environment_smash = ENVIRONMENT_SMASH_WALLS //Walls can't stop THE LAW mob_size = MOB_SIZE_LARGE radio_key = /obj/item/device/encryptionkey/headset_sec @@ -444,7 +444,7 @@ Auto Patrol[]"}, if(severity==2 && prob(70)) ..(severity-1) else - new /obj/effect/overlay/temp/emp(loc) + new /obj/effect/temp_visual/emp(loc) var/list/mob/living/carbon/targets = new for(var/mob/living/carbon/C in view(12,src)) if(C.stat==2) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 75948d2eb2..afcf1d4c33 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -115,7 +115,7 @@ melee_damage_upper = 30 attacktext = "smashes their armored gauntlet into" speed = 3 - environment_smash = 2 + environment_smash = ENVIRONMENT_SMASH_WALLS attack_sound = 'sound/weapons/punch3.ogg' status_flags = 0 mob_size = MOB_SIZE_LARGE @@ -126,7 +126,7 @@ /mob/living/simple_animal/hostile/construct/armored/hostile //actually hostile, will move around, hit things AIStatus = AI_ON - environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP + environment_smash = ENVIRONMENT_SMASH_STRUCTURES //only token destruction, don't smash the cult wall NO STOP /mob/living/simple_animal/hostile/construct/armored/bullet_act(obj/item/projectile/P) if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)) @@ -218,7 +218,7 @@ retreat_distance = 10 minimum_distance = 10 //AI artificers will flee like fuck attacktext = "rams" - environment_smash = 2 + environment_smash = ENVIRONMENT_SMASH_WALLS attack_sound = 'sound/weapons/punch2.ogg' construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/wall, /obj/effect/proc_holder/spell/aoe_turf/conjure/floor, @@ -272,7 +272,7 @@ /mob/living/simple_animal/hostile/construct/builder/hostile //actually hostile, will move around, hit things, heal other constructs AIStatus = AI_ON - environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP + environment_smash = ENVIRONMENT_SMASH_STRUCTURES //only token destruction, don't smash the cult wall NO STOP /////////////////////////////Non-cult Artificer///////////////////////// /mob/living/simple_animal/hostile/construct/builder/noncult diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 159aec35af..5f3c8f6183 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -216,7 +216,7 @@ if(change) if(change > 0) if(M && stat != DEAD) - new /obj/effect/overlay/temp/heart(loc) + new /obj/effect/temp_visual/heart(loc) emote("me", 1, "purrs!") else if(M && stat != DEAD) diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index eb6feb00be..a2ae3b4b2d 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -553,7 +553,7 @@ if(change) if(change > 0) if(M && stat != DEAD) // Added check to see if this mob (the dog) is dead to fix issue 2454 - new /obj/effect/overlay/temp/heart(loc) + new /obj/effect/temp_visual/heart(loc) emote("me", 1, "yaps happily!") else if(M && stat != DEAD) // Same check here, even though emote checks it as well (poor form to check it only in the help case) diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 2594700770..e4daeb66d1 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -24,7 +24,7 @@ maxHealth = 40 melee_damage_lower = 1 melee_damage_upper = 2 - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE stop_automated_movement_when_pulled = 1 blood_volume = BLOOD_VOLUME_NORMAL var/obj/item/udder/udder = null diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index 5297391462..8de57f1a85 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -20,7 +20,7 @@ mob_size = MOB_SIZE_SMALL gold_core_spawnable = 2 obj_damage = 0 - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE var/list/edibles = list(/mob/living/simple_animal/butterfly,/mob/living/simple_animal/cockroach) //list of atoms, however turfs won't affect AI, but will affect consumption. /mob/living/simple_animal/hostile/lizard/CanAttack(atom/the_target)//Can we actually attack a possible target? diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index cd427ba33c..7a6204c7c9 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -31,7 +31,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians health = INFINITY healable = FALSE //don't brusepack the guardian damage_coeff = list(BRUTE = 0.5, BURN = 0.5, TOX = 0.5, CLONE = 0.5, STAMINA = 0, OXY = 0.5) //how much damage from each damage type we transfer to the owner - environment_smash = 1 + environment_smash = ENVIRONMENT_SMASH_STRUCTURES obj_damage = 40 melee_damage_lower = 15 melee_damage_upper = 15 @@ -175,9 +175,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians if(istype(summoner.loc, /obj/effect)) Recall(TRUE) else - new /obj/effect/overlay/temp/guardian/phase/out(loc) + new /obj/effect/temp_visual/guardian/phase/out(loc) forceMove(summoner.loc) - new /obj/effect/overlay/temp/guardian/phase(loc) + new /obj/effect/temp_visual/guardian/phase(loc) /mob/living/simple_animal/hostile/guardian/canSuicide() return 0 @@ -315,7 +315,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians return FALSE if(loc == summoner) forceMove(summoner.loc) - new /obj/effect/overlay/temp/guardian/phase(loc) + new /obj/effect/temp_visual/guardian/phase(loc) cooldown = world.time + 10 return TRUE return FALSE @@ -323,7 +323,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians /mob/living/simple_animal/hostile/guardian/proc/Recall(forced) if(!summoner || loc == summoner || (cooldown > world.time && !forced)) return FALSE - new /obj/effect/overlay/temp/guardian/phase/out(loc) + new /obj/effect/temp_visual/guardian/phase/out(loc) forceMove(summoner) cooldown = world.time + 10 diff --git a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm index 1fa54dfd21..71ae19695c 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm @@ -71,8 +71,11 @@ melee_damage_upper = 50 armour_penetration = 100 obj_damage = 0 - environment_smash = 0 - new /obj/effect/overlay/temp/guardian/phase/out(get_turf(src)) + + + environment_smash = ENVIRONMENT_SMASH_NONE + + new /obj/effect/temp_visual/guardian/phase/out(get_turf(src)) alpha = 15 if(!forced) to_chat(src, "You enter stealth, empowering your next attack.") diff --git a/code/modules/mob/living/simple_animal/guardian/types/charger.dm b/code/modules/mob/living/simple_animal/guardian/types/charger.dm index 708a1e2ce6..c1be82b820 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/charger.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/charger.dm @@ -40,7 +40,7 @@ /mob/living/simple_animal/hostile/guardian/charger/Move() if(charging) - new /obj/effect/overlay/temp/decoy/fading(loc,src) + new /obj/effect/temp_visual/decoy/fading(loc,src) . = ..() /mob/living/simple_animal/hostile/guardian/charger/snapback() diff --git a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm index 9da40c0c7c..1e6fa727b9 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm @@ -21,14 +21,14 @@ if(. && prob(40) && isliving(target)) var/mob/living/M = target if(!M.anchored && M != summoner && !hasmatchingsummoner(M)) - new /obj/effect/overlay/temp/guardian/phase/out(get_turf(M)) + new /obj/effect/temp_visual/guardian/phase/out(get_turf(M)) do_teleport(M, M, 10) for(var/mob/living/L in range(1, M)) if(hasmatchingsummoner(L)) //if the summoner matches don't hurt them continue if(L != src && L != summoner) L.apply_damage(15, BRUTE) - new /obj/effect/overlay/temp/explosion(get_turf(M)) + new /obj/effect/temp_visual/explosion(get_turf(M)) /mob/living/simple_animal/hostile/guardian/bomb/AltClickOn(atom/movable/A) if(!istype(A)) @@ -75,7 +75,7 @@ var/turf/T = get_turf(src) stored_obj.forceMove(T) playsound(T,'sound/effects/Explosion2.ogg', 200, 1) - new /obj/effect/overlay/temp/explosion(T) + new /obj/effect/temp_visual/explosion(T) user.ex_act(2) qdel(src) else 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 eacf58410b..cabb6854b2 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/protector.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/protector.dm @@ -63,6 +63,6 @@ else to_chat(summoner, "You moved out of range, and were pulled back! You can only move [range] meters from [real_name]!") summoner.visible_message("\The [summoner] jumps back to [summoner.p_their()] protector.") - new /obj/effect/overlay/temp/guardian/phase/out(get_turf(summoner)) + new /obj/effect/temp_visual/guardian/phase/out(get_turf(summoner)) summoner.forceMove(get_turf(src)) - new /obj/effect/overlay/temp/guardian/phase(get_turf(summoner)) + new /obj/effect/temp_visual/guardian/phase(get_turf(summoner)) diff --git a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm index f7c14f336a..37777a5ead 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm @@ -45,7 +45,7 @@ melee_damage_lower = 0 melee_damage_upper = 0 obj_damage = 0 - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE alpha = 45 range = 255 incorporeal_move = 1 diff --git a/code/modules/mob/living/simple_animal/guardian/types/standard.dm b/code/modules/mob/living/simple_animal/guardian/types/standard.dm index 1d2cfdea6f..72bb57513e 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/standard.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/standard.dm @@ -4,7 +4,7 @@ melee_damage_upper = 20 obj_damage = 80 next_move_modifier = 0.8 //attacks 20% faster - environment_smash = 2 + environment_smash = ENVIRONMENT_SMASH_WALLS playstyle_string = "As a standard type you have no special abilities, but have a high damage resistance and a powerful attack capable of smashing through walls." magic_fluff_string = "..And draw the Assistant, faceless and generic, but never to be underestimated." tech_fluff_string = "Boot sequence complete. Standard combat modules loaded. Holoparasite swarm online." 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 159e6df5f4..3d7ae48443 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/support.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm @@ -34,7 +34,7 @@ C.adjustFireLoss(-5) C.adjustOxyLoss(-5) C.adjustToxLoss(-5) - var/obj/effect/overlay/temp/heal/H = new /obj/effect/overlay/temp/heal(get_turf(C)) + var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(C)) if(namedatum) H.color = namedatum.colour if(C == summoner) @@ -136,11 +136,11 @@ to_chat(src, "You need to hold still!") return - new /obj/effect/overlay/temp/guardian/phase/out(T) + new /obj/effect/temp_visual/guardian/phase/out(T) if(isliving(A)) var/mob/living/L = A L.flash_act() A.visible_message("[A] disappears in a flash of light!", \ "Your vision is obscured by a flash of light!") do_teleport(A, beacon, 0) - new /obj/effect/overlay/temp/guardian/phase(get_turf(A)) + new /obj/effect/temp_visual/guardian/phase(get_turf(A)) diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index b2cb16efa2..2d511004e7 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -158,7 +158,7 @@ a_intent = INTENT_HELP friendly = "caresses" obj_damage = 0 - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE gold_core_spawnable = 1 icon_state = "maid" icon_living = "maid" diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index 51e782b019..6e60f6b958 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -31,7 +31,7 @@ faction = list("hostile") move_to_delay = 0 obj_damage = 0 - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE mouse_opacity = 2 pass_flags = PASSTABLE | PASSGRILLE | PASSMOB mob_size = MOB_SIZE_TINY 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 951589daaf..59177857cd 100644 --- a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm +++ b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm @@ -8,7 +8,7 @@ icon = 'icons/mob/simple_human.dmi' icon_state = "paperwizard" ranged = 1 - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE minimum_distance = 3 retreat_distance = 3 obj_damage = 0 @@ -16,7 +16,7 @@ melee_damage_upper = 20 health = 1000 maxHealth = 1000 - loot = list(/obj/effect/overlay/temp/paperwiz_dying) + loot = list(/obj/effect/temp_visual/paperwiz_dying) projectiletype = /obj/item/projectile/temp projectilesound = 'sound/weapons/emitter.ogg' attack_sound = 'sound/hallucinations/growl1.ogg' @@ -129,7 +129,7 @@ qdel(src) //I see through your ruse! //fancy effects -/obj/effect/overlay/temp/paper_scatter +/obj/effect/temp_visual/paper_scatter name = "scattering paper" desc = "Pieces of paper scattering to the wind." layer = ABOVE_OPEN_TURF_LAYER @@ -139,7 +139,7 @@ duration = 5 randomdir = FALSE -/obj/effect/overlay/temp/paperwiz_dying +/obj/effect/temp_visual/paperwiz_dying name = "craft portal" desc = "A wormhole sucking the wizard into the void. Neat." layer = ABOVE_OPEN_TURF_LAYER @@ -149,18 +149,18 @@ duration = 18 randomdir = FALSE -/obj/effect/overlay/temp/paperwiz_dying/Initialize() +/obj/effect/temp_visual/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) -/obj/effect/overlay/temp/paperwiz_dying/Destroy() +/obj/effect/temp_visual/paperwiz_dying/Destroy() for(var/mob/M in range(7,src)) shake_camera(M, 7, 1) var/turf/T = get_turf(src) playsound(T,'sound/magic/Summon_Magic.ogg', 50, 1, 1) - new /obj/effect/overlay/temp/paper_scatter(T) + new /obj/effect/temp_visual/paper_scatter(T) new /obj/item/clothing/suit/wizrobe/paper(T) new /obj/item/clothing/head/collectable/paper(T) return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/flan.dm b/code/modules/mob/living/simple_animal/hostile/flan.dm index c77fff881e..cb581b6ec5 100644 --- a/code/modules/mob/living/simple_animal/hostile/flan.dm +++ b/code/modules/mob/living/simple_animal/hostile/flan.dm @@ -8,7 +8,7 @@ icon_living = "flan" icon_dead = "flan_dead" turns_per_move = 5 - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE speed = -2 maxHealth = 50 health = 50 diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index 77b68a936d..5f2c011665 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -17,7 +17,7 @@ robust_searching = 1 stat_attack = 2 obj_damage = 0 - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE speak_emote = list("squeaks") ventcrawler = VENTCRAWLER_ALWAYS var/datum/mind/origin diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 994dcb96d3..48e756e408 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -2,7 +2,7 @@ faction = list("hostile") stop_automated_movement_when_pulled = 0 obj_damage = 40 - environment_smash = 1 //Set to 1 to break closets,tables,racks, etc; 2 for walls; 3 for rwalls + environment_smash = ENVIRONMENT_SMASH_STRUCTURES //Set to 1 to break closets,tables,racks, etc; 2 for walls; 3 for rwalls var/atom/target var/ranged = 0 var/rapid = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm index e09336059c..25ce0fc0ec 100644 --- a/code/modules/mob/living/simple_animal/hostile/illusion.dm +++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm @@ -67,7 +67,7 @@ melee_damage_upper = 0 speed = -1 obj_damage = 0 - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE /mob/living/simple_animal/hostile/illusion/escape/AttackingTarget() diff --git a/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm b/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm index de1bf0b308..363753ee62 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm @@ -4,7 +4,7 @@ faction = list("jungle") weather_immunities = list("acid") obj_damage = 30 - environment_smash = 2 + environment_smash = ENVIRONMENT_SMASH_WALLS minbodytemp = 0 maxbodytemp = 450 response_help = "pokes" 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 fa61a16e51..2645ebcef7 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -134,7 +134,7 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/bubblegum/Move() if(charging) - new /obj/effect/overlay/temp/decoy/fading(loc,src) + new /obj/effect/temp_visual/decoy/fading(loc,src) DestroySurroundings() . = ..() if(!stat && .) @@ -150,12 +150,12 @@ Difficulty: Hard var/turf/T = get_turf(target) if(!T || T == loc) return - new /obj/effect/overlay/temp/dragon_swoop/bubblegum(T) + new /obj/effect/temp_visual/dragon_swoop/bubblegum(T) charging = TRUE DestroySurroundings() walk(src, 0) setDir(get_dir(src, T)) - var/obj/effect/overlay/temp/decoy/D = new /obj/effect/overlay/temp/decoy(loc,src) + var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(loc,src) animate(D, alpha = 0, color = "#FF0000", transform = matrix()*2, time = 3) sleep(3) throw_at(T, get_dist(src, T), 1, src, 0, callback = CALLBACK(src, .charge_end, bonus_charges)) @@ -245,9 +245,9 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodsmack(turf/T, handedness) if(handedness) - new /obj/effect/overlay/temp/bubblegum_hands/rightsmack(T) + new /obj/effect/temp_visual/bubblegum_hands/rightsmack(T) else - new /obj/effect/overlay/temp/bubblegum_hands/leftsmack(T) + new /obj/effect/temp_visual/bubblegum_hands/leftsmack(T) sleep(2.5) for(var/mob/living/L in T) if(!faction_check_mob(L)) @@ -259,11 +259,11 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodgrab(turf/T, handedness) if(handedness) - new /obj/effect/overlay/temp/bubblegum_hands/rightpaw(T) - new /obj/effect/overlay/temp/bubblegum_hands/rightthumb(T) + new /obj/effect/temp_visual/bubblegum_hands/rightpaw(T) + new /obj/effect/temp_visual/bubblegum_hands/rightthumb(T) else - new /obj/effect/overlay/temp/bubblegum_hands/leftpaw(T) - new /obj/effect/overlay/temp/bubblegum_hands/leftthumb(T) + new /obj/effect/temp_visual/bubblegum_hands/leftpaw(T) + new /obj/effect/temp_visual/bubblegum_hands/leftthumb(T) sleep(6) for(var/mob/living/L in T) if(!faction_check_mob(L)) @@ -276,31 +276,31 @@ Difficulty: Hard addtimer(CALLBACK(src, .proc/devour, L), 2) sleep(1) -/obj/effect/overlay/temp/dragon_swoop/bubblegum +/obj/effect/temp_visual/dragon_swoop/bubblegum duration = 10 -/obj/effect/overlay/temp/bubblegum_hands +/obj/effect/temp_visual/bubblegum_hands icon = 'icons/effects/bubblegum.dmi' duration = 9 -/obj/effect/overlay/temp/bubblegum_hands/rightthumb +/obj/effect/temp_visual/bubblegum_hands/rightthumb icon_state = "rightthumbgrab" -/obj/effect/overlay/temp/bubblegum_hands/leftthumb +/obj/effect/temp_visual/bubblegum_hands/leftthumb icon_state = "leftthumbgrab" -/obj/effect/overlay/temp/bubblegum_hands/rightpaw +/obj/effect/temp_visual/bubblegum_hands/rightpaw icon_state = "rightpawgrab" layer = BELOW_MOB_LAYER -/obj/effect/overlay/temp/bubblegum_hands/leftpaw +/obj/effect/temp_visual/bubblegum_hands/leftpaw icon_state = "leftpawgrab" layer = BELOW_MOB_LAYER -/obj/effect/overlay/temp/bubblegum_hands/rightsmack +/obj/effect/temp_visual/bubblegum_hands/rightsmack icon_state = "rightsmack" -/obj/effect/overlay/temp/bubblegum_hands/leftsmack +/obj/effect/temp_visual/bubblegum_hands/leftsmack icon_state = "leftsmack" /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_warp() @@ -316,7 +316,7 @@ Difficulty: Hard if(!pools.len) return FALSE - var/obj/effect/overlay/temp/decoy/DA = new /obj/effect/overlay/temp/decoy(loc,src) + var/obj/effect/temp_visual/decoy/DA = new /obj/effect/temp_visual/decoy(loc,src) DA.color = "#FF0000" var/oldtransform = DA.transform DA.transform = matrix()*2 @@ -358,7 +358,7 @@ Difficulty: Hard new /obj/effect/decal/cleanable/blood/bubblegum(J) for(var/i in 1 to range) J = get_step(previousturf, targetdir) - new /obj/effect/overlay/temp/dir_setting/bloodsplatter(previousturf, get_dir(previousturf, J)) + new /obj/effect/temp_visual/dir_setting/bloodsplatter(previousturf, get_dir(previousturf, J)) playsound(previousturf,'sound/effects/splat.ogg', 100, 1, -1) if(!J || !previousturf.atmos_adjacent_turfs || !previousturf.atmos_adjacent_turfs[J]) break 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 a390ecae71..fd42582317 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -95,7 +95,7 @@ Difficulty: Very Hard ..() internal = new/obj/item/device/gps/internal/colossus(src) -/obj/effect/overlay/temp/at_shield +/obj/effect/temp_visual/at_shield name = "anti-toolbox field" desc = "A shimmering forcefield protecting the colossus." icon = 'icons/effects/effects.dmi' @@ -105,14 +105,14 @@ Difficulty: Very Hard duration = 8 var/target -/obj/effect/overlay/temp/at_shield/Initialize(mapload, new_target) +/obj/effect/temp_visual/at_shield/Initialize(mapload, new_target) . = ..() target = new_target INVOKE_ASYNC(src, /atom/movable/proc/orbit, target, 0, FALSE, 0, 0, FALSE, TRUE) /mob/living/simple_animal/hostile/megafauna/colossus/bullet_act(obj/item/projectile/P) if(!stat) - var/obj/effect/overlay/temp/at_shield/AT = new /obj/effect/overlay/temp/at_shield(src.loc, src) + var/obj/effect/temp_visual/at_shield/AT = new /obj/effect/temp_visual/at_shield(src.loc, src) var/random_x = rand(-32, 32) AT.pixel_x += random_x @@ -123,8 +123,9 @@ Difficulty: Very Hard /mob/living/simple_animal/hostile/megafauna/colossus/proc/enrage(mob/living/L) if(ishuman(L)) var/mob/living/carbon/human/H = L - if(H.martial_art && prob(H.martial_art.deflection_chance)) - . = TRUE + if(H.mind) + if(H.mind.martial_art && prob(H.mind.martial_art.deflection_chance)) + . = TRUE /mob/living/simple_animal/hostile/megafauna/colossus/proc/alternating_dir_shots() dir_shots(GLOB.diagonals) @@ -581,7 +582,7 @@ Difficulty: Very Hard if(..()) for(var/i in range(1, src)) if(isturf(i)) - new /obj/effect/overlay/temp/cult/sparks(i) + new /obj/effect/temp_visual/cult/sparks(i) continue if(ishuman(i)) var/mob/living/carbon/human/H = i @@ -657,7 +658,7 @@ Difficulty: Very Hard minbodytemp = 0 maxbodytemp = 1500 obj_damage = 0 - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE AIStatus = AI_OFF stop_automated_movement = 1 var/heal_power = 5 @@ -675,7 +676,7 @@ Difficulty: Very Hard var/mob/living/L = target if(L.stat != DEAD) L.heal_overall_damage(heal_power, heal_power) - new /obj/effect/overlay/temp/heal(get_turf(target), "#80F5FF") + new /obj/effect/temp_visual/heal(get_turf(target), "#80F5FF") /mob/living/simple_animal/hostile/lightgeist/ghostize() . = ..() @@ -699,7 +700,7 @@ Difficulty: Very Hard if(..()) var/list/L = list() var/turf/T = get_step(src, dir) - new /obj/effect/overlay/temp/emp/pulse(T) + new /obj/effect/temp_visual/emp/pulse(T) for(var/i in T) if(istype(i, /obj/item) && !is_type_in_typecache(i, banned_items_typecache)) var/obj/item/W = i 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 45139747fa..1c1fc8fb9e 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm @@ -124,7 +124,7 @@ Difficulty: Medium 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) + new /obj/effect/temp_visual/target(turf) /mob/living/simple_animal/hostile/megafauna/dragon/proc/fire_walls() playsound(get_turf(src),'sound/magic/Fireball.ogg', 200, 1) @@ -179,7 +179,7 @@ Difficulty: Medium 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) + var/obj/effect/temp_visual/dragon_flight/F = new /obj/effect/temp_visual/dragon_flight(loc, negative) negative = !negative //invert it for the swoop down later @@ -208,7 +208,7 @@ Difficulty: Medium 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) + new /obj/effect/temp_visual/target(loc, flame_hit) forceMove(get_step(src, get_dir(src, target))) if(loc == get_turf(target)) if(!fire_rain) @@ -228,8 +228,8 @@ Difficulty: Medium else 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) + new /obj/effect/temp_visual/dragon_flight/end(loc, negative) + new /obj/effect/temp_visual/dragon_swoop(loc) animate(src, transform = oldtransform, time = 5) sleep(5) swooping &= ~SWOOP_INVULNERABLE @@ -271,7 +271,7 @@ Difficulty: Medium invisibility = 100 -/obj/effect/overlay/temp/fireball +/obj/effect/temp_visual/fireball icon = 'icons/obj/wizard.dmi' icon_state = "fireball" name = "fireball" @@ -281,28 +281,28 @@ Difficulty: Medium duration = 9 pixel_z = DRAKE_SWOOP_HEIGHT -/obj/effect/overlay/temp/fireball/Initialize() +/obj/effect/temp_visual/fireball/Initialize() . = ..() animate(src, pixel_z = 0, time = duration) -/obj/effect/overlay/temp/target +/obj/effect/temp_visual/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() +/obj/effect/temp_visual/target/ex_act() return -/obj/effect/overlay/temp/target/Initialize(mapload, list/flame_hit) +/obj/effect/temp_visual/target/Initialize(mapload, list/flame_hit) . = ..() INVOKE_ASYNC(src, .proc/fall, flame_hit) -/obj/effect/overlay/temp/target/proc/fall(list/flame_hit) +/obj/effect/temp_visual/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) + new /obj/effect/temp_visual/fireball(T) sleep(duration) if(ismineralturf(T)) var/turf/closed/mineral/M = T @@ -320,7 +320,7 @@ Difficulty: Medium else L.adjustFireLoss(10) //if we've already hit them, do way less damage -/obj/effect/overlay/temp/dragon_swoop +/obj/effect/temp_visual/dragon_swoop name = "certain death" desc = "Don't just stand there, move!" icon = 'icons/effects/96x96.dmi' @@ -331,7 +331,7 @@ Difficulty: Medium color = "#FF0000" duration = 5 -/obj/effect/overlay/temp/dragon_flight +/obj/effect/temp_visual/dragon_flight icon = 'icons/mob/lavaland/dragon.dmi' icon_state = "dragon" layer = ABOVE_ALL_MOB_LAYER @@ -339,11 +339,11 @@ Difficulty: Medium duration = 10 randomdir = FALSE -/obj/effect/overlay/temp/dragon_flight/Initialize(mapload, negative) +/obj/effect/temp_visual/dragon_flight/Initialize(mapload, negative) . = ..() INVOKE_ASYNC(src, .proc/flight, negative) -/obj/effect/overlay/temp/dragon_flight/proc/flight(negative) +/obj/effect/temp_visual/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 @@ -355,12 +355,12 @@ Difficulty: Medium else animate(src, pixel_x = DRAKE_SWOOP_HEIGHT, pixel_z = DRAKE_SWOOP_HEIGHT, time = 7) -/obj/effect/overlay/temp/dragon_flight/end +/obj/effect/temp_visual/dragon_flight/end pixel_x = DRAKE_SWOOP_HEIGHT pixel_z = DRAKE_SWOOP_HEIGHT duration = 5 -/obj/effect/overlay/temp/dragon_flight/end/flight(negative) +/obj/effect/temp_visual/dragon_flight/end/flight(negative) if(negative) pixel_x = -DRAKE_SWOOP_HEIGHT animate(src, pixel_x = -16, pixel_z = 0, time = 5) 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 79ac234ab9..fad0ab17df 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -150,7 +150,7 @@ Difficulty: Hard var/prevloc = loc . = ..() if(!stat && .) - var/obj/effect/overlay/temp/hierophant/squares/HS = new /obj/effect/overlay/temp/hierophant/squares(prevloc) + var/obj/effect/temp_visual/hierophant/squares/HS = new /obj/effect/temp_visual/hierophant/squares(prevloc) HS.dir = dir playsound(loc, 'sound/mecha/mechmove04.ogg', 150, 1, -4) if(target) @@ -250,7 +250,7 @@ Difficulty: Hard pickedtarget = pick_n_take(targets) if(!istype(pickedtarget) || pickedtarget.stat == DEAD) pickedtarget = target - var/obj/effect/overlay/temp/hierophant/chaser/C = new /obj/effect/overlay/temp/hierophant/chaser(loc, src, pickedtarget, chaser_speed, FALSE) + var/obj/effect/temp_visual/hierophant/chaser/C = new /obj/effect/temp_visual/hierophant/chaser(loc, src, pickedtarget, chaser_speed, FALSE) C.moving = 3 C.moving_dir = pick_n_take(cardinal_copy) sleep(10) @@ -280,10 +280,10 @@ Difficulty: Hard else INVOKE_ASYNC(src, .proc/diagonal_blasts, target) else if(chaser_cooldown < world.time) //if chasers are off cooldown, fire some! - var/obj/effect/overlay/temp/hierophant/chaser/C = new /obj/effect/overlay/temp/hierophant/chaser(loc, src, target, chaser_speed, FALSE) + var/obj/effect/temp_visual/hierophant/chaser/C = new /obj/effect/temp_visual/hierophant/chaser(loc, src, target, chaser_speed, FALSE) chaser_cooldown = world.time + initial(chaser_cooldown) if((prob(anger_modifier) || target.Adjacent(src)) && target != src) - var/obj/effect/overlay/temp/hierophant/chaser/OC = new /obj/effect/overlay/temp/hierophant/chaser(loc, src, target, max(1.5, 5 - anger_modifier * 0.07), FALSE) + var/obj/effect/temp_visual/hierophant/chaser/OC = new /obj/effect/temp_visual/hierophant/chaser(loc, src, target, max(1.5, 5 - anger_modifier * 0.07), FALSE) OC.moving = 4 OC.moving_dir = pick(GLOB.cardinal - C.moving_dir) else //just release a burst of power @@ -293,10 +293,10 @@ Difficulty: Hard var/turf/T = get_turf(victim) if(!T) return - new /obj/effect/overlay/temp/hierophant/telegraph/diagonal(T, src) + new /obj/effect/temp_visual/hierophant/telegraph/diagonal(T, src) playsound(T,'sound/effects/bin_close.ogg', 200, 1) sleep(2) - new /obj/effect/overlay/temp/hierophant/blast(T, src, FALSE) + new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE) for(var/d in GLOB.diagonals) INVOKE_ASYNC(src, .proc/blast_wall, T, d) @@ -304,10 +304,10 @@ Difficulty: Hard var/turf/T = get_turf(victim) if(!T) return - new /obj/effect/overlay/temp/hierophant/telegraph/cardinal(T, src) + new /obj/effect/temp_visual/hierophant/telegraph/cardinal(T, src) playsound(T,'sound/effects/bin_close.ogg', 200, 1) sleep(2) - new /obj/effect/overlay/temp/hierophant/blast(T, src, FALSE) + new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE) for(var/d in GLOB.cardinal) INVOKE_ASYNC(src, .proc/blast_wall, T, d) @@ -315,10 +315,10 @@ Difficulty: Hard var/turf/T = get_turf(victim) if(!T) return - new /obj/effect/overlay/temp/hierophant/telegraph(T, src) + new /obj/effect/temp_visual/hierophant/telegraph(T, src) playsound(T,'sound/effects/bin_close.ogg', 200, 1) sleep(2) - new /obj/effect/overlay/temp/hierophant/blast(T, src, FALSE) + new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE) for(var/d in GLOB.alldirs) INVOKE_ASYNC(src, .proc/blast_wall, T, d) @@ -327,7 +327,7 @@ Difficulty: Hard var/turf/previousturf = T var/turf/J = get_step(previousturf, set_dir) for(var/i in 1 to range) - new /obj/effect/overlay/temp/hierophant/blast(J, src, FALSE) + new /obj/effect/temp_visual/hierophant/blast(J, src, FALSE) previousturf = J J = get_step(previousturf, set_dir) @@ -342,8 +342,8 @@ Difficulty: Hard INVOKE_ASYNC(src, .proc/arena_squares, T, d) for(var/t in RANGE_TURFS(11, T)) if(t && get_dist(t, T) == 11) - new /obj/effect/overlay/temp/hierophant/wall(t) - new /obj/effect/overlay/temp/hierophant/blast(t, src, FALSE) + new /obj/effect/temp_visual/hierophant/wall(t) + new /obj/effect/temp_visual/hierophant/blast(t, src, FALSE) if(get_dist(src, T) >= 11) //hey you're out of range I need to get closer to you! INVOKE_ASYNC(src, .proc/blink, T) @@ -351,7 +351,7 @@ Difficulty: Hard var/turf/previousturf = T var/turf/J = get_step(previousturf, set_dir) for(var/i in 1 to 10) - var/obj/effect/overlay/temp/hierophant/squares/HS = new /obj/effect/overlay/temp/hierophant/squares(J) + var/obj/effect/temp_visual/hierophant/squares/HS = new /obj/effect/temp_visual/hierophant/squares(J) HS.dir = set_dir previousturf = J J = get_step(previousturf, set_dir) @@ -362,19 +362,19 @@ Difficulty: Hard return var/turf/T = get_turf(victim) var/turf/source = get_turf(src) - new /obj/effect/overlay/temp/hierophant/telegraph(T, src) - new /obj/effect/overlay/temp/hierophant/telegraph(source, src) + new /obj/effect/temp_visual/hierophant/telegraph(T, src) + new /obj/effect/temp_visual/hierophant/telegraph(source, src) playsound(T,'sound/magic/Wand_Teleport.ogg', 200, 1) playsound(source,'sound/machines/AirlockOpen.ogg', 200, 1) blinking = TRUE sleep(2) //short delay before we start... - new /obj/effect/overlay/temp/hierophant/telegraph/teleport(T, src) - new /obj/effect/overlay/temp/hierophant/telegraph/teleport(source, src) + new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, src) + new /obj/effect/temp_visual/hierophant/telegraph/teleport(source, src) for(var/t in RANGE_TURFS(1, T)) - var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, src, FALSE) + var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, src, FALSE) B.damage = 30 for(var/t in RANGE_TURFS(1, source)) - var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, src, FALSE) + var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, src, FALSE) B.damage = 30 animate(src, alpha = 0, time = 2, easing = EASE_OUT) //fade out sleep(1) @@ -396,11 +396,11 @@ Difficulty: Hard var/turf/T = get_turf(victim) if(!T) return - new /obj/effect/overlay/temp/hierophant/telegraph(T, src) + new /obj/effect/temp_visual/hierophant/telegraph(T, src) playsound(T,'sound/effects/bin_close.ogg', 200, 1) sleep(2) for(var/t in RANGE_TURFS(1, T)) - new /obj/effect/overlay/temp/hierophant/blast(t, src, FALSE) + new /obj/effect/temp_visual/hierophant/blast(t, src, FALSE) /mob/living/simple_animal/hostile/megafauna/hierophant/proc/burst(turf/original) //release a wave of blasts playsound(original,'sound/machines/AirlockOpen.ogg', 200, 1) @@ -413,7 +413,7 @@ Difficulty: Hard if(dist > last_dist) last_dist = dist sleep(1 + min(burst_range - last_dist, 12) * 0.5) //gets faster as it gets further out - new /obj/effect/overlay/temp/hierophant/blast(T, src, FALSE) + new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE) /mob/living/simple_animal/hostile/megafauna/hierophant/AltClickOn(atom/A) //player control handler(don't give this to a player holy fuck) if(!istype(A) || get_dist(A, src) <= 2) @@ -421,29 +421,29 @@ Difficulty: Hard blink(A) //Hierophant overlays -/obj/effect/overlay/temp/hierophant +/obj/effect/temp_visual/hierophant name = "vortex energy" layer = BELOW_MOB_LAYER var/mob/living/caster //who made this, anyway -/obj/effect/overlay/temp/hierophant/Initialize(mapload, new_caster) +/obj/effect/temp_visual/hierophant/Initialize(mapload, new_caster) . = ..() if(new_caster) caster = new_caster -/obj/effect/overlay/temp/hierophant/squares +/obj/effect/temp_visual/hierophant/squares icon_state = "hierophant_squares" duration = 3 light_range = 1 randomdir = FALSE -/obj/effect/overlay/temp/hierophant/squares/Initialize(mapload, new_caster) +/obj/effect/temp_visual/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 were not friends, but pooling is dead. +/obj/effect/temp_visual/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,21 +451,21 @@ Difficulty: Hard duration = 100 smooth = SMOOTH_TRUE -/obj/effect/overlay/temp/hierophant/wall/Initialize(mapload, new_caster) +/obj/effect/temp_visual/hierophant/wall/Initialize(mapload, new_caster) . = ..() queue_smooth_neighbors(src) queue_smooth(src) -/obj/effect/overlay/temp/hierophant/wall/Destroy() +/obj/effect/temp_visual/hierophant/wall/Destroy() queue_smooth_neighbors(src) return ..() -/obj/effect/overlay/temp/hierophant/wall/CanPass(atom/movable/mover, turf/target, height = 0) +/obj/effect/temp_visual/hierophant/wall/CanPass(atom/movable/mover, turf/target, height = 0) if(mover == caster) return TRUE return FALSE -/obj/effect/overlay/temp/hierophant/chaser //a hierophant's chaser. follows target around, moving and producing a blast every speed deciseconds. +/obj/effect/temp_visual/hierophant/chaser //a hierophant's chaser. follows target around, moving and producing a blast every speed deciseconds. duration = 98 var/mob/living/target //what it's following var/turf/targetturf //what turf the target is actually on @@ -479,9 +479,9 @@ Difficulty: Hard var/currently_seeking = FALSE var/friendly_fire_check = FALSE //if blasts produced apply friendly fire var/monster_damage_boost = TRUE - var/damage = 10 + var/damage = 10 -/obj/effect/overlay/temp/hierophant/chaser/Initialize(mapload, new_caster, new_target, new_speed, is_friendly_fire) +/obj/effect/temp_visual/hierophant/chaser/Initialize(mapload, new_caster, new_target, new_speed, is_friendly_fire) . = ..() target = new_target friendly_fire_check = is_friendly_fire @@ -489,14 +489,14 @@ Difficulty: Hard speed = new_speed addtimer(CALLBACK(src, .proc/seek_target), 1) -/obj/effect/overlay/temp/hierophant/chaser/proc/get_target_dir() +/obj/effect/temp_visual/hierophant/chaser/proc/get_target_dir() . = get_cardinal_dir(src, targetturf) if((. != previous_moving_dir && . == more_previouser_moving_dir) || . == 0) //we're alternating, recalculate var/list/cardinal_copy = GLOB.cardinal.Copy() cardinal_copy -= more_previouser_moving_dir . = pick(cardinal_copy) -/obj/effect/overlay/temp/hierophant/chaser/proc/seek_target() +/obj/effect/temp_visual/hierophant/chaser/proc/seek_target() if(!currently_seeking) currently_seeking = TRUE targetturf = get_turf(target) @@ -523,33 +523,34 @@ Difficulty: Hard moving-- sleep(speed) targetturf = get_turf(target) -/obj/effect/overlay/temp/hierophant/chaser/proc/make_blast() - var/obj/effect/overlay/temp/hierophant/blast/B = new(loc, caster, friendly_fire_check) + +/obj/effect/temp_visual/hierophant/chaser/proc/make_blast() + var/obj/effect/temp_visual/hierophant/blast/B = new(loc, caster, friendly_fire_check) B.damage = damage B.monster_damage_boost = monster_damage_boost -/obj/effect/overlay/temp/hierophant/telegraph +/obj/effect/temp_visual/hierophant/telegraph icon = 'icons/effects/96x96.dmi' icon_state = "hierophant_telegraph" pixel_x = -32 pixel_y = -32 duration = 3 -/obj/effect/overlay/temp/hierophant/telegraph/diagonal +/obj/effect/temp_visual/hierophant/telegraph/diagonal icon_state = "hierophant_telegraph_diagonal" -/obj/effect/overlay/temp/hierophant/telegraph/cardinal +/obj/effect/temp_visual/hierophant/telegraph/cardinal icon_state = "hierophant_telegraph_cardinal" -/obj/effect/overlay/temp/hierophant/telegraph/teleport +/obj/effect/temp_visual/hierophant/telegraph/teleport icon_state = "hierophant_telegraph_teleport" duration = 9 -/obj/effect/overlay/temp/hierophant/telegraph/edge +/obj/effect/temp_visual/hierophant/telegraph/edge icon_state = "hierophant_telegraph_edge" duration = 40 -/obj/effect/overlay/temp/hierophant/blast +/obj/effect/temp_visual/hierophant/blast icon_state = "hierophant_blast" name = "vortex blast" light_range = 1 @@ -561,7 +562,7 @@ 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/Initialize(mapload, new_caster, friendly_fire) +/obj/effect/temp_visual/hierophant/blast/Initialize(mapload, new_caster, friendly_fire) . = ..() friendly_fire_check = friendly_fire if(new_caster) @@ -571,7 +572,7 @@ Difficulty: Hard M.gets_drilled(caster) INVOKE_ASYNC(src, .proc/blast) -/obj/effect/overlay/temp/hierophant/blast/proc/blast() +/obj/effect/temp_visual/hierophant/blast/proc/blast() var/turf/T = get_turf(src) if(!T) return @@ -582,12 +583,12 @@ Difficulty: Hard sleep(1.3) //slightly forgiving; the burst animation is 1.5 deciseconds bursting = FALSE //we no longer damage crossers -/obj/effect/overlay/temp/hierophant/blast/Crossed(atom/movable/AM) +/obj/effect/temp_visual/hierophant/blast/Crossed(atom/movable/AM) ..() if(bursting) do_damage(get_turf(src)) -/obj/effect/overlay/temp/hierophant/blast/proc/do_damage(turf/T) +/obj/effect/temp_visual/hierophant/blast/proc/do_damage(turf/T) for(var/mob/living/L in T.contents - hit_things) //find and damage mobs... hit_things += L if((friendly_fire_check && caster && caster.faction_check_mob(L)) || L.stat == DEAD) @@ -634,7 +635,7 @@ Difficulty: Hard INVOKE_ASYNC(H, /obj/item/weapon/hierophant_club.proc/prepare_icon_update) if(do_after(user, 50, target = src)) playsound(src,'sound/magic/Blind.ogg', 200, 1, -4) - new /obj/effect/overlay/temp/hierophant/telegraph/teleport(get_turf(src), user) + new /obj/effect/temp_visual/hierophant/telegraph/teleport(get_turf(src), user) to_chat(user, "You collect [src], reattaching it to the club!") H.beacon = null user.update_action_buttons_icon() 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 0a0ff6bdd3..9b8e037d61 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -8,7 +8,7 @@ maxHealth = 1000 a_intent = INTENT_HARM sentience_type = SENTIENCE_BOSS - environment_smash = 3 + environment_smash = ENVIRONMENT_SMASH_RWALLS obj_damage = 400 light_range = 3 faction = list("mining", "boss") diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 16df9e4c7a..da45e31d1e 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -203,7 +203,7 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca if(..()) emote_see = list("aims menacingly") obj_damage = 0 - environment_smash = 0 //needed? seems weird for them to do so + environment_smash = ENVIRONMENT_SMASH_NONE //needed? seems weird for them to do so ranged = 1 retreat_distance = 1 //just enough to shoot minimum_distance = 6 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 a68ccc4884..e3e4e37396 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -4,7 +4,7 @@ faction = list("mining") weather_immunities = list("lava","ash") obj_damage = 30 - environment_smash = 2 + environment_smash = ENVIRONMENT_SMASH_WALLS minbodytemp = 0 maxbodytemp = INFINITY response_help = "pokes" @@ -215,7 +215,7 @@ ranged_cooldown = 0 ranged_cooldown_time = 20 obj_damage = 0 - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE retreat_distance = 3 minimum_distance = 3 pass_flags = PASSTABLE @@ -334,7 +334,7 @@ attack_sound = 'sound/weapons/pierce.ogg' throw_message = "falls right through the strange body of the" obj_damage = 0 - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE pass_flags = PASSTABLE del_on_death = 1 @@ -595,7 +595,7 @@ aggro_vision_range = 9 idle_vision_range = 5 mob_size = MOB_SIZE_SMALL - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE var/wumbo = 0 var/inflate_cooldown = 0 loot = list(/obj/item/asteroid/fugu_gland{layer = ABOVE_MOB_LAYER}) @@ -640,7 +640,7 @@ minimum_distance = 1 move_to_delay = 6 transform *= 2 - environment_smash = 2 + environment_smash = ENVIRONMENT_SMASH_WALLS mob_size = MOB_SIZE_LARGE speed = 1 addtimer(CALLBACK(src, .proc/Deflate), 100) @@ -660,7 +660,7 @@ move_to_delay = 2 transform /= 2 inflate_cooldown = 4 - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE mob_size = MOB_SIZE_SMALL speed = 0 @@ -800,11 +800,12 @@ del_on_death = 1 stat_attack = 1 robust_searching = 1 + var/can_infest_dead = FALSE /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/Life() if(isturf(loc)) for(var/mob/living/carbon/human/H in view(src,1)) //Only for corpse right next to/on same tile - if(H.stat == UNCONSCIOUS) + if(H.stat == UNCONSCIOUS || (can_infest_dead && H.stat == DEAD)) infest(H) ..() @@ -818,6 +819,58 @@ H.forceMove(L) qdel(src) +//Advanced Legion is slightly tougher to kill and can raise corpses (revive other legions) + +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/advanced + stat_attack = 2 + maxHealth = 120 + health = 120 + brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced + icon_state = "dwarf_legion" + +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced + stat_attack = 2 + can_infest_dead = TRUE + +//Legion that spawns Legions + +/mob/living/simple_animal/hostile/spawner/legion + name = "legion" + desc = "One of many." + icon = 'icons/mob/lavaland/dragon.dmi' + icon_state = "legion" + icon_living = "legion" + icon_dead = "legion" + health = 450 + maxHealth = 450 + max_mobs = 3 + spawn_time = 200 + spawn_text = "peels itself off from" + melee_damage_lower = 20 + melee_damage_upper = 20 + anchored = FALSE + AIStatus = AI_ON + stop_automated_movement = FALSE + wander = TRUE + maxbodytemp = INFINITY + layer = MOB_LAYER + del_on_death = TRUE + sentience_type = SENTIENCE_BOSS + loot = list(/obj/item/organ/hivelord_core/legion = 3, /obj/effect/mob_spawn/human/corpse/damaged = 5) + move_to_delay = 14 + vision_range = 5 + aggro_vision_range = 9 + idle_vision_range = 5 + speed = 3 + faction = list("mining") + weather_immunities = list("lava","ash") + obj_damage = 30 + environment_smash = ENVIRONMENT_SMASH_STRUCTURES + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + +//Organ + /obj/item/organ/hivelord_core/legion name = "legion's soul" desc = "A strange rock that still crackles with power... its \ @@ -871,7 +924,7 @@ speak_chance = 1 turns_per_move = 8 obj_damage = 0 - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE move_to_delay = 15 response_help = "pets" response_disarm = "gently pushes aside" diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index d82a332027..125f96384b 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -20,7 +20,7 @@ attacktext = "chomps" attack_sound = 'sound/weapons/bite.ogg' faction = list("mushroom") - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE stat_attack = 2 mouse_opacity = 1 speed = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm index 3eb8e85c93..57d016ae68 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm @@ -22,7 +22,7 @@ faction = list("hostile") attack_sound = 'sound/weapons/bite.ogg' obj_damage = 0 - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE ventcrawler = VENTCRAWLER_ALWAYS mob_size = MOB_SIZE_TINY movement_type = FLYING diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm index f0029af0d3..fb365aeb87 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm @@ -23,7 +23,7 @@ attacktext = "attacks" attack_sound = 'sound/items/bikehorn.ogg' obj_damage = 0 - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE del_on_death = 1 loot = list(/obj/effect/mob_spawn/human/clown/corpse) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm index 4a8c99a111..563c5a3d03 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm @@ -20,6 +20,6 @@ attacktext = "hits" attack_sound = 'sound/weapons/punch1.ogg' obj_damage = 0 - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE del_on_death = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/stickman.dm b/code/modules/mob/living/simple_animal/hostile/stickman.dm index 3f4267e164..15dfd7ad9d 100644 --- a/code/modules/mob/living/simple_animal/hostile/stickman.dm +++ b/code/modules/mob/living/simple_animal/hostile/stickman.dm @@ -14,7 +14,7 @@ speed = 0 stat_attack = 1 robust_searching = 1 - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE maxHealth = 100 health = 100 harm_intent_damage = 5 @@ -52,7 +52,7 @@ /mob/living/simple_animal/hostile/stickman/Initialize(mapload, var/wizard_summoned) ..() - new /obj/effect/overlay/temp/paper_scatter(src) + new /obj/effect/temp_visual/paper_scatter(src) summoned_by_wizard = wizard_summoned /mob/living/simple_animal/hostile/stickman/death() diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 20724fe179..b7b8b5aa85 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -131,7 +131,7 @@ minimum_distance = 10 retreat_distance = 10 obj_damage = 0 - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE /mob/living/simple_animal/hostile/syndicate/civilian/Aggro() ..() @@ -150,7 +150,7 @@ melee_damage_lower = 15 melee_damage_upper = 15 obj_damage = 0 - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE attacktext = "cuts" attack_sound = 'sound/weapons/bladeslice.ogg' faction = list("syndicate") diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 831058a284..31aa1ea589 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -51,7 +51,7 @@ var/attacktext = "attacks" var/attack_sound = null var/friendly = "nuzzles" //If the mob does no damage with it's attack - var/environment_smash = 0 //Set to 1 to allow breaking of crates,lockers,racks,tables; 2 for walls; 3 for Rwalls + var/environment_smash = ENVIRONMENT_SMASH_NONE //Set to 1 to allow breaking of crates,lockers,racks,tables; 2 for walls; 3 for Rwalls var/speed = 1 //LETS SEE IF I CAN SET SPEEDS FOR SIMPLE MOBS WITHOUT DESTROYING EVERYTHING. Higher speed is slower, negative speed is faster @@ -249,7 +249,7 @@ /mob/living/simple_animal/gib_animation() if(icon_gib) - new /obj/effect/overlay/temp/gib_animation/animal(loc, icon_gib) + new /obj/effect/temp_visual/gib_animation/animal(loc, icon_gib) /mob/living/simple_animal/say_mod(input, message_mode) if(speak_emote && speak_emote.len) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index c6680a28f0..b890208d2b 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -293,14 +293,14 @@ if(!src || !isturf(src.loc) || !(A in view(src.loc))) return 0 - if(istype(A, /obj/effect/overlay/temp/point)) + if(istype(A, /obj/effect/temp_visual/point)) return 0 var/tile = get_turf(A) if (!tile) return 0 - new /obj/effect/overlay/temp/point(A,invisibility) + new /obj/effect/temp_visual/point(A,invisibility) return 1 diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index f9d1f59717..e85dca9cad 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -242,12 +242,12 @@ L.loc = locate(locx,locy,mobloc.z) var/limit = 2//For only two trailing shadows. for(var/turf/T in getline(mobloc, L.loc)) - new /obj/effect/overlay/temp/dir_setting/ninja/shadow(T, L.dir) + new /obj/effect/temp_visual/dir_setting/ninja/shadow(T, L.dir) limit-- if(limit<=0) break else - new /obj/effect/overlay/temp/dir_setting/ninja/shadow(mobloc, L.dir) + new /obj/effect/temp_visual/dir_setting/ninja/shadow(mobloc, L.dir) L.loc = get_step(L, direct) L.setDir(direct) if(3) //Incorporeal move, but blocked by holy-watered tiles and salt piles. @@ -295,8 +295,12 @@ return A else var/atom/movable/AM = A - if(AM == buckled) //Kind of unnecessary but let's just be sure + if(AM == buckled) continue + if(ismob(AM)) + var/mob/M = AM + if(M.buckled) + continue if(!AM.CanPass(src) || AM.density) if(AM.anchored) return AM diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 9e5e86836b..58db8cb848 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -36,7 +36,7 @@ cut_overlays() invisibility = INVISIBILITY_MAXIMUM - new /obj/effect/overlay/temp/monkeyify(loc) + new /obj/effect/temp_visual/monkeyify(loc) sleep(22) var/mob/living/carbon/monkey/O = new /mob/living/carbon/monkey( loc ) @@ -186,7 +186,7 @@ icon = null cut_overlays() invisibility = INVISIBILITY_MAXIMUM - new /obj/effect/overlay/temp/monkeyify/humanify(loc) + new /obj/effect/temp_visual/monkeyify/humanify(loc) sleep(22) var/mob/living/carbon/human/O = new( loc ) for(var/obj/item/C in O.loc) diff --git a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm index 1f5fdc6ea0..619ae359d3 100644 --- a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm +++ b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm @@ -72,7 +72,7 @@ It is possible to destroy the net by the occupant or someone else. M.dropItemToGround(W) playsound(M.loc, 'sound/effects/sparks4.ogg', 50, 1) - new /obj/effect/overlay/temp/dir_setting/ninja/phase/out(get_turf(M), M.dir) + new /obj/effect/temp_visual/dir_setting/ninja/phase/out(get_turf(M), M.dir) visible_message("[M] suddenly vanishes!") M.forceMove(pick(GLOB.holdingfacility)) //Throw mob in to the holding facility. @@ -86,7 +86,7 @@ It is possible to destroy the net by the occupant or someone else. spark_system.start() playsound(M.loc, 'sound/effects/phasein.ogg', 25, 1) playsound(M.loc, 'sound/effects/sparks2.ogg', 50, 1) - new /obj/effect/overlay/temp/dir_setting/ninja/phase(get_turf(M), M.dir) + new /obj/effect/temp_visual/dir_setting/ninja/phase(get_turf(M), M.dir) qdel(src) else//And they are free. diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_teleporting.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_teleporting.dm index 42f1af6c0e..74dcec12ce 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_teleporting.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_teleporting.dm @@ -27,7 +27,7 @@ Contents: if(destination && isturf(mobloc))//So we don't teleport out of containers playsound(H.loc, "sparks", 50, 1) - new /obj/effect/overlay/temp/dir_setting/ninja/phase/out(get_turf(H), H.dir) + new /obj/effect/temp_visual/dir_setting/ninja/phase/out(get_turf(H), H.dir) handle_teleport_grab(destination, H) H.loc = destination @@ -35,7 +35,7 @@ Contents: spark_system.start() playsound(H.loc, 'sound/effects/phasein.ogg', 25, 1) playsound(H.loc, "sparks", 50, 1) - new /obj/effect/overlay/temp/dir_setting/ninja/phase(get_turf(H), H.dir) + new /obj/effect/temp_visual/dir_setting/ninja/phase(get_turf(H), H.dir) destination.phase_damage_creatures(20,H)//Paralyse and damage mobs and mechas on the turf s_coold = 1 @@ -55,7 +55,7 @@ Contents: var/turf/mobloc = get_turf(H.loc)//To make sure that certain things work properly below. if(!T.density && isturf(mobloc)) playsound(H.loc, "sparks", 50, 1) - new /obj/effect/overlay/temp/dir_setting/ninja/phase/out(get_turf(H), H.dir) + new /obj/effect/temp_visual/dir_setting/ninja/phase/out(get_turf(H), H.dir) handle_teleport_grab(T, H) H.forceMove(T) @@ -63,7 +63,7 @@ Contents: spark_system.start() playsound(H.loc, 'sound/effects/phasein.ogg', 25, 1) playsound(H.loc, "sparks", 50, 1) - new /obj/effect/overlay/temp/dir_setting/ninja/phase(get_turf(H), H.dir) + new /obj/effect/temp_visual/dir_setting/ninja/phase(get_turf(H), H.dir) T.phase_damage_creatures(20,H)//Paralyse and damage mobs and mechas on the turf s_coold = 1 diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 0dc080bd19..976e48707b 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -44,8 +44,8 @@ ..() -/obj/item/weapon/paper/New() - ..() +/obj/item/weapon/paper/Initialize() + . = ..() pixel_y = rand(-8, 8) pixel_x = rand(-9, 9) update_icon() diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index cf7c28d2ba..0818c7c32f 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -110,7 +110,7 @@ papers.Add(P) total_paper++ update_icon() - else if(istype(I, /obj/item/weapon/pen)) + else if(istype(I, /obj/item/weapon/pen) && !bin_pen) var/obj/item/weapon/pen/P = I if(!user.transferItemToLoc(P, src)) return diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 7f4777e300..866041d883 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -53,8 +53,8 @@ desc = "A strangely translucent and iridescent crystal that looks like it used to be part of a larger structure." icon = 'icons/obj/supermatter.dmi' icon_state = "darkmatter_shard" - density = 1 - anchored = 0 + density = TRUE + anchored = FALSE light_range = 4 resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF @@ -74,7 +74,7 @@ var/emergency_alert = "CRYSTAL DELAMINATION IMMINENT." var/explosion_point = 900 - var/emergency_issued = 0 + var/emergency_issued = FALSE var/explosion_power = 12 var/temp_factor = 30 @@ -116,12 +116,12 @@ var/common_channel = null //for logging - var/has_been_powered = 0 - var/has_reached_emergency = 0 + var/has_been_powered = FALSE + var/has_reached_emergency = FALSE // For making hugbox supermatter - var/takes_damage = 1 - var/produces_gas = 1 + var/takes_damage = TRUE + var/produces_gas = TRUE var/obj/effect/countdown/supermatter/countdown /obj/machinery/power/supermatter_shard/make_frozen_visual() @@ -385,7 +385,7 @@ /obj/machinery/power/supermatter_shard/bullet_act(obj/item/projectile/Proj) var/turf/L = loc if(!istype(L)) // We don't run process() when we are in space - return 0 // This stops people from being able to really power up the supermatter + return FALSE // This stops people from being able to really power up the supermatter // Then bring it inside to explode instantly upon landing on a valid turf. if(!istype(Proj.firer, /obj/machinery/power/emitter)) investigate_log("has been hit by [Proj] fired by [Proj.firer]", "supermatter") @@ -394,10 +394,10 @@ if(!has_been_powered) investigate_log("has been powered for the first time.", "supermatter") message_admins("[src] has been powered for the first time [ADMIN_JMP(src)].") - has_been_powered = 1 + has_been_powered = TRUE else if(takes_damage) damage += Proj.damage * config_bullet_energy - return 0 + return FALSE /obj/machinery/power/supermatter_shard/singularity_act() var/gain = 100 @@ -409,7 +409,7 @@ M << 'sound/effects/supermatter.ogg' //everyone goan know bout this to_chat(M, "A horrible screeching fills your ears, and a wave of dread washes over you...") qdel(src) - return(gain) + return gain /obj/machinery/power/supermatter_shard/blob_act(obj/structure/blob/B) if(B && !isspaceturf(loc)) //does nothing in space @@ -450,7 +450,7 @@ user.visible_message("\The [user] reaches out and touches \the [src], inducing a resonance... [user.p_their()] body starts to glow and bursts into flames before flashing into ash.",\ "You reach out and touch \the [src]. Everything starts burning and all you can hear is ringing. Your last thought is \"That was not a wise decision.\"",\ "You hear an unearthly noise as a wave of heat washes over you.") - + investigate_log("has been attacked (hand) by [user]", "supermatter") playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1) Consume(user) @@ -464,11 +464,11 @@ if(!istype(W) || (W.flags & ABSTRACT) || !istype(user)) return if(user.drop_item(W)) - Consume(W) user.visible_message("As [user] touches \the [src] with \a [W], silence fills the room...",\ "You touch \the [src] with \the [W], and everything suddenly goes silent.\n\The [W] flashes into dust as you flinch away from \the [src].",\ "Everything suddenly goes silent.") - + investigate_log("has been attacked ([W]) by [user]", "supermatter") + Consume(W) playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1) radiation_pulse(get_turf(src), 1, 1, 150, 1) @@ -517,15 +517,15 @@ // When you wanna make a supermatter shard for the dramatic effect, but // don't want it exploding suddenly /obj/machinery/power/supermatter_shard/hugbox - takes_damage = 0 - produces_gas = 0 + takes_damage = FALSE + produces_gas = FALSE /obj/machinery/power/supermatter_shard/crystal name = "supermatter crystal" desc = "A strangely translucent and iridescent crystal." base_icon_state = "darkmatter" icon_state = "darkmatter" - anchored = 1 + anchored = TRUE gasefficency = 0.15 explosion_power = 35 diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index f873ef6083..18eb546b6c 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -16,7 +16,7 @@ var/randomspread = 0 //Randomspread for automatics var/delay = 0 //Delay for energy weapons var/click_cooldown_override = 0 //Override this to make your gun have a faster fire rate, in tenths of a second. 4 is the default gun cooldown. - var/firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect //the visual effect appearing when the ammo is fired. + var/firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect //the visual effect appearing when the ammo is fired. /obj/item/ammo_casing/New() diff --git a/code/modules/projectiles/ammunition/caseless.dm b/code/modules/projectiles/ammunition/caseless.dm index 9ba066ef95..0480476a74 100644 --- a/code/modules/projectiles/ammunition/caseless.dm +++ b/code/modules/projectiles/ammunition/caseless.dm @@ -45,7 +45,7 @@ icon_state = "s-casing-live" projectile_type = /obj/item/projectile/beam fire_sound = 'sound/weapons/Laser.ogg' - firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect/energy + firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy /obj/item/ammo_casing/caseless/laser/gatling projectile_type = /obj/item/projectile/beam/weak diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm index ba4770ebba..7da945a5b8 100644 --- a/code/modules/projectiles/ammunition/energy.dm +++ b/code/modules/projectiles/ammunition/energy.dm @@ -6,7 +6,7 @@ var/e_cost = 100 //The amount of energy a cell needs to expend to create this shot. var/select_name = "energy" fire_sound = 'sound/weapons/Laser.ogg' - firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect/energy + firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy /obj/item/ammo_casing/energy/chameleon projectile_type = /obj/item/projectile/energy/chameleon diff --git a/code/modules/projectiles/ammunition/special.dm b/code/modules/projectiles/ammunition/special.dm index 16ec87e043..bd57d7c07a 100644 --- a/code/modules/projectiles/ammunition/special.dm +++ b/code/modules/projectiles/ammunition/special.dm @@ -2,7 +2,7 @@ name = "magic casing" desc = "I didn't even know magic needed ammo..." projectile_type = /obj/item/projectile/magic - firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect/magic + firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/magic /obj/item/ammo_casing/magic/change projectile_type = /obj/item/projectile/magic/change @@ -89,4 +89,4 @@ select_name = "spraydown" fire_sound = 'sound/weapons/gunshot_smg.ogg' e_cost = 20 - firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect + firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect diff --git a/code/modules/projectiles/boxes_magazines/external_mag.dm b/code/modules/projectiles/boxes_magazines/external_mag.dm index 11112ec974..8733cd2e1e 100644 --- a/code/modules/projectiles/boxes_magazines/external_mag.dm +++ b/code/modules/projectiles/boxes_magazines/external_mag.dm @@ -13,6 +13,21 @@ max_ammo = 8 multiple_sprites = 2 +/obj/item/ammo_box/magazine/m10mm/rifle + name = "rifle magazine (10mm)" + desc = "A well-worn magazine fitted for the surplus rifle." + icon_state = "75-8" + origin_tech = "combat=2" + ammo_type = /obj/item/ammo_casing/c10mm + caliber = "10mm" + max_ammo = 10 + +/obj/item/ammo_box/magazine/m10mm/rifle/update_icon() + if(ammo_count()) + icon_state = "75-8" + else + icon_state = "75-0" + /obj/item/ammo_box/magazine/m10mm/fire name = "pistol magazine (10mm incendiary)" desc = "A gun magazine. Loaded with rounds which ignite the target." @@ -52,16 +67,31 @@ /obj/item/ammo_box/magazine/wt550m9/wtap name = "wt550 magazine (Armour Piercing 4.6x30mm)" + icon_state = "46x30mmtA-20" ammo_type = /obj/item/ammo_casing/c46x30mmap +/obj/item/ammo_box/magazine/wt550m9/wtap/update_icon() + ..() + icon_state = "46x30mmtA-[round(ammo_count(),4)]" + /obj/item/ammo_box/magazine/wt550m9/wttx name = "wt550 magazine (Toxin Tipped 4.6x30mm)" + icon_state = "46x30mmtT-20" ammo_type = /obj/item/ammo_casing/c46x30mmtox +/obj/item/ammo_box/magazine/wt550m9/wttx/update_icon() + ..() + icon_state = "46x30mmtT-[round(ammo_count(),4)]" + /obj/item/ammo_box/magazine/wt550m9/wtic name = "wt550 magazine (Incindiary 4.6x30mm)" + icon_state = "46x30mmtI-20" ammo_type = /obj/item/ammo_casing/c46x30mminc +/obj/item/ammo_box/magazine/wt550m9/wtic/update_icon() + ..() + icon_state = "46x30mmtI-[round(ammo_count(),4)]" + /obj/item/ammo_box/magazine/uzim9mm name = "uzi magazine (9mm)" icon_state = "uzi9mm-32" diff --git a/code/modules/projectiles/boxes_magazines/internal_mag.dm b/code/modules/projectiles/boxes_magazines/internal_mag.dm index 3e7112ffed..9476d728a6 100644 --- a/code/modules/projectiles/boxes_magazines/internal_mag.dm +++ b/code/modules/projectiles/boxes_magazines/internal_mag.dm @@ -109,6 +109,11 @@ ammo_type = /obj/item/ammo_casing/shotgun/buckshot max_ammo = 6 +/obj/item/ammo_box/magazine/internal/shot/com/compact + name = "compact combat shotgun internal magazine" + ammo_type = /obj/item/ammo_casing/shotgun/buckshot + max_ammo = 4 + /obj/item/ammo_box/magazine/internal/shot/dual name = "double-barrel shotgun internal magazine" max_ammo = 2 diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 1ffdaf0d29..0235bbe84d 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -375,8 +375,29 @@ pin = /obj/item/device/firing_pin/implant/pindicate origin_tech = "combat=7;syndicate=6" +// Old Semi-Auto Rifle // +/obj/item/weapon/gun/ballistic/automatic/surplus + name = "Surplus Rifle" + desc = "One of countless obsolete ballistic rifles that still sees use as a cheap deterrent. Uses 10mm ammo and its bulky frame prevents one-hand firing." + origin_tech = "combat=3;materials=2" + icon_state = "surplus" + item_state = "moistnugget" + weapon_weight = WEAPON_HEAVY + mag_type = /obj/item/ammo_box/magazine/m10mm/rifle + fire_delay = 30 + burst_size = 1 + can_unsuppress = 1 + can_suppress = 1 + w_class = WEIGHT_CLASS_HUGE + slot_flags = SLOT_BACK + actions_types = list() +/obj/item/weapon/gun/ballistic/automatic/surplus/update_icon() + if(magazine) + icon_state = "surplus" + else + icon_state = "surplus-e" // Laser rifle (rechargeable magazine) // diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 6ce52748ec..ac3c56b88a 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -344,6 +344,15 @@ slung = 0 update_icon() +/obj/item/weapon/gun/ballistic/revolver/doublebarrel/improvised/sawn + name = "sawn-off improvised shotgun" + desc = "A single-shot shotgun, better not miss" + icon_state = "ishotgun" + item_state = "gun" + w_class = WEIGHT_CLASS_NORMAL + sawn_state = SAWN_OFF + slot_flags = SLOT_BELT + /obj/item/weapon/gun/ballistic/revolver/reverse //Fires directly at its user... unless the user is a clown, of course. clumsy_check = 0 diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 7195afd146..5f376370d4 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -192,6 +192,14 @@ mag_type = /obj/item/ammo_box/magazine/internal/shot/com w_class = WEIGHT_CLASS_HUGE +/obj/item/weapon/gun/ballistic/shotgun/automatic/combat/compact + name = "compact combat shotgun" + desc = "A compact version of the semi automatic combat shotgun. For close encounters." + icon_state = "cshotgunc" + origin_tech = "combat=4;materials=2" + mag_type = /obj/item/ammo_box/magazine/internal/shot/com/compact + w_class = WEIGHT_CLASS_BULKY + //Dual Feed Shotgun /obj/item/weapon/gun/ballistic/shotgun/automatic/dual_tube diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 0a886a76d1..0f108fcc76 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -198,7 +198,7 @@ if(ismineralturf(target_turf)) var/turf/closed/mineral/M = target_turf M.gets_drilled(firer) - var/obj/effect/overlay/temp/kinetic_blast/K = new /obj/effect/overlay/temp/kinetic_blast(target_turf) + var/obj/effect/temp_visual/kinetic_blast/K = new /obj/effect/temp_visual/kinetic_blast(target_turf) K.color = color for(var/obj/item/borg/upgrade/modkit/M in kinetic_modules) if(QDELETED(M)) //whoever shot this was very, very unfortunate. @@ -358,7 +358,7 @@ /obj/item/borg/upgrade/modkit/aoe/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target) if(stats_stolen) return - new /obj/effect/overlay/temp/explosion/fast(target_turf) + new /obj/effect/temp_visual/explosion/fast(target_turf) if(turf_aoe) for(var/T in RANGE_TURFS(1, target_turf) - target_turf) if(ismineralturf(T)) @@ -370,7 +370,6 @@ L.apply_damage(K.damage*modifier, K.damage_type, K.def_zone, armor) to_chat(L, "You're struck by a [K.name]!") - /obj/item/borg/upgrade/modkit/aoe/turfs name = "mining explosion" desc = "Causes the kinetic accelerator to destroy rock in an AoE." @@ -392,11 +391,11 @@ //Indoors /obj/item/borg/upgrade/modkit/indoors name = "decrease pressure penalty" - desc = "Increases the damage a kinetic accelerator does in a high pressure environment." + desc = "A syndicate modification kit that increases the damage a kinetic accelerator does in a high pressure environment." modifier = 2 denied_type = /obj/item/borg/upgrade/modkit/indoors maximum_of_type = 2 - cost = 40 + cost = 35 /obj/item/borg/upgrade/modkit/indoors/modify_projectile(obj/item/projectile/kinetic/K) K.pressure_decrease *= modifier diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index b938e399df..b3e55f2423 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -5,7 +5,7 @@ item_state = null w_class = WEIGHT_CLASS_BULKY force = 10 - modifystate = TRUE + modifystate = TRUE flags = CONDUCT slot_flags = SLOT_BACK ammo_type = list(/obj/item/ammo_casing/energy/laser/pulse, /obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser) @@ -40,7 +40,7 @@ w_class = WEIGHT_CLASS_NORMAL slot_flags = SLOT_BELT icon_state = "pulse_carbine" - item_state = null + item_state = null cell_type = "/obj/item/weapon/stock_parts/cell/pulse/carbine" can_flashlight = 1 flight_x_offset = 18 diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/medbeam.dm index 32646ee1e8..37d576a8ff 100644 --- a/code/modules/projectiles/guns/medbeam.dm +++ b/code/modules/projectiles/guns/medbeam.dm @@ -113,7 +113,7 @@ /obj/item/weapon/gun/medbeam/proc/on_beam_tick(var/mob/living/target) if(target.health != target.maxHealth) - new /obj/effect/overlay/temp/heal(get_turf(target), "#80F5FF") + new /obj/effect/temp_visual/heal(get_turf(target), "#80F5FF") target.adjustBruteLoss(-4) target.adjustFireLoss(-4) return diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 3dedaa9ae1..3dbadc85c5 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -90,9 +90,9 @@ if(starting) splatter_dir = get_dir(starting, target_loca) if(isalien(L)) - new /obj/effect/overlay/temp/dir_setting/bloodsplatter/xenosplatter(target_loca, splatter_dir) + new /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter(target_loca, splatter_dir) else - new /obj/effect/overlay/temp/dir_setting/bloodsplatter(target_loca, splatter_dir) + new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir) if(prob(33)) L.add_splatter_floor(target_loca) else if(impact_effect_type) @@ -224,7 +224,7 @@ pixel_y_offset += 32 old_pixel_y += 32 new_y-- - + pixel_x = old_pixel_x pixel_y = old_pixel_y step_towards(src, locate(new_x, new_y, z)) @@ -237,7 +237,7 @@ animate(src, pixel_x = pixel_x_offset, pixel_y = pixel_y_offset, time = max(1, (delay <= 3 ? delay - 1 : delay)), flags = ANIMATION_END_NOW) old_pixel_x = pixel_x_offset old_pixel_y = pixel_y_offset - + if(original && (original.layer>=2.75) || ismob(original)) if(loc == get_turf(original)) if(!(original in permutated)) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 6dbd01d372..766d8b5e39 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -9,7 +9,7 @@ hitsound_wall = 'sound/weapons/effects/searwall.ogg' flag = "laser" eyeblur = 2 - impact_effect_type = /obj/effect/overlay/temp/impact_effect/red_laser + impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser light_color = LIGHT_COLOR_RED /obj/item/projectile/beam/laser @@ -25,7 +25,7 @@ var/mob/living/carbon/M = target M.IgniteMob() else if(isturf(target)) - impact_effect_type = /obj/effect/overlay/temp/impact_effect/red_laser/wall + impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser/wall /obj/item/projectile/beam/weak damage = 15 @@ -48,7 +48,7 @@ irradiate = 30 range = 15 forcedodge = 1 - impact_effect_type = /obj/effect/overlay/temp/impact_effect/green_laser + impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser light_color = LIGHT_COLOR_GREEN /obj/item/projectile/beam/disabler @@ -59,14 +59,14 @@ flag = "energy" hitsound = 'sound/weapons/tap.ogg' eyeblur = 0 - impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser + impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser light_color = LIGHT_COLOR_BLUE /obj/item/projectile/beam/pulse name = "pulse" icon_state = "u_laser" damage = 50 - impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser + impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser light_color = LIGHT_COLOR_BLUE /obj/item/projectile/beam/pulse/on_hit(atom/target, blocked = 0) @@ -94,7 +94,7 @@ damage = 30 legacy = 1 animate_movement = SLIDE_STEPS - impact_effect_type = /obj/effect/overlay/temp/impact_effect/green_laser + impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser light_color = LIGHT_COLOR_GREEN /obj/item/projectile/beam/emitter/singularity_pull() @@ -108,7 +108,7 @@ damage_type = STAMINA flag = "laser" var/suit_types = list(/obj/item/clothing/suit/redtag, /obj/item/clothing/suit/bluetag) - impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser + impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser light_color = LIGHT_COLOR_BLUE /obj/item/projectile/beam/lasertag/on_hit(atom/target, blocked = 0) @@ -122,7 +122,7 @@ /obj/item/projectile/beam/lasertag/redtag icon_state = "laser" suit_types = list(/obj/item/clothing/suit/bluetag) - impact_effect_type = /obj/effect/overlay/temp/impact_effect/red_laser + impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser light_color = LIGHT_COLOR_RED /obj/item/projectile/beam/lasertag/bluetag @@ -134,17 +134,17 @@ icon_state = "purple_laser" damage = 200 damage_type = BURN - impact_effect_type = /obj/effect/overlay/temp/impact_effect/purple_laser + impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser light_color = LIGHT_COLOR_PURPLE /obj/item/projectile/beam/instakill/blue icon_state = "blue_laser" - impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser + impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser light_color = LIGHT_COLOR_BLUE /obj/item/projectile/beam/instakill/red icon_state = "red_laser" - impact_effect_type = /obj/effect/overlay/temp/impact_effect/red_laser + impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser light_color = LIGHT_COLOR_RED /obj/item/projectile/beam/instakill/on_hit(atom/target) diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index cceb77bee1..73355cd326 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -6,7 +6,7 @@ nodamage = 0 flag = "bullet" hitsound_wall = "ricochet" - impact_effect_type = /obj/effect/overlay/temp/impact_effect + impact_effect_type = /obj/effect/temp_visual/impact_effect /obj/item/projectile/bullet/weakbullet //beanbag, heavy stamina damage damage = 5 @@ -190,7 +190,7 @@ name = "dart" icon_state = "cbbolt" damage = 6 - var/piercing = FALSE + var/piercing = FALSE /obj/item/projectile/bullet/dart/New() ..() @@ -201,15 +201,15 @@ if(iscarbon(target)) var/mob/living/carbon/M = target if(blocked != 100) // not completely blocked - if(M.can_inject(null, FALSE, def_zone, piercing)) // Pass the hit zone to see if it can inject by whether it hit the head or the body. + if(M.can_inject(null, FALSE, def_zone, piercing)) // Pass the hit zone to see if it can inject by whether it hit the head or the body. ..() reagents.reaction(M, INJECT) reagents.trans_to(M, reagents.total_volume) - return TRUE + return TRUE else blocked = 100 - target.visible_message("\The [src] was deflected!", \ - "You were protected against \the [src]!") + target.visible_message("\The [src] was deflected!", \ + "You were protected against \the [src]!") ..(target, blocked) reagents.set_reacting(TRUE) @@ -240,28 +240,28 @@ nodamage = 1 . = ..() // Execute the rest of the code. -/obj/item/projectile/bullet/dnainjector - name = "\improper DNA injector" - icon_state = "syringeproj" - var/obj/item/weapon/dnainjector/injector - -/obj/item/projectile/bullet/dnainjector/on_hit(atom/target, blocked = 0) - if(iscarbon(target)) - var/mob/living/carbon/M = target - if(blocked != 100) - if(M.can_inject(null, FALSE, def_zone, FALSE)) - if(injector.inject(M, firer)) - QDEL_NULL(injector) - return TRUE - else - blocked = 100 - target.visible_message("\The [src] was deflected!", \ - "You were protected against \the [src]!") - return ..() - -/obj/item/projectile/bullet/dnainjector/Destroy() - QDEL_NULL(injector) - return ..() +/obj/item/projectile/bullet/dnainjector + name = "\improper DNA injector" + icon_state = "syringeproj" + var/obj/item/weapon/dnainjector/injector + +/obj/item/projectile/bullet/dnainjector/on_hit(atom/target, blocked = 0) + if(iscarbon(target)) + var/mob/living/carbon/M = target + if(blocked != 100) + if(M.can_inject(null, FALSE, def_zone, FALSE)) + if(injector.inject(M, firer)) + QDEL_NULL(injector) + return TRUE + else + blocked = 100 + target.visible_message("\The [src] was deflected!", \ + "You were protected against \the [src]!") + return ..() + +/obj/item/projectile/bullet/dnainjector/Destroy() + QDEL_NULL(injector) + return ..() //// SNIPER BULLETS diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index cfa7727186..f82fcca3e3 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -135,7 +135,7 @@ damage = 20 damage_type = CLONE irradiate = 10 - impact_effect_type = /obj/effect/overlay/temp/impact_effect/green_laser + impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser /obj/item/projectile/energy/dart //ninja throwing dart name = "dart" @@ -164,7 +164,7 @@ /obj/item/projectile/energy/tesla name = "tesla bolt" icon_state = "tesla_projectile" - impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser + impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser var/chain /obj/item/projectile/energy/tesla/fire(setAngle) diff --git a/code/modules/projectiles/projectile/plasma.dm b/code/modules/projectiles/projectile/plasma.dm index 50d96cc7b9..b5d8958f64 100644 --- a/code/modules/projectiles/projectile/plasma.dm +++ b/code/modules/projectiles/projectile/plasma.dm @@ -7,7 +7,6 @@ obj/item/projectile/energy/plasmabolt damage_type = BURN hitsound = 'sound/weapons/sear.ogg' hitsound_wall = 'sound/weapons/effects/searwall.ogg' - impact_effect_type = /obj/effect/overlay/temp/impact_effect/green_laser light_range = 3 light_color = LIGHT_COLOR_GREEN diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index f5df46cb7b..57b339178f 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -5,7 +5,7 @@ damage_type = BURN nodamage = 1 flag = "energy" - impact_effect_type = /obj/effect/overlay/temp/impact_effect/ion + impact_effect_type = /obj/effect/temp_visual/impact_effect/ion /obj/item/projectile/ion/on_hit(atom/target, blocked = 0) @@ -202,7 +202,8 @@ damage = 5 range = 3.5 //works as 4, but doubles to 7 dismemberment = 20 - impact_effect_type = /obj/effect/overlay/temp/impact_effect/purple_laser + impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser + var/mine_range = 3 //mines this many additional tiles /obj/item/projectile/plasma/Initialize() . = ..() @@ -215,24 +216,27 @@ if(pressure < 60) name = "full strength [name]" damage *= 4 - range *= 2 /obj/item/projectile/plasma/on_hit(atom/target) . = ..() if(ismineralturf(target)) var/turf/closed/mineral/M = target M.gets_drilled(firer) - Range() + if(mine_range) + mine_range-- + range++ if(range > 0) return -1 /obj/item/projectile/plasma/adv damage = 7 range = 5 + mine_range = 5 /obj/item/projectile/plasma/adv/mech damage = 10 - range = 6 + range = 9 + mine_range = 3 /obj/item/projectile/plasma/turret //Between normal and advanced for damage, made a beam so not the turret does not destroy glass @@ -270,7 +274,7 @@ A.throw_at(throwtarget,power+1,1) thrown_items[A] = A for(var/turf/F in range(T,power)) - new /obj/effect/overlay/temp/gravpush(F) + new /obj/effect/temp_visual/gravpush(F) /obj/item/projectile/gravityattract name = "attraction bolt" @@ -300,7 +304,7 @@ A.throw_at(T, power+1, 1) thrown_items[A] = A for(var/turf/F in range(T,power)) - new /obj/effect/overlay/temp/gravpush(F) + new /obj/effect/temp_visual/gravpush(F) /obj/item/projectile/gravitychaos name = "gravitational blast" @@ -330,5 +334,5 @@ A.throw_at(get_edge_target_turf(A, pick(GLOB.cardinal)), power+1, 1) thrown_items[A] = A for(var/turf/Z in range(T,power)) - new /obj/effect/overlay/temp/gravpush(Z) + new /obj/effect/temp_visual/gravpush(Z) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 2c8ef5e065..55a59bed61 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -453,14 +453,14 @@ /datum/reagents/proc/check_ignoreslow(mob/M) if(istype(M, /mob)) - if(M.reagents.has_reagent("morphine")||M.reagents.has_reagent("ephedrine")) + if(M.reagents.has_reagent("morphine")) return 1 else M.status_flags &= ~IGNORESLOWDOWN /datum/reagents/proc/check_gofast(mob/M) if(istype(M, /mob)) - if(M.reagents.has_reagent("unholywater")||M.reagents.has_reagent("nuka_cola")||M.reagents.has_reagent("stimulants")) + if(M.reagents.has_reagent("unholywater")||M.reagents.has_reagent("nuka_cola")||M.reagents.has_reagent("stimulants")||M.reagents.has_reagent("ephedrine")) return 1 else M.status_flags &= ~GOTTAGOFAST diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 5a73c5dcf4..481704ac41 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -1,285 +1,183 @@ /obj/machinery/computer/pandemic name = "PanD.E.M.I.C 2200" desc = "Used to work with viruses." - density = 1 - anchored = 1 + density = TRUE + anchored = TRUE icon = 'icons/obj/chemical.dmi' icon_state = "mixer0" circuit = /obj/item/weapon/circuitboard/computer/pandemic - use_power = 1 + use_power = TRUE idle_power_usage = 20 resistance_flags = ACID_PROOF - var/temp_html = "" - var/wait = null - var/obj/item/weapon/reagent_containers/beaker = null + var/wait + var/obj/item/weapon/reagent_containers/beaker /obj/machinery/computer/pandemic/Initialize() . = ..() update_icon() -/obj/machinery/computer/pandemic/proc/GetVirusByIndex(index) - if(beaker && beaker.reagents) - if(beaker.reagents.reagent_list.len) - var/datum/reagent/blood/BL = locate() in beaker.reagents.reagent_list - if(BL) - if(BL.data && BL.data["viruses"]) - var/list/viruses = BL.data["viruses"] - return viruses[index] - return null +/obj/machinery/computer/pandemic/Destroy() + QDEL_NULL(beaker) + return ..() -/obj/machinery/computer/pandemic/proc/GetResistancesByIndex(index) - if(beaker && beaker.reagents) - if(beaker.reagents.reagent_list.len) - var/datum/reagent/blood/BL = locate() in beaker.reagents.reagent_list - if(BL) - if(BL.data && BL.data["resistances"]) - var/list/resistances = BL.data["resistances"] - return resistances[index] - return null +/obj/machinery/computer/pandemic/proc/get_by_index(thing, index) + if(!beaker || !beaker.reagents) + return + var/datum/reagent/blood/B = locate() in beaker.reagents.reagent_list + if(B && B.data[thing]) + return B.data[thing][index] -/obj/machinery/computer/pandemic/proc/GetVirusTypeByIndex(index) - var/datum/disease/D = GetVirusByIndex(index) +/obj/machinery/computer/pandemic/proc/get_virus_id_by_index(index) + var/datum/disease/D = get_by_index("viruses", index) if(D) return D.GetDiseaseID() - return null -/obj/machinery/computer/pandemic/proc/replicator_cooldown(waittime) - wait = 1 +/obj/machinery/computer/pandemic/proc/get_viruses_data(datum/reagent/blood/B) + . = list() + if(!islist(B.data["viruses"])) + return + var/list/V = B.data["viruses"] + var/index = 1 + for(var/virus in V) + var/datum/disease/D = virus + if(!istype(D) || D.visibility_flags & HIDDEN_PANDEMIC) + continue + + var/list/this = list() + this["name"] = D.name + if(istype(D, /datum/disease/advance)) + var/datum/disease/advance/A = SSdisease.archive_diseases[D.GetDiseaseID()] + if(A.name == "Unknown") + this["can_rename"] = TRUE + this["name"] = A.name + this["is_adv"] = TRUE + this["resistance"] = A.totalResistance() + this["stealth"] = A.totalStealth() + this["stage_speed"] = A.totalStageSpeed() + this["transmission"] = A.totalTransmittable() + this["symptoms"] = list() + for(var/symptom in A.symptoms) + var/datum/symptom/S = symptom + var/list/this_symptom = list() + this_symptom["name"] = S.name + this["symptoms"] += list(this_symptom) + this["index"] = index++ + this["agent"] = D.agent + this["description"] = D.desc || "none" + this["spread"] = D.spread_text || "none" + this["cure"] = D.cure_text || "none" + + . += list(this) + +/obj/machinery/computer/pandemic/proc/get_resistance_data(datum/reagent/blood/B) + . = list() + if(!islist(B.data["resistances"])) + return + var/list/resistances = B.data["resistances"] + for(var/id in resistances) + var/list/this = list() + var/datum/disease/D = SSdisease.archive_diseases[id] + if(D) + this["id"] = id + this["name"] = D.name + . += list(this) + +/obj/machinery/computer/pandemic/proc/reset_replicator_cooldown() + wait = FALSE update_icon() - spawn(waittime) - wait = null - update_icon() - playsound(src.loc, 'sound/machines/ping.ogg', 30, 1) + playsound(loc, 'sound/machines/ping.ogg', 30, 1) /obj/machinery/computer/pandemic/update_icon() if(stat & BROKEN) icon_state = (beaker ? "mixer1_b" : "mixer0_b") return - icon_state = "mixer[(beaker)?"1":"0"][(powered()) ? "" : "_nopower"]" - + icon_state = "mixer[(beaker) ? "1" : "0"][powered() ? "" : "_nopower"]" if(wait) cut_overlays() else add_overlay("waitlight") -/obj/machinery/computer/pandemic/Topic(href, href_list) +/obj/machinery/computer/pandemic/proc/eject_beaker() + beaker.forceMove(get_turf(src)) + beaker = null + update_icon() + +/obj/machinery/computer/pandemic/ui_interact(mob/user, ui_key = "main", datum/tgui/ui, force_open = FALSE, datum/tgui/master_ui, 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, "pandemic", name, 575, 500, master_ui, state) + ui.open() + +/obj/machinery/computer/pandemic/ui_data(mob/user) + var/list/data = list() + data["is_ready"] = !wait + if(beaker) + data["has_beaker"] = TRUE + if(!beaker.reagents.total_volume || !beaker.reagents.reagent_list) + data["beaker_empty"] = TRUE + var/datum/reagent/blood/B = locate() in beaker.reagents.reagent_list + if(B) + data["has_blood"] = TRUE + data["blood"] = list() + data["blood"]["dna"] = B.data["blood_DNA"] || "none" + data["blood"]["type"] = B.data["blood_type"] || "none" + data["viruses"] = get_viruses_data(B) + data["resistances"] = get_resistance_data(B) + + return data + +/obj/machinery/computer/pandemic/ui_act(action, params) if(..()) return - - usr.set_machine(src) - if(!beaker) return - - if (href_list["create_vaccine"]) - if(!src.wait) - var/obj/item/weapon/reagent_containers/glass/bottle/B = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc) - if(B) - B.pixel_x = rand(-3, 3) - B.pixel_y = rand(-3, 3) - var/path = GetResistancesByIndex(text2num(href_list["create_vaccine"])) - var/vaccine_type = path - var/vaccine_name = "Unknown" - - if(!ispath(vaccine_type)) - if(SSdisease.archive_diseases[path]) - var/datum/disease/D = SSdisease.archive_diseases[path] - if(D) - vaccine_name = D.name - vaccine_type = path - else if(vaccine_type) - var/datum/disease/D = new vaccine_type(0, null) - if(D) - vaccine_name = D.name - - if(vaccine_type) - - B.name = "[vaccine_name] vaccine bottle" - B.reagents.add_reagent("vaccine", 15, list(vaccine_type)) - replicator_cooldown(200) - else - temp_html = "The replicator is not ready yet." - updateUsrDialog() - return - else if (href_list["create_virus_culture"]) - if(!wait) - var/type = GetVirusTypeByIndex(text2num(href_list["create_virus_culture"]))//the path is received as string - converting - var/datum/disease/D = null - if(!ispath(type)) - D = GetVirusByIndex(text2num(href_list["create_virus_culture"])) - var/datum/disease/advance/A = SSdisease.archive_diseases[D.GetDiseaseID()] - if(A) - D = new A.type(0, A) - else if(type) - if(type in SSdisease.diseases) // Make sure this is a disease - D = new type(0, null) - if(!D) - return - var/name = stripped_input(usr,"Name:","Name the culture",D.name,MAX_NAME_LEN) - if(name == null || wait) - return - var/obj/item/weapon/reagent_containers/glass/bottle/B = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc) - B.icon_state = "bottle3" - B.pixel_x = rand(-3, 3) - B.pixel_y = rand(-3, 3) - replicator_cooldown(50) - var/list/data = list("viruses"=list(D)) - B.name = "[name] culture bottle" - B.desc = "A small bottle. Contains [D.agent] culture in synthblood medium." - B.reagents.add_reagent("blood",20,data) - updateUsrDialog() - else - temp_html = "The replicator is not ready yet." - updateUsrDialog() - return - else if (href_list["empty_beaker"]) - beaker.reagents.clear_reagents() - updateUsrDialog() - return - else if (href_list["eject"]) - beaker.forceMove(get_turf(loc)) - beaker = null - icon_state = "mixer0" - updateUsrDialog() - return - else if (href_list["emptyeject_beaker"]) - beaker.reagents.clear_reagents() - beaker.forceMove(get_turf(loc)) - beaker = null - icon_state = "mixer0" - updateUsrDialog() - return - else if(href_list["clear"]) - temp_html = "" - updateUsrDialog() - return - else if(href_list["name_disease"]) - var/new_name = stripped_input(usr, "Name the Disease", "New Name", "", MAX_NAME_LEN) - if(!new_name) - return - if(..()) - return - var/id = GetVirusTypeByIndex(text2num(href_list["name_disease"])) - if(SSdisease.archive_diseases[id]) + switch(action) + if("eject_beaker") + eject_beaker() + . = TRUE + if("empty_beaker") + beaker.reagents.clear_reagents() + . = TRUE + if("empty_eject_beaker") + beaker.reagents.clear_reagents() + eject_beaker() + . = TRUE + if("rename_disease") + var/id = get_virus_id_by_index(text2num(params["index"])) var/datum/disease/advance/A = SSdisease.archive_diseases[id] - A.AssignName(new_name) - for(var/datum/disease/advance/AD in SSdisease.processing) - AD.Refresh() - updateUsrDialog() - - - else - usr << browse(null, "window=pandemic") - updateUsrDialog() - return - - add_fingerprint(usr) - return - -/obj/machinery/computer/pandemic/attack_hand(mob/user) - if(..()) - return - user.set_machine(src) - var/dat = "" - if(temp_html) - dat = "[src.temp_html]

Main Menu" - else if(!beaker) - dat += "Please insert beaker.
" - dat += "Close" - else - var/datum/reagents/R = beaker.reagents - var/datum/reagent/blood/Blood = null - for(var/datum/reagent/blood/B in R.reagent_list) - if(B) - Blood = B - break - if(!R.total_volume||!R.reagent_list.len) - dat += "The beaker is empty
" - else if(!Blood) - dat += "No blood sample found in beaker." - else if(!Blood.data) - dat += "No blood data found in beaker." - else - dat += "

Blood sample data:

" - dat += "Blood DNA: [(Blood.data["blood_DNA"]||"none")]
" - dat += "Blood Type: [(Blood.data["blood_type"]||"none")]
" - - - if(Blood.data["viruses"]) - var/list/vir = Blood.data["viruses"] - if(vir.len) - var/i = 0 - for(var/datum/disease/D in Blood.data["viruses"]) - i++ - if(!(D.visibility_flags & HIDDEN_PANDEMIC)) - - if(istype(D, /datum/disease/advance)) - - var/datum/disease/advance/A = D - D = SSdisease.archive_diseases[A.GetDiseaseID()] - if(D && D.name == "Unknown") - dat += "Name Disease
" - - if(!D) - CRASH("We weren't able to get the advance disease from the archive.") - - dat += "Disease Agent: [D?"[D.agent] - Create virus culture bottle":"none"]
" - dat += "Common name: [(D.name||"none")]
" - dat += "Description: [(D.desc||"none")]
" - dat += "Spread: [(D.spread_text||"none")]
" - dat += "Possible cure: [(D.cure_text||"none")]

" - if(istype(D, /datum/disease/advance)) - var/datum/disease/advance/A = D - dat += "Stealth: [(A.totalStealth())]
" - dat += "Resistance: [(A.totalResistance())]
" - dat += "Stage Speed: [(A.totalStageSpeed())]
" - dat += "Transmission: [(A.totalTransmittable())]

" - dat += "Symptoms: " - var/english_symptoms = list() - for(var/datum/symptom/S in A.symptoms) - english_symptoms += S.name - dat += english_list(english_symptoms) - - else - dat += "No detectable virus in the sample." - else - dat += "No detectable virus in the sample." - - dat += "
Contains antibodies to: " - if(Blood.data["resistances"]) - var/list/res = Blood.data["resistances"] - if(res.len) - dat += "
    " - var/i = 0 - for(var/type in Blood.data["resistances"]) - i++ - var/disease_name = "Unknown" - - if(!ispath(type)) - var/datum/disease/advance/A = SSdisease.archive_diseases[type] - if(A) - disease_name = A.name - else - var/datum/disease/D = new type(0, null) - disease_name = D.name - - dat += "
  • [disease_name] - Create vaccine bottle
  • " - dat += "

" - else - dat += "nothing
" - else - dat += "nothing
" - dat += "
Eject beaker[((R.total_volume&&R.reagent_list.len) ? "-- Empty beaker":"")]" - dat += "[((R.total_volume&&R.reagent_list.len) ? "-- Empty and Eject beaker":"")]
" - dat += "Close" - - user << browse("[src.name]
[dat]", "window=pandemic;size=575x400") - onclose(user, "pandemic") - return - + if(A) + var/new_name = stripped_input(usr, "Name the disease", "New name", "", MAX_NAME_LEN) + if(!new_name || ..()) + return + A.AssignName(new_name) + for(var/datum/disease/advance/AD in SSdisease.processing) + AD.Refresh() + . = TRUE + if("create_culture_bottle") + var/id = get_virus_id_by_index(text2num(params["index"])) + var/datum/disease/advance/A = new(FALSE, SSdisease.archive_diseases[id]) + var/list/data = list("viruses" = list(A)) + var/obj/item/weapon/reagent_containers/glass/bottle/B = new(get_turf(src)) + B.name = "[A.name] culture bottle" + B.desc = "A small bottle. Contains [A.agent] culture in synthblood medium." + B.reagents.add_reagent("blood", 20, data) + wait = TRUE + update_icon() + addtimer(CALLBACK(src, .proc/reset_replicator_cooldown), 50) + . = TRUE + if("create_vaccine_bottle") + var/index = params["index"] + var/datum/disease/D = SSdisease.archive_diseases[index] + var/obj/item/weapon/reagent_containers/glass/bottle/B = new(get_turf(src)) + B.name = "[D.name] vaccine bottle" + B.reagents.add_reagent("vaccine", 15, list(index)) + wait = TRUE + update_icon() + addtimer(CALLBACK(src, .proc/reset_replicator_cooldown), 200) + . = TRUE /obj/machinery/computer/pandemic/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/reagent_containers) && (I.container_type & OPENCONTAINER)) - . = 1 //no afterattack + . = TRUE //no afterattack if(stat & (NOPOWER|BROKEN)) return if(beaker) @@ -288,15 +186,15 @@ if(!user.drop_item()) return - beaker = I - beaker.loc = src + beaker = I + beaker.forceMove(src) to_chat(user, "You add the beaker to the machine.") - updateUsrDialog() - icon_state = "mixer1" + update_icon() else return ..() /obj/machinery/computer/pandemic/on_deconstruction() if(beaker) - beaker.loc = get_turf(src) - ..() \ No newline at end of file + beaker.forceMove(get_turf(src)) + beaker = null + . = ..() \ No newline at end of file diff --git a/code/modules/reagents/chemistry/reagents/blob_reagents.dm b/code/modules/reagents/chemistry/reagents/blob_reagents.dm index 948da607f8..9b1117bcc5 100644 --- a/code/modules/reagents/chemistry/reagents/blob_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/blob_reagents.dm @@ -298,7 +298,7 @@ var/initial_volume = reac_volume reac_volume = ..() if(reac_volume >= 10) //if it's not a spore cloud, bad time incoming - var/obj/effect/overlay/temp/explosion/fast/E = new /obj/effect/overlay/temp/explosion/fast(get_turf(M)) + var/obj/effect/temp_visual/explosion/fast/E = new /obj/effect/temp_visual/explosion/fast(get_turf(M)) E.alpha = 150 for(var/mob/living/L in orange(get_turf(M), 1)) if("blob" in L.faction) //no friendly fire diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index b30207eaf3..f3cc8b8620 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -160,6 +160,12 @@ var/obj/item/toy/carpplushie/dehy_carp/dehy = O dehy.Swell() // Makes a carp + else if(istype(O, /obj/item/stack/sheet/hairlesshide)) + var/obj/item/stack/sheet/hairlesshide/HH = O + var/obj/item/stack/sheet/wetleather/WL = new(get_turf(HH)) + WL.amount = HH.amount + qdel(HH) + /* * Water reaction to a mob */ @@ -367,11 +373,15 @@ if(ishuman(M)) var/mob/living/carbon/human/N = M - if(N.dna.species.id == "human") // If they're human, turn em to the "orange" race, and give em spiky black hair + N.hair_style = "Spiky" + N.facial_hair_style = "Shaved" + N.facial_hair_color = "000" + N.hair_color = "000" + if(!(HAIR in N.dna.species.species_traits)) //No hair? No problem! + N.dna.species.species_traits += HAIR + if(N.dna.species.use_skintones) N.skin_tone = "orange" - N.hair_style = "Spiky" - N.hair_color = "000" - if(MUTCOLORS in N.dna.species.species_traits) //Aliens with custom colors simply get turned orange + else if(MUTCOLORS in N.dna.species.species_traits) //Aliens with custom colors simply get turned orange N.dna.features["mcolor"] = "f80" N.regenerate_icons() if(prob(7)) @@ -380,7 +390,7 @@ else M.visible_message("[M] flexes [M.p_their()] arms.") if(prob(10)) - M.say(pick("Check these sweet biceps bro!", "Deal with it.", "CHUG! CHUG! CHUG! CHUG!", "Winning!", "NERDS!", "My name is John and I hate every single one of you.")) + M.say(pick("Shit was SO cash.", "You are everything bad in the world.", "What sports do you play, other than 'jack off to naked drawn Japanese people?'", "Don’t be a stranger. Just hit me with your best shot.", "My name is John and I hate every single one of you.")) ..() return @@ -1126,7 +1136,7 @@ /datum/reagent/nitrous_oxide/reaction_mob(mob/M, method=TOUCH, reac_volume) if(method == VAPOR) M.drowsyness += max(round(reac_volume, 1), 2) - + /datum/reagent/nitrous_oxide/on_mob_life(mob/living/M) M.drowsyness += 2 if(ishuman(M)) diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 28e8550b45..72e42b500f 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -104,11 +104,12 @@ if(!operating) return use_power(100) - affecting = loc.contents - src // moved items will be all in loc - sleep(1) + addtimer(CALLBACK(src, .proc/convey, affecting), 1) + +/obj/machinery/conveyor/proc/convey(list/affecting) for(var/atom/movable/A in affecting) - if(A.loc == loc) + if((A.loc == loc) && A.has_gravity()) A.ConveyorMove(movedir) // attack with item, place item on conveyor diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 834b79d4dc..cb00bf6ea1 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -249,16 +249,6 @@ other types of metals and chemistry for reagents). build_path = /obj/item/borg/upgrade/modkit/range category = list("Mining Designs", "Cyborg Upgrade Modules") -/datum/design/superaccelerator - name = "Kinetic Accelerator Pressure Mod" - desc = "A modification kit which allows Kinetic Accelerators to do more damage while indoors." - id = "indoormod" - req_tech = list("materials" = 5, "powerstorage" = 4, "engineering" = 4, "magnets" = 4, "combat" = 3) - build_type = PROTOLATHE | MECHFAB - materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_URANIUM = 2000) - build_path = /obj/item/borg/upgrade/modkit/indoors - category = list("Mining Designs", "Cyborg Upgrade Modules") - /datum/design/hyperaccelerator name = "Kinetic Accelerator Mining AoE Mod" desc = "A modification kit for Kinetic Accelerators which causes it to fire AoE blasts that destroy rock." diff --git a/code/modules/shuttle/ripple.dm b/code/modules/shuttle/ripple.dm index ca49f50ae5..a757a86430 100644 --- a/code/modules/shuttle/ripple.dm +++ b/code/modules/shuttle/ripple.dm @@ -1,4 +1,4 @@ -/obj/effect/overlay/temp/ripple +/obj/effect/temp_visual/ripple name = "hyperspace ripple" desc = "Something is coming through hyperspace, you can see the \ visual disturbances. It's probably best not to be on top of these \ @@ -13,10 +13,10 @@ duration = 3 * SHUTTLE_RIPPLE_TIME -/obj/effect/overlay/temp/ripple/Initialize(mapload, time_left) +/obj/effect/temp_visual/ripple/Initialize(mapload, time_left) . = ..() animate(src, alpha=255, time=time_left) addtimer(CALLBACK(src, .proc/stop_animation), 8, TIMER_CLIENT_TIME) -/obj/effect/overlay/temp/ripple/proc/stop_animation() +/obj/effect/temp_visual/ripple/proc/stop_animation() icon_state = "medi_holo_no_anim" diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index a5d60b1e8d..96db9d0ac3 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -404,7 +404,7 @@ /obj/docking_port/mobile/proc/create_ripples(obj/docking_port/stationary/S1, animate_time) var/list/turfs = ripple_area(S1) for(var/t in turfs) - ripples += new /obj/effect/overlay/temp/ripple(t, animate_time) + ripples += new /obj/effect/temp_visual/ripple(t, animate_time) /obj/docking_port/mobile/proc/remove_ripples() for(var/R in ripples) @@ -764,6 +764,6 @@ if(T in block(T0,T1)) return TRUE return FALSE - + #undef DOCKING_PORT_HIGHLIGHT diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index aa28f2402c..72e7b5bb3f 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -254,7 +254,7 @@ /mob/living/simple_animal/hostile/bear/fightpit name = "fight pit bear" desc = "This bear's trained through ancient Russian secrets to fear the walls of its glass prison." - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE /obj/effect/decal/hammerandsickle name = "hammer and sickle" diff --git a/code/modules/spells/spell_types/construct_spells.dm b/code/modules/spells/spell_types/construct_spells.dm index b6898afdef..c8a7c387ee 100644 --- a/code/modules/spells/spell_types/construct_spells.dm +++ b/code/modules/spells/spell_types/construct_spells.dm @@ -128,8 +128,8 @@ action_icon_state = "phaseshift" action_background_icon_state = "bg_demon" jaunt_in_time = 12 - jaunt_in_type = /obj/effect/overlay/temp/dir_setting/wraith - jaunt_out_type = /obj/effect/overlay/temp/dir_setting/wraith/out + jaunt_in_type = /obj/effect/temp_visual/dir_setting/wraith + jaunt_out_type = /obj/effect/temp_visual/dir_setting/wraith/out /obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/jaunt_steam(mobloc) return @@ -256,7 +256,7 @@ S.add_atom_colour("#990000", FIXED_COLOUR_PRIORITY) S.faction = list("cult") playsound(get_turf(S), 'sound/effects/ghost.ogg', 100, 1) - new /obj/effect/overlay/temp/cult/sac(get_turf(S)) + new /obj/effect/temp_visual/cult/sac(get_turf(S)) /obj/effect/proc_holder/spell/targeted/dominate/can_target(mob/living/target) if(!isanimal(target) || target.stat) @@ -267,5 +267,5 @@ /obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/golem charge_max = 800 - jaunt_in_type = /obj/effect/overlay/temp/dir_setting/cult/phase - jaunt_out_type = /obj/effect/overlay/temp/dir_setting/cult/phase/out \ No newline at end of file + jaunt_in_type = /obj/effect/temp_visual/dir_setting/cult/phase + jaunt_out_type = /obj/effect/temp_visual/dir_setting/cult/phase/out \ No newline at end of file diff --git a/code/modules/spells/spell_types/ethereal_jaunt.dm b/code/modules/spells/spell_types/ethereal_jaunt.dm index f1e959fd6f..940967adeb 100644 --- a/code/modules/spells/spell_types/ethereal_jaunt.dm +++ b/code/modules/spells/spell_types/ethereal_jaunt.dm @@ -13,8 +13,8 @@ nonabstract_req = 1 var/jaunt_duration = 50 //in deciseconds var/jaunt_in_time = 5 - var/jaunt_in_type = /obj/effect/overlay/temp/wizard - var/jaunt_out_type = /obj/effect/overlay/temp/wizard/out + var/jaunt_in_type = /obj/effect/temp_visual/wizard + var/jaunt_out_type = /obj/effect/temp_visual/wizard/out action_icon_state = "jaunt" /obj/effect/proc_holder/spell/targeted/ethereal_jaunt/cast(list/targets,mob/user = usr) //magnets, so mostly hardcoded diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm index b8296a1da5..f62259f67b 100644 --- a/code/modules/spells/spell_types/wizard.dm +++ b/code/modules/spells/spell_types/wizard.dm @@ -257,7 +257,7 @@ selection_type = "view" sound = 'sound/magic/Repulse.ogg' var/maxthrow = 5 - var/sparkle_path = /obj/effect/overlay/temp/gravpush + var/sparkle_path = /obj/effect/temp_visual/gravpush action_icon_state = "repulse" @@ -300,7 +300,7 @@ range = 2 cooldown_min = 150 invocation_type = "none" - sparkle_path = /obj/effect/overlay/temp/dir_setting/tailsweep + sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep action_icon_state = "tailsweep" action_background_icon_state = "bg_alien" diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index 2bc650656f..9a787f9fda 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -83,14 +83,18 @@ //sometimes we want to ignore that we don't have the required amount of legs. /mob/proc/get_leg_ignore() - return 0 + return FALSE /mob/living/carbon/alien/larva/get_leg_ignore() - return 1 + return TRUE /mob/living/carbon/human/get_leg_ignore() if(movement_type & FLYING) - return 1 + return TRUE + var/obj/item/weapon/tank/jetpack/J = get_jetpack() + if(J && J.on && !has_gravity()) + return TRUE + return FALSE /mob/living/proc/get_missing_limbs() return list() diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm index 3f5b4b4ca4..667742afc4 100644 --- a/code/modules/uplink/uplink_item.dm +++ b/code/modules/uplink/uplink_item.dm @@ -914,8 +914,8 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. cost = 3 /datum/uplink_item/device_tools/military_belt - name = "Military Belt" - desc = "A robust seven-slot red belt that is capable of holding all manner of tatical equipment." + name = "Chest Rig" + desc = "A robust seven-slot set of webbing that is capable of holding all manner of tatical equipment." item = /obj/item/weapon/storage/belt/military cost = 1 exclude_modes = list(/datum/game_mode/nuclear) @@ -1282,7 +1282,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. cost = 10 item = /obj/item/weapon/pneumatic_cannon/pie/selfcharge restricted_roles = list("Clown") - surplus = 0 //No fun unless you're the clown! + surplus = 0 //No fun unless you're the clown! /datum/uplink_item/role_restricted/ancient_jumpsuit name = "Ancient Jumpsuit" @@ -1298,8 +1298,8 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. item = /obj/item/toy/eightball/haunted cost = 2 restricted_roles = list("Curator") - limited_stock = 1 // please don't spam deadchat - + limited_stock = 1 //please don't spam deadchat + /datum/uplink_item/role_restricted/modified_syringe_gun name = "Modified Syringe Gun" desc = "A syringe gun that fires DNA injectors instead of normal syringes." @@ -1307,6 +1307,14 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. cost = 14 restricted_roles = list("Geneticist", "Chief Medical Officer") +/datum/uplink_item/role_restricted/pressure_mod + name = "Kinetic Accelerator Pressure Mod" + desc = "A modification kit which allows Kinetic Accelerators to do greatly increased damage while indoors. Occupies 35% mod capacity." + item = /obj/item/borg/upgrade/modkit/indoors + cost = 5 //you need two for full damage, so total of 10 for maximum damage + limited_stock = 2 //you can't use more than two! + restricted_roles = list("Shaft Miner") + // Pointless /datum/uplink_item/badass category = "(Pointless) Badassery" diff --git a/code/modules/vehicles/speedbike.dm b/code/modules/vehicles/speedbike.dm index 15337d8a28..7cd2839b4b 100644 --- a/code/modules/vehicles/speedbike.dm +++ b/code/modules/vehicles/speedbike.dm @@ -19,7 +19,7 @@ /obj/vehicle/space/speedbike/Move(newloc,move_dir) if(has_buckled_mobs()) - new /obj/effect/overlay/temp/dir_setting/speedbike_trail(loc,move_dir) + new /obj/effect/temp_visual/dir_setting/speedbike_trail(loc,move_dir) . = ..() /obj/vehicle/space/speedbike/red diff --git a/code/world.dm b/code/world.dm index b8fbd4eddf..566c9e213c 100644 --- a/code/world.dm +++ b/code/world.dm @@ -16,6 +16,33 @@ /world/New() log_world("World loaded at [time_stamp()]") + SetupExternalRSC() + + GLOB.config_error_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl + + make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once) + + config = new + + SetRoundID() + + SetupLogs() + + GLOB.revdata.DownloadPRDetails() + + load_motd() + load_admins() +// load_mentors() + load_menu() + if(config.usewhitelist) + load_whitelist() + LoadBans() + + GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000 + + Master.Initialize(10, FALSE) + +/world/proc/SetupExternalRSC() #if (PRELOAD_RSC == 0) external_rsc_urls = world.file2list("config/external_rsc_urls.txt","\n") var/i=1 @@ -25,10 +52,8 @@ else external_rsc_urls.Cut(i,i+1) #endif - GLOB.config_error_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl - make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once) - config = new - GLOB.log_directory = "data/logs/[time2text(world.realtime, "YYYY/MM/DD")]/round-" + +/world/proc/SetRoundID() if(config.sql_enabled) if(SSdbcore.Connect()) log_world("Database connection established.") @@ -38,10 +63,14 @@ query_feedback_max_id.Execute() if(query_feedback_max_id.NextRow()) GLOB.round_id = query_feedback_max_id.item[1] - GLOB.log_directory += "[GLOB.round_id]" else log_world("Your server failed to establish a connection with the database.") - if(!GLOB.round_id) + +/world/proc/SetupLogs() + GLOB.log_directory = "data/logs/[time2text(world.realtime, "YYYY/MM/DD")]/round-" + if(GLOB.round_id) + GLOB.log_directory += "[GLOB.round_id]" + else GLOB.log_directory += "[replacetext(time_stamp(), ":", ".")]" GLOB.world_game_log = file("[GLOB.log_directory]/game.log") GLOB.world_attack_log = file("[GLOB.log_directory]/attack.log") @@ -54,27 +83,10 @@ if(fexists(GLOB.config_error_log)) fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log") fdel(GLOB.config_error_log) - + if(GLOB.round_id) log_game("Round ID: [GLOB.round_id]") - GLOB.revdata.DownloadPRDetails() - load_mode() - load_motd() - load_admins() - load_menu() - if(config.usewhitelist) - load_whitelist() -//disabled to prevent runtimes until it's fixed -// load_mentors() - LoadBans() - - GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000 - - GLOB.data_core = new /datum/datacore() - - Master.Initialize(10, FALSE) - #define IRC_STATUS_THROTTLE 50 /world/Topic(T, addr, master, key) if(config && config.log_world_topic) @@ -200,99 +212,21 @@ if(PRcounts[id] > PR_ANNOUNCEMENTS_PER_ROUND) return -#define CHAT_PULLR 64 //defined in preferences.dm, but not available here at compilation time + var/final_composed = "PR: [announcement]" for(var/client/C in GLOB.clients) - if(C.prefs && (C.prefs.chat_toggles & CHAT_PULLR)) - C << "PR: [announcement]" -#undef CHAT_PULLR + C.AnnouncePR(final_composed) -#define WORLD_REBOOT(X) log_world("World rebooted at [time_stamp()]"); ..(X); return; - -/world/Reboot(var/reason, var/feedback_c, var/feedback_r, var/time) - if (reason == 1) //special reboot, do none of the normal stuff +/world/Reboot(reason = 0, fast_track = FALSE) + if (reason || fast_track) //special reboot, do none of the normal stuff if (usr) log_admin("[key_name(usr)] Has requested an immediate world restart via client side debugging tools") message_admins("[key_name_admin(usr)] Has requested an immediate world restart via client side debugging tools") to_chat(world, "Rebooting World immediately due to host request") - WORLD_REBOOT(1) - var/delay - if(time) - delay = time else - delay = config.round_end_countdown * 10 - if(SSticker.delay_end) - to_chat(world, "An admin has delayed the round end.") - return - to_chat(world, "Rebooting World in [delay/10] [(delay >= 10 && delay < 20) ? "second" : "seconds"]. [reason]") - var/round_end_sound_sent = FALSE - if(SSticker.round_end_sound) - round_end_sound_sent = TRUE - for(var/thing in GLOB.clients) - var/client/C = thing - if (!C) - continue - C.Export("##action=load_rsc", SSticker.round_end_sound) - sleep(delay) - if(SSticker.delay_end) - to_chat(world, "Reboot was cancelled by an admin.") - return - OnReboot(reason, feedback_c, feedback_r, round_end_sound_sent) - WORLD_REBOOT(0) -#undef WORLD_REBOOT - -/world/proc/OnReboot(reason, feedback_c, feedback_r, round_end_sound_sent) - SSblackbox.set_details("[feedback_c]","[feedback_r]") - log_game("Rebooting World. [reason]") - 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 - to_chat(world, "Rebooting world...") - for(var/thing in GLOB.clients) - var/client/C = thing - if(C && config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite - C << link("byond://[config.server]") - -/world/proc/RoundEndAnimation(round_end_sound_sent) - set waitfor = FALSE - var/round_end_sound - if(SSticker.round_end_sound) - round_end_sound = SSticker.round_end_sound - if (!round_end_sound_sent) - for(var/thing in GLOB.clients) - var/client/C = thing - if (!C) - continue - C.Export("##action=load_rsc", round_end_sound) - else - round_end_sound = pick(\ - 'sound/roundend/newroundsexy.ogg', - 'sound/roundend/apcdestroyed.ogg', - 'sound/roundend/bangindonk.ogg', - 'sound/roundend/leavingtg.ogg', - 'sound/roundend/its_only_game.ogg', - 'sound/roundend/yeehaw.ogg', - 'sound/roundend/disappointed.ogg'\ - ) - - for(var/thing in GLOB.clients) - var/obj/screen/splash/S = new(thing, FALSE) - S.Fade(FALSE,FALSE) - - world << sound(round_end_sound) - -/world/proc/load_mode() - var/mode = trim(file2text("data/mode.txt")) - if(mode) - GLOB.master_mode = mode - else - GLOB.master_mode = "extended" - log_game("Saved mode is '[GLOB.master_mode]'") - -/world/proc/save_mode(the_mode) - var/F = file("data/mode.txt") - fdel(F) - F << the_mode + to_chat(world, "Rebooting world...") + Master.Shutdown() //run SS shutdowns + log_world("World rebooted at [time_stamp()]"); + ..() /world/proc/load_motd() GLOB.join_motd = file2text("config/motd.txt") + "
" + GLOB.revdata.GetTestMergeInfo() @@ -346,4 +280,4 @@ if (features) s += ": [jointext(features, ", ")]" - status = s + status = s \ No newline at end of file diff --git a/config/game_options.txt.rej b/config/game_options.txt.rej deleted file mode 100644 index bb860ac94d..0000000000 --- a/config/game_options.txt.rej +++ /dev/null @@ -1,10 +0,0 @@ -diff a/config/game_options.txt b/config/game_options.txt (rejected hunks) -@@ -482,7 +482,7 @@ Space_Budget 16 - #Must be at least 30 to not break parallax I recommended at least 55 to be visually/aurally appropriate - ARRIVALS_SHUTTLE_DOCK_WINDOW 55 - --#Set this to 1 to prevent late join players from spawning if the arrivals shuttle is depressurized -+#Uncomment to prevent late join players from spawning if the arrivals shuttle is depressurized - #ARRIVALS_SHUTTLE_REQUIRE_SAFE_LATEJOIN - - # How many wirechewing rodents you want to spawn on exposed maintenane wires at the start of the round. You may wish to set this to 0 if you're testing powernets. diff --git a/html/changelogs/AutoChangeLog-pr-1087.yml b/html/changelogs/AutoChangeLog-pr-1087.yml new file mode 100644 index 0000000000..c94c89bed0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1087.yml @@ -0,0 +1,4 @@ +author: "Lzimann" +delete-after: True +changes: + - rscadd: "Pandemic is now tgui!" diff --git a/html/changelogs/AutoChangeLog-pr-1091.yml b/html/changelogs/AutoChangeLog-pr-1091.yml new file mode 100644 index 0000000000..b8d5699997 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1091.yml @@ -0,0 +1,5 @@ +author: "Joan" +delete-after: True +changes: + - tweak: "Resonator fields now visually show how long they have until they burst." + - bugfix: "Hitting a legion skull with a resonator will now produce a field." diff --git a/html/changelogs/AutoChangeLog-pr-1096.yml b/html/changelogs/AutoChangeLog-pr-1096.yml new file mode 100644 index 0000000000..fff14de59e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1096.yml @@ -0,0 +1,4 @@ +author: "Steelpoint" +delete-after: True +changes: + - rscadd: "The Warden's Cycler Shotgun has been replaced with a Compact Combat Shotgun. A unique weapon, it can fit in armour slots but at the sacrifice of a smaller ammo capacity of four shells." diff --git a/html/changelogs/AutoChangeLog-pr-1101.yml b/html/changelogs/AutoChangeLog-pr-1101.yml new file mode 100644 index 0000000000..f57bf23e13 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1101.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "Spessmen seems to have stopped suffering from the mental condition that makes them believe they can't move fast if they have only one leg, even if they're in space and using a jetpack!" diff --git a/html/changelogs/AutoChangeLog-pr-1102.yml b/html/changelogs/AutoChangeLog-pr-1102.yml new file mode 100644 index 0000000000..8e01bbc5ad --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1102.yml @@ -0,0 +1,4 @@ +author: "That Really Good Soda Flavor" +delete-after: True +changes: + - bugfix: "Martial arts are no longer lost when mind-swapping, cloning, moving your brain, et cetera." diff --git a/html/changelogs/AutoChangeLog-pr-1103.yml b/html/changelogs/AutoChangeLog-pr-1103.yml new file mode 100644 index 0000000000..39ae5952ab --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1103.yml @@ -0,0 +1,7 @@ +author: "coiax" +delete-after: True +changes: + - rscadd: "Galactic Common has been added to silicon's internal language +database, meaning even if a cyborg is created from someone who +previously did not know Galactic Common, they will be able to speak it +as a silicon." diff --git a/html/changelogs/AutoChangeLog-pr-1109.yml b/html/changelogs/AutoChangeLog-pr-1109.yml new file mode 100644 index 0000000000..f1c4acbc0e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1109.yml @@ -0,0 +1,6 @@ +author: "Joan, Repukan" +delete-after: True +changes: + - rscadd: "Traitor miners can now buy up to 2 KA Pressure Mods for 5 TC each. +balance: KA Pressure Mods now only take up 35 mod capacity each, allowing traitor miners to use 2 and have space for 1 other mod." + - rscdel: "R&D can no longer build KA Pressure Mods." diff --git a/html/changelogs/AutoChangeLog-pr-1112.yml b/html/changelogs/AutoChangeLog-pr-1112.yml new file mode 100644 index 0000000000..dcd84158cc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1112.yml @@ -0,0 +1,4 @@ +author: "Joan" +delete-after: True +changes: + - tweak: "Ripleys will collect all ore in front of them when they move with a clamp and stored ore box." diff --git a/html/changelogs/AutoChangeLog-pr-1116.yml b/html/changelogs/AutoChangeLog-pr-1116.yml new file mode 100644 index 0000000000..d63e6e64ba --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1116.yml @@ -0,0 +1,4 @@ +author: "ma44" +delete-after: True +changes: + - rscadd: "Reports of syndicate base on lavaland has been outfitted with a state of the art donksoft toy weapon dispenser." diff --git a/html/changelogs/AutoChangeLog-pr-1117.yml b/html/changelogs/AutoChangeLog-pr-1117.yml new file mode 100644 index 0000000000..a5cdcb8039 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1117.yml @@ -0,0 +1,4 @@ +author: "Joan" +delete-after: True +changes: + - tweak: "Chasms will glow dimly, like lava." diff --git a/html/changelogs/AutoChangeLog-pr-1119.yml b/html/changelogs/AutoChangeLog-pr-1119.yml new file mode 100644 index 0000000000..e41fb408be --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1119.yml @@ -0,0 +1,4 @@ +author: "Steelpoint" +delete-after: True +changes: + - rscadd: "Auto Rifle alt ammo mags (AP, Incendiary, Uranium Tipped) now have a coloured stripe to denote them." diff --git a/html/changelogs/AutoChangeLog-pr-1121.yml b/html/changelogs/AutoChangeLog-pr-1121.yml new file mode 100644 index 0000000000..18f8cc544e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1121.yml @@ -0,0 +1,6 @@ +author: "Joan" +delete-after: True +changes: + - rscdel: "Nanotrasen has taken a lower bid for their meson suppliers, and meson scanners will no longer display terrain layouts while on the planet." + - tweak: "However, they have discovered that, with some tweaks, mineral scanners will no longer actually require you to be wearing mesons." + - tweak: "The cheaper mesons will not completely remove reliance on light." diff --git a/html/changelogs/AutoChangeLog-pr-1129.yml b/html/changelogs/AutoChangeLog-pr-1129.yml new file mode 100644 index 0000000000..695dc0b148 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1129.yml @@ -0,0 +1,4 @@ +author: "That Really Good Soda Flavor" +delete-after: True +changes: + - bugfix: "Fixed a bug where paper bins could swallow up pens into the void." diff --git a/html/changelogs/AutoChangeLog-pr-1130.yml b/html/changelogs/AutoChangeLog-pr-1130.yml new file mode 100644 index 0000000000..c7dacb5662 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1130.yml @@ -0,0 +1,10 @@ +author: "Robustin" +delete-after: True +changes: + - rscadd: "Gang influence is now decentralized, each gangster has their own influence that they can increase by spraying (and protecting) their tags and new influence-enhancing bling." + - rscadd: "Gang uniforms are now created based on your gang's color and can be purchased by any gang member. They will increase the wearer's influence and provide protection, but will make it fairly obvious which gang you belong to." + - rscadd: "Gangs have access to a new surplus rifle; it is a semi-automatic rifle that is very bulky and has a very low rate of fire. Gang members can buy this gun for just 8 influence." + - rscadd: "Gangs have access to the new machine gun turret; it unleashes a volley of bullets with an extended view range. It does not run out of ammo, but a significant delay between volleys and its stationary nature leaves the gunner vulnerable to flanking and return fire. Holding down the trigger will allow you to aim the gun while firing. It will cost gangs 50 influence." + - rscadd: "The sawn-off improvised shotgun is now available to gangs for 6 influence. With buckshot shells being easy to produce or purchase, this gun gives the most \"bang for your buck\" but its single-shell capacity will leave you vulnerable during a pitched gunfight." + - rscadd: "The Wetwork boots give gangs access to a lightly armored noslip variant." + - tweak: "The armored gang outfits are now slightly more resistant to ballistic and bomb damage" diff --git a/html/changelogs/AutoChangeLog-pr-1141.yml b/html/changelogs/AutoChangeLog-pr-1141.yml new file mode 100644 index 0000000000..2b8841490d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1141.yml @@ -0,0 +1,4 @@ +author: "Tacolizard" +delete-after: True +changes: + - tweak: "Station based armour is slightly more descriptive of what it does." diff --git a/html/changelogs/AutoChangeLog-pr-1146.yml b/html/changelogs/AutoChangeLog-pr-1146.yml new file mode 100644 index 0000000000..c7b4db56f6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1146.yml @@ -0,0 +1,4 @@ +author: "That Really Good Soda Flavor" +delete-after: True +changes: + - tweak: "Changed spray tan overdoses to be more realistic." diff --git a/html/changelogs/AutoChangeLog-pr-1147.yml b/html/changelogs/AutoChangeLog-pr-1147.yml new file mode 100644 index 0000000000..6c524da4aa --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1147.yml @@ -0,0 +1,5 @@ +author: "QualityVan" +delete-after: True +changes: + - rscadd: "Hairless hides now become wet when exposed to water" + - rscadd: "You can microwave wet leather to dry it" diff --git a/html/changelogs/AutoChangeLog-pr-1149.yml b/html/changelogs/AutoChangeLog-pr-1149.yml new file mode 100644 index 0000000000..4a5c010dd4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1149.yml @@ -0,0 +1,4 @@ +author: "Steelpoint" +delete-after: True +changes: + - rscadd: "Boxstation armoury weapon racks now have glass panes to help prevent the weapons easily flying out of a breached hull." diff --git a/icons/effects/ore_visuals.dmi b/icons/effects/ore_visuals.dmi new file mode 100644 index 0000000000..30a05b043a Binary files /dev/null and b/icons/effects/ore_visuals.dmi differ diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index b9ddf04153..8fbd06a23b 100644 Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ diff --git a/icons/mob/lavaland/dragon.dmi b/icons/mob/lavaland/dragon.dmi index 911d7288d1..2a5e20a671 100644 Binary files a/icons/mob/lavaland/dragon.dmi and b/icons/mob/lavaland/dragon.dmi differ diff --git a/icons/mob/lavaland/lavaland_monsters.dmi b/icons/mob/lavaland/lavaland_monsters.dmi index c45d49fdc5..7c41752024 100644 Binary files a/icons/mob/lavaland/lavaland_monsters.dmi and b/icons/mob/lavaland/lavaland_monsters.dmi differ diff --git a/icons/mob/neck.dmi b/icons/mob/neck.dmi index 53bc261686..de13308f37 100644 Binary files a/icons/mob/neck.dmi and b/icons/mob/neck.dmi differ diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index 87d4e5ed22..33149a3e2e 100644 Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index 263e51400a..441f334ca7 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index fd078d775c..48f37887cf 100644 Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi index 7a3c416b94..c0f2d46f62 100644 Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index 90e4ee5332..d936e41df4 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi index dfb1f4c51b..611a27e6a7 100644 Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ diff --git a/icons/obj/turrets.dmi b/icons/obj/turrets.dmi index c4077b6601..b186c3f224 100644 Binary files a/icons/obj/turrets.dmi and b/icons/obj/turrets.dmi differ diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi index 8e08060f0d..c7b9bbcdc8 100644 Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ diff --git a/icons/turf/mining.dmi b/icons/turf/mining.dmi index 66c07a8146..8770f77cd9 100644 Binary files a/icons/turf/mining.dmi and b/icons/turf/mining.dmi differ diff --git a/icons/turf/smoothrocks.dmi b/icons/turf/smoothrocks.dmi index a7e9864617..ba2bbce955 100644 Binary files a/icons/turf/smoothrocks.dmi and b/icons/turf/smoothrocks.dmi differ diff --git a/tgstation.dme b/tgstation.dme index ad998e8286..2d2e35f59e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -14,7 +14,6 @@ // BEGIN_INCLUDE #include "_maps\basemap.dm" -#include "_maps\loadallmaps.dm" #include "_maps\tgstation2.dm" #include "code\_compile_options.dm" #include "code\world.dm" @@ -197,7 +196,6 @@ #include "code\controllers\subsystem\dbcore.dm" #include "code\controllers\subsystem\disease.dm" #include "code\controllers\subsystem\events.dm" -#include "code\controllers\subsystem\fields.dm" #include "code\controllers\subsystem\fire_burning.dm" #include "code\controllers\subsystem\garbage.dm" #include "code\controllers\subsystem\icon_smooth.dm" @@ -232,6 +230,7 @@ #include "code\controllers\subsystem\vote.dm" #include "code\controllers\subsystem\weather.dm" #include "code\controllers\subsystem\processing\fastprocess.dm" +#include "code\controllers\subsystem\processing\fields.dm" #include "code\controllers\subsystem\processing\flightpacks.dm" #include "code\controllers\subsystem\processing\obj.dm" #include "code\controllers\subsystem\processing\overlays.dm" @@ -324,7 +323,11 @@ #include "code\datums\helper_datums\icon_snapshot.dm" #include "code\datums\helper_datums\teleport.dm" #include "code\datums\helper_datums\topic_input.dm" +#include "code\datums\martial\boxing.dm" +#include "code\datums\martial\cqc.dm" #include "code\datums\martial\krav_maga.dm" +#include "code\datums\martial\plasma_fist.dm" +#include "code\datums\martial\sleeping_carp.dm" #include "code\datums\martial\wrestling.dm" #include "code\datums\ruins\lavaland.dm" #include "code\datums\ruins\space.dm" diff --git a/tgui/assets/tgui.css.rej b/tgui/assets/tgui.css.rej deleted file mode 100644 index bc960c1251..0000000000 --- a/tgui/assets/tgui.css.rej +++ /dev/null @@ -1,6 +0,0 @@ -diff a/tgui/assets/tgui.css b/tgui/assets/tgui.css (rejected hunks) -@@ -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 d7b7e7f257..c609f0d32b 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 u="function"==typeof require&&require;if(!s&&u)return u(o,!0);if(i)return i(o,!0);var p=Error("Cannot find module '"+o+"'");throw p.code="MODULE_NOT_FOUND",p}var c=n[o]={exports:{}};e[o][0].call(c.exports,function(t){var n=e[o][1][t];return r(n?n:t)},c,c.exports,t,e,n,a)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o2?p[2]:void 0,l=Math.min((void 0===c?o:r(c,o))-u,o-s),f=1;for(s>u&&u+l>s&&(f=-1,u+=l-1,s+=l-1);l-- >0;)u in n?n[s]=n[u]:delete n[s],s+=f,u+=f;return n}},{76:76,79:79,80:80}],6:[function(t,e,n){"use strict";var a=t(80),r=t(76),i=t(79);e.exports=[].fill||function(t){for(var e=a(this),n=i(e.length),o=arguments,s=o.length,u=r(s>1?o[1]:void 0,n),p=s>2?o[2]:void 0,c=void 0===p?n:r(p,n);c>u;)e[u++]=t;return e}},{76:76,79:79,80:80}],7:[function(t,e,n){var a=t(78),r=t(79),i=t(76);e.exports=function(t){return function(e,n,o){var s,u=a(e),p=r(u.length),c=i(o,p);if(t&&n!=n){for(;p>c;)if(s=u[c++],s!=s)return!0}else for(;p>c;c++)if((t||c in u)&&u[c]===n)return t||c;return!t&&-1}}},{76:76,78:78,79:79}],8:[function(t,e,n){var a=t(17),r=t(34),i=t(80),o=t(79),s=t(9);e.exports=function(t){var e=1==t,n=2==t,u=3==t,p=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),x=o(b.length),_=0,w=e?s(f,x):n?s(f,0):void 0;x>_;_++)if((l||_ in b)&&(m=b[_],v=y(m,_,g),t))if(e)w[_]=v;else if(v)switch(t){case 3:return!0;case 5:return m;case 6:return _;case 2:w.push(m)}else if(p)return!1;return c?-1:u||p?p:w}}},{17:17,34:34,79:79,80:80,9:9}],9:[function(t,e,n){var a=t(38),r=t(36),i=t(83)("species");e.exports=function(t,e){var n;return r(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!r(n.prototype)||(n=void 0),a(n)&&(n=n[i],null===n&&(n=void 0))),new(void 0===n?Array:n)(e)}},{36:36,38:38,83:83}],10:[function(t,e,n){var a=t(11),r=t(83)("toStringTag"),i="Arguments"==a(function(){return arguments}());e.exports=function(t){var e,n,o;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=(e=Object(t))[r])?n:i?a(e):"Object"==(o=a(e))&&"function"==typeof e.callee?"Arguments":o}},{11:11,83:83}],11:[function(t,e,n){var a={}.toString;e.exports=function(t){return a.call(t).slice(8,-1)}},{}],12:[function(t,e,n){"use strict";var a=t(46),r=t(31),i=t(60),o=t(17),s=t(69),u=t(18),p=t(27),c=t(42),l=t(44),f=t(82)("id"),d=t(30),h=t(38),m=t(65),v=t(19),g=Object.isExtensible||h,b=v?"_s":"size",y=0,x=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]},_=function(t,e){var n,a=x(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&&p(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=_(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!!_(this,t)}}),v&&a.setDesc(c.prototype,"size",{get:function(){return u(this[b])}}),c},def:function(t,e,n){var a,r,i=_(t,e);return i?i.v=n:(t._l=i={i:r=x(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:_,setStrong:function(t,e,n){c(t,e,function(t,e){this._t=t,this._k=e,this._l=void 0},function(){for(var t=this,e=t._k,n=t._l;n&&n.r;)n=n.p;return t._t&&(t._l=n=n?n.n:t._t._f)?"keys"==e?l(0,n.k):"values"==e?l(0,n.v):l(0,[n.k,n.v]):(t._t=void 0,l(1))},n?"entries":"values",!n,!0),m(e)}}},{17:17,18:18,19:19,27:27,30:30,31:31,38:38,42:42,44:44,46:46,60:60,65:65,69:69,82:82}],13:[function(t,e,n){var a=t(27),r=t(10);e.exports=function(t){return function(){if(r(this)!=t)throw TypeError(t+"#toJSON isn't generic");var e=[];return a(this,!1,e.push,e),e}}},{10:10,27:27}],14:[function(t,e,n){"use strict";var a=t(31),r=t(60),i=t(4),o=t(38),s=t(69),u=t(27),p=t(8),c=t(30),l=t(82)("weak"),f=Object.isExtensible||o,d=p(5),h=p(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&&u(r,n,t[a],t)});return r(i.prototype,{"delete":function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i)&&delete t[l][this._i]:v(this)["delete"](t):!1},has:function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i):v(this).has(t):!1}}),i},def:function(t,e,n){return f(i(e))?(c(e,l)||a(e,l,{}),e[l][t._i]=n):v(t).set(e,n),t},frozenStore:v,WEAK:l}},{27:27,30:30,31:31,38:38,4:4,60:60,69:69,8:8,82:82}],15:[function(t,e,n){"use strict";var a=t(29),r=t(22),i=t(61),o=t(60),s=t(27),u=t(69),p=t(38),c=t(24),l=t(43),f=t(66);e.exports=function(t,e,n,d,h,m){var v=a[t],g=v,b=h?"set":"add",y=g&&g.prototype,x={},_=function(t){var e=y[t];i(y,t,"delete"==t?function(t){return m&&!p(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!p(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!p(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,E=k[b](m?{}:-0,1)!=k,S=c(function(){k.has(1)}),C=l(function(t){new g(t)});C||(g=e(function(e,n){u(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)}),(S||w)&&(_("delete"),_("has"),h&&_("get")),(w||E)&&_(b),m&&y.clear&&delete y.clear}else g=d.getConstructor(e,t,h,b),o(g.prototype,n);return f(g,t),x[t]=g,r(r.G+r.W+r.F*(g!=v),x),m||d.setStrong(g,t,h),g}},{22:22,24:24,27:27,29:29,38:38,43:43,60:60,61:61,66:66,69:69}],16:[function(t,e,n){var a=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=a)},{}],17:[function(t,e,n){var a=t(2);e.exports=function(t,e,n){if(a(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,a){return t.call(e,n,a)};case 3:return function(n,a,r){return t.call(e,n,a,r)}}return function(){return t.apply(e,arguments)}}},{2:2}],18:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],19:[function(t,e,n){e.exports=!t(24)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{24:24}],20:[function(t,e,n){var a=t(38),r=t(29).document,i=a(r)&&a(r.createElement);e.exports=function(t){return i?r.createElement(t):{}}},{29:29,38:38}],21:[function(t,e,n){var a=t(46);e.exports=function(t){var e=a.getKeys(t),n=a.getSymbols;if(n)for(var r,i=n(t),o=a.isEnum,s=0;i.length>s;)o.call(t,r=i[s++])&&e.push(r);return e}},{46:46}],22:[function(t,e,n){var a=t(29),r=t(16),i=t(31),o=t(61),s=t(17),u="prototype",p=function(t,e,n){var c,l,f,d,h=t&p.F,m=t&p.G,v=t&p.S,g=t&p.P,b=t&p.B,y=m?a:v?a[e]||(a[e]={}):(a[e]||{})[u],x=m?r:r[e]||(r[e]={}),_=x[u]||(x[u]={});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),x[c]!=f&&i(x,c,d),g&&_[c]!=f&&(_[c]=f)};a.core=r,p.F=1,p.G=2,p.S=4,p.P=8,p.B=16,p.W=32,e.exports=p},{16:16,17:17,29:29,31:31,61:61}],23:[function(t,e,n){var a=t(83)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[a]=!1,!"/./"[t](e)}catch(r){}}return!0}},{83:83}],24:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],25:[function(t,e,n){"use strict";var a=t(31),r=t(61),i=t(24),o=t(18),s=t(83);e.exports=function(t,e,n){var u=s(t),p=""[t];i(function(){var e={};return e[u]=function(){return 7},7!=""[t](e)})&&(r(String.prototype,t,n(o,u,p)),a(RegExp.prototype,u,2==e?function(t,e){return p.call(t,this,e)}:function(t){return p.call(t,this)}))}},{18:18,24:24,31:31,61:61,83:83}],26:[function(t,e,n){"use strict";var a=t(4);e.exports=function(){var t=a(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},{4:4}],27:[function(t,e,n){var a=t(17),r=t(40),i=t(35),o=t(4),s=t(79),u=t(84);e.exports=function(t,e,n,p){var c,l,f,d=u(t),h=a(n,p,e?2:1),m=0;if("function"!=typeof d)throw TypeError(t+" is not iterable!");if(i(d))for(c=s(t.length);c>m;m++)e?h(o(l=t[m])[0],l[1]):h(t[m]);else for(f=d.call(t);!(l=f.next()).done;)r(f,h,l.value,e)}},{17:17,35:35,4:4,40:40,79:79,84:84}],28:[function(t,e,n){var a=t(78),r=t(46).getNames,i={}.toString,o="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return r(t)}catch(e){return o.slice()}};e.exports.get=function(t){return o&&"[object Window]"==i.call(t)?s(t):r(a(t))}},{46:46,78:78}],29:[function(t,e,n){var a=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=a)},{}],30:[function(t,e,n){var a={}.hasOwnProperty;e.exports=function(t,e){return a.call(t,e)}},{}],31:[function(t,e,n){var a=t(46),r=t(59);e.exports=t(19)?function(t,e,n){return a.setDesc(t,e,r(1,n))}:function(t,e,n){return t[e]=n,t}},{19:19,46:46,59:59}],32:[function(t,e,n){e.exports=t(29).document&&document.documentElement},{29:29}],33:[function(t,e,n){e.exports=function(t,e,n){var a=void 0===n;switch(e.length){case 0:return a?t():t.call(n);case 1:return a?t(e[0]):t.call(n,e[0]);case 2:return a?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return a?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return a?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},{}],34:[function(t,e,n){var a=t(11);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==a(t)?t.split(""):Object(t)}},{11:11}],35:[function(t,e,n){var a=t(45),r=t(83)("iterator"),i=Array.prototype;e.exports=function(t){return void 0!==t&&(a.Array===t||i[r]===t)}},{45:45,83:83}],36:[function(t,e,n){var a=t(11);e.exports=Array.isArray||function(t){return"Array"==a(t)}},{11:11}],37:[function(t,e,n){var a=t(38),r=Math.floor;e.exports=function(t){return!a(t)&&isFinite(t)&&r(t)===t}},{38:38}],38:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],39:[function(t,e,n){var a=t(38),r=t(11),i=t(83)("match");e.exports=function(t){var e;return a(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==r(t))}},{11:11,38:38,83:83}],40:[function(t,e,n){var a=t(4);e.exports=function(t,e,n,r){try{return r?e(a(n)[0],n[1]):e(n)}catch(i){var o=t["return"];throw void 0!==o&&a(o.call(t)),i}}},{4:4}],41:[function(t,e,n){"use strict";var a=t(46),r=t(59),i=t(66),o={};t(31)(o,t(83)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=a.create(o,{next:r(1,n)}),i(t,e+" Iterator")}},{31:31,46:46,59:59,66:66,83:83}],42:[function(t,e,n){"use strict";var a=t(48),r=t(22),i=t(61),o=t(31),s=t(30),u=t(45),p=t(41),c=t(66),l=t(46).getProto,f=t(83)("iterator"),d=!([].keys&&"next"in[].keys()),h="@@iterator",m="keys",v="values",g=function(){return this};e.exports=function(t,e,n,b,y,x,_){p(n,e,b);var w,k,E=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)}},S=e+" Iterator",C=y==v,P=!1,A=t.prototype,O=A[f]||A[h]||y&&A[y],T=O||E(y);if(O){var R=l(T.call(new t));c(R,S,!0),!a&&s(A,h)&&o(R,f,g),C&&O.name!==v&&(P=!0,T=function(){return O.call(this)})}if(a&&!_||!d&&!P&&A[f]||o(A,f,T),u[e]=T,u[S]=g,y)if(w={values:C?T:E(v),keys:x?T:E(m),entries:C?E("entries"):T},_)for(k in w)k in A||i(A,k,w[k]);else r(r.P+r.F*(d||P),e,w);return w}},{22:22,30:30,31:31,41:41,45:45,46:46,48:48,61:61,66:66,83:83}],43:[function(t,e,n){var a=t(83)("iterator"),r=!1;try{var i=[7][a]();i["return"]=function(){r=!0},Array.from(i,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!r)return!1;var n=!1;try{var i=[7],o=i[a]();o.next=function(){return{done:n=!0}},i[a]=function(){return o},t(i)}catch(s){}return n}},{83:83}],44:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],45:[function(t,e,n){e.exports={}},{}],46:[function(t,e,n){var a=Object;e.exports={create:a.create,getProto:a.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:a.getOwnPropertyDescriptor,setDesc:a.defineProperty,setDescs:a.defineProperties,getKeys:a.keys,getNames:a.getOwnPropertyNames,getSymbols:a.getOwnPropertySymbols,each:[].forEach}},{}],47:[function(t,e,n){var a=t(46),r=t(78);e.exports=function(t,e){for(var n,i=r(t),o=a.getKeys(i),s=o.length,u=0;s>u;)if(i[n=o[u++]]===e)return n}},{46:46,78:78}],48:[function(t,e,n){e.exports=!1},{}],49:[function(t,e,n){e.exports=Math.expm1||function(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}},{}],50:[function(t,e,n){e.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&1e-8>t?t-t*t/2:Math.log(1+t)}},{}],51:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],52:[function(t,e,n){var a,r,i,o=t(29),s=t(75).set,u=o.MutationObserver||o.WebKitMutationObserver,p=o.process,c=o.Promise,l="process"==t(11)(p),f=function(){var t,e,n;for(l&&(t=p.domain)&&(p.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(){p.nextTick(f)};else if(u){var d=1,h=document.createTextNode("");new u(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&&p.domain};r&&(r.next=e),a||(a=e,i()),r=e}},{11:11,29:29,75:75}],53:[function(t,e,n){var a=t(46),r=t(80),i=t(34);e.exports=t(24)(function(){var t=Object.assign,e={},n={},a=Symbol(),r="abcdefghijklmnopqrst";return e[a]=7,r.split("").forEach(function(t){n[t]=t}),7!=t({},e)[a]||Object.keys(t({},n)).join("")!=r})?function(t,e){for(var n=r(t),o=arguments,s=o.length,u=1,p=a.getKeys,c=a.getSymbols,l=a.isEnum;s>u;)for(var f,d=i(o[u++]),h=c?p(d).concat(c(d)):p(d),m=h.length,v=0;m>v;)l.call(d,f=h[v++])&&(n[f]=d[f]);return n}:Object.assign},{24:24,34:34,46:46,80:80}],54:[function(t,e,n){var a=t(22),r=t(16),i=t(24);e.exports=function(t,e){var n=(r.Object||{})[t]||Object[t],o={};o[t]=e(n),a(a.S+a.F*i(function(){n(1)}),"Object",o)}},{16:16,22:22,24:24}],55:[function(t,e,n){var a=t(46),r=t(78),i=a.isEnum;e.exports=function(t){return function(e){for(var n,o=r(e),s=a.getKeys(o),u=s.length,p=0,c=[];u>p;)i.call(o,n=s[p++])&&c.push(t?[n,o[n]]:o[n]);return c}}},{46:46,78:78}],56:[function(t,e,n){var a=t(46),r=t(4),i=t(29).Reflect;e.exports=i&&i.ownKeys||function(t){var e=a.getNames(r(t)),n=a.getSymbols;return n?e.concat(n(t)):e}},{29:29,4:4,46:46}],57:[function(t,e,n){"use strict";var a=t(58),r=t(33),i=t(2);e.exports=function(){for(var t=i(this),e=arguments.length,n=Array(e),o=0,s=a._,u=!1;e>o;)(n[o]=arguments[o++])===s&&(u=!0);return function(){var a,i=this,o=arguments,p=o.length,c=0,l=0;if(!u&&!p)return r(t,n,i);if(a=n.slice(),u)for(;e>c;c++)a[c]===s&&(a[c]=o[l++]);for(;p>l;)a.push(o[l++]);return r(t,a,i)}}},{2:2,33:33,58:58}],58:[function(t,e,n){e.exports=t(29)},{29:29}],59:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],60:[function(t,e,n){var a=t(61);e.exports=function(t,e){for(var n in e)a(t,n,e[n]);return t}},{61:61}],61:[function(t,e,n){var a=t(29),r=t(31),i=t(82)("src"),o="toString",s=Function[o],u=(""+s).split(o);t(16).inspectSource=function(t){return s.call(t)},(e.exports=function(t,e,n,o){"function"==typeof n&&(n.hasOwnProperty(i)||r(n,i,t[e]?""+t[e]:u.join(e+"")),n.hasOwnProperty("name")||r(n,"name",e)),t===a?t[e]=n:(o||delete t[e],r(t,e,n))})(Function.prototype,o,function(){return"function"==typeof this&&this[i]||s.call(this)})},{16:16,29:29,31:31,82:82}],62:[function(t,e,n){e.exports=function(t,e){var n=e===Object(e)?function(t){return e[t]}:e;return function(e){return(e+"").replace(t,n)}}},{}],63:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],64:[function(t,e,n){var a=t(46).getDesc,r=t(38),i=t(4),o=function(t,e){if(i(t),!r(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,r){try{r=t(17)(Function.call,a(Object.prototype,"__proto__").set,2),r(e,[]),n=!(e instanceof Array)}catch(i){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:r(t,e),t}}({},!1):void 0),check:o}},{17:17,38:38,4:4,46:46}],65:[function(t,e,n){"use strict";var a=t(29),r=t(46),i=t(19),o=t(83)("species");e.exports=function(t){var e=a[t];i&&e&&!e[o]&&r.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{19:19,29:29,46:46,83:83}],66:[function(t,e,n){var a=t(46).setDesc,r=t(30),i=t(83)("toStringTag");e.exports=function(t,e,n){t&&!r(t=n?t:t.prototype,i)&&a(t,i,{configurable:!0,value:e})}},{30:30,46:46,83:83}],67:[function(t,e,n){var a=t(29),r="__core-js_shared__",i=a[r]||(a[r]={});e.exports=function(t){return i[t]||(i[t]={})}},{29:29}],68:[function(t,e,n){var a=t(4),r=t(2),i=t(83)("species");e.exports=function(t,e){var n,o=a(t).constructor;return void 0===o||void 0==(n=a(o)[i])?e:r(n)}},{2:2,4:4,83:83}],69:[function(t,e,n){e.exports=function(t,e,n){if(!(t instanceof e))throw TypeError(n+": use the 'new' operator!");return t}},{}],70:[function(t,e,n){var a=t(77),r=t(18);e.exports=function(t){return function(e,n){var i,o,s=r(e)+"",u=a(n),p=s.length;return 0>u||u>=p?t?"":void 0:(i=s.charCodeAt(u),55296>i||i>56319||u+1===p||(o=s.charCodeAt(u+1))<56320||o>57343?t?s.charAt(u):i:t?s.slice(u,u+2):(i-55296<<10)+(o-56320)+65536)}}},{18:18,77:77}],71:[function(t,e,n){var a=t(39),r=t(18);e.exports=function(t,e,n){if(a(e))throw TypeError("String#"+n+" doesn't accept regex!");return r(t)+""}},{18:18,39:39}],72:[function(t,e,n){var a=t(79),r=t(73),i=t(18);e.exports=function(t,e,n,o){var s=i(t)+"",u=s.length,p=void 0===n?" ":n+"",c=a(e);if(u>=c)return s;""==p&&(p=" ");var l=c-u,f=r.call(p,Math.ceil(l/p.length));return f.length>l&&(f=f.slice(0,l)),o?f+s:s+f}},{18:18,73:73,79:79}],73:[function(t,e,n){"use strict";var a=t(77),r=t(18);e.exports=function(t){var e=r(this)+"",n="",i=a(t);if(0>i||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(e+=e))1&i&&(n+=e);return n}},{18:18,77:77}],74:[function(t,e,n){var a=t(22),r=t(18),i=t(24),o=" \n\x0B\f\r  ᠎              \u2028\u2029\ufeff",s="["+o+"]",u="​…",p=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]()||u[t]()!=u}),"String",n)},f=l.trim=function(t,e){return t=r(t)+"",1&e&&(t=t.replace(p,"")),2&e&&(t=t.replace(c,"")),t};e.exports=l},{18:18,22:22,24:24}],75:[function(t,e,n){var a,r,i,o=t(17),s=t(33),u=t(32),p=t(20),c=t(29),l=c.process,f=c.setImmediate,d=c.clearImmediate,h=c.MessageChannel,m=0,v={},g="onreadystatechange",b=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},y=function(t){b.call(t.data)};f&&d||(f=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++m]=function(){s("function"==typeof t?t:Function(t),e)},a(m),m},d=function(t){delete v[t]},"process"==t(11)(l)?a=function(t){l.nextTick(o(b,t,1))}:h?(r=new h,i=r.port2,r.port1.onmessage=y,a=o(i.postMessage,i,1)):c.addEventListener&&"function"==typeof postMessage&&!c.importScripts?(a=function(t){c.postMessage(t+"","*")},c.addEventListener("message",y,!1)):a=g in p("script")?function(t){u.appendChild(p("script"))[g]=function(){u.removeChild(this),b.call(t)}}:function(t){setTimeout(o(b,t,1),0)}),e.exports={set:f,clear:d}},{11:11,17:17,20:20,29:29,32:32,33:33}],76:[function(t,e,n){var a=t(77),r=Math.max,i=Math.min;e.exports=function(t,e){return t=a(t),0>t?r(t+e,0):i(t,e)}},{77:77}],77:[function(t,e,n){var a=Math.ceil,r=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?r:a)(t)}},{}],78:[function(t,e,n){var a=t(34),r=t(18);e.exports=function(t){return a(r(t))}},{18:18,34:34}],79:[function(t,e,n){var a=t(77),r=Math.min;e.exports=function(t){return t>0?r(a(t),9007199254740991):0}},{77:77}],80:[function(t,e,n){var a=t(18);e.exports=function(t){return Object(a(t))}},{18:18}],81:[function(t,e,n){var a=t(38);e.exports=function(t,e){if(!a(t))return t;var n,r;if(e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;if("function"==typeof(n=t.valueOf)&&!a(r=n.call(t)))return r;if(!e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;throw TypeError("Can't convert object to primitive value")}},{38:38}],82:[function(t,e,n){var a=0,r=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++a+r).toString(36))}},{}],83:[function(t,e,n){var a=t(67)("wks"),r=t(82),i=t(29).Symbol;e.exports=function(t){return a[t]||(a[t]=i&&i[t]||(i||r)("Symbol."+t))}},{29:29,67:67,82:82}],84:[function(t,e,n){var a=t(10),r=t(83)("iterator"),i=t(45);e.exports=t(16).getIteratorMethod=function(t){return void 0!=t?t[r]||t["@@iterator"]||i[a(t)]:void 0}},{10:10,16:16,45:45,83:83}],85:[function(t,e,n){"use strict";var a,r=t(46),i=t(22),o=t(19),s=t(59),u=t(32),p=t(20),c=t(30),l=t(11),f=t(33),d=t(24),h=t(4),m=t(2),v=t(38),g=t(80),b=t(78),y=t(77),x=t(76),_=t(79),w=t(34),k=t(82)("__proto__"),E=t(8),S=t(7)(!1),C=Object.prototype,P=Array.prototype,A=P.slice,O=P.join,T=r.setDesc,R=r.getDesc,M=r.setDescs,j={};o||(a=!d(function(){return 7!=T(p("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 R(t,e)}catch(n){}return c(t,e)?s(!C.propertyIsEnumerable.call(t,e),t[e]):void 0},r.setDescs=M=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:M});var L="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),N=L.concat("length","prototype"),D=L.length,F=function(){var t,e=p("iframe"),n=D,a=">";for(e.style.display="none",u.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("
[G.name] Gang: [round((G.territory.len/GLOB.start_state.num_territories)*100, 1)]% Control