diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm index 299850722c0..0314b624a82 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm @@ -1,76 +1,133 @@ -"a" = (/turf/template_noop,/area/template_noop) -"b" = (/turf/closed/wall/r_wall,/area/ruin/powered) -"c" = (/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"d" = (/obj/structure/grille,/obj/structure/window/fulltile,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"e" = (/turf/open/floor/plating/beach/sand,/area/ruin/powered) -"f" = (/obj/effect/overlay/palmtree_l,/turf/open/floor/plating/beach/sand,/area/ruin/powered) -"g" = (/turf/closed/wall/mineral/sandstone,/area/ruin/powered) -"h" = (/obj/effect/overlay/palmtree_r,/obj/effect/overlay/coconut,/turf/open/floor/plating/beach/sand,/area/ruin/powered) -"i" = (/obj/structure/table,/obj/item/weapon/storage/box/drinkingglasses,/obj/item/weapon/storage/box/drinkingglasses,/obj/item/weapon/reagent_containers/food/drinks/shaker,/obj/item/weapon/storage/box/beakers,/turf/open/floor/wood,/area/ruin/powered) -"j" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/open/floor/wood,/area/ruin/powered) -"k" = (/obj/machinery/vending/boozeomat{emagged = 1},/turf/open/floor/wood,/area/ruin/powered) -"l" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/rag,/turf/open/floor/wood,/area/ruin/powered) -"m" = (/obj/effect/mob_spawn/human/cook{helmet = null; id_access = "Bartender"; id_job = "Bartender"; suit = /obj/item/clothing/suit/armor/vest; uniform = /obj/item/clothing/under/rank/bartender; death = 0; desc = "Looks secure."; flavour_text = "You are a bartender for the beach!"; icon = 'icons/obj/Cryogenic2.dmi'; icon_state = "sleeper"; mob_name = "Jerry Thomas"; name = "bartenders cryosleeper"; roundstart = 1},/turf/open/floor/wood,/area/ruin/powered) -"n" = (/turf/open/floor/wood,/area/ruin/powered) -"o" = (/obj/structure/table,/obj/machinery/microwave,/turf/open/floor/wood,/area/ruin/powered) -"p" = (/turf/open/floor/plating/beach/sand,/obj/structure/closet/crate/bin,/turf/open/floor/plasteel/sandeffect,/area/ruin/powered) -"q" = (/turf/open/floor/plating/beach/sand,/turf/open/floor/plasteel/sandeffect,/area/ruin/powered) -"r" = (/obj/structure/table,/turf/open/floor/wood,/area/ruin/powered) -"s" = (/turf/open/floor/plating/beach/sand,/obj/machinery/vending/cigarette,/turf/open/floor/plasteel/sandeffect,/area/ruin/powered) -"t" = (/obj/structure/table/wood,/turf/open/floor/wood,/area/ruin/powered) -"u" = (/obj/machinery/processor,/turf/open/floor/wood,/area/ruin/powered) -"v" = (/turf/open/floor/plating/beach/sand,/obj/machinery/vending/cola,/turf/open/floor/plasteel/sandeffect,/area/ruin/powered) -"w" = (/turf/open/floor/plating/beach/sand,/obj/structure/chair/stool,/turf/open/floor/plasteel/sandeffect,/area/ruin/powered) -"x" = (/obj/structure/closet/secure_closet/freezer/meat,/turf/open/floor/wood,/area/ruin/powered) -"y" = (/turf/open/floor/plating/beach/sand,/obj/machinery/vending/snack,/turf/open/floor/plasteel/sandeffect,/area/ruin/powered) -"z" = (/turf/open/floor/plating/beach/sand{density = 1; opacity = 1},/area/ruin/powered) -"A" = (/obj/machinery/door/airlock/sandstone,/turf/open/floor/wood,/area/ruin/powered) -"B" = (/obj/structure/closet/secure_closet/freezer/kitchen,/turf/open/floor/wood,/area/ruin/powered) -"C" = (/obj/structure/sign/barsign,/turf/closed/wall/mineral/sandstone,/area/ruin/powered) -"D" = (/mob/living/simple_animal/crab,/turf/open/floor/plating/beach/sand,/area/ruin/powered) -"E" = (/obj/effect/overlay/palmtree_l,/obj/effect/overlay/coconut,/turf/open/floor/plating/beach/sand,/area/ruin/powered) -"F" = (/turf/open/floor/plating/beach/sand,/obj/structure/closet/athletic_mixed,/turf/open/floor/plasteel/sandeffect,/area/ruin/powered) -"G" = (/turf/open/floor/plating/beach/sand,/obj/item/clothing/shoes/sandal,/obj/item/clothing/shoes/sandal,/obj/item/clothing/shoes/sandal,/obj/structure/closet/crate,/turf/open/floor/plasteel/sandeffect,/area/ruin/powered) -"H" = (/obj/machinery/door/airlock/hatch,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth; blocks_air = 1},/area/ruin/powered) -"I" = (/obj/machinery/door/airlock/sandstone,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"J" = (/obj/effect/overlay/coconut,/turf/open/floor/plating/beach/sand,/area/ruin/powered) -"K" = (/obj/item/toy/beach_ball,/turf/open/floor/plating/beach/sand,/area/ruin/powered) -"L" = (/obj/structure/chair,/turf/open/floor/plating/beach/sand,/area/ruin/powered) -"M" = (/obj/structure/chair,/mob/living/simple_animal/crab,/turf/open/floor/plating/beach/sand,/area/ruin/powered) -"N" = (/turf/open/floor/plating/beach/coastline_t,/area/ruin/powered) -"O" = (/turf/open/floor/plating/beach/coastline_b,/area/ruin/powered) -"P" = (/turf/open/floor/plating/beach/water,/area/ruin/powered) -"Q" = (/turf/closed/wall/r_wall{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"aa" = (/turf/template_noop,/area/template_noop) +"ab" = (/turf/closed/wall/r_wall{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"ac" = (/turf/closed/wall/r_wall,/area/ruin/powered) +"ad" = (/obj/structure/flora/ausbushes/leafybush,/turf/open/floor/plating/beach/sand,/area/ruin/powered) +"ae" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/stack/cable_coil,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"af" = (/obj/structure/table,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"ag" = (/obj/structure/reagent_dispensers/fueltank,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"ah" = (/obj/machinery/power/smes,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"ai" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"aj" = (/turf/closed/wall/mineral/sandstone{baseturf = /turf/open/floor/plating/beach/sand},/area/ruin/powered) +"ak" = (/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/obj/structure/toilet,/turf/open/floor/plasteel/sandeffect,/area/ruin/powered) +"al" = (/obj/structure/urinal{pixel_y = 32},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"am" = (/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/obj/structure/urinal{pixel_y = 32},/turf/open/floor/plasteel/sandeffect,/area/ruin/powered) +"an" = (/obj/item/device/flashlight/lantern,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"ao" = (/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/open/floor/plasteel/sandeffect,/area/ruin/powered) +"ap" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/open/floor/plating/beach/sand,/area/ruin/powered) +"aq" = (/obj/structure/flora/ausbushes/sunnybush,/turf/open/floor/plating/beach/sand,/area/ruin/powered) +"ar" = (/turf/open/floor/plating/beach/sand,/area/ruin/powered) +"as" = (/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"at" = (/obj/item/weapon/tank/internals/oxygen,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"au" = (/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/turf/open/floor/plasteel/sandeffect,/area/ruin/powered) +"av" = (/obj/machinery/door/airlock/hatch,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"aw" = (/obj/machinery/door/airlock/sandstone,/turf/open/floor/wood,/area/ruin/powered) +"ax" = (/obj/structure/extinguisher_cabinet,/turf/closed/wall/mineral/sandstone{baseturf = /turf/open/floor/plating/beach/sand},/area/ruin/powered) +"ay" = (/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/obj/machinery/door/airlock/hatch,/turf/open/floor/plasteel/sandeffect,/area/ruin/powered) +"az" = (/obj/item/clothing/tie/dope_necklace,/obj/item/weapon/reagent_containers/spray/spraytan,/turf/open/floor/plating/beach/sand,/area/ruin/powered) +"aA" = (/turf/open/floor/plating/beach/sand,/turf/open/floor/plasteel/sandeffect,/area/ruin/powered) +"aB" = (/turf/open/floor/plasteel/asteroid/warning{baseturf = /turf/open/floor/plating/beach/sand; dir = 1; icon_state = "asteroidwarning"; tag = "icon-asteroidwarning (NORTH)"},/area/ruin/powered) +"aC" = (/turf/open/floor/wood,/area/ruin/powered) +"aD" = (/obj/structure/table,/obj/item/weapon/storage/box/drinkingglasses,/obj/item/weapon/storage/box/drinkingglasses,/obj/item/weapon/reagent_containers/food/drinks/shaker,/obj/item/weapon/storage/box/beakers,/turf/open/floor/wood,/area/ruin/powered) +"aE" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/open/floor/wood,/area/ruin/powered) +"aF" = (/obj/machinery/vending/boozeomat{emagged = 1},/turf/open/floor/wood,/area/ruin/powered) +"aG" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/rag,/turf/open/floor/wood,/area/ruin/powered) +"aH" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/turf/open/floor/wood,/area/ruin/powered) +"aI" = (/obj/structure/table,/obj/machinery/microwave,/turf/open/floor/wood,/area/ruin/powered) +"aJ" = (/obj/structure/closet/crate/bin,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/trash/candy,/obj/item/toy/talking/owl,/turf/open/floor/plasteel/asteroid/warning{baseturf = /turf/open/floor/plating/beach/sand; dir = 1; icon_state = "asteroidwarning"; tag = "icon-asteroidwarning (NORTH)"},/area/ruin/powered) +"aK" = (/turf/open/floor/plasteel/asteroid{baseturf = /turf/open/floor/plating/beach/sand},/area/ruin/powered) +"aL" = (/obj/effect/mob_spawn/human/bartender/alive{name = "beach bum sleeper"},/turf/open/floor/wood,/area/ruin/powered) +"aM" = (/obj/structure/reagent_dispensers/beerkeg,/turf/open/floor/wood,/area/ruin/powered) +"aN" = (/obj/machinery/vending/cigarette,/turf/open/floor/plasteel/asteroid{baseturf = /turf/open/floor/plating/beach/sand},/area/ruin/powered) +"aO" = (/obj/structure/stacklifter,/turf/open/floor/plating/beach/sand,/area/ruin/powered) +"aP" = (/obj/structure/table/wood,/turf/open/floor/wood,/area/ruin/powered) +"aQ" = (/obj/structure/table/wood,/obj/item/device/flashlight/lamp,/turf/open/floor/wood,/area/ruin/powered) +"aR" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/drinks/bottle/tequila,/turf/open/floor/wood,/area/ruin/powered) +"aS" = (/obj/machinery/processor,/turf/open/floor/wood,/area/ruin/powered) +"aT" = (/obj/machinery/vending/cola,/turf/open/floor/plasteel/asteroid{baseturf = /turf/open/floor/plating/beach/sand},/area/ruin/powered) +"aU" = (/obj/effect/overlay/palmtree_l,/turf/open/floor/plating/beach/sand,/area/ruin/powered) +"aV" = (/obj/effect/mob_spawn/human/beach/alive{flavour_text = "You're, like, totally a dudebro, bruh. Ch'yea. You came here, like, on spring break, hopin' to pick up some bangin' hot chicks, y'knaw?"; pocket2 = /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/dank; uniform = /obj/item/clothing/under/pants/youngfolksjeans},/turf/open/floor/plating/beach/sand,/area/ruin/powered) +"aW" = (/obj/structure/chair/stool,/turf/open/floor/plasteel/asteroid/warning{baseturf = /turf/open/floor/plating/beach/sand; dir = 1; icon_state = "asteroidwarning"; tag = "icon-asteroidwarning (NORTH)"},/area/ruin/powered) +"aX" = (/obj/structure/closet/secure_closet/freezer/meat,/turf/open/floor/wood,/area/ruin/powered) +"aY" = (/obj/machinery/vending/snack,/turf/open/floor/plasteel/asteroid{baseturf = /turf/open/floor/plating/beach/sand},/area/ruin/powered) +"aZ" = (/obj/effect/overlay/coconut,/turf/open/floor/plating/beach/sand,/area/ruin/powered) +"ba" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/open/floor/pod/dark{baseturf = /turf/open/floor/plating/asteroid/basalt},/area/ruin/powered) +"bb" = (/obj/structure/weightlifter,/turf/open/floor/plating/beach/sand,/area/ruin/powered) +"bc" = (/turf/open/floor/wood,/obj/machinery/door/airlock/sandstone,/turf/open/floor/plasteel/sandeffect,/area/ruin/powered) +"bd" = (/obj/structure/closet/secure_closet/freezer/kitchen,/turf/open/floor/wood,/area/ruin/powered) +"be" = (/obj/vehicle/scooter/skateboard{dir = 4},/turf/open/floor/plating/beach/sand,/area/ruin/powered) +"bf" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/open/floor/pod/dark{baseturf = /turf/open/floor/plating/asteroid/basalt},/area/ruin/powered) +"bg" = (/obj/structure/sign/barsign,/turf/closed/wall/mineral/sandstone,/area/ruin/powered) +"bh" = (/turf/closed/wall/mineral/sandstone,/area/ruin/powered) +"bi" = (/turf/open/floor/plating/beach/sand{density = 1; opacity = 1},/area/ruin/powered) +"bj" = (/obj/structure/chair/wood/normal{icon_state = "wooden_chair"; dir = 4},/turf/open/floor/plasteel/asteroid{baseturf = /turf/open/floor/plating/beach/sand},/area/ruin/powered) +"bk" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/snacks/pastatomato,/turf/open/floor/plasteel/asteroid{baseturf = /turf/open/floor/plating/beach/sand},/area/ruin/powered) +"bl" = (/obj/structure/chair/wood/normal{icon_state = "wooden_chair"; dir = 8},/turf/open/floor/plasteel/asteroid{baseturf = /turf/open/floor/plating/beach/sand},/area/ruin/powered) +"bm" = (/mob/living/simple_animal/crab,/turf/open/floor/plating/beach/sand{density = 1; opacity = 1},/area/ruin/powered) +"bn" = (/obj/structure/closet/athletic_mixed,/turf/open/floor/pod/dark{baseturf = /turf/open/floor/plating/asteroid/basalt},/area/ruin/powered) +"bo" = (/turf/open/floor/pod/dark{baseturf = /turf/open/floor/plating/asteroid/basalt},/obj/structure/rack,/obj/item/clothing/shoes/sandal,/obj/item/clothing/shoes/sandal,/turf/open/floor/plasteel/sandeffect,/area/ruin/powered) +"bp" = (/obj/structure/grille,/obj/structure/window/fulltile,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"bq" = (/turf/open/floor/pod/dark{baseturf = /turf/open/floor/plating/asteroid/basalt},/obj/structure/closet/athletic_mixed,/turf/open/floor/plasteel/sandeffect,/area/ruin/powered) +"br" = (/turf/open/floor/pod/dark{baseturf = /turf/open/floor/plating/asteroid/basalt},/area/ruin/powered) +"bs" = (/turf/open/floor/pod/dark{baseturf = /turf/open/floor/plating/asteroid/basalt},/turf/open/floor/plasteel/sandeffect,/area/ruin/powered) +"bt" = (/obj/machinery/door/airlock/hatch,/obj/structure/fans/tiny,/turf/open/floor/pod/dark{baseturf = /turf/open/floor/plating/asteroid/basalt},/area/ruin/powered) +"bu" = (/turf/open/floor/pod/light{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"bv" = (/turf/open/floor/pod/light{baseturf = /turf/open/floor/plating/lava/smooth},/turf/open/floor/plasteel/sandeffect,/area/ruin/powered) +"bw" = (/obj/machinery/door/airlock/sandstone,/turf/open/floor/pod/dark{baseturf = /turf/open/floor/plating/asteroid/basalt},/area/ruin/powered) +"bx" = (/obj/structure/flora/rock,/turf/open/floor/plating/beach/sand,/area/ruin/powered) +"by" = (/turf/open/floor/pod/dark{baseturf = /turf/open/floor/plating/asteroid/basalt},/obj/machinery/door/airlock/sandstone,/turf/open/floor/plasteel/sandeffect,/area/ruin/powered) +"bz" = (/mob/living/simple_animal/crab,/turf/open/floor/plating/beach/sand,/area/ruin/powered) +"bA" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/bikehorn/airhorn,/obj/structure/table/wood,/obj/item/weapon/storage/firstaid,/obj/item/weapon/storage/firstaid/brute,/turf/open/floor/wood,/area/ruin/powered) +"bB" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced{dir = 1; layer = 2.9},/obj/structure/chair/stool,/turf/open/floor/wood,/area/ruin/powered) +"bC" = (/obj/structure/table/wood,/obj/item/weapon/tank/internals/oxygen,/obj/item/weapon/pickaxe,/turf/open/floor/pod/dark{baseturf = /turf/open/floor/plating/asteroid/basalt},/area/ruin/powered) +"bD" = (/turf/open/floor/pod/dark{baseturf = /turf/open/floor/plating/asteroid/basalt},/obj/structure/dresser,/turf/open/floor/plasteel/sandeffect,/area/ruin/powered) +"bE" = (/obj/item/weapon/reagent_containers/spray/spraytan,/turf/open/floor/plating/beach/sand,/area/ruin/powered) +"bF" = (/obj/item/toy/beach_ball,/turf/open/floor/plating/beach/sand,/area/ruin/powered) +"bG" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/item/device/megaphone,/turf/open/floor/wood,/area/ruin/powered) +"bH" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/effect/mob_spawn/human/beach/alive{flavour_text = "You're a spunky lifeguard! It's up to you to make sure nobody drowns or gets eaten by sharks and stuff."; has_id = 1; id_access = "Medical Doctor"; id_job = "Lifeguard"; mob_gender = "female"},/turf/open/floor/wood,/area/ruin/powered) +"bI" = (/obj/structure/dresser,/turf/open/floor/pod/dark{baseturf = /turf/open/floor/plating/asteroid/basalt},/area/ruin/powered) +"bJ" = (/obj/structure/chair,/turf/open/floor/plating/beach/sand,/area/ruin/powered) +"bK" = (/obj/item/weapon/storage/backpack/dufflebag,/turf/open/floor/plating/beach/sand,/area/ruin/powered) +"bL" = (/turf/open/floor/pod/light{baseturf = /turf/open/floor/plating/lava/smooth; density = 1},/obj/structure/lattice,/turf/open/floor/plasteel/sandeffect,/area/ruin/powered) +"bM" = (/turf/open/floor/plasteel/stairs/old,/area/ruin/powered) +"bN" = (/obj/structure/flora/ausbushes/reedbush,/turf/open/floor/plating/beach/sand,/area/ruin/powered) +"bO" = (/obj/item/weapon/reagent_containers/spray/spraytan,/obj/item/device/camera,/turf/open/floor/plating/beach/sand,/area/ruin/powered) +"bP" = (/obj/item/weapon/reagent_containers/food/drinks/beer,/turf/open/floor/plating/beach/sand,/area/ruin/powered) +"bQ" = (/obj/structure/flora/ausbushes/reedbush,/turf/open/floor/plating/beach/coastline_t,/area/ruin/powered) +"bR" = (/turf/open/floor/plating/beach/coastline_t,/area/ruin/powered) +"bS" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/open/floor/plating/beach/coastline_t,/area/ruin/powered) +"bT" = (/turf/open/floor/plating/beach/coastline_b,/area/ruin/powered) +"bU" = (/turf/open/floor/plating/beach/water,/area/ruin/powered) +"bV" = (/obj/structure/flora/ausbushes/stalkybush,/turf/open/floor/plating/beach/water,/area/ruin/powered) (1,1,1) = {" -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bccccccccccccccccccccccccccccb -bcddddddddddddddddddddddddddcb -bcdeeeeeeeeeeeeeeeeeeeeeeeedcb -bcdeeeeefeeeeeeeeeeeeeeeeeedcb -bcdeeeeeegggggggggggeeeeheedcb -bcdeeeeeegijklmnnnogpqeeeeedcb -bcdeeeeeqgnnnnnnnnrgsqqqqqedcb -bcdeeeefqgttttttgnugvqqqqqedcb -bcdeeeeeqqwwwwwwgnxgyqeeeeedcb -bcdzzzzzqqqqqqqqAnBgqqzzzzedcb -bcdeeeeeeqqqqqqqgCggqeDeeeedcb -bcdeeeEeeeeeeqqqqqqqqeeeeeedcb -bcdeeeeeeeeeeqqqeeeeeeeeFGedcb -HcIeeeeeeeeeeqqqeeeeeeeeqqedcb -bcdeeDeeeeeeeeeeeeeeeeeeeeedcb -bcdeeeeefJeeeeeeeeeeeeeeeeedcb -bcdeeKLeeLeeMeeLeLeLeLeLefedcb -bcdeeeeeeeeeeeeeeeeeeeeeeeedcb -bcdNNNNNNNNNNNNNNNNNNNNNNNNdcb -bcdOOOOOOOOOOOOOOOOOOOOOOOOdcb -bcdPPPPPPPPPPPPPPPPPPPPPPPPdcb -bcdPPPPPPPPPPPPPPPPPPPPPPPPdcb -bcdPPPPPPPPPPPPPPPPPPPPPPPPdcb -bcdPPPPPPPPPPPPPPPPPPPPPPPPdcb -bcdPPPPPPPPPPPPPPPPPPPPPPPPdcb -bcddddddddddddddddddddddddddcb -bccccccccccccccccccccccccccccb -bbbbbQbbbbbbbbbbbbbbbbbbbbbbbb +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaabababacacacacacacacacacacacacabababaaaaaaaaaaaa +aaaaaaaaabababadabaeafagahaiajakajalamanaoabapabababaaaaaaaa +aaaaaaababaqararabasasasasatajauavasasauauabararaqababaaaaaa +aaaaababadaraparababajawajaxajajajajajajayabaraparapababaaaa +aaaaabapararazaraAaBajaCaDaEaFaGaHaIajaJaKaAararararadabaaaa +aaababarararararaAaKajaCaCaLaCaCaCaMajaNaKaAarararararababaa +aaabaparaOaraOaraAaKajaPaQaPaRajaCaSajaTaKaAaraUaraqarapabaa +aaabarararaVararaAaKaBaWaWaWaWajaCaXajaYaKaAararaZarararabaa +baabararbbarbbaraAaKaKaKaKaKaKbcaCbdajaKaKaAarararbearapabbf +aaabararararararaAaKaKaKaKaKaKajbgbhajaKaKaAararararararabaa +ababababbibibibiaAaKbjbkblaKaKaBaBaBaBaKaKaAbibmbibiabababab +acbnbobpararararaAaKaKaKaKaKaKaKaKaKaKaKaKaAararararbpbqboab +acbrbrbpararaUaraAaAaAaAaAaAaAaAaAaAaAaAaAaAararararbpbrbsab +btbubvbpaAaraZararararararararararararararararararaAbpbububt +abbvbvbwaAarararararararbxararararaZarararararararaAbybvbuab +btbububpaAarararararararararararaUararararararararaAbpbvbvbt +acbsbrbparbzarararbxarararararararararbAbBararaZararbpbsbrab +acbCbDbpararararararararararbEararbFarbGbHarararararbpbIbCab +ababababarbJarbJarbJarbJbKbJarbJarararbLbMarbJararaUabababab +aaabadapbNarararbOararararararararbzarararbPararararapbNabaa +baabbQbRbRbSbRbRbRbRbRbRbRbRbRbRbRbRbRbRbRbRbRbRbSbRbRbRabbf +aaabbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTabaa +aaababbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUababaa +aaaaabbUbUbUbUbUbUbUbUbUbUbUbUbUbVbUbUbUbUbUbUbUbUbUbUabaaaa +aaaaababbUbUbUbUbUbVbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUababaaaa +aaaaaaababbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbVbUbUbUababaaaaaa +aaaaaaaaabababbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUabababaaaaaaaa +aaaaaaaaaaaaababababababababababababababababababaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_gym.dmm b/_maps/RandomRuins/LavaRuins/lavaland_gym.dmm index 207eabfa613..155236dd586 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_gym.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_gym.dmm @@ -5,48 +5,49 @@ "e" = (/obj/structure/closet,/mob/living/simple_animal/hostile/zombie,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) "f" = (/obj/structure/punching_bag,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) "g" = (/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"h" = (/obj/structure/window{icon_state = "window"; dir = 1},/obj/item/weapon/shard{icon_state = "medium"},/mob/living/simple_animal/hostile/zombie{name = "Boss of This Gym"},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"i" = (/obj/structure/window{icon_state = "window"; dir = 1},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"j" = (/obj/structure/window{icon_state = "window"; dir = 1},/obj/structure/window{icon_state = "window"; dir = 4},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"h" = (/obj/structure/window{icon_state = "window";dir = 1},/obj/item/weapon/shard{icon_state = "medium"},/mob/living/simple_animal/hostile/zombie{name = "Boss of This Gym"},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"i" = (/obj/structure/window{icon_state = "window";dir = 1},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"j" = (/obj/structure/window{icon_state = "window";dir = 1},/obj/structure/window{icon_state = "window";dir = 4},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) "k" = (/obj/effect/decal/cleanable/blood,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) "l" = (/obj/structure/weightlifter,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"m" = (/obj/structure/window{icon_state = "window"; dir = 8},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"n" = (/obj/structure/window{icon_state = "window"; dir = 4},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"m" = (/obj/structure/window{icon_state = "window";dir = 8},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"n" = (/obj/structure/window{icon_state = "window";dir = 4},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) "o" = (/obj/structure/stacklifter,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"p" = (/obj/structure/window,/obj/structure/window{icon_state = "window"; dir = 8},/obj/effect/decal/cleanable/blood,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"p" = (/obj/structure/window,/obj/structure/window{icon_state = "window";dir = 8},/obj/effect/decal/cleanable/blood,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) "q" = (/obj/structure/window,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) "r" = (/obj/structure/window,/obj/item/weapon/shard,/mob/living/simple_animal/hostile/zombie{name = "Leatherhead"},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"s" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter4 (NORTH)"; icon_state = "splatter4"; dir = 1},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"t" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter6 (EAST)"; icon_state = "splatter6"; dir = 4},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (NORTH)"; icon_state = "tracks"; dir = 1},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-gib3"; icon_state = "gib3"},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"u" = (/obj/machinery/door/airlock/external,/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/ruin/powered) -"v" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (EAST)"; icon_state = "tracks"; dir = 4},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (NORTHEAST)"; icon_state = "tracks"; dir = 5},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"w" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (EAST)"; icon_state = "tracks"; dir = 4},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (SOUTHEAST)"; icon_state = "tracks"; dir = 6},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"x" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter5"; icon_state = "splatter5"},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (EAST)"; icon_state = "tracks"; dir = 4},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"y" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter4 (NORTH)"; icon_state = "splatter4"; dir = 1},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter6 (NORTH)"; icon_state = "splatter6"; dir = 1},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"z" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter5"; icon_state = "splatter5"},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) +"s" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter4 (NORTH)";icon_state = "splatter4";dir = 1},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) +"t" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter6 (EAST)";icon_state = "splatter6";dir = 4},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (NORTH)";icon_state = "tracks";dir = 1},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-gib3";icon_state = "gib3"},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) +"u" = (/obj/machinery/door/airlock/external,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"v" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (EAST)";icon_state = "tracks";dir = 4},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (NORTHEAST)";icon_state = "tracks";dir = 5},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) +"w" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (EAST)";icon_state = "tracks";dir = 4},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (SOUTHEAST)";icon_state = "tracks";dir = 6},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) +"x" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter5";icon_state = "splatter5"},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (EAST)";icon_state = "tracks";dir = 4},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) +"y" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter4 (NORTH)";icon_state = "splatter4";dir = 1},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter6 (NORTH)";icon_state = "splatter6";dir = 1},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) +"z" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter5";icon_state = "splatter5"},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) "A" = (/mob/living/simple_animal/hostile/zombie,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"B" = (/obj/structure/window{icon_state = "window"; dir = 1},/obj/machinery/shower,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"C" = (/obj/structure/window{icon_state = "window"; dir = 1},/obj/machinery/shower,/mob/living/simple_animal/hostile/zombie,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"B" = (/obj/structure/window{icon_state = "window";dir = 1},/obj/machinery/shower,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"C" = (/obj/structure/window{icon_state = "window";dir = 1},/obj/machinery/shower,/mob/living/simple_animal/hostile/zombie,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"D" = (/turf/template_noop,/area/template_noop) (1,1,1) = {" -aaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabab -aaaaaccccccccccccbbb -aaaaacdeddddddedcbbb -aaaaacfgghiijkglcbaa -aaaaacfggmgkngglcbbb -aaaaacfggmggnggocbbb -aaaaacfggpqqrggocstb -aaaaacgkgggggggkuvwx -aaaaacuucccccccccyzb -aaaaacgAgggggggAcbbb -aaaaacggggggAgggcbbb -aaaaacBCBBggBBBBcbaa -aaaaacgggggggAggcbaa -aaaaaccccccccccccbaa -aaaaaaaaaaaaaaaaaabb -aaaaaaaaaaaaaaaabbbb -aaaaaaaaaaaaaaaabbba +DDDDDDDDDDDDDDDDDDDD +DDDDDDDDDDDDDDDDDDDD +DDDDDDDDDDDDDDDDDDDD +DDDDDDDDDDDDDDDDDDDD +DDDccccccccccccDDDDD +DDDcdeddddddedcbDDDD +DDDcfgghiijkglcbaDDD +DDDcfggmgkngglcbbbDD +DDDcfggmggnggocbbbDD +DDDcfggpqqrggocstbbD +DDDcgkgggggggkuvwxbD +DDDcuucccccccccyzbbD +DDDcgAgggggggAcbbbbD +DDDcggggggAgggcbbbDD +DDDcBCBBggBBBBcbbDDD +DDDcgggggggAggcbDDDD +DDDccccccccccccbDDDD +DDDDDDDDDDDDDDDDDDDD +DDDDDDDDDDDDDDDDDDDD +DDDDDDDDDDDDDDDDDDDD "} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm index e90e8f60831..6249fddfb88 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm @@ -7,11 +7,11 @@ "ag" = (/turf/open/floor/plasteel/bar{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "ah" = (/obj/structure/toilet,/turf/open/floor/plasteel/bar{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "ai" = (/obj/machinery/vending/coffee,/turf/open/floor/plasteel/cmo{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) -"aj" = (/obj/structure/table/wood,/obj/item/weapon/storage/backpack/dufflebag/med,/turf/open/floor/plasteel/cmo{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) +"aj" = (/obj/structure/table/wood,/obj/item/device/flashlight/lamp,/turf/open/floor/plasteel/cmo{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "ak" = (/obj/structure/table/wood,/obj/item/device/taperecorder,/obj/item/weapon/pen/blue,/turf/open/floor/plasteel/cmo{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "al" = (/obj/structure/table/wood,/obj/item/toy/carpplushie,/turf/open/floor/plasteel/cmo{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "am" = (/obj/machinery/vending/snack,/turf/open/floor/plasteel/cmo{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) -"an" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 4},/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) +"an" = (/obj/machinery/sleeper{icon_state = "sleeper-open";dir = 4},/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "ao" = (/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "ap" = (/obj/structure/table,/obj/item/weapon/circular_saw,/obj/item/weapon/scalpel{pixel_y = 12},/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "aq" = (/obj/structure/table,/obj/item/weapon/cautery{pixel_x = 4},/obj/item/weapon/surgicaldrill,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) @@ -19,11 +19,11 @@ "as" = (/turf/open/floor/plasteel/cmo{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "at" = (/obj/structure/chair/office/dark{dir = 1},/turf/open/floor/plasteel/cmo{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "au" = (/obj/structure/chair/office/dark{dir = 4},/turf/open/floor/plasteel/cmo{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) -"av" = (/obj/structure/table/reinforced,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/mask/surgical,/obj/item/clothing/suit/apron/surgical,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) +"av" = (/obj/item/weapon/reagent_containers/glass/rag,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;dir = 8;icon_state = "blue"},/area/ruin/powered) "aw" = (/obj/structure/bed/roller,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "ax" = (/obj/structure/closet/crate/trashcart,/obj/item/weapon/storage/bag/trash,/obj/item/trash/cheesie,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/bodybag,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka,/turf/open/floor/grass{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/lavaland/surface/outdoors) -"ay" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/open/floor/plasteel/bar{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) -"az" = (/obj/structure/noticeboard{dir = 1; pixel_y = -27},/obj/item/weapon/paper{info = "Nothing of interest to report."; name = "Important Notice - Mrs. Henderson"},/turf/open/floor/plasteel/cmo{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) +"ay" = (/obj/structure/sink{icon_state = "sink";dir = 8;pixel_x = -12;pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/open/floor/plasteel/bar{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) +"az" = (/obj/structure/noticeboard{dir = 1;pixel_y = -27},/obj/item/weapon/paper{info = "Nothing of interest to report.";name = "Important Notice - Mrs. Henderson"},/turf/open/floor/plasteel/cmo{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "aA" = (/obj/structure/closet/secure_closet/medical2,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "aB" = (/obj/machinery/computer/operating,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "aC" = (/obj/structure/table/optable,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) @@ -35,14 +35,14 @@ "aI" = (/turf/closed/wall/shuttle/smooth,/area/ruin/powered) "aJ" = (/turf/open/floor/plasteel/grimy{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/lavaland/surface/outdoors) "aK" = (/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) -"aL" = (/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; dir = 1; icon_state = "blue"},/area/ruin/powered) -"aM" = (/obj/effect/mob_spawn/human/doctor/alive{flavour_text = "You were putting in your hours as a vet in the local animal hospital when a massive bluespace translocation shunted you across the galaxy. Can you survive on this desolate wasteland..?"; id_job = "Veterinarian"},/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; dir = 1; icon_state = "blue"},/area/ruin/powered) -"aN" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; dir = 1; icon_state = "blue"},/area/ruin/powered) -"aO" = (/obj/machinery/iv_drip,/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; dir = 1; icon_state = "blue"},/area/ruin/powered) -"aP" = (/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; dir = 0; icon_state = "blue"},/area/ruin/powered) -"aQ" = (/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; dir = 8; icon_state = "bluecorner"},/area/ruin/powered) -"aR" = (/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; dir = 4; icon_state = "blue"},/area/ruin/powered) -"aS" = (/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; dir = 8; icon_state = "blue"},/area/ruin/powered) +"aL" = (/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;dir = 1;icon_state = "blue"},/area/ruin/powered) +"aM" = (/obj/effect/mob_spawn/human/doctor/alive{flavour_text = "You were putting in your hours as a vet in the local animal hospital when a massive bluespace translocation shunted you across the galaxy. Can you survive on this desolate wasteland..?";id_job = "Veterinarian"},/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;dir = 1;icon_state = "blue"},/area/ruin/powered) +"aN" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;dir = 1;icon_state = "blue"},/area/ruin/powered) +"aO" = (/obj/machinery/iv_drip,/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;dir = 1;icon_state = "blue"},/area/ruin/powered) +"aP" = (/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;dir = 0;icon_state = "blue"},/area/ruin/powered) +"aQ" = (/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;dir = 8;icon_state = "bluecorner"},/area/ruin/powered) +"aR" = (/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;dir = 4;icon_state = "blue"},/area/ruin/powered) +"aS" = (/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;dir = 8;icon_state = "blue"},/area/ruin/powered) "aT" = (/obj/structure/closet,/obj/effect/decal/cleanable/cobweb,/obj/item/ammo_casing/shotgun/dart,/obj/item/ammo_casing/shotgun/dart,/obj/item/weapon/gun/projectile/revolver/doublebarrel{desc = "For putting critters out to pasture."},/obj/item/ammo_casing/shotgun/buckshot,/obj/item/weapon/storage/box/bodybags,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "aU" = (/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "aV" = (/obj/structure/closet/secure_closet/medical1,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) @@ -50,7 +50,7 @@ "aX" = (/obj/item/stack/cable_coil/random,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "aY" = (/obj/structure/bodycontainer/morgue,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "aZ" = (/obj/effect/decal/cleanable/ash,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) -"ba" = (/obj/structure/table/glass,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/reagent_containers/glass/beaker,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) +"ba" = (/obj/structure/table/glass,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/storage/backpack/dufflebag/med,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "bb" = (/obj/structure/table/reinforced,/obj/item/device/laser_pointer,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "bc" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/regular,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "bd" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/gloves,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) @@ -61,63 +61,72 @@ "bi" = (/obj/item/toy/cattoy,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "bj" = (/obj/structure/table/glass,/obj/item/weapon/lazarus_injector,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "bk" = (/obj/structure/reagent_dispensers/fueltank,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) -"bl" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/cookie{name = "doggie biscuit"},/obj/item/weapon/reagent_containers/food/snacks/cookie{name = "doggie biscuit"},/obj/item/weapon/reagent_containers/food/snacks/cookie{name = "doggie biscuit"},/obj/item/weapon/reagent_containers/food/snacks/cookie{name = "doggie biscuit"},/obj/item/weapon/reagent_containers/food/snacks/cookie{name = "doggie biscuit"},/obj/item/weapon/reagent_containers/food/snacks/cookie{name = "doggie biscuit"},/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; dir = 1; icon_state = "blue"},/area/ruin/powered) -"bm" = (/obj/structure/chair/comfy/teal{dir = 8},/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; dir = 1; icon_state = "blue"},/area/ruin/powered) +"bl" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/cookie{name = "doggie biscuit"},/obj/item/weapon/reagent_containers/food/snacks/cookie{name = "doggie biscuit"},/obj/item/weapon/reagent_containers/food/snacks/cookie{name = "doggie biscuit"},/obj/item/weapon/reagent_containers/food/snacks/cookie{name = "doggie biscuit"},/obj/item/weapon/reagent_containers/food/snacks/cookie{name = "doggie biscuit"},/obj/item/weapon/reagent_containers/food/snacks/cookie{name = "doggie biscuit"},/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;dir = 1;icon_state = "blue"},/area/ruin/powered) +"bm" = (/obj/structure/chair/comfy/teal{dir = 8},/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;dir = 1;icon_state = "blue"},/area/ruin/powered) "bn" = (/obj/structure/bed/dogbed,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "bo" = (/obj/item/weapon/reagent_containers/glass/bowl,/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) -"bp" = (/obj/structure/closet/crate/bin,/obj/item/trash/pistachios,/obj/item/weapon/lipstick/random,/obj/item/seeds/apple,/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; dir = 8; icon_state = "blue"},/area/ruin/powered) +"bp" = (/obj/structure/closet/crate/bin,/obj/item/trash/pistachios,/obj/item/weapon/lipstick/random,/obj/item/seeds/apple,/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;dir = 8;icon_state = "blue"},/area/ruin/powered) "bq" = (/obj/structure/filingcabinet/chestdrawer/wheeled,/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "br" = (/obj/structure/chair/office/dark,/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "bs" = (/obj/structure/table/reinforced,/obj/item/weapon/phone,/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "bt" = (/obj/structure/flora/kirbyplants,/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) -"bu" = (/obj/structure/chair/comfy/teal{dir = 8},/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; dir = 4; icon_state = "blue"},/area/ruin/powered) -"bv" = (/obj/effect/mob_spawn/mouse{dir = 4; flavour_text = "You're a mousey! You're getting pretty old as mice go, and you haven't been feeling well as of late. Your master loves you a lot so he took you to this place so you can get better! You can't wait to see him again!"; mob_name = "Stallman Jr."},/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) +"bu" = (/obj/structure/chair/comfy/teal{dir = 8},/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;dir = 4;icon_state = "blue"},/area/ruin/powered) +"bv" = (/obj/effect/mob_spawn/mouse{dir = 4;flavour_text = "You're a mousey! You're getting pretty old as mice go, and you haven't been feeling well as of late. Your master loves you a lot so he took you to this place so you can get better! You can't wait to see him again!";mob_name = "Stallman Jr."},/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "bw" = (/obj/effect/decal/cleanable/dirt,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) -"bx" = (/obj/machinery/door/airlock/medical{name = "Patient Room"; req_access_txt = "5"},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) -"by" = (/obj/structure/table/reinforced,/obj/item/device/flashlight/lamp,/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; dir = 8; icon_state = "blue"},/area/ruin/powered) +"bx" = (/obj/machinery/door/airlock/medical{name = "Patient Room";req_access_txt = "5"},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) +"by" = (/obj/structure/table/reinforced,/obj/item/device/flashlight/lamp,/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;dir = 8;icon_state = "blue"},/area/ruin/powered) "bz" = (/obj/structure/table/reinforced,/obj/item/clothing/glasses/regular,/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "bA" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/fourcolor,/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "bB" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/hug,/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "bC" = (/obj/structure/chair/office/light{dir = 1},/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) -"bD" = (/obj/structure/table/glass,/obj/item/weapon/reagent_containers/glass/bottle/cyanide{desc = "A cocktail of chemotherpy drugs intended to treat bladder cancer."; name = "MVAC regimen"},/obj/item/weapon/reagent_containers/syringe,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) -"bE" = (/obj/structure/closet/crate/critter,/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; dir = 8; icon_state = "blue"},/area/ruin/powered) -"bF" = (/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; dir = 10; icon_state = "blue"},/area/ruin/powered) -"bG" = (/obj/structure/chair/comfy/teal{dir = 8},/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; dir = 6; icon_state = "blue"},/area/ruin/powered) -"bH" = (/obj/item/weapon/reagent_containers/glass/rag,/obj/structure/table,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; dir = 8; icon_state = "blue"},/area/ruin/powered) +"bD" = (/obj/structure/table/glass,/obj/item/weapon/reagent_containers/glass/bottle/cyanide{desc = "A cocktail of chemotherpy drugs intended to treat bladder cancer.";name = "MVAC regimen"},/obj/item/weapon/reagent_containers/syringe,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) +"bE" = (/obj/structure/closet/crate/critter,/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;dir = 8;icon_state = "blue"},/area/ruin/powered) +"bF" = (/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;dir = 10;icon_state = "blue"},/area/ruin/powered) +"bG" = (/obj/structure/chair/comfy/teal{dir = 8},/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;dir = 6;icon_state = "blue"},/area/ruin/powered) +"bH" = (/obj/structure/table,/obj/item/weapon/tank/internals/oxygen,/obj/item/weapon/tank/internals/oxygen,/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;dir = 8;icon_state = "blue"},/area/ruin/powered) "bI" = (/obj/structure/sign/bluecross_2{name = "animal hospital"},/turf/closed/wall/shuttle/smooth{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "bJ" = (/obj/machinery/door/airlock/glass_large,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "bK" = (/obj/item/weapon/reagent_containers/glass/bowl,/obj/item/weapon/reagent_containers/food/snacks/grown/wheat,/obj/item/weapon/reagent_containers/food/snacks/grown/wheat,/obj/item/weapon/reagent_containers/food/snacks/grown/wheat,/obj/effect/decal/cleanable/dirt,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "bL" = (/obj/vehicle/scooter/skateboard{dir = 4},/turf/open/floor/grass{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/lavaland/surface/outdoors) "bM" = (/obj/structure/flora/ausbushes/sunnybush,/turf/open/floor/grass{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/lavaland/surface/outdoors) -"bN" = (/obj/effect/mob_spawn/cow{dir = 4; flavour_text = "You're a cow. You've lived a pampered life as a prized show heifer, a real blue-ribbon winner. After showing signs of a minor respiratory infection, your master took you to the hospital right away. He'd better come back soon, you're getting quite impatient."; mob_name = "Flossie"},/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) +"bN" = (/obj/effect/mob_spawn/cow{dir = 4;flavour_text = "You're a cow. You've lived a pampered life as a prized show heifer, a real blue-ribbon winner. After showing signs of a minor respiratory infection, your master took you to the hospital right away. He'd better come back soon, you're getting quite impatient.";mob_name = "Flossie"},/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "bO" = (/obj/structure/flora/ausbushes/ppflowers,/turf/open/floor/grass{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/lavaland/surface/outdoors) "bP" = (/obj/structure/chair/office/light{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) "bQ" = (/obj/structure/table/glass,/obj/item/clothing/tie/petcollar,/obj/item/weapon/pen/blue,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) -"bR" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/melee/baton/cattleprod,/obj/item/weapon/stock_parts/cell/high,/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; dir = 10; icon_state = "blue"},/area/ruin/powered) -"bS" = (/obj/structure/closet,/obj/item/weapon/defibrillator/loaded,/obj/item/weapon/storage/belt/medical,/obj/item/clothing/glasses/hud/health,/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; dir = 6; icon_state = "blue"},/area/ruin/powered) +"bR" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/melee/baton/cattleprod,/obj/item/weapon/stock_parts/cell/high,/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;dir = 10;icon_state = "blue"},/area/ruin/powered) +"bS" = (/obj/structure/closet,/obj/item/weapon/defibrillator/loaded,/obj/item/weapon/storage/belt/medical,/obj/item/clothing/glasses/hud/health,/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;dir = 6;icon_state = "blue"},/area/ruin/powered) "bT" = (/obj/item/weapon/pickaxe,/obj/effect/decal/cleanable/blood/old,/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) "bU" = (/obj/effect/decal/remains/human,/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) "bV" = (/obj/effect/decal/cleanable/blood/old,/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) "bW" = (/turf/open/floor/grass,/area/lavaland/surface/outdoors) +"cf" = (/obj/machinery/sleeper{icon_state = "sleeper-open";dir = 4},/turf/open/floor/plasteel{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;dir = 1;icon_state = "blue"},/area/ruin/powered) +"ce" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 1},/obj/machinery/portable_atmospherics/pump,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) +"cd" = (/obj/structure/table/reinforced,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/mask/surgical,/obj/item/clothing/suit/apron/surgical,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/space) +"cc" = (/obj/machinery/atmospherics/pipe/simple/general/visible,/turf/closed/wall/shuttle/smooth{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/ruin/powered) +"cb" = (/obj/machinery/atmospherics/components/binary/valve,/turf/open/floor/grass{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/lavaland/surface/outdoors) +"ca" = (/obj/machinery/atmospherics/components/unary/tank/air{dir = 4},/turf/open/floor/grass{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/lavaland/surface/outdoors) +"bZ" = (/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 10},/turf/open/floor/grass{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/lavaland/surface/outdoors) +"bY" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 1},/turf/open/floor/grass{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/lavaland/surface/outdoors) +"bX" = (/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 6},/turf/open/floor/grass{baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface},/area/lavaland/surface/outdoors) (1,1,1) = {" aaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaa -aaaaaaaaaaaaababababacacabacababaaaaaaaaaa -aaaaaaaaaaaaababacabacacacababababaaaaaaaa -aaaaaaaaaaababacacacacadacacacababaaaaaaaa -aaaaaaaaaeaeaeaeaeafafafaeaeaeaeaeaeaeaeaa -aaaaababaeagahaeaiajakalamaeanaoapaqaraeaa -aaaaababaeagagaeasatasauasaeavaoaoaoawaeaa +aaaaaaaaaaaaababababacacabacabababaaaaaaaa +aaaaaaaaaaaaababacabacacacbXbYbZabababaaaa +aaaaaaaaaaababacacacacadaccacacbacacababaa +aaaaaaaaaeaeaeaeaeafafafaeaeaeccaeaeaeaeaa +aaaaababaeagahaeaiajakalamaecdceapaqaraeaa +aaaaababaeagagaeasatasauasaeanaoaoaoawaeaa aaababaxaeayagaeasasazasasaeaAaoaBaCaDaeaa abababacaEaeaFaGaFaeaeaeaFaHaeaFaIaIaIaeaa -ababaJaJaFaKaKaLaKaMaMaMaKaLaLaKaLaNaOaeaa +ababaJaJaFaKaKaLaKaMaMaMaKaLcfaKaLaNaOaeaa abababacaeaKaKaPaPaKaPaKaPaPaPaKaPaQaRaeaa aaababaeaEaFaEaeaeaFaeaFaeaeaEaFaeaSaRaeaa ababacaeaTaUaeaVaWaoaeaoaWaVaeaXaeaSaRaeaa aaababaeaYaZaebaaobbaebcaobdaebeaeaSaRaeaa aaaaaaaebfbgaebhbiaoaeaoaobjaebkaeaSaRaeaa aaaaaaaeaEaFaEaGaeaFaeaFaeaeaeaeaEaSaRaeaa -aaaaaaaaaeaKaLaLaLaKblaKbmaebnboafaSaRaeaa +aaaaaaaaaeaKaLaLaLaKblaKbmaebnboafavaRaeaa aaaaaaaaaebpbqbrbsaKbtaKbuaebvbwbxaKaRaeaa aaaaaaaaaebybzbAbBaKaKaKbuaebCbDaebEaRaeaa aaaaaaaaaebFaPaPaPaKaKaPbGaeaeaeaEbHaRaeaa diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm index 91d2e091cae..0d13efc45a1 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm @@ -11,19 +11,19 @@ "k" = (/obj/effect/mob_spawn/human/corpse/damaged,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "l" = (/obj/structure/closet/crate/radiation,/obj/item/device/flashlight/lantern,/obj/item/device/flashlight/lantern,/obj/item/device/flashlight/lantern,/obj/item/device/flashlight/flare,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "m" = (/obj/structure/closet/crate/medical,/obj/item/device/malf_upgrade,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) -"n" = (/obj/structure/closet/crate/hydroponics,/obj/item/weapon/storage/belt,/obj/item/weapon/scythe,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) +"n" = (/obj/structure/closet/crate/hydroponics,/obj/item/weapon/storage/belt,/obj/item/weapon/scythe,/obj/item/seeds/glowshroom,/obj/item/seeds/glowshroom,/obj/item/weapon/reagent_containers/glass/bucket,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "o" = (/obj/item/device/flashlight/lantern,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "p" = (/obj/item/device/flashlight/seclite,/obj/item/device/flashlight,/obj/structure/closet/crate,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "q" = (/obj/item/device/flashlight/flare,/obj/item/device/flashlight/seclite,/obj/item/device/flashlight/seclite,/obj/item/device/flashlight,/obj/structure/closet/crate,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "r" = (/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "s" = (/obj/item/weapon/twohanded/spear,/obj/structure/mineral_door/iron,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "t" = (/obj/structure/mineral_door/iron,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) -"u" = (/obj/structure/closet/crate,/obj/item/weapon/rcd/loaded,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) -"v" = (/obj/structure/closet/crate,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/regular,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) +"u" = (/obj/structure/closet/crate/engineering,/obj/item/weapon/rcd/loaded,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) +"v" = (/obj/structure/closet/crate/medical,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/reagent_containers/blood/random,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "w" = (/obj/machinery/the_singularitygen,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) -"x" = (/obj/structure/rack{icon = 'icons/obj/stationobjs.dmi'; icon_state = "minibar_left"; name = "skeletal minibar"},/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) -"y" = (/obj/structure/rack{icon = 'icons/obj/stationobjs.dmi'; icon_state = "minibar_right"; name = "skeletal minibar"},/obj/item/clothing/head/helmet/roman/legionaire,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) -"z" = (/obj/item/weapon/shovel,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) +"x" = (/obj/structure/rack{icon = 'icons/obj/stationobjs.dmi';icon_state = "minibar_left";name = "skeletal minibar"},/obj/item/stack/sheet/cloth/ten,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) +"y" = (/obj/structure/rack{icon = 'icons/obj/stationobjs.dmi';icon_state = "minibar_right";name = "skeletal minibar"},/obj/item/clothing/head/helmet/roman/legionaire,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) +"z" = (/obj/item/weapon/shovel,/obj/effect/decal/cleanable/cobweb2,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "A" = (/obj/structure/closet/crate,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/o2,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "B" = (/obj/structure/table_frame,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "C" = (/obj/structure/table/optable,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) @@ -32,12 +32,16 @@ "F" = (/obj/structure/closet/crate/miningcar,/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) "G" = (/obj/item/weapon/twohanded/spear,/obj/structure/rack,/obj/item/weapon/twohanded/spear,/obj/item/weapon/twohanded/spear,/obj/item/weapon/twohanded/spear,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "H" = (/obj/item/weapon/twohanded/spear,/obj/structure/rack,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) -"I" = (/obj/structure/mineral_door/iron,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth; blocks_air = 1},/area/ruin/unpowered) +"I" = (/obj/structure/mineral_door/iron,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth;blocks_air = 1},/area/ruin/unpowered) "J" = (/turf/closed/wall/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/lavaland/surface/outdoors) -"K" = (/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "o2=13;n2=24;TEMP=300"},/area/lavaland/surface/outdoors) +"K" = (/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth;initial_gas_mix = "o2=13;n2=24;TEMP=300"},/area/lavaland/surface/outdoors) "L" = (/obj/item/weapon/twohanded/spear,/obj/structure/table,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) -"M" = (/obj/item/weapon/pickaxe,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "o2=13;n2=24;TEMP=300"},/area/lavaland/surface/outdoors) +"M" = (/obj/item/weapon/pickaxe,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth;initial_gas_mix = "o2=13;n2=24;TEMP=300"},/area/lavaland/surface/outdoors) "N" = (/obj/structure/ore_box,/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) +"R" = (/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) +"Q" = (/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) +"P" = (/obj/machinery/iv_drip,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) +"O" = (/obj/item/weapon/reagent_containers/glass/bowl,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) (1,1,1) = {" aabaaaaaaaaabb @@ -45,13 +49,13 @@ aaaaaaaaaaaabb aaaaccccccaaab aaaacdefgcaaab aaaacehifcaaab -baaccifffccaaa +baacciffOccaaa baacjfkfflcaaa aaacmnfopqcaaa aaccrrstrrccaa aacuvwffxyzcaa -aacAfffkffBcaa -aacCfDffffEcaa +aacAPffkQfBcaa +aacCRDffffEcaa bFrGfHrIrrrraa JKrLLHrKbKMNaa JKrrrrrbbbbbaa diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm index 64e43646095..fbf9af94e17 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm @@ -1,62 +1,103 @@ -"a" = (/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"b" = (/turf/closed/wall/r_wall,/area/ruin/powered/snow_biodome) -"c" = (/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) -"d" = (/obj/structure/grille,/obj/structure/window/fulltile,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) -"e" = (/turf/open/floor/plating/ice,/area/ruin/powered/snow_biodome) -"f" = (/turf/open/floor/plating/asteroid/snow{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) -"g" = (/obj/structure/flora/rock/icy,/turf/open/floor/plating/asteroid/snow{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) -"h" = (/obj/structure/flora/bush,/turf/open/floor/plating/asteroid/snow{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) -"i" = (/turf/closed/wall/mineral/wood,/area/ruin/powered/snow_biodome) -"j" = (/obj/structure/dresser,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/lava/smooth; name = "floor"},/area/ruin/powered/snow_biodome) -"k" = (/obj/structure/bed,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/lava/smooth; name = "floor"},/area/ruin/powered/snow_biodome) -"l" = (/obj/structure/bookcase/random,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/lava/smooth; name = "floor"},/area/ruin/powered/snow_biodome) -"m" = (/obj/structure/flora/tree/pine,/turf/open/floor/plating/asteroid/snow{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) -"n" = (/obj/structure/flora/grass/both,/turf/open/floor/plating/asteroid/snow{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) -"o" = (/turf/open/floor/wood{baseturf = /turf/open/floor/plating/lava/smooth; name = "floor"},/area/ruin/powered/snow_biodome) -"p" = (/obj/structure/flora/tree/dead,/turf/open/floor/plating/asteroid/snow{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) -"q" = (/obj/machinery/door/airlock/wood,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/lava/smooth; name = "floor"},/area/ruin/powered/snow_biodome) -"r" = (/obj/structure/chair/comfy/brown{tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4},/turf/open/floor/wood{baseturf = /turf/open/floor/plating/lava/smooth; name = "floor"},/area/ruin/powered/snow_biodome) -"s" = (/obj/structure/table/wood,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/lava/smooth; name = "floor"},/area/ruin/powered/snow_biodome) -"t" = (/obj/structure/chair/comfy/brown{tag = "icon-comfychair (WEST)"; icon_state = "comfychair"; dir = 8},/turf/open/floor/wood{baseturf = /turf/open/floor/plating/lava/smooth; name = "floor"},/area/ruin/powered/snow_biodome) -"u" = (/turf/closed/wall/mineral/wood{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) -"v" = (/obj/structure/displaycase/captain,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/lava/smooth; name = "floor"},/area/ruin/powered/snow_biodome) -"w" = (/obj/structure/bed/dogbed,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/lava/smooth; name = "floor"},/area/ruin/powered/snow_biodome) -"x" = (/obj/structure/flora/tree/pine/xmas,/turf/open/floor/plating/asteroid/snow{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) -"y" = (/obj/machinery/door/airlock/hatch,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth; blocks_air = 1},/area/ruin/powered/snow_biodome) -"z" = (/obj/machinery/door/airlock/silver,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) -"A" = (/obj/structure/flora/rock/pile/icy,/turf/open/floor/plating/asteroid/snow{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) -"B" = (/turf/open/floor/wood{baseturf = /turf/open/floor/plating/lava/smooth; name = "bridge"},/area/ruin/powered/snow_biodome) -"C" = (/turf/closed/wall/r_wall{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"aa" = (/turf/template_noop,/area/template_noop) +"ab" = (/turf/closed/wall/r_wall{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"ac" = (/obj/item/stack/medical/ointment,/obj/structure/table,/obj/item/stack/medical/bruise_pack,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"ad" = (/obj/structure/table,/obj/item/stack/medical/gauze,/obj/item/stack/medical/gauze,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"ae" = (/obj/machinery/power/smes,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"af" = (/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"ag" = (/obj/structure/reagent_dispensers/beerkeg,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"ah" = (/obj/item/weapon/reagent_containers/food/drinks/mug,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"ai" = (/obj/machinery/shower,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"aj" = (/obj/structure/sink,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"ak" = (/turf/open/floor/plating/asteroid/snow{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"al" = (/obj/effect/decal/cleanable/oil,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"am" = (/obj/machinery/door/airlock/hatch,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"an" = (/obj/structure/toilet{dir = 8},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"ao" = (/turf/open/floor/plating/ice,/area/ruin/powered/snow_biodome) +"ap" = (/obj/structure/flora/rock/icy,/turf/open/floor/plating/asteroid/snow{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"aq" = (/turf/closed/wall/mineral/wood,/area/ruin/powered/snow_biodome) +"ar" = (/obj/machinery/door/airlock/wood,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"as" = (/obj/structure/fans,/turf/closed/wall/mineral/wood,/area/ruin/powered/snow_biodome) +"at" = (/turf/open/floor/wood{baseturf = /turf/open/floor/plating/lava/smooth; name = "floor"},/area/ruin/powered/snow_biodome) +"au" = (/obj/structure/bed,/obj/item/weapon/bedsheet/blue,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/lava/smooth; name = "floor"},/area/ruin/powered/snow_biodome) +"av" = (/obj/structure/bookcase/random,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/lava/smooth; name = "floor"},/area/ruin/powered/snow_biodome) +"aw" = (/obj/structure/table/wood,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/lava/smooth; name = "floor"},/area/ruin/powered/snow_biodome) +"ax" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/snacks/beans,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/lava/smooth; name = "floor"},/area/ruin/powered/snow_biodome) +"ay" = (/obj/structure/closet/crate/trashcart,/obj/item/trash/semki,/obj/item/trash/candy,/turf/open/floor/plating/asteroid/snow{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"az" = (/obj/structure/flora/tree/pine,/turf/open/floor/plating/asteroid/snow{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"aA" = (/obj/structure/chair/comfy/brown{tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4},/turf/open/floor/wood{baseturf = /turf/open/floor/plating/lava/smooth; name = "floor"},/area/ruin/powered/snow_biodome) +"aB" = (/obj/structure/flora/rock/pile/icy,/turf/open/floor/plating/asteroid/snow{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"aC" = (/obj/structure/flora/tree/dead,/turf/open/floor/plating/asteroid/snow{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"aD" = (/obj/machinery/door/airlock/wood,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/lava/smooth; name = "floor"},/area/ruin/powered/snow_biodome) +"aE" = (/obj/structure/extinguisher_cabinet,/turf/closed/wall/mineral/wood,/area/ruin/powered/snow_biodome) +"aF" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/drinks/mug/coco,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/lava/smooth; name = "floor"},/area/ruin/powered/snow_biodome) +"aG" = (/obj/structure/chair/comfy/brown{tag = "icon-comfychair (WEST)"; icon_state = "comfychair"; dir = 8},/turf/open/floor/wood{baseturf = /turf/open/floor/plating/lava/smooth; name = "floor"},/area/ruin/powered/snow_biodome) +"aH" = (/mob/living/simple_animal/hostile/skeleton/eskimo,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/lava/smooth; name = "floor"},/area/ruin/powered/snow_biodome) +"aI" = (/obj/structure/flora/bush,/turf/open/floor/plating/asteroid/snow{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"aJ" = (/obj/vehicle/atv,/turf/open/floor/plating/asteroid/snow{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"aK" = (/turf/closed/wall/mineral/wood{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"aL" = (/obj/structure/displaycase/captain,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/lava/smooth; name = "floor"},/area/ruin/powered/snow_biodome) +"aM" = (/turf/open/floor/carpet{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"aN" = (/obj/structure/bed/dogbed,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/lava/smooth; name = "floor"},/area/ruin/powered/snow_biodome) +"aO" = (/obj/machinery/door/airlock/glass_large,/obj/structure/fans/tiny,/turf/open/floor/pod/dark,/area/ruin/powered/snow_biodome) +"aP" = (/obj/structure/fans/tiny,/turf/open/floor/pod/dark,/area/ruin/powered/snow_biodome) +"aQ" = (/obj/structure/flora/grass/both,/turf/open/floor/plating/asteroid/snow{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"aR" = (/obj/structure/flora/tree/pine/xmas,/turf/open/floor/plating/asteroid/snow{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"aS" = (/obj/structure/rack,/obj/item/clothing/suit/hooded/wintercoat/science,/obj/item/clothing/shoes/winterboots,/obj/item/clothing/gloves/fingerless,/turf/open/floor/pod/dark,/area/ruin/powered/snow_biodome) +"aT" = (/obj/structure/grille,/obj/structure/window/fulltile,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"aU" = (/obj/machinery/vending/coffee,/turf/open/floor/pod/dark,/area/ruin/powered/snow_biodome) +"aV" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/open/floor/pod/dark,/area/ruin/powered/snow_biodome) +"aW" = (/turf/open/floor/pod/dark,/area/ruin/powered/snow_biodome) +"aX" = (/turf/open/floor/pod/light,/area/ruin/powered/snow_biodome) +"aY" = (/obj/structure/chair/stool,/turf/open/floor/pod/dark,/area/ruin/powered/snow_biodome) +"aZ" = (/obj/machinery/door/airlock/hatch,/obj/structure/fans/tiny,/turf/open/floor/pod/dark,/area/ruin/powered/snow_biodome) +"ba" = (/obj/machinery/door/airlock/silver,/turf/open/floor/pod/dark,/area/ruin/powered/snow_biodome) +"bb" = (/obj/machinery/door/airlock/silver,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/snow_biodome) +"bc" = (/obj/structure/table,/turf/open/floor/pod/dark,/area/ruin/powered/snow_biodome) +"bd" = (/obj/structure/table,/obj/item/weapon/pen,/obj/item/weapon/paper_bin,/turf/open/floor/pod/dark,/area/ruin/powered/snow_biodome) +"be" = (/obj/structure/table,/obj/machinery/microwave,/turf/open/floor/pod/dark,/area/ruin/powered/snow_biodome) +"bf" = (/obj/effect/decal/cleanable/oil,/turf/open/floor/pod/dark,/area/ruin/powered/snow_biodome) +"bg" = (/obj/item/weapon/twohanded/required/chainsaw,/obj/structure/closet,/turf/open/floor/pod/dark,/area/ruin/powered/snow_biodome) +"bh" = (/obj/structure/filingcabinet,/turf/open/floor/pod/dark,/area/ruin/powered/snow_biodome) +"bi" = (/obj/machinery/computer/monitor,/turf/open/floor/pod/dark,/area/ruin/powered/snow_biodome) +"bj" = (/obj/item/weapon/storage/toolbox/mechanical,/turf/open/floor/pod/dark,/area/ruin/powered/snow_biodome) +"bk" = (/obj/structure/reagent_dispensers/fueltank,/turf/open/floor/pod/dark,/area/ruin/powered/snow_biodome) +"bl" = (/turf/open/floor/wood{baseturf = /turf/open/floor/plating/lava/smooth; name = "bridge"},/area/ruin/powered/snow_biodome) +"bm" = (/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/ruin/powered/snow_biodome) +"bn" = (/obj/item/clothing/mask/balaclava,/turf/open/floor/pod/dark,/area/ruin/powered/snow_biodome) +"bo" = (/obj/structure/table,/obj/item/weapon/storage/fancy/cigarettes/cigpack_carp,/turf/open/floor/pod/dark,/area/ruin/powered/snow_biodome) +"bp" = (/obj/structure/table,/obj/item/weapon/pen,/obj/item/weapon/paper,/turf/open/floor/pod/dark,/area/ruin/powered/snow_biodome) +"bq" = (/obj/machinery/light/built{dir = 1},/turf/open/floor/pod/dark,/area/ruin/powered/snow_biodome) +"br" = (/obj/structure/fans/tiny,/obj/machinery/door/airlock/glass_large,/turf/open/floor/pod/dark,/area/ruin/powered/snow_biodome) (1,1,1) = {" -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bccccccccccccccccccccccccccccb -bcddddddddddddddddddddddddddcb -bcdeefgfffffffffhiiiiiiiiiidcb -bcdfeeffffhfffffhijkilllllidcb -bcdfeeeemfffmffnfiooioooooidcb -bcdpfeeeffpffffffiqiiorstoidcb -bcdfheeeefffhffffioooorstoidcb -bcdhfffeefffhmhfnuvoooooowidcb -bcdffhfeeefffffffiiiiqqiiiidcb -bcdfffffeeffffgffffffffffffdcb -bcdfmfffeeemffffhffffffffxfdcb -bcdfffffeeeffpfnfffffffffffdcb -bcdnfffffeeeefffffmfffmhhffdcb -yczfAfmffeeeeeffffffpffffffdcb -bcdffffffffeeffmfffhffngfffdcb -bcdfffpffhfeeefffffffffffmfdcb -bcdfmffffmfeeeeffffmffpffffdcb -bcdffffgffBBBBBBfpffffffnffdcb -bcdffnhhffBBBBBBffffgfhffffdcb -bcdfffhfffffeeeffffffhfffffdcb -bcdffffnpfhfffeeefffffmfAmfdcb -bcdffffffffffhffeefmffhhfffdcb -bcdhfmfffhfmffffeefffnhhffhdcb -bcdfffffffffhhfhfeeeffffpffdcb -bcdhhffmfffffpfffffeeffffffdcb -bcddddddddddddddddddddddddddcb -bccccccccccccccccccccccccccccb -bbbbbCbbbbbbbbbbbbbbbbbbbbbbbb +aaaaaaaaaaaaaaaaaaababababababababababababaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaababababacadaeafaeagahabaiajababababaaaaaaaaaaaa +aaaaaaaaabababakabafafafafalafahafamafafanabakabababaaaaaaaa +aaaaaaababaoapakababaqaraqaqaqasaqaqaqaqababakakapababaaaaaa +aaaaababaoaoakakakakaqatauaqavawaxavavaqayakazakakakababaaaa +aaaaabakaoaoaoakazakaqatauaqataAawatataqakakakaBakakakabaaaa +aaababaCakaoaoakakakaqaDaqaEataAaFaGaHaqakaIaJakakazakababaa +aaabakakaIaoaoaoakakaqatatataHatatatataqakakakakakakakakabaa +aaabakakakakaoaoaoakaKaLatataMaMatataNaqakapakaCakakakakabaa +aaabakakakaIakaoaoakaqaqaqaqaOaPaqaqaqaqakakakakaQakakakabaa +ababababakakakaoaoakakakakakapakakaRakakakakakakakakabababab +abaSaSaTazakakakaoaoaoazakakakakaIakakakakakakakakakaTaUaVab +abaWaWaTakakakakaoaoaoakakaCakaQakakakakakakakakakakaTaWaWab +abaWaWaTaBakakakakaoaoaoaoakakakakakazakakakazaIaIakaTaXaYab +aZaXaXbaakakazakakaoaoaoaoaoakakakakakakaCakakakakakbbaXbcab +abaWbdaTakakakakakakaoaoaoakakazakakakaIakakaQapakakaTaXbeab +abaWaYaTakakaCakakaIakaoaoaoakakakakakakakakakakakazaTbfbgab +abbhbiaTaIakakakakazakaoaoaoaoakakakakazakakaCakakakaTbjbkab +ababababakakakapakakblblblblblblakaCakakakakakakaQakabababab +ababakakakaQaIaIakakblblblblblblakakakakapakaIakakakakakabaa +ababakakakakaIakakakakakaoaoaoakakakakakakaIakakakakakakabaa +aaabakakakakakaQaCakaIakakaoaoaoaoakakakakakazakaBazakakabaa +aaababakakakakakakakakakakaIakaoaoaoakazakakaIaIakakakababaa +aaaaabakakazakakakaIakazakakakakaoaoaoakakaQaIaIakakakabaaaa +aaaaababakakakakakakakakaIakakakakaoaoaoakakakakaCakababaaaa +aaaabmababakakazakakababababaOaPababababakakakakakababbmaaaa +aaaabmbmabababakakakabaSbnaXaXaXaXaWboabakakakabababbmbmaaaa +aaaaaabmbmbmabababababaSaWaXaXaXaXaWbpabababababbmbmbmaaaaaa +aaaaaaaabmbmbmbmbqbmababababbraPababababbmbqbmbmbmaaaaaaaaaa +aaaaaaaaaaaaaabmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmaaaaaaaaaaaaaa "} diff --git a/_maps/map_files/MetaStation/MetaStation.v41I.dmm b/_maps/map_files/MetaStation/MetaStation.v41I.dmm index dd60f599a3f..fe15b19a5ec 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41I.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41I.dmm @@ -60283,9 +60283,7 @@ pixel_y = 0 }, /obj/item/weapon/folder/blue, -/obj/item/clothing/head/collectable/HoS{ - desc = "It's your turn to demand excessive paperwork, signatures, stamps, and hire more clowns! Papers, please!"; - icon_state = "hopcap"; +/obj/item/clothing/head/collectable/HoP{ name = "novelty HoP hat" }, /obj/machinery/light/small{ diff --git a/code/__DEFINES/clothing.dm b/code/__DEFINES/clothing.dm index fabe22f95c4..dd8ce2bdb96 100644 --- a/code/__DEFINES/clothing.dm +++ b/code/__DEFINES/clothing.dm @@ -13,19 +13,7 @@ #define SLOT_POCKET 2048 //this is to allow items with a w_class of 3 or 4 to fit in pockets. #define SLOT_DENYPOCKET 4096 //this is to deny items with a w_class of 2 or 1 to fit in pockets. -//Bit flags for the flags_inv variable, which determine when a piece of clothing hides another. IE a helmet hiding glasses. -#define HIDEGLOVES 1 -#define HIDESUITSTORAGE 2 -#define HIDEJUMPSUIT 4 //these first four are only used in exterior suits -#define HIDESHOES 8 -#define HIDEMASK 16 //these last six are only used in masks and headgear. -#define HIDEEARS 32 // (ears means headsets and such) -#define HIDEEYES 64 // Whether eyes and glasses are hidden -#define HIDEFACE 128 // Whether we appear as unknown. -#define HIDEHAIR 256 -#define HIDEFACIALHAIR 512 - -//slots +//SLOTS #define slot_back 1 #define slot_wear_mask 2 #define slot_handcuffed 3 @@ -49,6 +37,49 @@ #define slots_amt 20 // Keep this up to date! +//I hate that this has to exist +/proc/slotdefine2slotbit(slotdefine) //Keep this up to date with the value of SLOT BITMASKS and SLOTS (the two define sections above) + . = 0 + switch(slotdefine) + if(slot_back) + . = SLOT_BACK + if(slot_wear_mask) + . = SLOT_MASK + if(slot_belt) + . = SLOT_BELT + if(slot_wear_id) + . = SLOT_ID + if(slot_ears) + . = SLOT_EARS + if(slot_glasses) + . = SLOT_EYES + if(slot_gloves) + . = SLOT_GLOVES + if(slot_head) + . = SLOT_HEAD + if(slot_shoes) + . = SLOT_FEET + if(slot_wear_suit) + . = SLOT_OCLOTHING + if(slot_w_uniform) + . = SLOT_ICLOTHING + if(slot_l_store, slot_r_store) + . = SLOT_POCKET + + +//Bit flags for the flags_inv variable, which determine when a piece of clothing hides another. IE a helmet hiding glasses. +#define HIDEGLOVES 1 +#define HIDESUITSTORAGE 2 +#define HIDEJUMPSUIT 4 //these first four are only used in exterior suits +#define HIDESHOES 8 +#define HIDEMASK 16 //these last six are only used in masks and headgear. +#define HIDEEARS 32 // (ears means headsets and such) +#define HIDEEYES 64 // Whether eyes and glasses are hidden +#define HIDEFACE 128 // Whether we appear as unknown. +#define HIDEHAIR 256 +#define HIDEFACIALHAIR 512 + + //Cant seem to find a mob bitflags area other than the powers one // bitflags for clothing parts - also used for limbs diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 6da4887e902..8ae4a5d974b 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -283,6 +283,7 @@ var/list/bloody_footprints_cache = list() #define TURF_WET_WATER 1 #define TURF_WET_LUBE 2 #define TURF_WET_ICE 3 +#define TURF_WET_PERMAFROST 4 //Object/Item sharpness #define IS_BLUNT 0 diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm index ded24179173..7f5b1709a6c 100644 --- a/code/_globalvars/configuration.dm +++ b/code/_globalvars/configuration.dm @@ -26,6 +26,9 @@ var/Debug2 = 0 var/global/comms_key = "default_pwd" var/global/comms_allowed = 0 //By default, the server does not allow messages to be sent to it, unless the key is strong enough (this is to prevent misconfigured servers from becoming vulnerable) +//Cross server communications +var/global/cross_address = "byond://" //This needs to be global as the message sent contains the comms key. +var/global/cross_allowed = 0 //Don't bother attempting to send if the address wasn't set. //This was a define, but I changed it to a variable so it can be changed in-game.(kept the all-caps definition because... code...) -Errorage var/MAX_EX_DEVESTATION_RANGE = 3 diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 743d1328a13..067730d32bf 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -202,6 +202,7 @@ var/client_error_version = 0 var/client_error_message = "Your version of byond is too old, may have issues, and is blocked from accessing this server." + var/cross_name = "Other server" /datum/configuration/New() var/list/L = subtypesof(/datum/game_mode) @@ -359,6 +360,12 @@ global.comms_key = value if(value != "default_pwd" && length(value) > 6) //It's the default value or less than 6 characters long, warn badmins global.comms_allowed = 1 + if("cross_server_address") + global.cross_address = value + if(value != "byond:\\address:port") + global.cross_allowed = 1 + if("cross_comms_name") + cross_name = value if("see_own_notes") config.see_own_notes = 1 if("soft_popcap") diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index dea6e9645a0..7decbd16a22 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -92,4 +92,5 @@ /datum/subsystem/on_varedit(edited_var) if (edited_var == "can_fire" && can_fire) next_fire = world.time + wait + ..() diff --git a/code/controllers/subsystem/voting.dm b/code/controllers/subsystem/voting.dm index 0549457940e..6279e25fc84 100644 --- a/code/controllers/subsystem/voting.dm +++ b/code/controllers/subsystem/voting.dm @@ -145,9 +145,19 @@ var/datum/subsystem/vote/SSvote /datum/subsystem/vote/proc/initiate_vote(vote_type, initiator_key) if(!mode) - if(started_time != null) + if(started_time) var/next_allowed_time = (started_time + config.vote_delay) - if(next_allowed_time > world.time) + if(mode) + usr << "There is already a vote in progress! please wait for it to finish." + return 0 + + var/admin = FALSE + var/ckey = ckey(initiator_key) + if((admin_datums[ckey]) || (ckey in deadmins)) + admin = TRUE + + if(next_allowed_time > world.time && !admin) + usr << "A vote was initiated recently, you must wait roughly [(next_allowed_time-world.time)/10] seconds before a new vote can be started!" return 0 reset() diff --git a/code/datums/action.dm b/code/datums/action.dm index 9bbfe5412ff..677ccc18254 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -275,13 +275,16 @@ return 0 return ..() -/datum/action/item_action/organ_action/toggle - /datum/action/item_action/organ_action/toggle/New(Target) ..() name = "Toggle [target.name]" button.name = name +/datum/action/item_action/organ_action/use/New(Target) + ..() + name = "Use [target.name]" + button.name = name + diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index a436272faae..b62367c4cb9 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -1,6 +1,10 @@ // reference: /client/proc/modify_variables(var/atom/O, var/param_var_name = null, var/autodetect_class = 0) -datum/proc/on_varedit(modified_var) //called whenever a var is edited +/datum + var/var_edited = 0 //Warrenty void if seal is broken + +/datum/proc/on_varedit(modified_var) //called whenever a var is edited + var_edited = 1 return /client/proc/debug_variables(datum/D in world) @@ -218,6 +222,8 @@ datum/proc/on_varedit(modified_var) //called whenever a var is edited if(src.holder && src.holder.marked_datum && src.holder.marked_datum == D) body += "
Marked Object" + if(D.var_edited) + body += "
Var Edited" body += "" body += "" diff --git a/code/datums/martial.dm b/code/datums/martial.dm index 6ecff3fcaf9..46e18dde7d7 100644 --- a/code/datums/martial.dm +++ b/code/datums/martial.dm @@ -128,64 +128,6 @@ D.forcesay(hit_appends) return 1 -/datum/martial_art/wrestling - name = "Wrestling" - help_verb = /mob/living/carbon/human/proc/wrestling_help - -// combo refence since wrestling uses a different format to sleeping carp and plasma fist. -// Clinch "G" -// Suplex "GD" -// Advanced grab "G" - -/datum/martial_art/wrestling/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - D.grabbedby(A,1) - var/obj/item/weapon/grab/G = A.get_active_hand() - if(G && prob(50)) - G.state = GRAB_AGGRESSIVE - D.visible_message("[A] has [D] in a clinch!", \ - "[A] has [D] in a clinch!") - else - D.visible_message("[A] fails to get [D] in a clinch!", \ - "[A] fails to get [D] in a clinch!") - return 1 - - -/datum/martial_art/wrestling/proc/Suplex(mob/living/carbon/human/A, mob/living/carbon/human/D) - - D.visible_message("[A] suplexes [D]!", \ - "[A] suplexes [D]!") - D.forceMove(A.loc) - var/armor_block = D.run_armor_check(null, "melee") - D.apply_damage(30, BRUTE, null, armor_block) - D.apply_effect(6, WEAKEN, armor_block) - add_logs(A, D, "suplexed") - - A.SpinAnimation(10,1) - - D.SpinAnimation(10,1) - spawn(3) - armor_block = A.run_armor_check(null, "melee") - A.apply_effect(4, WEAKEN, armor_block) - return - -/datum/martial_art/wrestling/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(istype(A.get_inactive_hand(),/obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = A.get_inactive_hand() - if(G.affecting == D) - Suplex(A,D) - return 1 - harm_act(A,D) - return 1 - -/datum/martial_art/wrestling/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - D.grabbedby(A,1) - D.visible_message("[A] holds [D] down!", \ - "[A] holds [D] down!") - var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected)) - var/armor_block = D.run_armor_check(affecting, "melee") - D.apply_damage(10, STAMINA, affecting, armor_block) - return 1 - /mob/living/carbon/human/proc/wrestling_help() set name = "Recall Teachings" set desc = "Remember how to wrestle." @@ -452,7 +394,6 @@ if(slot == slot_belt) var/mob/living/carbon/human/H = user style.teach(H,1) - user << "You have an urge to flex your muscles and get into a fight. You have the knowledge of a thousand wrestlers before you. You can remember more by using the Recall teaching verb in the wrestling tab." return /obj/item/weapon/storage/belt/champion/wrestling/dropped(mob/user) @@ -461,7 +402,6 @@ var/mob/living/carbon/human/H = user if(H.get_item_by_slot(slot_belt) == src) style.remove(H) - user << "You no longer have an urge to flex your muscles." return /obj/item/weapon/plasma_fist_scroll diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm new file mode 100644 index 00000000000..c80217e7754 --- /dev/null +++ b/code/datums/martial/wrestling.dm @@ -0,0 +1,421 @@ +/datum/martial_art/wrestling + name = "Wrestling" + var/datum/action/slam/slam = new/datum/action/slam() + var/datum/action/throw_wrassle/throw_wrassle = new/datum/action/throw_wrassle() + var/datum/action/kick/kick = new/datum/action/kick() + var/datum/action/strike/strike = new/datum/action/strike() + var/datum/action/drop/drop = new/datum/action/drop() + +/datum/martial_art/wrestling/proc/check_streak(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + switch(streak) + if("drop") + streak = "" + drop(A,D) + return 1 + if("strike") + streak = "" + strike(A,D) + return 1 + if("kick") + streak = "" + kick(A,D) + return 1 + if("throw") + streak = "" + throw_wrassle(A,D) + return 1 + if("slam") + streak = "" + slam(A,D) + return 1 + return 0 + +/datum/action/slam + name = "Slam (Cinch) - Slam a grappled opponent into the floor." + button_icon_state = "wrassle_slam" + +/datum/action/slam/Trigger() + if(owner.incapacitated()) + owner << "You can't WRESTLE while you're OUT FOR THE COUNT." + 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" + +/datum/action/throw_wrassle + name = "Throw (Cinch) - Spin a cinched opponent around and throw them." + button_icon_state = "wrassle_throw" + +/datum/action/throw_wrassle/Trigger() + if(owner.incapacitated()) + owner << "You can't WRESTLE while you're OUT FOR THE COUNT." + 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" + +/datum/action/kick + name = "Kick - A powerful kick, sends people flying away from you. Also useful for escaping from bad situations." + button_icon_state = "wrassle_kick" + +/datum/action/kick/Trigger() + if(owner.incapacitated()) + owner << "You can't WRESTLE while you're OUT FOR THE COUNT." + 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" + +/datum/action/strike + name = "Strike - Hit a neaby opponent with a quick attack." + button_icon_state = "wrassle_strike" + +/datum/action/strike/Trigger() + if(owner.incapacitated()) + owner << "You can't WRESTLE while you're OUT FOR THE COUNT." + 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" + +/datum/action/drop + name = "Drop - Smash down onto an opponent." + button_icon_state = "wrassle_drop" + +/datum/action/drop/Trigger() + if(owner.incapacitated()) + owner << "You can't WRESTLE while you're OUT FOR THE COUNT." + 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" + +/datum/martial_art/wrestling/teach(var/mob/living/carbon/human/H,var/make_temporary=0) + ..() + H << "SNAP INTO A THIN TIM!" + H << "Place your cursor over a move at the top of the screen to see what it does." + drop.Grant(H) + kick.Grant(H) + slam.Grant(H) + throw_wrassle.Grant(H) + strike.Grant(H) + +/datum/martial_art/wrestling/remove(var/mob/living/carbon/human/H) + ..() + H << "You no longer feel that the tower of power is too sweet to be sour..." + drop.Remove(H) + kick.Remove(H) + slam.Remove(H) + throw_wrassle.Remove(H) + strike.Remove(H) + +/datum/martial_art/wrestling/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(check_streak(A,D)) + return 1 + ..() + +/datum/martial_art/wrestling/proc/throw_wrassle(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(!D) + return + if(!A.pulling || A.pulling != D) + A << "You need to have [D] in a cinch!" + return + D.forceMove(A.loc) + D.dir = get_dir(D, A) + + D.Stun(4) + A.visible_message("[A] starts spinning around with [D]!") + A.emote("scream") + + for (var/i = 0, i < 20, i++) + var/delay = 5 + switch (i) + if (17 to INFINITY) + delay = 0.25 + if (14 to 16) + delay = 0.5 + if (9 to 13) + delay = 1 + if (5 to 8) + delay = 2 + if (0 to 4) + delay = 3 + + if (A && D) + + if (get_dist(A, D) > 1) + A << "[D] is too far away!" + return 0 + + if (!isturf(A.loc) || !isturf(D.loc)) + A << "You can't throw [D] from here!" + return 0 + + A.dir = turn(A.dir, 90) + var/turf/T = get_step(A, A.dir) + var/turf/S = D.loc + if ((S && isturf(S) && S.Exit(D)) && (T && isturf(T) && T.Enter(A))) + D.forceMove(T) + D.dir = get_dir(D, A) + else + return 0 + + sleep(delay) + + if (A && D) + // These are necessary because of the sleep call. + + if (get_dist(A, D) > 1) + A << "[D] is too far away!" + return 0 + + if (!isturf(A.loc) || !isturf(D.loc)) + A << "You can't throw [D] from here!" + return 0 + + D.forceMove(A.loc) // Maybe this will help with the wallthrowing bug. + + A.visible_message("[A] throws [D]!") + playsound(A.loc, "swing_hit", 50, 1) + var/turf/T = get_edge_target_turf(A, A.dir) + if (T && isturf(T)) + if (!D.stat) + D.emote("scream") + D.throw_at(T, 10, 4) + D.Weaken(2) + + return 0 + +/datum/martial_art/wrestling/proc/slam(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(!D) + return + if(!A.pulling || A.pulling != D) + A << "You need to have [D] in a cinch!" + return + D.forceMove(A.loc) + A.dir = get_dir(A, D) + D.dir = get_dir(D, A) + + A.visible_message("[A] lifts [D] up!") + + spawn (0) + if (D) + animate(D, transform = matrix(180, MATRIX_ROTATE), time = 1, loop = 0) + sleep (15) + if (D) + animate(transform = null, time = 1, loop = 0) + + for (var/i = 0, i < 3, i++) + if (A && D) + A.pixel_y += 3 + D.pixel_y += 3 + A.dir = turn(A.dir, 90) + D.dir = turn(D.dir, 90) + + switch (A.dir) + if (NORTH) + D.pixel_x = A.pixel_x + if (SOUTH) + D.pixel_x = A.pixel_x + if (EAST) + D.pixel_x = A.pixel_x - 8 + if (WEST) + D.pixel_x = A.pixel_x + 8 + + if (get_dist(A, D) > 1) + A << "[D] is too far away!" + A.pixel_x = 0 + A.pixel_y = 0 + D.pixel_x = 0 + D.pixel_y = 0 + return 0 + + if (!isturf(A.loc) || !isturf(D.loc)) + A << "You can't slam [D] here!" + A.pixel_x = 0 + A.pixel_y = 0 + D.pixel_x = 0 + D.pixel_y = 0 + return 0 + else + if (A) + A.pixel_x = 0 + A.pixel_y = 0 + if (D) + D.pixel_x = 0 + D.pixel_y = 0 + return 0 + + sleep (1) + + if (A && D) + A.pixel_x = 0 + A.pixel_y = 0 + D.pixel_x = 0 + D.pixel_y = 0 + + if (get_dist(A, D) > 1) + A << "[D] is too far away!" + return 0 + + if (!isturf(A.loc) || !isturf(D.loc)) + A << "You can't slam [D] here!" + return 0 + + D.forceMove(A.loc) + + var/fluff = "body-slam" + switch(pick(2,3)) + if (2) + fluff = "turbo [fluff]" + if (3) + fluff = "atomic [fluff]" + + A.visible_message("[A] [fluff] [D]!") + playsound(A.loc, "swing_hit", 50, 1) + if (!D.stat) + D.emote("scream") + D.weakened += 2 + D.stunned += 2 + + switch(rand(1,3)) + if (2) + D.adjustBruteLoss(rand(20,30)) + if (3) + D.ex_act(3) + else + D.adjustBruteLoss(rand(10,20)) + else + D.ex_act(3) + + else + if (A) + A.pixel_x = 0 + A.pixel_y = 0 + if (D) + D.pixel_x = 0 + D.pixel_y = 0 + + + return 0 + +/datum/martial_art/wrestling/proc/strike(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(!D) + return + var/turf/T = get_turf(A) + if (T && isturf(T) && D && isturf(D.loc)) + for (var/i = 0, i < 4, i++) + A.dir = turn(A.dir, 90) + + A.forceMove(D.loc) + spawn (4) + if (A && (T && isturf(T) && get_dist(A, T) <= 1)) + A.forceMove(T) + + A.visible_message("[A] headbutts [D]!") + D.adjustBruteLoss(rand(10,20)) + playsound(A.loc, "swing_hit", 50, 1) + D.Paralyse(1) + +/datum/martial_art/wrestling/proc/kick(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(!D) + return + A.emote("scream") + A.emote("flip") + A.dir = turn(A.dir, 90) + + A.visible_message("[A] roundhouse-kicks [D]!") + playsound(A.loc, "swing_hit", 50, 1) + D.adjustBruteLoss(rand(10,20)) + + var/turf/T = get_edge_target_turf(A, get_dir(A, get_step_away(D, A))) + if (T && isturf(T)) + D.Weaken(1) + D.throw_at(T, 3, 2) + +/datum/martial_art/wrestling/proc/drop(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(!D) + return + var/obj/surface = null + var/turf/ST = null + var/falling = 0 + + for (var/obj/O in oview(1, A)) + if (O.density == 1) + if (O == A) continue + if (O == D) continue + if (O.opacity) continue + else + surface = O + ST = get_turf(O) + break + + if (surface && (ST && isturf(ST))) + A.forceMove(ST) + A.visible_message("[A] climbs onto [surface]!") + A.pixel_y = 10 + falling = 1 + sleep(10) + + if (A && D) + // These are necessary because of the sleep call. + + if ((falling == 0 && get_dist(A, D) > 1) || (falling == 1 && get_dist(A, D) > 2)) // We climbed onto stuff. + A.pixel_y = 0 + if (falling == 1) + A.visible_message("...and dives head-first into the ground, ouch!") + A.adjustBruteLoss(rand(10,20)) + A.Weaken(3) + A << "[D] is too far away!" + return 0 + + if (!isturf(A.loc) || !isturf(D.loc)) + A.pixel_y = 0 + A << "You can't drop onto [D] from here!" + return 0 + + if(A) + animate(A, transform = matrix(90, MATRIX_ROTATE), time = 1, loop = 0) + sleep(10) + if(A) + animate(A, transform = null, time = 1, loop = 0) + + A.forceMove(D.loc) + + A.visible_message("[A] leg-drops [D]!") + playsound(A.loc, "swing_hit", 50, 1) + A.emote("scream") + + if (falling == 1) + if (prob(33) || D.stat) + D.ex_act(3) + else + D.adjustBruteLoss(rand(20,30)) + else + D.adjustBruteLoss(rand(20,30)) + + D.Weaken(1) + D.Stun(2) + + A.pixel_y = 0 + + else + if (A) + A.pixel_y = 0 + return + +/datum/martial_art/wrestling/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(check_streak(A,D)) + return 1 + ..() + +/datum/martial_art/wrestling/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(check_streak(A,D)) + return 1 + if(A.pulling == D) + return 1 + A.start_pulling(D) + D.visible_message("[A] gets [D] in a cinch!", \ + "[A] gets [D] in a cinch!") + D.Stun(rand(3,5)) + return 1 diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 933d8ff2db8..1587bc4b8d2 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -146,11 +146,7 @@ /datum/mind/proc/remove_cultist() if(src in ticker.mode.cult) - ticker.mode.cult -= src - ticker.mode.update_cult_icons_removed(src) - var/datum/game_mode/cult/cult = ticker.mode - if(istype(cult)) - cult.memorize_cult_objectives(src) + ticker.mode.remove_cultist(src, 0, 0) special_role = null remove_objectives() remove_antag_equip() @@ -488,20 +484,20 @@ if(ticker.mode.config_tag == "handofgod") text = uppertext(text) text = "[text]: " - if(src in ticker.mode.red_deity_prophets) - text += "RED PROPHET|red follower|employee|blue follower|blue prophet|red god|blue god" + if (src in ticker.mode.red_deities) + text += "RED GOD|red prophet|red follower|employee|blue god|blue prophet|blue follower" + else if(src in ticker.mode.red_deity_prophets) + text += "red god|RED PROPHET|red follower|employee|blue god|blue prophet|blue follower" else if (src in ticker.mode.red_deity_followers) - text += "red prophet|RED FOLLOWER|employee|blue follower|blue prophet|red god|blue god" - else if (src in ticker.mode.blue_deity_followers) - text += "red prophet|red follower|employee|BLUE FOLLOWER|blue prophet|red god|blue god" - else if (src in ticker.mode.blue_deity_prophets) - text += "red prophet|red follower|employee|blue follower|BLUE PROPHET|red god|blue god" - else if (src in ticker.mode.red_deities) - text += "red prophet|red follower|employee|blue follower|blue prophet|RED GOD|blue god" + text += "red god|red prophet|RED FOLLOWER|employee|blue god|blue prophet|blue follower" else if (src in ticker.mode.blue_deities) - text += "red prophet|red follower|employee|blue follower|blue prophet|red god|BLUE GOD" + text += "red god|red prophet|red follower|employee|BLUE GOD|blue prophet|blue follower" + else if (src in ticker.mode.blue_deity_prophets) + text += "red god|red prophet|red follower|employee|blue god|BLUE PROPHET|blue follower" + else if (src in ticker.mode.blue_deity_followers) + text += "red god|red prophet|red follower|employee|blue god|blue prophet|BLUE FOLLOWER" else - text += "red prophet|red follower|EMPLOYEE|blue follower|blue prophet|red god|blue god" + text += "red god|red prophet|red follower|EMPLOYEE|blue god|blue prophet|blue follower" if(current && current.client && (ROLE_HOG_GOD in current.client.prefs.be_special)) text += "|HOG God Enabled in Prefs" @@ -983,12 +979,11 @@ switch(href_list["cult"]) if("clear") remove_cultist() - current << "You have been brainwashed! You are no longer a cultist!" message_admins("[key_name_admin(usr)] has de-cult'ed [current].") log_admin("[key_name(usr)] has de-cult'ed [current].") if("cultist") if(!(src in ticker.mode.cult)) - ticker.mode.add_cultist(src) + ticker.mode.add_cultist(src, 0) message_admins("[key_name_admin(usr)] has cult'ed [current].") log_admin("[key_name(usr)] has cult'ed [current].") if("tome") diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 14a79e8a9ae..4185dc51a4b 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -16,7 +16,7 @@ /datum/atom_hud/data /datum/atom_hud/data/human/medical - hud_icons = list(HEALTH_HUD, STATUS_HUD) + hud_icons = list(STATUS_HUD, HEALTH_HUD) /datum/atom_hud/data/human/medical/basic @@ -67,24 +67,49 @@ return 0 //helper for getting the appropriate health status -/proc/RoundHealth(health) - switch(health) +/proc/RoundHealth(mob/living/M) + if(M.stat == DEAD) + return "health-100" //what's our health? it doesn't matter, we're dead + var/resulthealth = (M.health / M.maxHealth) * 100 + switch(resulthealth) if(100 to INFINITY) return "health100" - if(70 to 100) - return "health80" - if(50 to 70) - return "health60" - if(30 to 50) - return "health40" - if(18 to 30) + if(90.625 to 100) + return "health93.75" + if(84.375 to 90.625) + return "health87.5" + if(78.125 to 84.375) + return "health81.25" + if(71.875 to 78.125) + return "health75" + if(65.625 to 71.875) + return "health68.75" + if(59.375 to 65.625) + return "health62.5" + if(53.125 to 59.375) + return "health56.25" + if(46.875 to 53.125) + return "health50" + if(40.625 to 46.875) + return "health43.75" + if(34.375 to 40.625) + return "health37.5" + if(28.125 to 34.375) + return "health31.25" + if(21.875 to 28.125) return "health25" - if(5 to 18) - return "health10" - if(1 to 5) - return "health1" - if(-99 to 0) + if(15.625 to 21.875) + return "health18.75" + if(9.375 to 15.625) + return "health12.5" + if(1 to 9.375) + return "health6.25" + if(-50 to 1) return "health0" + if(-85 to -50) + return "health-50" + if(-99 to -85) + return "health-85" else return "health-100" return "0" @@ -99,20 +124,28 @@ var/turf/T = get_turf(src) if (T) crewmonitor.queueUpdate(T.z) -//called when a carbon changes health -/mob/living/carbon/proc/med_hud_set_health() +//called when a living mob changes health +/mob/living/proc/med_hud_set_health() var/image/holder = hud_list[HEALTH_HUD] - if(stat == DEAD) - holder.icon_state = "hudhealth-100" - else - holder.icon_state = "hud[RoundHealth(health)]" + holder.icon_state = "hud[RoundHealth(src)]" + +//for carbon suit sensors +/mob/living/carbon/med_hud_set_health() + ..() var/turf/T = get_turf(src) - if (T) + if(T) crewmonitor.queueUpdate(T.z) //called when a carbon changes stat, virus or XENO_HOST -/mob/living/carbon/proc/med_hud_set_status() +/mob/living/proc/med_hud_set_status() + var/image/holder = hud_list[STATUS_HUD] + if(stat == DEAD) + holder.icon_state = "huddead" + else + holder.icon_state = "hudhealthy" + +/mob/living/carbon/med_hud_set_status() var/image/holder = hud_list[STATUS_HUD] if(stat == DEAD) holder.icon_state = "huddead" diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index 7f433d5fc36..037d0d246ea 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -89,6 +89,8 @@ attacktext = "hits" attack_sound = 'sound/weapons/genhit1.ogg' flying = 1 + del_on_death = 1 + deathmessage = "The blob spore explodes into a cloud of gas!" var/death_cloud_size = 1 //size of cloud produced from a dying spore var/list/human_overlays = list() var/is_zombie = 0 @@ -134,7 +136,6 @@ visible_message("The corpse of [H.name] suddenly rises!") /mob/living/simple_animal/hostile/blob/blobspore/death(gibbed) - ..(1) // On death, create a small smoke of harmful gas (s-Acid) var/datum/effect_system/smoke_spread/chem/S = new var/turf/location = get_turf(src) @@ -151,9 +152,10 @@ S.attach(location) S.set_up(reagents, death_cloud_size, location, silent=1) S.start() + if(factory) + factory.spore_delay = world.time + factory.spore_cooldown //put the factory on cooldown - ghostize() - qdel(src) + ..() /mob/living/simple_animal/hostile/blob/blobspore/Destroy() if(factory) diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm index 8ee6baa2c73..ccaf8e12a1a 100644 --- a/code/game/gamemodes/blob/blobs/factory.dm +++ b/code/game/gamemodes/blob/blobs/factory.dm @@ -11,6 +11,7 @@ var/mob/living/simple_animal/hostile/blob/blobbernaut/naut = null var/max_spores = 3 var/spore_delay = 0 + var/spore_cooldown = 80 //8 seconds between spores and after spore death /obj/effect/blob/factory/scannerreport() @@ -38,7 +39,7 @@ if(spore_delay > world.time) return flick("blob_factory_glow", src) - spore_delay = world.time + 100 // 10 seconds + spore_delay = world.time + spore_cooldown var/mob/living/simple_animal/hostile/blob/blobspore/BS = new/mob/living/simple_animal/hostile/blob/blobspore(src.loc, src) if(overmind) //if we don't have an overmind, we don't need to do anything but make a spore BS.overmind = overmind diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index 1ff18339458..72112430613 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -225,16 +225,24 @@ user.changeNext_move(CLICK_CD_MELEE) user << "The analyzer beeps once, then reports:
" user << 'sound/machines/ping.ogg' - if(overmind) - user << "Material: [overmind.blob_reagent_datum.name]." - user << "Material Effects: [overmind.blob_reagent_datum.analyzerdescdamage]" - user << "Material Properties: [overmind.blob_reagent_datum.analyzerdesceffect]
" - user << "Blob Type: [uppertext(initial(name))]" - user << "Health: [health]/[maxhealth]" - user << "Effects: [scannerreport()]" + chemeffectreport(user) + typereport(user) else return ..() +/obj/effect/blob/proc/chemeffectreport(mob/user) + if(overmind) + user << "Material: [overmind.blob_reagent_datum.name]." + user << "Material Effects: [overmind.blob_reagent_datum.analyzerdescdamage]" + user << "Material Properties: [overmind.blob_reagent_datum.analyzerdesceffect]
" + else + user << "No Material Detected!
" + +/obj/effect/blob/proc/typereport(mob/user) + user << "Blob Type: [uppertext(initial(name))]" + user << "Health: [health]/[maxhealth]" + user << "Effects: [scannerreport()]" + /obj/effect/blob/attacked_by(obj/item/I, mob/living/user) user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) @@ -294,8 +302,13 @@ /obj/effect/blob/examine(mob/user) ..() - user << "It seems to be made of [get_chem_name()]." - return + var/datum/atom_hud/hud_to_check = huds[DATA_HUD_MEDICAL_ADVANCED] + if(user.research_scanner || (user in hud_to_check.hudusers)) + user << "Your HUD displays an extensive report...
" + chemeffectreport(user) + typereport(user) + else + user << "It seems to be made of [get_chem_name()]." /obj/effect/blob/proc/scannerreport() return "A generic blob. Looks like someone forgot to override this proc, adminhelp this." diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm index 99ec015d119..e4c68a8537c 100644 --- a/code/game/gamemodes/changeling/powers/fleshmend.dm +++ b/code/game/gamemodes/changeling/powers/fleshmend.dm @@ -6,6 +6,9 @@ dna_cost = 2 req_stat = UNCONSCIOUS var/recent_uses = 1 //The factor of which the healing should be divided by + var/healing_ticks = 10 + // The ideal total healing amount, divided by healing_ticks to get heal/tick + var/total_healing = 100 /obj/effect/proc_holder/changeling/fleshmend/New() ..() @@ -17,7 +20,7 @@ /obj/effect/proc_holder/changeling/fleshmend/process() if(recent_uses > 1) - recent_uses-- + recent_uses = max(1, recent_uses - (1 / healing_ticks)) //Starts healing you every second for 10 seconds. Can be used whilst unconscious. /obj/effect/proc_holder/changeling/fleshmend/sting_action(mob/living/user) @@ -36,11 +39,14 @@ H.emote("scream") H.regenerate_limbs(1) - for(var/i = 0, i < 10, i++) //The healing itself - doesn't heal toxin damage (that's anatomic panacea) and effectiveness decreases with each use in a short timespan + // The healing itself - doesn't heal toxin damage (that's anatomic panacea) and + // effectiveness decreases with each use in a short timespan + for(var/i in 1 to healing_ticks) if(user) - user.adjustBruteLoss(-10 / recent_uses, 0) - user.adjustOxyLoss(-10 / recent_uses, 0) - user.adjustFireLoss(-10 / recent_uses, 0) + var/healpertick = -(total_healing / healing_ticks) + user.adjustBruteLoss(healpertick / recent_uses, 0) + user.adjustOxyLoss(healpertick / recent_uses, 0) + user.adjustFireLoss(healpertick / recent_uses, 0) user.updatehealth() sleep(10) diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm index a9c9d2b07d9..d4c60625f27 100644 --- a/code/game/gamemodes/changeling/powers/panacea.dm +++ b/code/game/gamemodes/changeling/powers/panacea.dm @@ -19,11 +19,11 @@ egg.loc = get_turf(user) user.reagents.add_reagent("mutadone", 10) - user.reagents.add_reagent("potass_iodide", 10) - user.reagents.add_reagent("charcoal", 20) + user.reagents.add_reagent("pen_acid", 20) user.reagents.add_reagent("antihol", 10) + user.reagents.add_reagent("mannitol", 25) for(var/datum/disease/D in user.viruses) D.cure() feedback_add_details("changeling_powers","AP") - return 1 \ No newline at end of file + return 1 diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 6b619838ded..f6b7c033c34 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -23,43 +23,13 @@ if(is_sacrifice_target(mind)) return 0 return 1 -/proc/cultist_commune(mob/living/user, clear = 0, say = 0, message) - if(!message) - return - if(say) - user.say("O bidai nabora se[pick("'","`")]sma!") - else - user.whisper("O bidai nabora se[pick("'","`")]sma!") - sleep(10) - if(!user) - return - if(say) - user.say(message) - else - user.whisper(message) - var/my_message = "Error, message null. You should probably report this." - for(var/mob/M in mob_list) - if(iscultist(M) || (M in dead_mob_list)) - if(clear || !ishuman(user)) - my_message = "[(ishuman(user) ? "Acolyte" : "Construct")] [user]: [message]" - else //Emergency comms - my_message = "Acolyte ???: [message]" - if(M in dead_mob_list) - M << "(F) [my_message]" - else - M << my_message - - log_say("[user.real_name]/[user.key] : [message]") - - - /datum/game_mode/cult name = "cult" config_tag = "cult" antag_flag = ROLE_CULTIST restricted_jobs = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel") protected_jobs = list() - required_players = 30 + required_players = 24 required_enemies = 4 recommended_enemies = 4 enemy_minimum_age = 14 @@ -75,7 +45,7 @@ /datum/game_mode/cult/announce() world << "The current game mode is - Cult!" - world << "Some crewmembers are attempting to start a cult!
\nCultists - complete your objectives at all costs. Convert crewmembers to your cause by using the convert rune, or sacrifice them and turn them into constructs. Remember - there is no you, there is only the cult.
\nPersonnel - Do not let the cult succeed in its mission. Forced consumption of holy water will convert a cultist back to a Nanotrasen-sanctioned faith.
" + world << "Some crewmembers are attempting to start a cult!
\nCultists - sacrifice your target and summon Nar-Sie at all costs. Convert crewmembers to your cause by using the convert rune, or sacrifice them and turn them into constructs. Remember - there is no you, there is only the cult.
\nPersonnel - Do not let the cult succeed in its mission. Forced consumption of holy water will convert a cultist back to a Nanotrasen-sanctioned faith.
" /datum/game_mode/cult/pre_setup() @@ -113,13 +83,14 @@ explanation = "Our knowledge must live on. Make sure at least [acolytes_needed] acolytes escape on the shuttle to spread their work on an another station." if("sacrifice") if(sacrifice_target) - explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. You will need the Sacrifice rune and three acolytes to do so." + explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role] via invoking a Sacrifice rune with them on it and three acolytes around it." else explanation = "Free objective." if("eldergod") - explanation = "Summon Nar-Sie via the rune 'Call Forth The Geometer'. It will only work if nine acolytes stand on and around it." + explanation = "Summon Nar-Sie by invoking the rune 'Summon Nar-Sie' with nine acolytes around and on it. You must do this after sacrificing your target." cult_mind.current << "Objective #[obj_count]: [explanation]" cult_mind.memory += "Objective #[obj_count]: [explanation]
" + /datum/game_mode/cult/post_setup() modePlayer += cult if("sacrifice" in cult_objectives) @@ -139,12 +110,12 @@ equip_cultist(cult_mind.current) update_cult_icons_added(cult_mind) cult_mind.current << "You are a member of the cult!" - memorize_cult_objectives(cult_mind) + add_cultist(cult_mind, 0) ..() + /datum/game_mode/proc/equip_cultist(mob/living/carbon/human/mob,tome = 0) if(!istype(mob)) return - mob.cult_add_comm() if (mob.mind) if (mob.mind.assigned_role == "Clown") mob << "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself." @@ -180,14 +151,17 @@ B.show_to(mob) return 1 -/datum/game_mode/proc/add_cultist(datum/mind/cult_mind) //BASE +/datum/game_mode/proc/add_cultist(datum/mind/cult_mind, stun) //BASE if (!istype(cult_mind)) return 0 if(!(cult_mind in cult) && is_convertable_to_cult(cult_mind)) - cult_mind.current.Paralyse(5) + if(stun) + cult_mind.current.Paralyse(5) cult += cult_mind cult_mind.current.faction |= "cult" - cult_mind.current.cult_add_comm() + cult_mind.current.verbs += /mob/living/proc/cult_help + var/datum/action/innate/cultcomm/C = new() + C.Grant(cult_mind.current) update_cult_icons_added(cult_mind) cult_mind.current.attack_log += "\[[time_stamp()]\] Has been converted to the cult!" if(jobban_isbanned(cult_mind.current, ROLE_CULTIST)) @@ -195,18 +169,21 @@ return 1 -/datum/game_mode/cult/add_cultist(datum/mind/cult_mind) //INHERIT +/datum/game_mode/cult/add_cultist(datum/mind/cult_mind, stun) //INHERIT if (!..(cult_mind)) return memorize_cult_objectives(cult_mind) -/datum/game_mode/proc/remove_cultist(datum/mind/cult_mind, show_message = 1) +/datum/game_mode/proc/remove_cultist(datum/mind/cult_mind, show_message = 1, stun) if(cult_mind in cult) cult -= cult_mind cult_mind.current.faction -= "cult" - cult_mind.current.verbs -= /mob/living/proc/cult_innate_comm - cult_mind.current.Paralyse(5) + cult_mind.current.verbs -= /mob/living/proc/cult_help + for(var/datum/action/innate/cultcomm/C in cult_mind.current.actions) + qdel(C) + if(stun) + cult_mind.current.Paralyse(5) cult_mind.current << "An unfamiliar white light flashes through your mind, cleansing the taint of the Dark One and all your memories as its servant." cult_mind.memory = "" update_cult_icons_removed(cult_mind) diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm new file mode 100644 index 00000000000..0af0525f908 --- /dev/null +++ b/code/game/gamemodes/cult/cult_comms.dm @@ -0,0 +1,75 @@ + +/datum/action/innate/cultcomm + name = "Communion" + button_icon_state = "cult_comms" + background_icon_state = "bg_demon" + check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_CONSCIOUS + +/datum/action/innate/cultcomm/IsAvailable() + if(!iscultist(owner)) + return 0 + return ..() + +/datum/action/innate/cultcomm/Activate() + var/input = stripped_input(usr, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "") + if(!input || !IsAvailable()) + return + + cultist_commune(usr, input) + return + +/proc/cultist_commune(mob/living/user, message) + if(!message) + return + if(!ishuman(user)) + user.say("O bidai nabora se[pick("'","`")]sma!") + else + user.whisper("O bidai nabora se[pick("'","`")]sma!") + sleep(10) + if(!user) + return + if(!ishuman(user)) + user.say(message) + else + user.whisper(message) + var/my_message = "[(ishuman(user) ? "Acolyte" : "Construct")] [user]: [message]" + for(var/mob/M in mob_list) + if(iscultist(M)) + M << my_message + else if(M in dead_mob_list) + M << "(F) [my_message]" + + log_say("[user.real_name]/[user.key] : [message]") + +/mob/living/proc/cult_help() + set category = "Cultist" + set name = "How to Play Cult" + var/text = "" + text += "
Tenets of the Dark One



" + + text += "I. SECRECY
Your cult is a SECRET organization. Your success DEPENDS on keeping your cult's members and locations SECRET for as long as possible. This means that your tome should be hidden \ + in your bag and never brought out in public. You should never create runes where other crew might find them, and you should avoid using talismans or other cult magic with witnesses around.

" + + text += "II. TOME
You start with a unique talisman in your bag. This supply talisman can be used 3 times, and creates starter equipment for your cult. The most critical of the talisman's functions is \ + the power to create a tome. This tome is your most important item and summoning one (in secret) is your FIRST PRIORITY. It lets you talk to fellow cultists and create runes, which in turn is essential to growing the cult's power.

" + + text += "III. RUNES
Runes are powerful sources of cult magic. Your tome will allow you to draw runes with your blood. Those runes, when hit with an empty hand, will attempt to \ + trigger the rune's magic. Runes are essential for the cult to convert new members, create powerful minions, or call upon incredibly powerful magic. Some runes require more than one cultist to use.

" + + text += "IV. TALISMANS
Talismans are a mobile source of cult magic that are NECESSARY to achieve success as a cult. Your starting talisman can produce certain talismans, but you will need \ + to use the -create talisman- rune (with ordinary paper on top) to get more talismans. Talismans are EXTREMELY powerful, therefore creating more talismans in a HIDDEN location should be one of your TOP PRIORITIES.

" + + text += "V. GROW THE CULT
There are certain basic strategies that all cultists should master. STUN talismans are the foundation of a successful cult. If you intend to convert the stunned person \ + you should use cuffs or a talisman of shackling on them and remove their headset before they recover (it takes about 10 seconds to recover). If you intend to sacrifice the victim, striking them quickly and repeatedly with your tome \ + will knock them out before they can recover. Sacrificed victims will their soul behind in a shard, these shards can be used on construct shells to make powerful servants for the cult. Remember you need TWO cultists standing near a \ + conversion rune to convert someone. Your construct minions cannot trigger most runes, but they will count as cultists in helping you trigger more powerful runes like conversion or blood boil.

" + + text += "VI. VICTORY
You have two ultimate goals as a cultist, sacrifice your target, and summon Nar-Sie. Sacrificing the target involves killing that individual and then placing \ + their corpse on a sacrifice rune and triggering that rune with THREE cultists. Do NOT lose the target's corpse! Only once the target is sacrificed can Nar-Sie be summoned. Summoning Nar-Sie will take nearly one minute \ + just to draw the massive rune needed. Do not create the rune until your cult is ready, the crew will receive the NAME and LOCATION of anyone who attempts to create the Nar-Sie rune. Once the Nar-Sie rune is drawn \ + you must gathered 9 cultists (or constructs) over the rune and then click it to bring the Dark One into this world!

" + + var/datum/browser/popup = new(usr, "mind", "", 800, 600) + popup.set_content(text) + popup.open() + return 1 \ No newline at end of file diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 8b8b70de1b9..680317bb768 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -12,7 +12,6 @@ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "rended") - /obj/item/weapon/melee/cultblade/attack(mob/living/target, mob/living/carbon/human/user) if(!iscultist(user)) user.Weaken(5) @@ -49,6 +48,15 @@ var/mob/living/carbon/human/H = target H.drip(50) + +/obj/item/weapon/restraints/legcuffs/bola/cult + name = "nar'sian bola" + desc = "A strong bola, bound with dark magic. Throw it to trip and slow your victim." + icon_state = "bola_cult" + breakouttime = 45 + weaken = 1 + + /obj/item/clothing/head/culthood name = "ancient cultist hood" icon_state = "culthood" diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 3002178f3f7..ecd8c75aa6e 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -1,84 +1,9 @@ /* -This file contains the arcane tome files as well as innate cultist emergency communications. +This file contains the arcane tome files. */ -/mob/proc/cult_add_comm() //why the fuck does this have its own proc? not removing it because it might be used somewhere but... - verbs += /mob/living/proc/cult_help - verbs += /mob/living/proc/cult_innate_comm - - -/mob/living/proc/cult_help() - set category = "Cultist" - set name = "How to Play Cult" - var/text = "" - text += "
Tenets of the Dark One



" - - text += "I. SECRECY
Your cult is a SECRET organization. Your success DEPENDS on keeping your cult's members and locations SECRET for as long as possible. This means that your tome should be hidden \ - in your bag and never brought out in public. You should never create runes where other crew might find them, and you should avoid using talismans or other cult magic with witnesses around.

" - - text += "II. TOME
You start with a unique talisman in your bag. This supply talisman can be used 3 times, and creates starter equipment for your cult. The most critical of the talisman's functions is \ - the power to create a tome. This tome is your most important item and summoning one (in secret) is your FIRST PRIORITY. It lets you talk to fellow cultists and create runes, which in turn is essential to growing the cult's power.

" - - text += "III. RUNES
Runes are powerful sources of cult magic. Your tome will allow you to draw runes with your blood. Those runes, when hit with an empty hand, will attempt to \ - trigger the rune's magic. Runes are essential for the cult to convert new members, create powerful minions, or call upon incredibly powerful magic. Some runes require more than one cultist to use.

" - - text += "IV. TALISMANS
Talismans are a mobile source of cult magic that are NECESSARY to achieve success as a cult. Your starting talisman can produce certain talismans, but you will need \ - to use the -create talisman- rune (with ordinary paper on top) to get more talismans. Talismans are EXTREMELY powerful, therefore creating more talismans in a HIDDEN location should be one of your TOP PRIORITIES.

" - - text += "V. GROW THE CULT
There are certain basic strategies that all cultists should master. STUN talismans are the foundation of a successful cult. If you intend to convert the stunned person \ - you should use cuffs or a talisman of shackling on them and remove their headset before they recover (it takes about 10 seconds to recover). If you intend to sacrifice the victim, striking them quickly and repeatedly with your tome \ - will knock them out before they can recover. Sacrificed victims will their soul behind in a shard, these shards can be used on construct shells to make powerful servants for the cult. Remember you need TWO cultists standing near a \ - conversion rune to convert someone. Your construct minions cannot trigger most runes, but they will count as cultists in helping you trigger more powerful runes like conversion or blood boil.

" - - text += "VI. VICTORY
You have two ultimate goals as a cultist, sacrifice your target, and summon Nar-Sie. Sacrificing the target involves killing that individual and then placing \ - their corpse on a sacrifice rune and triggering that rune with THREE cultists. Do NOT lose the target's corpse! Only once the target is sacrificed can Nar-Sie be summoned. Summoning Nar-Sie will take nearly one minute \ - just to draw the massive rune needed. Do not create the rune until your cult is ready, the crew will receive the NAME and LOCATION of anyone who attempts to create the Nar-Sie rune. Once the Nar-Sie rune is drawn \ - you must gathered 9 cultists (or constructs) over the rune and then click it to bring the Dark One into this world!

" - - var/datum/browser/popup = new(usr, "mind", "", 800, 600) - popup.set_content(text) - popup.open() - return 1 - -/mob/living/proc/cult_innate_comm() - set category = "Cultist" - set name = "Imperfect Communion" - - if(!iscultist(usr) || usr.incapacitated()) - return - if(!istype(usr, /mob/living/simple_animal)) - var/confirm_desperation = alert(usr, "This is a LAST RESORT; you should use a tome to communicate if possible. This ritual will inflict serious injury on you!", "Is this what you want?", "Yes", "No") - if(confirm_desperation == "No") - usr << "On second thought, maybe I should summon a tome." - return - var/input = stripped_input(usr, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "") - if(!input) - return - - if(!iscultist(usr) || usr.incapacitated()) - return //we do this again because input() sleeps - - if(ishuman(usr) || ismonkey(usr)) //Damage only applies to humans and monkeys, to allow constructs to communicate - usr.visible_message("[usr] starts clawing at \his arms with \his fingernails!", "You begin slicing open your arms with your fingernails!") - apply_damage(10,BRUTE, "l_arm") - apply_damage(10,BRUTE, "r_arm") - sleep(50) - if(usr.incapacitated()) - return //Hard to drawn intrinsic symbols when you're bleeding out in your cell. - var/turf/location = loc - if(istype(location, /turf)) // tearing your arms apart is going to spill a bit of blood, in fact thats the idea - location.add_blood(usr) // TO-DO change this to a badly drawn rune - apply_damage(10,BRUTE, "l_arm") // does a metric fuck ton of damage because this meant to be an emergency method of communication. - apply_damage(10,BRUTE, "r_arm") - if(usr.incapacitated()) - return - usr.visible_message("[usr] paints strange symbols with their own blood.", "You paint a messy rune with your own blood.") - sleep(20) - - cultist_commune(usr, 0, 1, input) - return /obj/item/weapon/tome name = "arcane tome" @@ -90,16 +15,12 @@ This file contains the arcane tome files as well as innate cultist emergency com /obj/item/weapon/tome/examine(mob/user) ..() - if(iscultist(user)) - user << "The scriptures of the Geometer. Allows the scribing of runes and access to the knowledge archives of the cult of Nar-Sie." + if(iscultist(user) || user.stat == DEAD) + user << "The scriptures of the Geometer. Allows the scribing of runes and access to the knowledge archives of the cult of Nar-Sie." + user << "Striking another cultist with it will purge holy water from them." + user << "Striking a noncultist, however, will sear their flesh." /obj/item/weapon/tome/attack(mob/living/M, mob/living/user) - if(istype(M,/mob/dead/observer)) - M.invisibility = 0 - user.visible_message("[user] strikes the air with [src], and a ghost appears!", \ - "You drag the ghost to your plane of reality!") - add_logs(user, M, "smacked", src) - return if(!istype(M)) return if(!iscultist(user)) @@ -127,104 +48,100 @@ This file contains the arcane tome files as well as innate cultist emergency com open_tome(user) /obj/item/weapon/tome/proc/open_tome(mob/user) - var/choice = alert(user,"You open the tome...",,"Commune","Scribe Rune","More Information") + var/choice = alert(user,"You open the tome...",,"Scribe Rune","More Information","Cancel") switch(choice) if("More Information") read_tome(user) if("Scribe Rune") scribe_rune(user) - if("Commune") - var/input = stripped_input(usr, "Please enter a message to tell to the other acolytes.", "Voice of Blood", "") - if(!input) - return - cultist_commune(user, 1, 0, input) + if("Cancel") + return /obj/item/weapon/tome/proc/read_tome(mob/user) var/text = "" text += "
Archives of the Dark One



" text += "A rune's name and effects can be revealed by examining the rune.<

" - text += "Imbue Talisman
The Rune of Talisman Creation is one of the most important. It is the only way to create new talismans. A blank sheet of paper must be on top of the rune. After \ - invoking it and choosing which talisman you desire, the paper will be converted into a talisman.

" + text += "Create Talisman
This rune is one of the most important runes the cult has, being the only way to create new talismans. A blank sheet of paper must be on top of the rune. After \ + invoking it and choosing which talisman you desire, the paper will be converted, after some delay into a talisman.

" - text += "Teleport
The Rune of Teleportation is a unique rite in that it requires a keyword before the scribing can begin. When invoked, search for other Rites of Translocation. \ + text += "Teleport
This rune is unique in that it requires a keyword before the scribing can begin. When invoked, it will find any other Teleport runes; \ If any are found, the user can choose which rune to send to. Upon activation, the rune teleports everything above it to the selected rune.

" - text += "Convert
The Rune of Conversion is important to the success of the cult. It will allow you to convert normal crew members into cultists. \ - To do this, simply place the crew member upon the rune and invoke it. This rune requires two acolytes to use. If the target to be converted is loyalty-implanted or a certain assignment, they will \ - be unable to be converted. People the Geometer wishes sacrificed will also be ineligible for conversion, and anyone with a shielding presence like the null rod will not be converted.

" + text += "Convert
This rune is critical to the success of the cult. It will allow you to convert normal crew members into cultists. \ + To do this, simply place the crew member upon the rune and invoke it. This rune requires two invokers to use. If the target to be converted is loyalty-implanted or a certain assignment, they will \ + be unable to be converted. People the Geometer wishes sacrificed will also be ineligible for conversion, and anyone with a shielding presence like the null rod will not be converted.
\ + Successful conversions will produce a tome for the new cultist.

" - text += "Sacrifice
The Rune of Sacrifice is necessary to achieve your goals. Simply place any dead creature upon the rune and invoke it (this will not \ - target cultists!). If this creature has a mind, a soul shard will be created and the creature's soul transported to it. This rune is required if the cult's objectives include the sacrifice of a crew \ - member. Sacrificing the dead can be done alone, but sacrificing living crew or your cult's target will require 3 cultists. Soul shards used on construct shells will move that soul into a \ - powerful construct of your choice.

" + text += "Sacrifice
This rune is necessary to achieve your goals. Simply place any dead creature upon the rune and invoke it (this will not \ + target cultists!). If this creature has a mind, a soulstone will be created and the creature's soul transported to it. Sacrificing the dead can be done alone, but sacrificing living crew or your cult's target will require 3 cultists. \ + Soulstones used on construct shells will move that soul into a powerful construct of your choice.

" - text += "Raise Dead
The Rune of Resurrection is a delicate rite that requires two corpses. To perform the ritual, place the corpse you wish to revive onto \ + text += "Raise Dead
This rune requires two corpses. To perform the ritual, place the corpse you wish to revive onto \ the rune and the offering body adjacent to it. When the rune is invoked, the body to be sacrificed will turn to dust, the life force flowing into the revival target. Assuming the target is not moved \ within a few seconds, they will be brought back to life, healed of all ailments.

" - text += "Electromagnetic Disruption
Robotic lifeforms have time and time again been the downfall of fledgling cults. The Rite of Disruption may allow you to gain the upper \ + text += "Electromagnetic Disruption
Robotic lifeforms have time and time again been the downfall of fledgling cults. This rune may allow you to gain the upper \ hand against these pests. By using the rune, a large electromagnetic pulse will be emitted from the rune's location. The size of the EMP will grow significantly for each additional adjacent cultist when the \ rune is activated.

" - text += "Astral Communion
The Rune of Astral Communion is perhaps the most ingenious rune that is usable by a single person. Upon invoking the rune, the \ + text += "Astral Communion
This rune is perhaps the most ingenious rune that is usable by a single person. Upon invoking the rune, the \ user's spirit will be ripped from their body. In this state, the user's physical body will be locked in place to the rune itself - any attempts to move it will result in the rune pulling it back. \ The body will also take constant damage while in this form, and may even die. The user's spirit will contain their consciousness, and will allow them to freely wander the station as a ghost. This may \ also be used to commune with the dead.

" - text += "Form Barrier
While simple, the Barrier Rune serves an important purpose in defense and hindering passage. When invoked, the \ + text += "Form Barrier
While simple, this rune serves an important purpose in defense and hindering passage. When invoked, the \ rune will draw a small amount of life force from the user and make the space above the rune completely dense, rendering it impassable to all but the most complex means. The rune may be invoked again to \ undo this effect and allow passage again.

" - text += "Summon Cultist
The Rune of Summoning requires two acolytes to use. When invoked, it will allow the user to summon a single cultist to the rune from \ - any location. This will deal a moderate amount of damage to all invokers. Absolutely crucial for rescuing your brothers from security.

" + text += "Summon Cultist
This rune allows the cult to free other cultists with ease. When invoked, it will allow the user to summon a single cultist to the rune from \ + any location. It requires two invokers, and will damage each invoker slightly.

" - text += "Blood Boil
The Rune of Boiling Blood may be considered one of the most dangerous rites composed by the cult of Nar-Sie. When invoked, it will do a \ - massive amount of damage to all non-cultist viewers, but it will also emit an explosion upon invocation. It requires three invokers.

" + text += "Blood Boil
When invoked, this rune will do a massive amount of damage to all non-cultist viewers, but it will also emit a small explosion upon invocation. \ + It requires three invokers.

" - text += "Manifest Spirit
If you wish to bring a spirit back from the dead with a wish for vengeance and desire to serve, the Rite of Spectral \ - Manifestation can do just that. When invoked, any spirits above the rune will be brought to life as a human wearing nothing that seeks only to serve you and the Geometer. However, the spirit's link \ - to reality is fragile - you must remain on top of the rune, and you will slowly take damage. Upon stepping off the rune, the spirits will dissipate, dropping their items to the ground. You may manifest \ + text += "Manifest Spirit
This rune allows you to summon spirits as humanoid fighters. When invoked, a spirit above the rune will be brought to life as a human, wearing nothing, that seeks only to serve you and the Geometer. \ + However, the spirit's link to reality is fragile - you must remain on top of the rune, and you will slowly take damage. Upon stepping off the rune, all summoned spirits will dissipate, dropping their items to the ground. You may manifest \ multiple spirits with one rune, but you will rapidly take damage in doing so.

" - text += "Summon Nar-Sie
There is only one way to summon the avatar of Nar-Sie, and that is the Ritual of Dimensional Rending. This ritual, in \ - comparison to other runes, is very large, requiring a 3x3 space of empty tiles to create. To invoke the rune, nine cultists must stand on the rune, so that all of them are within its circle. Then, \ - simply invoke it. A brief tearing will be heard as the barrier between dimensions is torn open, and the avatar will come forth.


" + text += "Summon Nar-Sie
This rune is necessary to achieve your goals. On attempting to scribe it, it will produce shields around you and alert everyone you are attempting to scribe it; it takes a very long time to scribe, \ + and does massive damage to the one attempting to scribe it.
Invoking it requires 9 invokers and the sacrifice of a specific crewmember, and once invoked, will summon the Geometer, Nar-Sie herself. \ + This will complete your objectives.


" - text += "Talisman of Teleportation
The talisman form of the Rite of Translocation will transport the invoker to a randomly chosen rune of the same keyword, then \ - disappear.

" + text += "Talisman of Teleportation
The talisman form of the Teleport rune will transport the invoker to a selected Teleport rune once.

" - text += "Talisman of Construction
The Rune of Fabrication is the main way of creating construct shells. To use it, one must place fifteen sheets of metal on top of the rune \ - and invoke it. The sheets will them be twisted into a construct shell, ready to recieve a soul to occupy it.

" + text += "Talisman of Construction
This talisman is the main way of creating construct shells. To use it, one must strike 30 sheets of metal with the talisman. The sheets will then be twisted into a construct shell, ready to recieve a soul to occupy it.

" - text += "Talisman of Tome Summoning
This talisman functions nearly identically to the rune. The talisman will attempt to place the tome in your hand \ - instead of on the ground, though this is the only advantage it has over the rune. It can be used once, then disappears.

" + text += "Talisman of Tome Summoning
This talisman will produce a single tome at your feet.

" - text += "Talismans of Veiling and Disguising
These talismans will hide, reveal, or disguise (as crayon drawings) all nearby runes.

" + text += "Talisman of Veiling/Revealing
This talisman will hide runes on its first use, and on the second, will reveal runes.

" - text += "Talisman of Electromagnetic Pulse
This talisman will EMP the target and anything else nearby. It disappears after one use.

" + text += "Talisman of Disguising
This talisman will permanently disguise all nearby runes as crayon runes.

" - text += "Talisman of Stunning
Without this talisman, the cult would have no way of easily acquiring targets to convert. Commonly called \"stunpapers\", this \ - talisman functions differently from others. Rather than simply reading the words, the target must be attacked directly with the talisman. The talisman will then knock down the target for a long \ - duration in addition to inhibiting their speech. Robotic lifeforms will suffer the effects of a heavy electromagnetic pulse instead.

" + text += "Talisman of Electromagnetic Pulse
This talisman will EMP anything else nearby. It disappears after one use.

" + + text += "Talisman of Stunning
Attacking a target will knock them down for a long duration in addition to inhibiting their speech. \ + Robotic lifeforms will suffer the effects of a heavy electromagnetic pulse instead.

" text += "Talisman of Armaments
The Talisman of Arming will equip the user with armored robes, a backpack, an eldritch longsword, an empowered bola, and a pair of boots. Any items that cannot \ - be equipped will not be summoned.

" + be equipped will not be summoned. Attacking a fellow cultist with it will instead equip them.

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

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

" - + text += "In addition to these runes, the cult has a small selection of equipment and constructs.

" text += "Equipment:

" - text += "Cult Blade
Cult blades are a sharp weapons that, notably, cannot be used by noncultists. These blades are produced by the Rite and Talisman of Arming.

" + text += "Cult Blade
Cult blades are sharp weapons that, notably, cannot be used by noncultists. These blades are produced by the Talisman of Arming.

" - text += "Cult Robes
Cult robes are heavily armored robes. These robes are produced by the Rite and Talisman of Arming.

" + text += "Cult Bola
Cult bolas are strong bolas, useful for snaring targets. These bolas are produced by the Talisman of Arming.

" + + text += "Cult Robes
Cult robes are heavily armored robes. These robes are produced by the Talisman of Arming.

" text += "Soulstone
A soulstone is a simple piece of magic, produced either via the starter talisman or by sacrificing humans. Using it on an unconscious or dead human, or on a Shade, will trap their soul in the stone, allowing its use in construct shells. \ -
The soul within can also be released as a Shade.

" +
The soul within can also be released as a Shade by using it in-hand.

" text += "Construct Shell
A construct shell is useless on its own, but placing a filled soulstone within it allows you to produce your choice of a Wraith, a Juggernaut, or an Artificer. \
Each construct has uses, detailed below in Constructs. Construct shells can be produced via the starter talisman or the Rite of Fabrication.

" @@ -240,14 +157,14 @@ This file contains the arcane tome files as well as innate cultist emergency com text += "Artificer
The Artificer is a weak and fragile construct, able to heal other constructs, produce more soulstones and construct shells, \ construct fortifying cult walls and flooring, and finally, it can release a few indiscriminate stunning missiles.

" - text += "Harvester
If you see one, know that you have done all you can and your life is void.

" - + text += "Harvester
If you see one, know that you have done all you can and your life is void.

" + var/datum/browser/popup = new(user, "tome", "", 800, 600) popup.set_content(text) popup.open() return 1 -/obj/item/weapon/tome/proc/scribe_rune(mob/user) +/obj/item/weapon/tome/proc/scribe_rune(mob/living/user) var/turf/Turf = get_turf(user) var/chosen_keyword var/obj/effect/rune/rune_to_scribe @@ -278,50 +195,45 @@ This file contains the arcane tome files as well as innate cultist emergency com break if(!rune_to_scribe) return - var/turf/Thenewturfyouwalkedto = get_turf(user) //we may have moved. adjust as needed... - if(locate(/obj/effect/rune) in Thenewturfyouwalkedto) + Turf = get_turf(user) //we may have moved. adjust as needed... + if(locate(/obj/effect/rune) in Turf) user << "There is already a rune here." return if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated()) return + if(ispath(rune_to_scribe, /obj/effect/rune/narsie)) + var/confirm_final = alert(usr, "This is the FINAL step to summon Nar-Sie, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for Nar-Sie!", "No") + if(confirm_final == "No") + usr << "On second thought, we should prepare further for the final battle..." + return + var/area/A = get_area(src) + var/locname = initial(A.name) + priority_announce("Figments from an eldritch god are being summoned by [user] into [locname] from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensionsal Affairs", 'sound/AI/spanomalies.ogg') + for(var/B in spiral_range_turfs(1, user, 1)) + var/turf/T = B + var/obj/machinery/shield/N = new(T) + N.name = "Rune-Scriber's Shield" + N.desc = "A potent shield summoned by cultists to protect them while they prepare the final ritual" + N.icon_state = "shield-red" + N.health = 60 + shields |= N user.visible_message("[user] cuts open their arm and begins writing in their own blood!", \ "You slice open your arm and begin drawing a sigil of the Geometer.") - if(iscarbon(user)) - var/mob/living/carbon/C = user - C.apply_damage(0.1, BRUTE, pick("l_arm", "r_arm")) - if("Summon Nar-Sie" == entered_rune_name) - var/confirm_final = alert(usr, "This is the FINAL step to summon Nar-Sie, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for Nar-Sie!", "No") - if(confirm_final == "No") - usr << "On second thought, we should prepare further for the final battle..." - return - C.apply_damage(40, BRUTE, pick("l_arm", "r_arm")) - var/area/A = get_area(src) - var/locname = initial(A.name) - priority_announce("Figments from an eldritch god are being summoned by [user] into [locname] from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensionsal Affairs", 'sound/AI/spanomalies.ogg') - for(var/turf/B in orange (1, user)) - var/obj/machinery/shield/N = new(B) - N.name = "Rune-Scriber's Shield" - N.desc = "A potent shield summoned by cultists to protect them while they prepare the final ritual" - N.icon_state = "shield-red" - N.health = 60 - shields |= N - if(!do_after(user, 400, target = get_turf(user))) - for(var/V in shields) - var/obj/machinery/shield/S = V - if(S && !qdeleted(S)) - qdel(S) - return - if(!do_after(user, 50, target = get_turf(user))) + user.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE, pick("l_arm", "r_arm")) + if(!do_after(user, initial(rune_to_scribe.scribe_delay), target = get_turf(user))) for(var/V in shields) var/obj/machinery/shield/S = V if(S && !qdeleted(S)) qdel(S) return + if(locate(/obj/effect/rune) in Turf) + user << "There is already a rune here." + return user.visible_message("[user] creates a strange circle in their own blood.", \ "You finish drawing the arcane markings of the Geometer.") for(var/V in shields) var/obj/machinery/shield/S = V if(S && !qdeleted(S)) qdel(S) - new rune_to_scribe(Thenewturfyouwalkedto, chosen_keyword) + new rune_to_scribe(Turf, chosen_keyword) user << "The [lowertext(initial(rune_to_scribe.cultist_name))] rune [initial(rune_to_scribe.cultist_desc)]" diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index da4d25943c1..4b75c8ce9d1 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -17,7 +17,7 @@ To draw a rune, use an arcane tome. name = "rune" var/cultist_name = "basic rune" desc = "An odd collection of symbols drawn in what seems to be blood." - var/cultist_desc = "A basic rune with no function." //This is shown to cultists who examine the rune in order to determine its true purpose. + var/cultist_desc = "a basic rune with no function." //This is shown to cultists who examine the rune in order to determine its true purpose. anchored = 1 icon = 'icons/obj/rune.dmi' icon_state = "1" @@ -30,14 +30,14 @@ To draw a rune, use an arcane tome. var/req_cultists = 1 //The amount of cultists required around the rune to invoke it. If only 1, any cultist can invoke it. var/rune_in_use = 0 // Used for some runes, this is for when you want a rune to not be usable when in use. - var/req_pylons = 0 - var/req_forges = 0 - var/req_archives = 0 - var/req_altars = 0 + var/scribe_delay = 50 //how long the rune takes to create + var/scribe_damage = 0.1 //how much damage you take doing it + + var/allow_excess_invokers = 0 //if we allow excess invokers when being invoked var/req_keyword = 0 //If the rune requires a keyword - go figure amirite var/keyword //The actual keyword for the rune - + /obj/effect/rune/New(loc, set_keyword) ..() if(set_keyword) @@ -47,14 +47,14 @@ To draw a rune, use an arcane tome. ..() if(iscultist(user) || user.stat == DEAD) //If they're a cultist or a ghost, tell them the effects user << "Name: [cultist_name]" - user << "Effects: [cultist_desc]" + user << "Effects: [capitalize(cultist_desc)]" user << "Required Acolytes: [req_cultists]" if(req_keyword && keyword) user << "Keyword: [keyword]" /obj/effect/rune/attackby(obj/I, mob/user, params) if(istype(I, /obj/item/weapon/tome) && iscultist(user)) - user << "You carefully erase [src]." + user << "You carefully erase the [lowertext(cultist_name)] rune." qdel(src) return else if(istype(I, /obj/item/weapon/nullrod)) @@ -68,14 +68,22 @@ To draw a rune, use an arcane tome. if(!iscultist(user)) user << "You aren't able to understand the words of [src]." return - if(can_invoke(user)) - invoke(user) - var/oldtransform = transform - animate(src, transform = matrix()*2, alpha = 0, time = 5) //fade out - animate(transform = oldtransform, alpha = 255, time = 0) + var/list/invokers = can_invoke(user) + if(invokers.len >= req_cultists) + invoke(invokers) else fail_invoke(user) +/obj/effect/rune/proc/talismanhide() //for talisman of revealing/hiding + visible_message("[src] fades away.") + invisibility = INVISIBILITY_OBSERVER + alpha = 100 //To help ghosts distinguish hidden runes + +/obj/effect/rune/proc/talismanreveal() //for talisman of revealing/hiding + invisibility = 0 + visible_message("[src] suddenly appears!") + alpha = initial(alpha) + /* There are a few different procs each rune runs through when a cultist activates it. @@ -88,64 +96,55 @@ structure_check() searches for nearby cultist structures required for the invoca /obj/effect/rune/proc/can_invoke(var/mob/living/user) //This proc determines if the rune can be invoked at the time. If there are multiple required cultists, it will find all nearby cultists. - if(!structure_check(req_pylons, req_forges, req_archives, req_altars)) - return 0 - if(!keyword && req_keyword) - return 0 - if(req_cultists <= 1) - if(invocation) - user.say(invocation) - return 1 - else - var/cultists_in_range = 0 + var/list/invokers = list() //people eligible to invoke the rune + var/list/chanters = list() //people who will actually chant the rune when passed to invoke() + chanters |= user + invokers |= user + if(req_cultists > 1 || allow_excess_invokers) for(var/mob/living/L in range(1, src)) if(iscultist(L)) - var/mob/living/carbon/human/H = L - if(!istype(H)) - if(istype(L, /mob/living/simple_animal/hostile/construct)) - if(invocation) - L.say(invocation) - cultists_in_range++ + if(L == user) continue - if(L.stat || (H.disabilities & MUTE) || H.silent) + if(ishuman(L)) + var/mob/living/carbon/human/H = L + if((H.disabilities & MUTE) || H.silent) + continue + if(L.stat) continue - if(invocation) - L.say(invocation) - cultists_in_range++ - if(cultists_in_range >= req_cultists) - return 1 - else - return 0 + invokers |= L + if(invokers.len >= req_cultists) + if(allow_excess_invokers) + chanters |= invokers + else + invokers -= user + shuffle(invokers) + for(var/i in 0 to req_cultists) + var/L = pick_n_take(invokers) + chanters |= L + return chanters -/obj/effect/rune/proc/invoke(var/mob/living/user) +/obj/effect/rune/proc/invoke(var/list/invokers) //This proc contains the effects of the rune as well as things that happen afterwards. If you want it to spawn an object and then delete itself, have both here. + if(invocation) + for(var/M in invokers) + var/mob/living/L = M + L.say(invocation) + var/oldtransform = transform + spawn(0) //animate is a delay, we want to avoid being delayed + animate(src, transform = matrix()*2, alpha = 0, time = 5) //fade out + animate(transform = oldtransform, alpha = 255, time = 0) /obj/effect/rune/proc/fail_invoke(var/mob/living/user) //This proc contains the effects of a rune if it is not invoked correctly, through either invalid wording or not enough cultists. By default, it's just a basic fizzle. visible_message("The markings pulse with a small flash of red light, then fall dark.") - -/obj/effect/rune/proc/structure_check(var/rpylons, var/rforges, var/rarchives, var/raltars) - var/pylons = 0 - var/forges = 0 - var/archives = 0 - var/altars = 0 - for(var/obj/structure/cult/pylon in orange(3,src)) - pylons++ - for(var/obj/structure/cult/forge in orange(3,src)) - forges++ - for(var/obj/structure/cult/tome in orange(3,src)) - archives++ - for(var/obj/structure/cult/talisman in orange(3,src)) - altars++ - if(pylons >= rpylons && forges >= rforges && archives >= rarchives && altars >= raltars) - return 1 - return 0 - + spawn(0) //animate is a delay, we want to avoid being delayed + animate(src, color = rgb(255, 0, 0), time = 0) + animate(src, color = initial(color), time = 5) //Malformed Rune: This forms if a rune is not drawn correctly. Invoking it does nothing but hurt the user. /obj/effect/rune/malformed cultist_name = "malformed rune" - cultist_desc = "A senseless rune written in gibberish. No good can come from invoking this." + cultist_desc = "a senseless rune written in gibberish. No good can come from invoking this." invocation = "Ra'sha yoka!" /obj/effect/rune/malformed/New() @@ -153,9 +152,12 @@ structure_check() searches for nearby cultist structures required for the invoca icon_state = "[rand(1,6)]" color = rgb(rand(0,255), rand(0,255), rand(0,255)) -/obj/effect/rune/malformed/invoke(mob/living/user) - user << "You feel your life force draining. The Geometer is displeased." - user.apply_damage(30, BRUTE) +/obj/effect/rune/malformed/invoke(var/list/invokers) + ..() + for(var/M in invokers) + var/mob/living/L = M + L << "You feel your life force draining. The Geometer is displeased." + L.apply_damage(30, BRUTE) qdel(src) /mob/proc/null_rod_check() //The null rod, if equipped, will protect the holder from the effects of most runes @@ -164,15 +166,16 @@ structure_check() searches for nearby cultist structures required for the invoca return N return 0 -//Rite of Binding: Turns a nearby rune and a paper on top of the rune to a talisman, if both are valid. +//Rite of Binding: A paper on top of the rune to a talisman. /obj/effect/rune/imbue cultist_name = "Create Talisman" - cultist_desc = "Transforms paper into powerful magic talismans." - invocation = null //no talisman made, no invocation. + cultist_desc = "transforms paper into powerful magic talismans." + invocation = "H'drak v'loso, mir'kanas verbot!" icon_state = "3" color = rgb(0, 0, 255) -/obj/effect/rune/imbue/invoke(mob/living/user) +/obj/effect/rune/imbue/invoke(var/list/invokers) + var/mob/living/user = invokers[1] //the first invoker is always the user var/turf/T = get_turf(src) var/list/papers_on_rune = list() var/entered_talisman_name @@ -184,12 +187,12 @@ structure_check() searches for nearby cultist structures required for the invoca if(!papers_on_rune.len) user << "There must be a blank paper on top of [src]!" fail_invoke() - log_game("Talisman Imbue rune failed - no blank papers on rune") + log_game("Talisman Creation rune failed - no blank papers on rune") return if(rune_in_use) user << "[src] can only support one ritual at a time!" fail_invoke() - log_game("Talisman Imbue rune failed - more than one user") + log_game("Talisman Creation rune failed - already in use") return var/obj/item/weapon/paper/paper_to_imbue = pick(papers_on_rune) for(var/I in subtypesof(/obj/item/weapon/paper/talisman) - /obj/item/weapon/paper/talisman/malformed - /obj/item/weapon/paper/talisman/supply) @@ -198,10 +201,10 @@ structure_check() searches for nearby cultist structures required for the invoca if(talisman_cult_name) possible_talismans[talisman_cult_name] = J //This is to allow the menu to let cultists select talismans by name entered_talisman_name = input(user, "Choose a talisman to imbue.", "Talisman Choices") as null|anything in possible_talismans - if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated()) - return talisman_type = possible_talismans[entered_talisman_name] - user.say("H'drak v'loso, mir'kanas verbot!") + if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated() || rune_in_use || !talisman_type) + return + ..() visible_message("Dark power begins to channel into the paper!.") rune_in_use = 1 if(!do_after(user, 100, target = get_turf(user))) @@ -215,7 +218,7 @@ structure_check() searches for nearby cultist structures required for the invoca var/list/teleport_runes = list() /obj/effect/rune/teleport cultist_name = "Teleport" - cultist_desc = "Warps everything above it to another chosen teleport rune." + cultist_desc = "warps everything above it to another chosen teleport rune." invocation = "Sas'so c'arta forbici!" icon_state = "2" color = "#551A8B" @@ -233,7 +236,8 @@ var/list/teleport_runes = list() teleport_runes -= src return ..() -/obj/effect/rune/teleport/invoke(mob/living/user) +/obj/effect/rune/teleport/invoke(var/list/invokers) + var/mob/living/user = invokers[1] //the first invoker is always the user var/list/potential_runes = list() var/list/teleportnames = list() var/list/duplicaterunecount = list() @@ -268,15 +272,22 @@ var/list/teleport_runes = list() return var/turf/T = get_turf(src) - var/turf/UT = get_turf(user) var/movedsomething = 0 + var/moveuserlater = 0 for(var/atom/movable/A in T) + if(A == user) + moveuserlater = 1 + movedsomething = 1 + continue if(!A.anchored) movedsomething = 1 A.forceMove(get_turf(actual_selected_rune)) if(movedsomething) + ..() visible_message("There is a sharp crack of inrushing air, and everything above the rune disappears!") - user << "You[user.loc == UT ? " send everything above the rune away":"r vision blurs, and you suddenly appear somewhere else"]." + user << "You[moveuserlater ? "r vision blurs, and you suddenly appear somewhere else":" send everything above the rune away"]." + if(moveuserlater) + user.forceMove(get_turf(actual_selected_rune)) else fail_invoke() @@ -284,13 +295,13 @@ var/list/teleport_runes = list() //Rite of Enlightenment: Converts a normal crewmember to the cult. Faster for every cultist nearby. /obj/effect/rune/convert cultist_name = "Convert" - cultist_desc = "Converts a normal crewmember on top of it to the cult. Does not work on loyalty-implanted crew." + cultist_desc = "converts a normal crewmember on top of it to the cult. Does not work on loyalty-implanted crew." invocation = "Mah'weyh pleggh at e'ntrath!" icon_state = "3" - color = rgb(255, 0, 0) + color = rgb(200, 0, 0) req_cultists = 2 -/obj/effect/rune/convert/invoke(mob/living/user) +/obj/effect/rune/convert/invoke(var/list/invokers) var/list/convertees = list() var/turf/T = get_turf(src) for(var/mob/living/M in T.contents) @@ -302,17 +313,17 @@ var/list/teleport_runes = list() return var/mob/living/new_cultist = pick(convertees) if(!is_convertable_to_cult(new_cultist.mind) || new_cultist.null_rod_check()) - user << "Something is shielding [new_cultist]'s mind!" + for(var/M in invokers) + M << "Something is shielding [new_cultist]'s mind!" + if(is_sacrifice_target(new_cultist.mind)) + M << "\"I desire this one for myself. SACRIFICE THEM!\"" fail_invoke() log_game("Convert rune failed - convertee could not be converted") - if(is_sacrifice_target(new_cultist.mind)) - for(var/mob/living/M in orange(1,src)) - if(iscultist(M)) - M << "\"I desire this one for myself. SACRIFICE THEM!\"" return + ..() new_cultist.visible_message("[new_cultist] writhes in pain as the markings below them glow a bloody red!", \ "AAAAAAAAAAAAAA-") - ticker.mode.add_cultist(new_cultist.mind) + ticker.mode.add_cultist(new_cultist.mind, 1) new /obj/item/weapon/tome(get_turf(src)) new_cultist.mind.special_role = "Cultist" new_cultist << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \ @@ -323,8 +334,9 @@ var/list/teleport_runes = list() //Rite of Tribute: Sacrifices a crew member to Nar-Sie. Places them into a soul shard if they're in their body. /obj/effect/rune/sacrifice cultist_name = "Sacrifice" - cultist_desc = "Sacrifices a crew member to the Geometer. May place them into a soul shard if their spirit remains in their body." + cultist_desc = "sacrifices a crew member to the Geometer. May place them into a soul shard if their spirit remains in their body." icon_state = "3" + allow_excess_invokers = 1 invocation = "Barhah hra zar'garis!" color = rgb(255, 255, 255) rune_in_use = 0 @@ -333,13 +345,17 @@ var/list/teleport_runes = list() ..() icon_state = "[rand(1,6)]" -/obj/effect/rune/sacrifice/invoke(mob/living/user) +/obj/effect/rune/sacrifice/invoke(var/list/invokers) if(rune_in_use) return rune_in_use = 1 + var/mob/living/user = invokers[1] //the first invoker is always the user var/turf/T = get_turf(src) var/list/possible_targets = list() for(var/mob/living/M in T.contents) + if(M.mind) + if(M.mind in sacrificed) + continue if(!iscultist(M)) possible_targets.Add(M) var/mob/offering @@ -360,46 +376,41 @@ var/list/teleport_runes = list() rune_in_use = 0 return*/ if(((ishuman(offering) || isrobot(offering)) && offering.stat != DEAD) || is_sacrifice_target(offering.mind)) //Requires three people to sacrifice living targets - var/cultists_nearby = 1 - for(var/mob/living/M in range(1,src)) - if(iscultist(M) && M != user) - cultists_nearby++ - M.say(invocation) - if(cultists_nearby < 3) - user << "[offering] is too greatly linked to the world! You need three acolytes!" + if(invokers.len < 3) + for(var/M in invokers) + M << "[offering] is too greatly linked to the world! You need three acolytes!" fail_invoke() log_game("Sacrifice rune failed - not enough acolytes and target is living") rune_in_use = 0 return visible_message("[src] pulses blood red!") color = rgb(126, 23, 23) - spawn(5) - color = initial(color) - sac(offering) + ..() + sac(invokers, offering) + color = initial(color) -/obj/effect/rune/sacrifice/proc/sac(mob/living/T) +/obj/effect/rune/sacrifice/proc/sac(var/list/invokers, mob/living/T) var/sacrifice_fulfilled if(T) if(istype(T, /mob/living/simple_animal/pet/dog)) - for(var/mob/living/carbon/C in range(3,src)) - if(iscultist(C)) - C << "\"Even I have standards, such as they are!\"" - if(C.reagents) - C.reagents.add_reagent("hell_water", 2) + for(var/M in invokers) + var/mob/living/L = M + L << "\"Even I have standards, such as they are!\"" + if(L.reagents) + L.reagents.add_reagent("hell_water", 2) if(T.mind) sacrificed.Add(T.mind) if(is_sacrifice_target(T.mind)) sacrifice_fulfilled = 1 PoolOrNew(/obj/effect/overlay/temp/cult/sac, src.loc) - for(var/mob/living/M in range(3,src)) - if(iscultist(M)) - if(sacrifice_fulfilled) - M << "\"Yes! This is the one I desire! You have done well.\"" + for(var/M in invokers) + if(sacrifice_fulfilled) + M << "\"Yes! This is the one I desire! You have done well.\"" + else + if(ishuman(T) || isrobot(T)) + M << "\"I accept this sacrifice.\"" else - if(ishuman(T) || isrobot(T)) - M << "\"I accept this sacrifice.\"" - else - M << "\"I accept this meager sacrifice.\"" + M << "\"I accept this meager sacrifice.\"" if(T.mind) var/obj/item/device/soulstone/stone = new /obj/item/device/soulstone(get_turf(src)) stone.invisibility = INVISIBILITY_MAXIMUM //so it's not picked up during transfer_soul() @@ -421,60 +432,67 @@ var/list/teleport_runes = list() //Ritual of Dimensional Rending: Calls forth the avatar of Nar-Sie upon the station. /obj/effect/rune/narsie cultist_name = "Summon Nar-Sie" - cultist_desc = "Tears apart dimensional barriers, calling forth the avatar of the Geometer." - invocation = null + cultist_desc = "tears apart dimensional barriers, calling forth the Geometer. Requires 9 invokers." + invocation = "TOK-LYR RQA-NAP G'OLT-ULOFT!!" req_cultists = 9 icon = 'icons/effects/96x96.dmi' + color = rgb(125,23,23) icon_state = "rune_large" pixel_x = -32 //So the big ol' 96x96 sprite shows up right pixel_y = -32 + mouse_opacity = 1 //we're huge and easy to click + scribe_delay = 450 //how long the rune takes to create + scribe_damage = 40.1 //how much damage you take doing it var/used -/obj/effect/rune/narsie/invoke(mob/living/user) +/obj/effect/rune/narsie/talismanhide() //can't hide this, and you wouldn't want to + return + +/obj/effect/rune/narsie/invoke(var/list/invokers) if(used) return + var/mob/living/user = invokers[1] if(ticker.mode.name == "cult") var/datum/game_mode/cult/cult_mode = ticker.mode if(!("eldergod" in cult_mode.cult_objectives)) - message_admins("[usr.real_name]([user.ckey]) tried to summon Nar-Sie when the objective was wrong") - for(var/mob/living/M in range(1,src)) - if(iscultist(M)) - M << "\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\"" - if(M.reagents) - M.reagents.add_reagent("hell_water", 10) - M.Weaken(7) - M.Stun(7) + message_admins("[user.real_name]([user.ckey]) tried to summon Nar-Sie when the objective was wrong") + for(var/M in invokers) + var/mob/living/L = M + L << "\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\"" + if(L.reagents) + L.reagents.add_reagent("hell_water", 10) + L.Weaken(7) + L.Stun(7) fail_invoke() log_game("Summon Nar-Sie rune failed - improper objective") return else if(cult_mode.sacrifice_target && !(cult_mode.sacrifice_target in sacrificed)) - for(var/mob/living/M in orange(1,src)) - if(iscultist(M)) - M << "The sacrifice is not complete. The portal lacks the power to open!" + for(var/M in invokers) + M << "The sacrifice is not complete. The portal lacks the power to open!" fail_invoke() log_game("Summon Nar-Sie rune failed - sacrifice not complete") return if(!cult_mode.eldergod) - for(var/mob/living/M in orange(1,src)) - if(iscultist(M)) - M << "The avatar of Nar-Sie is already on this plane!" - log_game("Summon Nar-Sie rune failed - already summoned") - return + for(var/M in invokers) + M << "Nar-Sie is already on this plane!" + log_game("Summon Nar-Sie rune failed - already summoned") + return //BEGIN THE SUMMONING used = 1 - for(var/mob/living/M in range(1,src)) - if(iscultist(M)) - M.say("TOK-LYR RQA-NAP G'OLT-ULOFT!!") + color = rgb(255, 0, 0) + ..() world << 'sound/effects/dimensional_rend.ogg' world << "The veil... is... TORN!!!--" + var/turf/T = get_turf(src) sleep(40) - new /obj/singularity/narsie/large(get_turf(user)) //Causes Nar-Sie to spawn even if the rune has been removed + new /obj/singularity/narsie/large(T) //Causes Nar-Sie to spawn even if the rune has been removed cult_mode.eldergod = 0 else + for(var/M in invokers) + M << "Nar-Sie does not respond!" fail_invoke() log_game("Summon Nar-Sie rune failed - gametype is not cult") - return /obj/effect/rune/narsie/attackby(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal. if((istype(I, /obj/item/weapon/tome) && iscultist(user))) @@ -494,46 +512,39 @@ var/list/teleport_runes = list() //Rite of Resurrection: Requires two corpses. Revives one and gibs the other. /obj/effect/rune/raise_dead cultist_name = "Raise Dead" - cultist_desc = "Requires two corpses. One on the rune and one adjacent to the rune. The one placed upon the rune is brought to life, the other is turned to ash." + cultist_desc = "requires two corpses, one on the rune and one adjacent to the rune. The one on the rune is brought to life, the other is turned to ash." invocation = null //Depends on the name of the user - see below icon_state = "1" - color = rgb(255, 0, 0) + color = rgb(200, 0, 0) -/obj/effect/rune/raise_dead/invoke(mob/living/user) +/obj/effect/rune/raise_dead/invoke(var/list/invokers) var/turf/T = get_turf(src) var/mob/living/mob_to_sacrifice var/mob/living/mob_to_revive var/list/potential_sacrifice_mobs = list() var/list/potential_revive_mobs = list() + var/mob/living/user = invokers[1] if(rune_in_use) return for(var/mob/living/M in orange(1,src)) - if(!(M in T.contents) && M.stat == DEAD) + if(M.stat == DEAD) potential_sacrifice_mobs.Add(M) if(!potential_sacrifice_mobs.len) user << "There are no eligible sacrifices nearby!" log_game("Raise Dead rune failed - no catalyst corpse") return mob_to_sacrifice = input(user, "Choose a corpse to sacrifice.", "Corpse to Sacrifice") as null|anything in potential_sacrifice_mobs - if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated() || !mob_to_revive || !mob_to_sacrifice) + if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated() || !mob_to_revive || !mob_to_sacrifice || rune_in_use) return for(var/mob/living/M in T.contents) if(M.stat == DEAD) potential_revive_mobs.Add(M) - if(rune_in_use) - return if(!potential_revive_mobs.len) user << "There is no eligible revival target on the rune!" log_game("Raise Dead rune failed - no corpse to revived") return mob_to_revive = input(user, "Choose a corpse to revive.", "Corpse to Revive") as null|anything in potential_revive_mobs - if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated()) - return - revive(mob_to_revive, mob_to_sacrifice, user, T) - - //Begin revival -/obj/effect/rune/raise_dead/proc/revive(mob/living/mob_to_revive, mob/living/mob_to_sacrifice, mob/living/user, turf/T) - if(rune_in_use) + if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated() || rune_in_use) return if(!in_range(mob_to_sacrifice,src)) user << "The sacrificial target has been moved!" @@ -555,6 +566,7 @@ var/list/teleport_runes = list() user.say("To life, to life, I bring them!") else user.say("Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!") + ..() mob_to_sacrifice.visible_message("[mob_to_sacrifice]'s body rises into the air, connected to [mob_to_revive] by a glowing tendril!") mob_to_revive.Beam(mob_to_sacrifice,icon_state="sendbeam",icon='icons/effects/effects.dmi',time=20) sleep(20) @@ -574,7 +586,8 @@ var/list/teleport_runes = list() /obj/effect/rune/raise_dead/fail_invoke() - for(var/mob/living/M in orange(1,src)) + ..() + for(var/mob/living/M in range(1,src)) if(M.stat == DEAD) M.visible_message("[M] twitches.") @@ -582,46 +595,38 @@ var/list/teleport_runes = list() //Rite of Disruption: Emits an EMP blast. /obj/effect/rune/emp cultist_name = "Electromagnetic Disruption" - cultist_desc = "Emits a large electromagnetic pulse, hindering electronics and disabling silicons." + cultist_desc = "emits a large electromagnetic pulse, increasing in size for each cultist invoking it, hindering electronics and disabling silicons." invocation = "Ta'gh fara'qha fel d'amar det!" icon_state = "5" + allow_excess_invokers = 1 color = rgb(77, 148, 255) -/obj/effect/rune/emp/invoke(mob/living/user) +/obj/effect/rune/emp/invoke(var/list/invokers) var/turf/E = get_turf(src) - var/emp_strength = 0 - for(var/mob/living/L in range(1, src)) - if(iscultist(L)) - var/mob/living/carbon/human/H = L - if(!istype(H)) - if(istype(L, /mob/living/simple_animal/hostile/construct)) - if(invocation) - L.say(invocation) - emp_strength++ - continue - if(L.stat || (H.disabilities & MUTE) || H.silent) - continue - emp_strength++ + ..() visible_message("[src] glows blue for a moment before vanishing.") - for(var/mob/living/carbon/C in range(1,src)) - switch(emp_strength) - if(1 to 2) - C << "You feel a minute vibration pass through you..." - playsound(E, 'sound/items/Welder2.ogg', 25, 1) - if(3 to 6) - C << "Your hair stands on end as a shockwave eminates from the rune!" - playsound(E, 'sound/magic/Disable_Tech.ogg', 50, 1) - if(7 to INFINITY) - C << "You chant in unison and a colossal burst of energy knocks you backward!" - playsound(E, 'sound/magic/Disable_Tech.ogg', 100, 1) - C.Weaken(2) + switch(invokers.len) + if(1 to 2) + playsound(E, 'sound/items/Welder2.ogg', 25, 1) + for(var/M in invokers) + M << "You feel a minute vibration pass through you..." + if(3 to 6) + playsound(E, 'sound/magic/Disable_Tech.ogg', 50, 1) + for(var/M in invokers) + M << "Your hair stands on end as a shockwave eminates from the rune!" + if(7 to INFINITY) + playsound(E, 'sound/magic/Disable_Tech.ogg', 100, 1) + for(var/M in invokers) + var/mob/living/L = M + L << "You chant in unison and a colossal burst of energy knocks you backward!" + L.Weaken(2) qdel(src) //delete before pulsing because it's a delay reee - empulse(E, 9*emp_strength, 12*emp_strength) // Scales now, from a single room to most of the station depending on # of chanters + empulse(E, 9*invokers.len, 12*invokers.len) // Scales now, from a single room to most of the station depending on # of chanters //Rite of Astral Communion: Separates one's spirit from their body. They will take damage while it is active. /obj/effect/rune/astral cultist_name = "Astral Communion" - cultist_desc = "Severs the link between one's spirit and body. This effect is taxing and one's physical body will take damage while this is active." + cultist_desc = "severs the link between one's spirit and body. This effect is taxing and one's physical body will take damage while this is active." invocation = "Fwe'sh mah erl nyag r'ya!" icon_state = "6" color = rgb(126, 23, 23) @@ -633,18 +638,22 @@ var/list/teleport_runes = list() if(affecting) user << "A translucent field encases [user] above the rune!" -/obj/effect/rune/astral/invoke(mob/living/user) +/obj/effect/rune/astral/can_invoke(mob/living/user) if(rune_in_use) user << "[src] cannot support more than one body!" - fail_invoke() log_game("Astral Communion rune failed - more than one user") - return + return list() var/turf/T = get_turf(src) if(!user in T.contents) user << "You must be standing on top of [src]!" - fail_invoke() log_game("Astral Communion rune failed - user not standing on rune") - return + return list() + return ..() + +/obj/effect/rune/astral/invoke(var/list/invokers) + var/mob/living/user = invokers[1] + ..() + var/turf/T = get_turf(src) rune_in_use = 1 affecting = user user.color = "#7e1717" @@ -690,7 +699,7 @@ var/list/teleport_runes = list() //Rite of the Corporeal Shield: When invoked, becomes solid and cannot be passed. Invoke again to undo. /obj/effect/rune/wall cultist_name = "Form Barrier" - cultist_desc = "When invoked, makes an invisible wall to block passage. Can be invoked again to reverse this." + cultist_desc = "when invoked, makes an invisible wall to block passage. Can be invoked again to reverse this." invocation = "Khari'd! Eske'te tannin!" icon_state = "1" color = rgb(255, 0, 0) @@ -700,7 +709,9 @@ var/list/teleport_runes = list() if(density) user << "There is a barely perceptible shimmering of the air above [src]." -/obj/effect/rune/wall/invoke(mob/living/user) +/obj/effect/rune/wall/invoke(var/list/invokers) + var/mob/living/user = invokers[1] + ..() density = !density user.visible_message("[user] places their hands on [src], and [density ? "the air above it begins to shimmer" : "the shimmer above it fades"].", \ "You channel your life energy into [src], [density ? "preventing" : "allowing"] passage above it.") @@ -712,17 +723,20 @@ var/list/teleport_runes = list() //Rite of Joined Souls: Summons a single cultist. /obj/effect/rune/summon cultist_name = "Summon Cultist" - cultist_desc = "Summons a single cultist to the rune." + cultist_desc = "summons a single cultist to the rune. Requires 2 invokers." invocation = "N'ath reth sh'yro eth d'rekkathnor!" req_cultists = 2 + allow_excess_invokers = 1 icon_state = "5" color = rgb(0, 255, 0) -/obj/effect/rune/summon/invoke(mob/living/user) +/obj/effect/rune/summon/invoke(var/list/invokers) + var/mob/living/user = invokers[1] var/list/cultists = list() for(var/datum/mind/M in ticker.mode.cult) - cultists.Add(M.current) - var/mob/living/cultist_to_summon = input("Who do you wish to call to [src]?", "Followers of the Geometer") as null|anything in (cultists - user) + if(!(M.current in invokers)) + cultists |= M.current + var/mob/living/cultist_to_summon = input(user, "Who do you wish to call to [src]?", "Followers of the Geometer") as null|anything in cultists if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated()) return if(!cultist_to_summon) @@ -740,10 +754,9 @@ var/list/teleport_runes = list() fail_invoke() log_game("Summon Cultist rune failed - target in away mission") return - if(cultist_to_summon.buckled) - cultist_to_summon.buckled.unbuckle_mob(cultist_to_summon,force=1) cultist_to_summon.visible_message("[cultist_to_summon] suddenly disappears in a flash of red light!", \ "Overwhelming vertigo consumes you as you are hurled through the air!") + ..() visible_message("A foggy shape materializes atop [src] and solidifes into [cultist_to_summon]!") user.apply_damage(10, BRUTE, "head") cultist_to_summon.forceMove(get_turf(src)) @@ -752,13 +765,14 @@ var/list/teleport_runes = list() //Rite of Boiling Blood: Deals extremely high amounts of damage to non-cultists nearby /obj/effect/rune/blood_boil cultist_name = "Boil Blood" - cultist_desc = "Boils the blood of non-believers who can see the rune, dealing extreme amounts of damage. Requires 3 chanters." + cultist_desc = "boils the blood of non-believers who can see the rune, dealing extreme amounts of damage. Requires 3 invokers." invocation = "Dedo ol'btoh!" icon_state = "4" - color = rgb(255, 0, 0) + color = rgb(200, 0, 0) req_cultists = 3 -/obj/effect/rune/blood_boil/invoke(mob/living/user) +/obj/effect/rune/blood_boil/invoke(var/list/invokers) + ..() visible_message("[src] briefly bubbles before exploding!") for(var/mob/living/carbon/C in viewers(src)) if(!iscultist(C)) @@ -769,10 +783,10 @@ var/list/teleport_runes = list() C << "Your blood boils in your veins!" C.take_overall_damage(45,45) C.Stun(7) - for(var/mob/living/carbon/M in range(1,src)) - if(iscultist(M)) - M.apply_damage(15, BRUTE, pick("l_arm", "r_arm")) - M << "[src] saps your strength!" + for(var/M in invokers) + var/mob/living/L = M + L.apply_damage(15, BRUTE, pick("l_arm", "r_arm")) + L << "[src] saps your strength!" explosion(get_turf(src), -1, 0, 1, 5) qdel(src) @@ -780,10 +794,10 @@ var/list/teleport_runes = list() //Rite of Spectral Manifestation: Summons a ghost on top of the rune as a cultist human with no items. User must stand on the rune at all times, and takes damage for each summoned ghost. /obj/effect/rune/manifest cultist_name = "Manifest Spirit" - cultist_desc = "Manifests a spirit as a servant of the Geometer. The invoker must not move from atop the rune, and will take damage for each summoned spirit." + cultist_desc = "manifests a spirit as a servant of the Geometer. The invoker must not move from atop the rune, and will take damage for each summoned spirit." invocation = "Gal'h'rfikk harfrandid mud'gib!" //how the fuck do you pronounce this icon_state = "6" - color = rgb(255, 0, 0) + color = rgb(200, 0, 0) /obj/effect/rune/manifest/New(loc) ..() @@ -794,7 +808,7 @@ var/list/teleport_runes = list() user << "You must be standing on [src]!" fail_invoke() log_game("Manifest rune failed - user not standing on rune") - return 0 + return list() var/list/ghosts_on_rune = list() for(var/mob/dead/observer/O in get_turf(src)) if(O.client && !jobban_isbanned(O, ROLE_CULTIST)) @@ -803,10 +817,11 @@ var/list/teleport_runes = list() user << "There are no spirits near [src]!" fail_invoke() log_game("Manifest rune failed - no nearby ghosts") - return 0 + return list() return ..() -/obj/effect/rune/manifest/invoke(mob/living/user) +/obj/effect/rune/manifest/invoke(var/list/invokers) + var/mob/living/user = invokers[1] var/list/ghosts_on_rune = list() for(var/mob/dead/observer/O in get_turf(src)) if(O.client && !jobban_isbanned(O, ROLE_CULTIST)) @@ -815,6 +830,7 @@ var/list/teleport_runes = list() var/mob/living/carbon/human/new_human = new(get_turf(src)) new_human.real_name = ghost_to_spawn.real_name new_human.alpha = 150 //Makes them translucent + ..() visible_message("A cloud of red mist forms above [src], and from within steps... a man.") user << "Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely..." var/obj/machinery/shield/N = new(get_turf(src)) @@ -824,14 +840,14 @@ var/list/teleport_runes = list() N.health = 20 N.mouse_opacity = 0 new_human.key = ghost_to_spawn.key - ticker.mode.add_cultist(new_human.mind) + ticker.mode.add_cultist(new_human.mind, 0) new_human << "You are a servant of the Geometer. You have been made semi-corporeal by the cult of Nar-Sie, and you are to serve them at all costs." while(user in get_turf(src)) if(user.stat) break - user.apply_damage(1, BRUTE) - sleep(30) + user.apply_damage(0.1, BRUTE) + sleep(3) qdel(N) if(new_human) @@ -840,41 +856,3 @@ var/list/teleport_runes = list() for(var/obj/I in new_human) new_human.unEquip(I) new_human.dust() -/* -//Rite of Dimensional Corruption: Stops time around the rune for all non-cultists. -/obj/effect/rune/timestop - cultist_name = "Time Stop" - cultist_desc = "Stops time around the rune for all non-cultists. Requires 3 chanters." - invocation = "T'ak ot'marzah oahr'du!" - icon_state = "2" - color = rgb(0, 0, 255) - req_cultists = 3 - -/obj/effect/rune/timestop/invoke(mob/living/user) - visible_message("[src] flares up for a moment, and then disappears into itself!") - new /obj/effect/timestop/cult(get_turf(src)) - for(var/mob/living/carbon/M in range(1,src)) - if(iscultist(M)) - M.apply_damage(20, BRUTE, "chest") - M << "[src] temporarily stops your heart from beating!" - qdel(src) - -/obj/effect/timestop/cult - name = "Dimensional Corruption" - desc = "Something not from this world has corrupted the spacetime continuum in this exact spot." - icon = 'icons/effects/96x96.dmi' - icon_state = "rune_large" - pixel_x = -32 - pixel_y = -32 - duration = 50 - alpha = 0 - color = rgb(255, 0, 0) - -/obj/effect/timestop/cult/timestop() - animate(src, alpha = 255, time = 5, loop = -1) - SpinAnimation(speed = 5) - for(var/mob/living/M in player_list) - if(iscultist(M) || M.null_rod_check()) - immune |= M - ..() -*/ diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index d2a3d80b61b..0125bec86da 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -55,13 +55,13 @@ var/dat = "There are [uses] bloody runes on the parchment.
" dat += "Please choose the chant to be imbued into the fabric of reality.
" dat += "
" - dat += "N'ath reth sh'yro eth d'raggathnor! - Allows you to summon an arcane tome.
" + dat += "N'ath reth sh'yro eth d'raggathnor! - Summons an arcane tome, used to scribe runes and communicate with other cultists.
" dat += "Sas'so c'arta forbici! - Allows you to move to a selected teleportation rune.
" dat += "Ta'gh fara'qha fel d'amar det! - Allows you to destroy technology in a short range.
" dat += "Fuu ma'jin! - Allows you to stun a person by attacking them with the talisman.
" - dat += "Kal'om neth! - Summons a soul stone, used to capure the spirits of dead or dying humans.
" - dat += "Daa'ig osk! - Summons a construct shell for use with captured souls. It is too large to carry on your person.
" dat += "Kla'atu barada nikt'o! - Two use talisman, first use makes all nearby runes invisible, second use reveals nearby hidden runes.
" + dat += "Kal'om neth! - Summons a soul stone, used to capure the spirits of dead or dying humans.
" + dat += "Daa'ig osk! - Summons a construct shell for use with soulstone-captured souls. It is too large to carry on your person.
" var/datum/browser/popup = new(user, "talisman", "", 400, 400) popup.set_content(dat) popup.open() @@ -176,16 +176,12 @@ invocation = "Nikt'o barada kla'atu!" revealing = TRUE for(var/obj/effect/rune/R in range(3,user)) - R.visible_message("[R] fades away.") - R.invisibility = INVISIBILITY_OBSERVER - R.alpha = 100 //To help ghosts distinguish hidden runes + R.talismanhide() else user.visible_message("A flash of light shines from [user]'s hand!", \ "You speak the words of the talisman, revealing nearby runes.") for(var/obj/effect/rune/R in range(3,user)) - R.invisibility = 0 - R.visible_message("[R] suddenly appears!") - R.alpha = initial(R.alpha) + R.talismanreveal() //Rite of False Truths: Same as rune /obj/item/weapon/paper/talisman/make_runes_fake @@ -201,6 +197,7 @@ for(var/obj/effect/rune/R in orange(6,user)) R.desc = "A rune drawn in crayon." + //Rite of Disruption: Weaker than rune /obj/item/weapon/paper/talisman/emp cultist_name = "Talisman of Electromagnetic Pulse" @@ -215,6 +212,7 @@ "You speak the words of the talisman, emitting an EMP blast.") empulse(src, 4, 8) + //Rite of Disorientation: Stuns and inhibit speech on a single target for quite some time /obj/item/weapon/paper/talisman/stun cultist_name = "Talisman of Stunning" @@ -259,6 +257,7 @@ return ..() + //Rite of Arming: Equips cultist armor on the user, where available /obj/item/weapon/paper/talisman/armor cultist_name = "Talisman of Arming" @@ -286,6 +285,7 @@ return ..() + //Talisman of Horrors: Breaks the mind of the victim with nightmarish hallucinations /obj/item/weapon/paper/talisman/horror cultist_name = "Talisman of Horrors" @@ -295,12 +295,13 @@ /obj/item/weapon/paper/talisman/horror/attack(mob/living/target, mob/living/user) if(iscultist(user)) - user.visible_message("You disturb [target] with visons of the end!") + user << "You disturb [target] with visons of the end!" if(iscarbon(target)) var/mob/living/carbon/H = target H.reagents.add_reagent("mindbreaker", 25) qdel(src) + //Talisman of Fabrication: Creates a construct shell out of 25 metal sheets. /obj/item/weapon/paper/talisman/construction cultist_name = "Talisman of Construction" @@ -319,7 +320,7 @@ if(iscultist(user)) user << "This talisman will only work on a stack of metal sheets!" log_game("Construct talisman failed - not a valid target") - + /obj/item/weapon/paper/talisman/construction/afterattack(obj/item/stack/sheet/metal/target, mob/user, proximity_flag, click_parameters) ..() if(proximity_flag && istype(target) && iscultist(user)) @@ -330,23 +331,7 @@ qdel(src) else user << "The talisman requires at least 25 sheets of metal!" - -/obj/item/weapon/restraints/handcuffs/energy/cult //For the talisman of shackling - name = "cult shackles" - desc = "shackles that bind the wrists with sinister magic." - trashtype = /obj/item/weapon/restraints/handcuffs/energy/used - origin_tech = "materials=2;magnets=5" -/obj/item/weapon/restraints/handcuffs/energy/cult/used - desc = "magical remnants" - -/obj/item/weapon/restraints/handcuffs/energy/cult/used/dropped(mob/user) - user.visible_message("Your [src] shatter in a discharge of dark magic!", \ - "[user]'s [src] shatters in a discharge of dark magic!") - var/datum/effect_system/spark_spread/S = new - S.set_up(4,0,user.loc) - S.start() - qdel(src) //Talisman of Shackling: Applies special cuffs directly from the talisman /obj/item/weapon/paper/talisman/shackle @@ -365,26 +350,21 @@ user << "There are indecipherable images scrawled on the paper in what looks to be... blood?" return 0 -/obj/item/weapon/paper/talisman/shackle/attack(mob/living/target, mob/living/user) - if(iscultist(user)) - if(isrobot(target)) - ..() - return - if(!isliving(target)) +/obj/item/weapon/paper/talisman/shackle/attack(mob/living/carbon/target, mob/living/user) + if(iscultist(user) && istype(target)) + if(target.stat == DEAD) user.visible_message("This talisman's magic does not affect the dead!") return - var/mob/living/L = target - if(ishuman(L)) - CuffAttack(L,user) - -/obj/item/weapon/paper/talisman/shackle/proc/CuffAttack(mob/living/L,mob/living/user) - if(!iscarbon(L)) + CuffAttack(target, user) return - var/mob/living/carbon/C = L + ..() + +/obj/item/weapon/paper/talisman/shackle/proc/CuffAttack(mob/living/carbon/C, mob/living/user) if(!C.handcuffed) + invoke(user, 1) playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2) C.visible_message("[user] begins restraining [C] with dark magic!", \ - "[user] begins shaping an dark magic around your wrists!") + "[user] begins shaping a dark magic around your wrists!") if(do_mob(user, C, 30)) if(!C.handcuffed) C.handcuffed = new /obj/item/weapon/restraints/handcuffs/energy/cult/used(C) @@ -392,9 +372,24 @@ user << "You shackle [C]." add_logs(user, C, "handcuffed") uses-- + else + user << "[C] is already bound." else user << "You fail to shackle [C]." + else + user << "[C] is already bound." if(uses <= 0) user.drop_item() qdel(src) return + +/obj/item/weapon/restraints/handcuffs/energy/cult //For the talisman of shackling + name = "cult shackles" + desc = "Shackles that bind the wrists with sinister magic." + trashtype = /obj/item/weapon/restraints/handcuffs/energy/used + origin_tech = "materials=2;magnets=5" + +/obj/item/weapon/restraints/handcuffs/energy/cult/used/dropped(mob/user) + user.visible_message("[user]'s [src] shatter in a discharge of dark magic!", \ + "Your [src] shatters in a discharge of dark magic!") + qdel(src) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index d7c63098f28..b4cd86efb66 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -530,7 +530,7 @@ M.key = theghost.key /datum/game_mode/proc/remove_antag_for_borging(datum/mind/newborgie) - ticker.mode.remove_cultist(newborgie, 0) + ticker.mode.remove_cultist(newborgie, 0, 0) ticker.mode.remove_revolutionary(newborgie, 0) ticker.mode.remove_gangster(newborgie, 0, remove_bosses=1) ticker.mode.remove_hog_follower(newborgie, 0) diff --git a/code/game/gamemodes/gang/dominator.dm b/code/game/gamemodes/gang/dominator.dm index e2c6276dbb6..bc1236d7d0e 100644 --- a/code/game/gamemodes/gang/dominator.dm +++ b/code/game/gamemodes/gang/dominator.dm @@ -101,7 +101,7 @@ SSshuttle.emergency.timer = world.time priority_announce("Hostile enviroment resolved. You have 3 minutes to board the Emergency Shuttle.", null, 'sound/AI/shuttledock.ogg', "Priority") else - priority_announce("All hostile activity within station systems have ceased.","Network Alert") + priority_announce("All hostile activity within station systems has ceased.","Network Alert") if(get_security_level() == "delta") set_security_level("red") @@ -119,6 +119,7 @@ if(!(stat & BROKEN)) set_broken() poi_list.Remove(src) + gang = null qdel(spark_system) return ..() diff --git a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm index eec67985c08..de6176c3c7c 100644 --- a/code/game/gamemodes/gang/recaller.dm +++ b/code/game/gamemodes/gang/recaller.dm @@ -228,7 +228,7 @@ pointcost = 10 if("C4") if(gang.points >= 10) - item_type = /obj/item/weapon/c4 + item_type = /obj/item/weapon/grenade/plastic/c4 pointcost = 10 if("pen") if((gang.points >= 50) || free_pen) diff --git a/code/game/gamemodes/handofgod/_handofgod.dm b/code/game/gamemodes/handofgod/_handofgod.dm index d5375834943..afba1ce73cf 100644 --- a/code/game/gamemodes/handofgod/_handofgod.dm +++ b/code/game/gamemodes/handofgod/_handofgod.dm @@ -358,7 +358,7 @@ var/global/list/global_handofgod_structuretypes = list() text += "
Red follower count: [red_deity_followers.len]" text += "
Red followers: " for(var/datum/mind/player in red_deity_followers) - text += "[player.name] ([player.key])" + text += "[player.name] ([player.key]), " var/objectives = "" if(red_god.objectives.len) diff --git a/code/game/gamemodes/handofgod/actions.dm b/code/game/gamemodes/handofgod/actions.dm index 762a8b4d683..9f6b01f8dff 100644 --- a/code/game/gamemodes/handofgod/actions.dm +++ b/code/game/gamemodes/handofgod/actions.dm @@ -1,6 +1,4 @@ - - - +/* Prophet's innate godspeak */ /datum/action/innate/godspeak name = "Godspeak" button_icon_state = "godspeak" @@ -17,8 +15,12 @@ var/msg = input(owner,"Speak to your god","Godspeak","") as null|text if(!msg) return - god << "[owner]: [msg]" - owner << "You say: [msg]" + var/rendered = "Prophet [owner]: [msg]" + god << rendered + owner << rendered + for(var/mob/M in mob_list) + if(isobserver(M)) + M << "(F) [rendered]" /datum/action/innate/godspeak/Destroy() god = null diff --git a/code/game/gamemodes/handofgod/god.dm b/code/game/gamemodes/handofgod/god.dm index 7dcd5b5f933..39deb470840 100644 --- a/code/game/gamemodes/handofgod/god.dm +++ b/code/game/gamemodes/handofgod/god.dm @@ -31,9 +31,9 @@ update_icons() build_hog_construction_lists() - //Force nexuses after 2 minutes in hand of god mode + //Force nexuses after 15 minutes in hand of god mode if(ticker && ticker.mode && ticker.mode.name == "hand of god") - addtimer(src, "forceplacenexus", 1200, FALSE) + addtimer(src, "forceplacenexus", 9000, FALSE) //Rebuilds the list based on the gamemode's lists @@ -197,12 +197,13 @@ return msg = say_quote(msg, get_spans()) - var/rendered = "Divine Telepathy, [name] [msg]" + var/rendered = "Divine Telepathy, [name] [msg]
" for(var/mob/M in mob_list) - if(is_handofgod_myfollowers(M) || isobserver(M)) - M.show_message(rendered, 2) - src << rendered + if(is_handofgod_god(M) || is_handofgod_myfollowers(M)) + M << rendered + if(isobserver(M)) + M << "(F) [rendered]" /mob/camera/god/emote(act,m_type = 1 ,msg = null) diff --git a/code/game/gamemodes/handofgod/items.dm b/code/game/gamemodes/handofgod/items.dm index 9d63f86c773..f512c5c11cb 100644 --- a/code/game/gamemodes/handofgod/items.dm +++ b/code/game/gamemodes/handofgod/items.dm @@ -1,5 +1,3 @@ - - /obj/item/weapon/banner name = "banner" icon = 'icons/obj/items.dmi' diff --git a/code/game/gamemodes/handofgod/powers.dm b/code/game/gamemodes/handofgod/powers.dm index a783595352d..30b3365cfcd 100644 --- a/code/game/gamemodes/handofgod/powers.dm +++ b/code/game/gamemodes/handofgod/powers.dm @@ -1,4 +1,3 @@ - /mob/camera/god/proc/ability_cost(cost = 0,structures = 0, requires_conduit = 0, can_place_near_enemy_nexus = 0) if(faith < cost) src << "You lack the faith!" @@ -127,7 +126,7 @@ var/mob/living/carbon/human/H = choice.current var/popehat = null var/popestick = null - + var/success = "" switch(side) if("red") popehat = /obj/item/clothing/head/helmet/plate/crusader/prophet/red @@ -139,22 +138,28 @@ if(popehat) var/obj/item/clothing/head/helmet/plate/crusader/prophet/P = new popehat() - H.unEquip(H.head) - H << "A powerful hat has been bestowed upon your head, you will need to wear this to utilize your staff fully.." - H.equip_to_slot_or_del(P,slot_head) + if(H.equip_to_slot_if_possible(P,slot_in_backpack,0,1,1)) + success = "It is in your backpack." + else + H.unEquip(H.head) + H.equip_to_slot_or_del(P,slot_head) + success = "It is on your head." + + if(success) + H << "A powerful hat has been bestowed upon you, you will need to wear it to utilize your staff fully." + H << "[success]" if(popestick) var/obj/item/weapon/godstaff/G = new popestick() G.god = src - var/success = "" - if(!H.put_in_hands(G)) - if(!H.equip_to_slot_if_possible(G,slot_in_backpack,0,1,1)) + if(!H.equip_to_slot_if_possible(G,slot_in_backpack,0,1,1)) + if(!H.put_in_hands(G)) G.loc = get_turf(H) success = "It is on the floor..." else - success = "It is in your backpack..." + success = "It is in your hands..." else - success = "It is in your hands..." + success = "It is in your backpack..." if(success) H << "A powerful staff has been bestowed upon you, you can use this to convert the false god's structures!" diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 4a47acdeaa3..03d896d0e1d 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -52,6 +52,7 @@ melee_damage_upper = 15 melee_damage_type = STAMINA 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) languages = SWARMER environment_smash = 0 attacktext = "shocks" @@ -84,6 +85,17 @@ /mob/living/simple_animal/hostile/swarmer/New() ..() verbs -= /mob/living/verb/pulled + var/datum/atom_hud/data/diagnostic/diag_hud = huds[DATA_HUD_DIAGNOSTIC] + diag_hud.add_to_hud(src) + + +/mob/living/simple_animal/hostile/swarmer/med_hud_set_health() + var/image/holder = hud_list[DIAG_HUD] + holder.icon_state = "huddiag[RoundDiagBar(health/maxHealth)]" + +/mob/living/simple_animal/hostile/swarmer/med_hud_set_status() + var/image/holder = hud_list[DIAG_STAT_HUD] + holder.icon_state = "hudstat" /mob/living/simple_animal/hostile/swarmer/Stat() ..() diff --git a/code/game/gamemodes/miniantags/monkey/monkey.dm b/code/game/gamemodes/miniantags/monkey/monkey.dm index 12f24f40b6e..717bf0a8346 100644 --- a/code/game/gamemodes/miniantags/monkey/monkey.dm +++ b/code/game/gamemodes/miniantags/monkey/monkey.dm @@ -15,7 +15,7 @@ var/carriers_to_make = 1 var/list/carriers = list() - var/monkeys_to_win = 0 + var/monkeys_to_win = 1 var/escaped_monkeys = 0 var/players_per_carrier = 30 diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 6d9e107a652..5725354a7ea 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -41,7 +41,7 @@ anchored = 1 mob_size = MOB_SIZE_TINY pass_flags = PASSTABLE | PASSGRILLE | PASSMOB - speed = 0 + speed = 1 unique_name = 1 var/essence = 75 //The resource, and health, of revenants. @@ -268,9 +268,13 @@ if(!src) return var/turf/T = get_turf(src) - if(istype(T, /turf/closed/wall)) + if(istype(T, /turf/closed)) src << "You cannot use abilities from inside of a wall." return 0 + for(var/obj/O in T) + if(O.density && !O.CanPass(src, T, 5)) + src << "You cannot use abilities inside of a dense object." + return 0 if(src.inhibited) src << "Your powers have been suppressed by nulling energy!" return 0 diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm index ceba7d8e227..d03f94b1164 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm @@ -118,6 +118,16 @@ log_say("RevenantTransmit: [key_name(user)]->[key_name(M)] : [msg]") user << "You transmit to [M]: [msg]" M << "An alien voice resonates from all around... [msg]" + for(var/ded in dead_mob_list) + if(!isobserver(ded)) + continue + ded << "(F) \ + [user] \ + Revenant Transmit --> \ + (F) \ + [M] \ + [msg]" + /obj/effect/proc_holder/spell/aoe_turf/revenant diff --git a/code/game/gamemodes/miniantags/revenant/revenant_blight.dm b/code/game/gamemodes/miniantags/revenant/revenant_blight.dm index 11ca11e7d3b..75efe72c4d9 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant_blight.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant_blight.dm @@ -25,7 +25,7 @@ ..() /datum/disease/revblight/stage_act() - if(!finalstage && affected_mob.lying && prob(stage*2)) + if(!finalstage && affected_mob.lying && prob(stage*5)) cure() return if(!finalstage && prob(stage*3)) diff --git a/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm b/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm index 287dff359e1..ebd2f67eafd 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm @@ -1,11 +1,11 @@ -#define REVENANT_SPAWN_THRESHOLD 10 +#define REVENANT_SPAWN_THRESHOLD 20 /datum/round_event_control/revenant name = "Spawn Revenant" typepath = /datum/round_event/revenant weight = 7 max_occurrences = 1 - earliest_start = 6000 //Meant to mix things up early-game. + earliest_start = 12000 //Meant to mix things up early-game. min_players = 5 diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index ee02361d451..fbd6fe472a8 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -303,7 +303,7 @@ l_pocket = /obj/item/weapon/pinpointer/nukeop id = /obj/item/weapon/card/id/syndicate belt = /obj/item/weapon/gun/projectile/automatic/pistol - backpack_contents = list(/obj/item/weapon/storage/box/engineer=1) + backpack_contents = list(/obj/item/weapon/storage/box/syndie=1) var/tc = 25 @@ -338,7 +338,7 @@ r_pocket = /obj/item/weapon/tank/internals/emergency_oxygen/engi belt = /obj/item/weapon/storage/belt/military r_hand = /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog - backpack_contents = list(/obj/item/weapon/storage/box/engineer=1,\ + backpack_contents = list(/obj/item/weapon/storage/box/syndie=1,\ /obj/item/weapon/tank/jetpack/oxygen/harness=1,\ /obj/item/weapon/gun/projectile/automatic/pistol=1) diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 72b678155e3..92c19d7600b 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -7,7 +7,6 @@ w_class = 1 slot_flags = SLOT_BELT origin_tech = "bluespace=4;materials=4" - var/imprinted = "empty" var/usability = 0 /obj/item/device/soulstone/anybody @@ -19,6 +18,12 @@ user << "An overwhelming feeling of dread comes over you as you pick up the soulstone. It would be wise to be rid of this quickly." user.Dizzy(120) +/obj/item/device/soulstone/examine(mob/user) + ..() + if(usability || iscultist(user) || iswizard(user) || user.stat == DEAD) + user << "A soulstone, used to capture souls, either from unconscious or sleeping humans or from freed shades." + user << "The captured soul can be placed into a construct shell to produce a construct, or released from the stone as a shade." + //////////////////////////////Capturing//////////////////////////////////////////////////////// /obj/item/device/soulstone/attack(mob/living/carbon/human/M, mob/user) @@ -28,10 +33,8 @@ return if(!istype(M, /mob/living/carbon/human))//If target is not a human. return ..() - if(istype(M, /mob/living/carbon/human/dummy)) - return ..() if(iscultist(M)) - user << "You shouldn't do that." + user << "\"Come now, do not capture your fellow's soul.\"" return add_logs(user, M, "captured [M.name]'s soul", src) @@ -41,53 +44,23 @@ ///////////////////Options for using captured souls/////////////////////////////////////// /obj/item/device/soulstone/attack_self(mob/user) - if (!in_range(src, user)) + if(!in_range(src, user)) return if(!iscultist(user) && !iswizard(user) && !usability) user.Paralyse(5) user << "Your body is wracked with debilitating pain!" return - user.set_machine(src) - var/dat = "Soul Stone
" for(var/mob/living/simple_animal/shade/A in src) - dat += "Captured Soul: [A.name]
" - dat += {"Summon Shade"} - dat += "
" - dat += {"Close"} - user << browse(dat, "window=aicard") - onclose(user, "aicard") - return - - -/obj/item/device/soulstone/Topic(href, href_list) - var/mob/U = usr - if (!in_range(src, U)||U.machine!=src) - U << browse(null, "window=aicard") - U.unset_machine() - return - - add_fingerprint(U) - U.set_machine(src) - - switch(href_list["choice"])//Now we switch based on choice. - if ("Close") - U << browse(null, "window=aicard") - U.unset_machine() - return - - if ("Summon") - for(var/mob/living/simple_animal/shade/A in src) - A.status_flags &= ~GODMODE - A.canmove = 1 - A.loc = U.loc - A.cancel_camera() - src.icon_state = "soulstone" - if(iswizard(U) || usability) - A << "You have been released from your prison, but you are still bound to [U.real_name]'s will. Help them succeed in their goals at all costs." - else if(iscultist(U)) - A << "You have been released from your prison, but you are still bound to the cult's will. Help them succeed in their goals at all costs." - - attack_self(U) + A.status_flags &= ~GODMODE + A.canmove = 1 + A.forceMove(get_turf(user)) + A.cancel_camera() + icon_state = "soulstone" + name = initial(name) + if(iswizard(user) || usability) + A << "You have been released from your prison, but you are still bound to [user.real_name]'s will. Help them succeed in their goals at all costs." + else if(iscultist(user)) + A << "You have been released from your prison, but you are still bound to the cult's will. Help them succeed in their goals at all costs." ///////////////////////////Transferring to constructs///////////////////////////////////////////////////// /obj/structure/constructshell @@ -96,6 +69,15 @@ icon_state = "construct" desc = "A wicked machine used by those skilled in magical arts. It is inactive." +/obj/structure/constructshell/examine(mob/user) + ..() + if(iscultist(user) || iswizard(user) || user.stat == DEAD) + user << "A construct shell, used to house bound souls from a soulstone." + user << "Placing a soulstone with a soul into this shell allows you to produce your choice of the following:" + user << "An Artificer, which can produce more shells and soulstones, as well as fortifications." + user << "A Wraith, which does high damage and can jaunt through walls, though it is quite fragile." + user << "A Juggernaut, which is very hard to kill and can produce temporary walls, but is slow." + /obj/structure/constructshell/attackby(obj/item/O, mob/user, params) if(istype(O, /obj/item/device/soulstone)) var/obj/item/device/soulstone/SS = O @@ -121,56 +103,50 @@ if(T.client != null) for(var/obj/item/W in T) T.unEquip(W) - init_shade(src, T, user) + init_shade(T, user) return 1 else user << "Capture failed!: The soul has already fled its mortal frame. You attempt to bring it back..." - return getCultGhost(src,T,user) + return getCultGhost(T,user) if("VICTIM") var/mob/living/carbon/human/T = target if(ticker.mode.name == "cult" && T.mind == ticker.mode:sacrifice_target) if(iscultist(user)) - user << "The Geometer of blood wants this mortal sacrificed with the rune." + user << "\"This soul is mine. SACRIFICE THEM!\"" else - user << "The soul stone doesn't work for no apparent reason." + user << "The soulstone doesn't work for no apparent reason." return 0 - if(imprinted != "empty") - user << "Capture failed!: The soul stone has already been imprinted with [imprinted]'s mind!" + if(contents.len) + user << "Capture failed!: The soulstone is full! Free an existing soul to make room." else - if (T.stat == 0) - user << "Capture failed!: Kill or maim the victim first!" - else + if(T.stat != CONSCIOUS) if(T.client == null) user << "Capture failed!: The soul has already fled its mortal frame. You attempt to bring it back..." - getCultGhost(src,T,user) + getCultGhost(T,user) else - if(contents.len) - user << "Capture failed!: The soul stone is full! Use or free an existing soul to make room." - else - for(var/obj/item/W in T) - T.unEquip(W) - init_shade(src, T, user, vic = 1) - qdel(T) + for(var/obj/item/W in T) + T.unEquip(W) + init_shade(T, user, vic = 1) + qdel(T) + else + user << "Capture failed!: Kill or maim the victim first!" + if("SHADE") var/mob/living/simple_animal/shade/T = target - if (T.stat == DEAD) - user << "Capture failed!: The shade has already been banished!" + if(contents.len) + user << "Capture failed!: The soulstone is full! Free an existing soul to make room." else - if(contents.len) - user << "Capture failed!: The soul stone is full! Use or free an existing soul to make room." - else - if(T.name != imprinted) - user << "Capture failed!: The soul stone has already been imprinted with [imprinted]'s mind!" - else - T.loc = src //put shade in stone - T.status_flags |= GODMODE - T.canmove = 0 - T.health = T.maxHealth - icon_state = "soulstone2" - T << "Your soul has been recaptured by the soul stone, its arcane energies are reknitting your ethereal form" - if(user != T) - user << "Capture successful!: [T.real_name]'s has been recaptured and stored within the soul stone." + T.loc = src //put shade in stone + T.status_flags |= GODMODE + T.canmove = 0 + T.health = T.maxHealth + icon_state = "soulstone2" + name = "soulstone: Shade of [T.real_name]" + T << "Your soul has been captured by the soulstone. Its arcane energies are reknitting your ethereal form." + if(user != T) + user << "Capture successful!: [T.real_name]'s soul has been captured and stored within the soulstone." + if("CONSTRUCT") var/obj/structure/constructshell/T = target var/mob/living/simple_animal/shade/A = locate() in src @@ -193,6 +169,7 @@ makeNewConstruct(/mob/living/simple_animal/hostile/construct/builder/noncult, A, user, 0, T.loc) qdel(T) + user.drop_item() qdel(src) else user << "Creation failed!: The soul stone is empty! Go kill someone!" @@ -203,22 +180,22 @@ var/mob/living/simple_animal/hostile/construct/newstruct = new ctype((loc_override) ? (loc_override) : (get_turf(target))) newstruct.faction |= "\ref[stoner]" newstruct.key = target.key - if(stoner && iscultist(stoner) || cultoverride) - if(ticker.mode.name == "cult") - ticker.mode:add_cultist(newstruct.mind) - else - ticker.mode.cult+=newstruct.mind - ticker.mode.update_cult_icons_added(newstruct.mind) + if(newstruct.mind) + if(stoner && iscultist(stoner) || cultoverride) + if(ticker.mode.name == "cult") + ticker.mode:add_cultist(newstruct.mind, 0) + else + ticker.mode.cult += newstruct.mind + ticker.mode.update_cult_icons_added(newstruct.mind) newstruct << newstruct.playstyle_string - if(stoner && iswizard(stoner)) - newstruct << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." - else if(stoner && iscultist(stoner)) - newstruct << "You are still bound to serve the cult, follow their orders and help them complete their goals at all costs." - else newstruct << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." + if(iscultist(stoner)) + newstruct << "You are still bound to serve the cult and [stoner], follow their orders and help them complete their goals at all costs." + else + newstruct << "You are still bound to serve your creator, [stoner], follow their orders and help them complete their goals at all costs." newstruct.cancel_camera() -/obj/item/device/soulstone/proc/init_shade(obj/item/device/soulstone/C, mob/living/carbon/human/T, mob/U, vic = 0) +/obj/item/device/soulstone/proc/init_shade(mob/living/carbon/human/T, mob/U, vic = 0) new /obj/effect/decal/remains/human(T.loc) //Spawns a skeleton T.invisibility = INVISIBILITY_ABSTRACT var/atom/movable/overlay/animation = new /atom/movable/overlay( T.loc ) @@ -227,8 +204,7 @@ animation.master = T flick("dust-h", animation) qdel(animation) - var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade( T.loc ) - S.loc = C //put shade in stone + var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade(src) S.status_flags |= GODMODE //So they won't die inside the stone somehow S.canmove = 0//Can't move out of the soul stone S.name = "Shade of [T.real_name]" @@ -237,21 +213,19 @@ if(U) S.faction |= "\ref[U]" //Add the master as a faction, allowing inter-mob cooperation if(U && iscultist(U)) - ticker.mode.add_cultist(S.mind,2) + ticker.mode.add_cultist(S.mind, 0) S.cancel_camera() - C.icon_state = "soulstone2" - C.name = "Soul Stone: [S.real_name]" + name = "soulstone: Shade of [T.real_name]" + icon_state = "soulstone2" if(U && (iswizard(U) || usability)) S << "Your soul has been captured! You are now bound to [U.real_name]'s will. Help them succeed in their goals at all costs." else if(U && iscultist(U)) S << "Your soul has been captured! You are now bound to the cult's will. Help them succeed in their goals at all costs." - C.imprinted = "[S.name]" if(vic && U) U << "Capture successful!: [T.real_name]'s soul has been ripped from their body and stored within the soul stone." - U << "The soulstone has been imprinted with [S.real_name]'s mind, it will no longer react to other souls." -/obj/item/device/soulstone/proc/getCultGhost(obj/item/device/soulstone/C, mob/living/carbon/human/T, mob/U) +/obj/item/device/soulstone/proc/getCultGhost(mob/living/carbon/human/T, mob/U) var/mob/dead/observer/chosen_ghost for(var/mob/dead/observer/ghost in player_list) //We put them back in their body @@ -266,13 +240,13 @@ if(!T) return 0 if(!chosen_ghost) - U << "The ghost has fled beyond your grasp." + U << "There were no spirits willing to become a shade." return 0 - if(C.contents.len) //If they used the soulstone on someone else in the meantime + if(contents.len) //If they used the soulstone on someone else in the meantime return 0 T.ckey = chosen_ghost.ckey for(var/obj/item/W in T) T.unEquip(W) - init_shade(C, T, U) + init_shade(T, U) qdel(T) return 1 diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 7971b6966ea..d2ff930d4eb 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -13,8 +13,8 @@ var/energy_drain = 0 var/obj/mecha/chassis = null var/range = MELEE //bitflags - reliability = 1000 var/salvageable = 1 + var/selectable = 1 // Set to 0 for passive equipment such as mining scanner or armor plates /obj/item/mecha_parts/mecha_equipment/proc/update_chassis_page() if(chassis) @@ -50,7 +50,15 @@ /obj/item/mecha_parts/mecha_equipment/proc/get_equip_info() if(!chassis) return - return "* [chassis.selected==src?"":""][src.name][chassis.selected==src?"":""]" + var/txt = "* " + if(chassis.selected == src) + txt += "[src.name]" + else if(selectable) + txt += "[src.name]" + else + txt += "[src.name]" + + return txt /obj/item/mecha_parts/mecha_equipment/proc/is_ranged()//add a distance restricted equipment. Why not? return range&RANGED @@ -102,7 +110,7 @@ chassis = M src.loc = M M.log_message("[src] initialized.") - if(!M.selected) + if(!M.selected && selectable) M.selected = src src.update_chassis_page() return diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm index ef5be5833af..a43d273ac65 100644 --- a/code/game/mecha/equipment/tools/mining_tools.dm +++ b/code/game/mecha/equipment/tools/mining_tools.dm @@ -112,7 +112,7 @@ desc = "Equipment for engineering and combat exosuits. It will automatically check surrounding rock for useful minerals." icon_state = "mecha_analyzer" origin_tech = "materials=3;engineering=2" - equip_cooldown = 30 + selectable = 0 var/scanning = 0 /obj/item/mecha_parts/mecha_equipment/mining_scanner/New() diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index cc40a6629a0..ead3ad8781d 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -152,10 +152,7 @@ range = 0 var/deflect_coeff = 1.15 var/damage_coeff = 0.8 - -/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/get_equip_info() - if(!chassis) return - return "* [src.name]" + selectable = 0 /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/proc/attack_react(mob/user as mob) if(action_checks(user)) @@ -174,10 +171,7 @@ range = 0 var/deflect_coeff = 1.15 var/damage_coeff = 0.8 - -/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/get_equip_info() - if(!chassis) return - return "* [src.name]" + selectable = 0 /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/proc/projectile_react() if(action_checks(src)) @@ -198,6 +192,7 @@ var/health_boost = 1 var/icon/droid_overlay var/list/repairable_damage = list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH) + selectable = 0 /obj/item/mecha_parts/mecha_equipment/repair_droid/Destroy() SSobj.processing.Remove(src) @@ -217,7 +212,7 @@ /obj/item/mecha_parts/mecha_equipment/repair_droid/get_equip_info() if(!chassis) return - return "* [src.name] - [equip_ready?"A":"Dea"]ctivate" + return "*  [src.name] - [equip_ready?"A":"Dea"]ctivate" /obj/item/mecha_parts/mecha_equipment/repair_droid/Topic(href, href_list) @@ -281,6 +276,7 @@ range = 0 var/coeff = 100 var/list/use_channels = list(EQUIP,ENVIRON,LIGHT) + selectable = 0 /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/Destroy() SSobj.processing.Remove(src) @@ -323,7 +319,7 @@ /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/get_equip_info() if(!chassis) return - return "* [src.name] - [equip_ready?"A":"Dea"]ctivate" + return "*  [src.name] - [equip_ready?"A":"Dea"]ctivate" /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/process() @@ -488,7 +484,6 @@ fuel_per_cycle_active = 30 power_per_cycle = 50 var/rad_per_cycle = 0.3 - reliability = 1000 /obj/item/mecha_parts/mecha_equipment/generator/nuclear/generator_init() fuel = new /obj/item/stack/sheet/mineral/uranium(src) diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index c793887e424..b3c67c72ce4 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -205,7 +205,7 @@ return 1 /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/get_equip_info() - return "[..()]\[[src.projectiles]\][(src.projectiles < initial(src.projectiles))?" - Rearm":null]" + return "[..()] \[[src.projectiles]\][(src.projectiles < initial(src.projectiles))?" - Rearm":null]" /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/rearm() diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 97df7baeb51..6c62de01260 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -109,10 +109,12 @@ var/phase_state = "" //icon_state when phasing var/strafe = FALSE //If we are strafing - var/static/list/armour_facings = list("[NORTH]" = list("[SOUTH]" = FRONT_ARMOUR, "[EAST]" = SIDE_ARMOUR, "[WEST]" = SIDE_ARMOUR, "[NORTH]" = BACK_ARMOUR), -"[EAST]" = list("[SOUTH]" = SIDE_ARMOUR, "[WEST]" = FRONT_ARMOUR, "[EAST]" = BACK_ARMOUR, "[NORTH]" = SIDE_ARMOUR), -"[SOUTH]" = list("[NORTH]" = FRONT_ARMOUR, "[WEST]" = SIDE_ARMOUR, "[EAST]" = SIDE_ARMOUR, "[SOUTH]" = BACK_ARMOUR ), -"[WEST]" = list("[NORTH]" = SIDE_ARMOUR, "[EAST]" = FRONT_ARMOUR, "[SOUTH]" = SIDE_ARMOUR, "[WEST]" = BACK_ARMOUR) ) + var/static/list/armour_facings = list( + "[NORTH]" = list("[SOUTH]" = FRONT_ARMOUR, "[EAST]" = SIDE_ARMOUR, "[WEST]" = SIDE_ARMOUR, "[NORTH]" = BACK_ARMOUR, "[SOUTHEAST]" = SIDE_ARMOUR, "[NORTHEAST]" = SIDE_ARMOUR, "[SOUTHWEST]" = SIDE_ARMOUR, "[NORTHWEST]" = SIDE_ARMOUR), + "[EAST]" = list("[SOUTH]" = SIDE_ARMOUR, "[WEST]" = FRONT_ARMOUR, "[EAST]" = BACK_ARMOUR, "[NORTH]" = SIDE_ARMOUR, "[SOUTHEAST]" = SIDE_ARMOUR, "[NORTHEAST]" = SIDE_ARMOUR, "[SOUTHWEST]" = SIDE_ARMOUR, "[NORTHWEST]" = SIDE_ARMOUR), + "[SOUTH]" = list("[NORTH]" = FRONT_ARMOUR, "[WEST]" = SIDE_ARMOUR, "[EAST]" = SIDE_ARMOUR, "[SOUTH]" = BACK_ARMOUR, "[SOUTHEAST]" = SIDE_ARMOUR, "[NORTHEAST]" = SIDE_ARMOUR, "[SOUTHWEST]" = SIDE_ARMOUR, "[NORTHWEST]" = SIDE_ARMOUR ), + "[WEST]" = list("[NORTH]" = SIDE_ARMOUR, "[EAST]" = FRONT_ARMOUR, "[SOUTH]" = SIDE_ARMOUR, "[WEST]" = BACK_ARMOUR, "[SOUTHEAST]" = SIDE_ARMOUR, "[NORTHEAST]" = SIDE_ARMOUR, "[SOUTHWEST]" = SIDE_ARMOUR, "[NORTHWEST]" = SIDE_ARMOUR) + ) var/occupant_sight_flags = 0 //sight flags to give to the occupant (e.g. mech mining scanner gives meson-like vision) @@ -553,9 +555,8 @@ if(yes) if(..()) //mech was thrown return - if(bumpsmash) - var/mecha = src - obstacle.mech_melee_attack(mecha) + if(bumpsmash && occupant) //Need a pilot to push the PUNCH button. + obstacle.mech_melee_attack(src) if(!obstacle || (obstacle && !obstacle.density)) step(src,dir) if(istype(obstacle, /obj)) @@ -1017,280 +1018,4 @@ var/year_integer = text2num(year) // = 2013??? /obj/mecha/update_remote_sight(mob/living/user) if(occupant_sight_flags) if(user == occupant) - user.sight |= occupant_sight_flags - -//////////////////////////////////////// Action Buttons /////////////////////////////////////////////// - -/obj/mecha/proc/GrantActions(mob/living/user, human_occupant = 0) - if(human_occupant) - eject_action.Grant(user, src) - internals_action.Grant(user, src) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - strafing_action.Grant(user, src) - - -/obj/mecha/proc/RemoveActions(mob/living/user, human_occupant = 0) - if(human_occupant) - eject_action.Remove(user) - internals_action.Remove(user) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - strafing_action.Remove(user) - - -/datum/action/innate/mecha - check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUNNED | AB_CHECK_CONSCIOUS - var/obj/mecha/chassis - -/datum/action/innate/mecha/Grant(mob/living/L, obj/mecha/M) - chassis = M - ..() - -/datum/action/innate/mecha/Destroy() - chassis = null - return ..() - -/datum/action/innate/mecha/mech_eject - name = "Eject From Mech" - button_icon_state = "mech_eject" - -/datum/action/innate/mecha/mech_eject/Activate() - if(!owner || !iscarbon(owner)) - return - if(!chassis || chassis.occupant != owner) - return - chassis.go_out() - - -/datum/action/innate/mecha/mech_toggle_internals - name = "Toggle Internal Airtank Usage" - button_icon_state = "mech_internals_off" - -/datum/action/innate/mecha/mech_toggle_internals/Activate() - if(!owner || !chassis || chassis.occupant != owner) - return - chassis.use_internal_tank = !chassis.use_internal_tank - button_icon_state = "mech_internals_[chassis.use_internal_tank ? "on" : "off"]" - chassis.occupant_message("Now taking air from [chassis.use_internal_tank?"internal airtank":"environment"].") - chassis.log_message("Now taking air from [chassis.use_internal_tank?"internal airtank":"environment"].") - UpdateButtonIcon() - -/datum/action/innate/mecha/mech_cycle_equip - name = "Cycle Equipment" - button_icon_state = "mech_cycle_equip_off" - -/datum/action/innate/mecha/mech_cycle_equip/Activate() - if(!owner || !chassis || chassis.occupant != owner) - return - if(chassis.equipment.len == 0) - chassis.occupant_message("No equipment available.") - return - if(!chassis.selected) - chassis.selected = chassis.equipment[1] - chassis.occupant_message("You select [chassis.selected]") - send_byjax(chassis.occupant,"exosuit.browser","eq_list",chassis.get_equipment_list()) - button_icon_state = "mech_cycle_equip_on" - UpdateButtonIcon() - return - var/number = 0 - for(var/A in chassis.equipment) - number++ - if(A == chassis.selected) - if(chassis.equipment.len == number) - chassis.selected = null - chassis.occupant_message("You switch to no equipment") - button_icon_state = "mech_cycle_equip_off" - else - chassis.selected = chassis.equipment[number+1] - chassis.occupant_message("You switch to [chassis.selected]") - button_icon_state = "mech_cycle_equip_on" - send_byjax(chassis.occupant,"exosuit.browser","eq_list",chassis.get_equipment_list()) - UpdateButtonIcon() - return - - -/datum/action/innate/mecha/mech_toggle_lights - name = "Toggle Lights" - button_icon_state = "mech_lights_off" - -/datum/action/innate/mecha/mech_toggle_lights/Activate() - if(!owner || !chassis || chassis.occupant != owner) - return - chassis.lights = !chassis.lights - if(chassis.lights) - chassis.AddLuminosity(chassis.lights_power) - button_icon_state = "mech_lights_on" - else - chassis.AddLuminosity(-chassis.lights_power) - button_icon_state = "mech_lights_off" - chassis.occupant_message("Toggled lights [chassis.lights?"on":"off"].") - chassis.log_message("Toggled lights [chassis.lights?"on":"off"].") - UpdateButtonIcon() - -/datum/action/innate/mecha/mech_view_stats - name = "View Stats" - button_icon_state = "mech_view_stats" - -/datum/action/innate/mecha/mech_view_stats/Activate() - if(!owner || !chassis || chassis.occupant != owner) - return - chassis.occupant << browse(chassis.get_stats_html(), "window=exosuit") - - -/datum/action/innate/mecha/strafe - name = "Toggle Strafing" - button_icon_state = "strafe" - -/datum/action/innate/mecha/strafe/Activate() - if(!owner || !chassis || chassis.occupant != owner) - return - - chassis.toggle_strafe() - -/obj/mecha/AltClick(mob/living/user) - if(user == occupant) - toggle_strafe() - -/obj/mecha/proc/toggle_strafe() - strafe = !strafe - - occupant_message("Toggled strafing mode [strafe?"on":"off"].") - log_message("Toggled strafing mode [strafe?"on":"off"].") - strafing_action.UpdateButtonIcon() - -//////////////////////////////////////// Specific Ability Actions /////////////////////////////////////////////// -//Need to be granted by the mech type, Not default abilities. - -/datum/action/innate/mecha/mech_toggle_thrusters - name = "Toggle Thrusters" - button_icon_state = "mech_thrusters_off" - -/datum/action/innate/mecha/mech_toggle_thrusters/Activate() - if(!owner || !chassis || chassis.occupant != owner) - return - if(chassis.get_charge() > 0) - chassis.thrusters_active = !chassis.thrusters_active - button_icon_state = "mech_thrusters_[chassis.thrusters_active ? "on" : "off"]" - chassis.log_message("Toggled thrusters.") - chassis.occupant_message("Thrusters [chassis.thrusters_active ?"en":"dis"]abled.") - - -/datum/action/innate/mecha/mech_defence_mode - name = "Toggle Defence Mode" - button_icon_state = "mech_defense_mode_off" - -/datum/action/innate/mecha/mech_defence_mode/Activate(forced_state = null) - if(!owner || !chassis || chassis.occupant != owner) - return - if(!isnull(forced_state)) - chassis.defence_mode = forced_state - else - chassis.defence_mode = !chassis.defence_mode - button_icon_state = "mech_defense_mode_[chassis.defence_mode ? "on" : "off"]" - if(chassis.defence_mode) - chassis.deflect_chance = chassis.defence_mode_deflect_chance - chassis.occupant_message("You enable [chassis] defence mode.") - else - chassis.deflect_chance = initial(chassis.deflect_chance) - chassis.occupant_message("You disable [chassis] defence mode.") - chassis.log_message("Toggled defence mode.") - UpdateButtonIcon() - -/datum/action/innate/mecha/mech_overload_mode - name = "Toggle leg actuators overload" - button_icon_state = "mech_overload_off" - -/datum/action/innate/mecha/mech_overload_mode/Activate(forced_state = null) - if(!owner || !chassis || chassis.occupant != owner) - return - if(!isnull(forced_state)) - chassis.leg_overload_mode = forced_state - else - chassis.leg_overload_mode = !chassis.leg_overload_mode - button_icon_state = "mech_overload_[chassis.leg_overload_mode ? "on" : "off"]" - chassis.log_message("Toggled leg actuators overload.") - if(chassis.leg_overload_mode) - chassis.leg_overload_mode = 1 - chassis.bumpsmash = 1 - chassis.step_in = min(1, round(chassis.step_in/2)) - chassis.step_energy_drain = chassis.step_energy_drain*chassis.leg_overload_coeff - chassis.occupant_message("You enable leg actuators overload.") - else - chassis.leg_overload_mode = 0 - chassis.bumpsmash = 0 - chassis.step_in = initial(chassis.step_in) - chassis.step_energy_drain = initial(chassis.step_energy_drain) - chassis.occupant_message("You disable leg actuators overload.") - UpdateButtonIcon() - -/datum/action/innate/mecha/mech_smoke - name = "Smoke" - button_icon_state = "mech_smoke" - -/datum/action/innate/mecha/mech_smoke/Activate() - if(!owner || !chassis || chassis.occupant != owner) - return - if(chassis.smoke_ready && chassis.smoke>0) - chassis.smoke_system.start() - chassis.smoke-- - chassis.smoke_ready = 0 - spawn(chassis.smoke_cooldown) - chassis.smoke_ready = 1 - - -/datum/action/innate/mecha/mech_zoom - name = "Zoom" - button_icon_state = "mech_zoom_off" - -/datum/action/innate/mecha/mech_zoom/Activate() - if(!owner || !chassis || chassis.occupant != owner) - return - if(owner.client) - chassis.zoom_mode = !chassis.zoom_mode - button_icon_state = "mech_zoom_[chassis.zoom_mode ? "on" : "off"]" - chassis.log_message("Toggled zoom mode.") - chassis.occupant_message("Zoom mode [chassis.zoom_mode?"en":"dis"]abled.") - if(chassis.zoom_mode) - owner.client.view = 12 - owner << sound('sound/mecha/imag_enh.ogg',volume=50) - else - owner.client.view = world.view//world.view - default mob view size - UpdateButtonIcon() - -/datum/action/innate/mecha/mech_switch_damtype - name = "Reconfigure arm microtool arrays" - button_icon_state = "mech_damtype_brute" - -/datum/action/innate/mecha/mech_switch_damtype/Activate() - if(!owner || !chassis || chassis.occupant != owner) - return - var/new_damtype - switch(chassis.damtype) - if("tox") - new_damtype = "brute" - chassis.occupant_message("Your exosuit's hands form into fists.") - if("brute") - new_damtype = "fire" - chassis.occupant_message("A torch tip extends from your exosuit's hand, glowing red.") - if("fire") - new_damtype = "tox" - chassis.occupant_message("A bone-chillingly thick plasteel needle protracts from the exosuit's palm.") - chassis.damtype = new_damtype. - button_icon_state = "mech_damtype_[new_damtype]" - playsound(src, 'sound/mecha/mechmove01.ogg', 50, 1) - UpdateButtonIcon() - -/datum/action/innate/mecha/mech_toggle_phasing - name = "Toggle Phasing" - button_icon_state = "mech_phasing_off" - -/datum/action/innate/mecha/mech_toggle_phasing/Activate() - if(!owner || !chassis || chassis.occupant != owner) - return - chassis.phasing = !chassis.phasing - button_icon_state = "mech_phasing_[chassis.phasing ? "on" : "off"]" - chassis.occupant_message("En":"#f00\">Dis"]abled phasing.") - UpdateButtonIcon() + user.sight |= occupant_sight_flags \ No newline at end of file diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm new file mode 100644 index 00000000000..869801152e4 --- /dev/null +++ b/code/game/mecha/mecha_actions.dm @@ -0,0 +1,281 @@ +//////////////////////////////////////// Action Buttons /////////////////////////////////////////////// + +/obj/mecha/proc/GrantActions(mob/living/user, human_occupant = 0) + if(human_occupant) + eject_action.Grant(user, src) + internals_action.Grant(user, src) + cycle_action.Grant(user, src) + lights_action.Grant(user, src) + stats_action.Grant(user, src) + strafing_action.Grant(user, src) + + +/obj/mecha/proc/RemoveActions(mob/living/user, human_occupant = 0) + if(human_occupant) + eject_action.Remove(user) + internals_action.Remove(user) + cycle_action.Remove(user) + lights_action.Remove(user) + stats_action.Remove(user) + strafing_action.Remove(user) + + +/datum/action/innate/mecha + check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUNNED | AB_CHECK_CONSCIOUS + var/obj/mecha/chassis + +/datum/action/innate/mecha/Grant(mob/living/L, obj/mecha/M) + chassis = M + ..() + +/datum/action/innate/mecha/Destroy() + chassis = null + return ..() + +/datum/action/innate/mecha/mech_eject + name = "Eject From Mech" + button_icon_state = "mech_eject" + +/datum/action/innate/mecha/mech_eject/Activate() + if(!owner || !iscarbon(owner)) + return + if(!chassis || chassis.occupant != owner) + return + chassis.go_out() + + +/datum/action/innate/mecha/mech_toggle_internals + name = "Toggle Internal Airtank Usage" + button_icon_state = "mech_internals_off" + +/datum/action/innate/mecha/mech_toggle_internals/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + chassis.use_internal_tank = !chassis.use_internal_tank + button_icon_state = "mech_internals_[chassis.use_internal_tank ? "on" : "off"]" + chassis.occupant_message("Now taking air from [chassis.use_internal_tank?"internal airtank":"environment"].") + chassis.log_message("Now taking air from [chassis.use_internal_tank?"internal airtank":"environment"].") + UpdateButtonIcon() + +/datum/action/innate/mecha/mech_cycle_equip + name = "Cycle Equipment" + button_icon_state = "mech_cycle_equip_off" + +/datum/action/innate/mecha/mech_cycle_equip/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + + var/list/available_equipment = list() + for(var/obj/item/mecha_parts/mecha_equipment/M in chassis.equipment) + if(M.selectable) + available_equipment += M + + if(available_equipment.len == 0) + chassis.occupant_message("No equipment available.") + return + if(!chassis.selected) + chassis.selected = available_equipment[1] + chassis.occupant_message("You select [chassis.selected]") + send_byjax(chassis.occupant,"exosuit.browser","eq_list",chassis.get_equipment_list()) + button_icon_state = "mech_cycle_equip_on" + UpdateButtonIcon() + return + var/number = 0 + for(var/A in available_equipment) + number++ + if(A == chassis.selected) + if(available_equipment.len == number) + chassis.selected = null + chassis.occupant_message("You switch to no equipment") + button_icon_state = "mech_cycle_equip_off" + else + chassis.selected = available_equipment[number+1] + chassis.occupant_message("You switch to [chassis.selected]") + button_icon_state = "mech_cycle_equip_on" + send_byjax(chassis.occupant,"exosuit.browser","eq_list",chassis.get_equipment_list()) + UpdateButtonIcon() + return + + +/datum/action/innate/mecha/mech_toggle_lights + name = "Toggle Lights" + button_icon_state = "mech_lights_off" + +/datum/action/innate/mecha/mech_toggle_lights/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + chassis.lights = !chassis.lights + if(chassis.lights) + chassis.AddLuminosity(chassis.lights_power) + button_icon_state = "mech_lights_on" + else + chassis.AddLuminosity(-chassis.lights_power) + button_icon_state = "mech_lights_off" + chassis.occupant_message("Toggled lights [chassis.lights?"on":"off"].") + chassis.log_message("Toggled lights [chassis.lights?"on":"off"].") + UpdateButtonIcon() + +/datum/action/innate/mecha/mech_view_stats + name = "View Stats" + button_icon_state = "mech_view_stats" + +/datum/action/innate/mecha/mech_view_stats/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + chassis.occupant << browse(chassis.get_stats_html(), "window=exosuit") + + +/datum/action/innate/mecha/strafe + name = "Toggle Strafing" + button_icon_state = "strafe" + +/datum/action/innate/mecha/strafe/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + + chassis.toggle_strafe() + +/obj/mecha/AltClick(mob/living/user) + if(user == occupant) + toggle_strafe() + +/obj/mecha/proc/toggle_strafe() + strafe = !strafe + + occupant_message("Toggled strafing mode [strafe?"on":"off"].") + log_message("Toggled strafing mode [strafe?"on":"off"].") + strafing_action.UpdateButtonIcon() + +//////////////////////////////////////// Specific Ability Actions /////////////////////////////////////////////// +//Need to be granted by the mech type, Not default abilities. + +/datum/action/innate/mecha/mech_toggle_thrusters + name = "Toggle Thrusters" + button_icon_state = "mech_thrusters_off" + +/datum/action/innate/mecha/mech_toggle_thrusters/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + if(chassis.get_charge() > 0) + chassis.thrusters_active = !chassis.thrusters_active + button_icon_state = "mech_thrusters_[chassis.thrusters_active ? "on" : "off"]" + chassis.log_message("Toggled thrusters.") + chassis.occupant_message("Thrusters [chassis.thrusters_active ?"en":"dis"]abled.") + + +/datum/action/innate/mecha/mech_defence_mode + name = "Toggle Defence Mode" + button_icon_state = "mech_defense_mode_off" + +/datum/action/innate/mecha/mech_defence_mode/Activate(forced_state = null) + if(!owner || !chassis || chassis.occupant != owner) + return + if(!isnull(forced_state)) + chassis.defence_mode = forced_state + else + chassis.defence_mode = !chassis.defence_mode + button_icon_state = "mech_defense_mode_[chassis.defence_mode ? "on" : "off"]" + if(chassis.defence_mode) + chassis.deflect_chance = chassis.defence_mode_deflect_chance + chassis.occupant_message("You enable [chassis] defence mode.") + else + chassis.deflect_chance = initial(chassis.deflect_chance) + chassis.occupant_message("You disable [chassis] defence mode.") + chassis.log_message("Toggled defence mode.") + UpdateButtonIcon() + +/datum/action/innate/mecha/mech_overload_mode + name = "Toggle leg actuators overload" + button_icon_state = "mech_overload_off" + +/datum/action/innate/mecha/mech_overload_mode/Activate(forced_state = null) + if(!owner || !chassis || chassis.occupant != owner) + return + if(!isnull(forced_state)) + chassis.leg_overload_mode = forced_state + else + chassis.leg_overload_mode = !chassis.leg_overload_mode + button_icon_state = "mech_overload_[chassis.leg_overload_mode ? "on" : "off"]" + chassis.log_message("Toggled leg actuators overload.") + if(chassis.leg_overload_mode) + chassis.leg_overload_mode = 1 + chassis.bumpsmash = 1 + chassis.step_in = min(1, round(chassis.step_in/2)) + chassis.step_energy_drain = chassis.step_energy_drain*chassis.leg_overload_coeff + chassis.occupant_message("You enable leg actuators overload.") + else + chassis.leg_overload_mode = 0 + chassis.bumpsmash = 0 + chassis.step_in = initial(chassis.step_in) + chassis.step_energy_drain = initial(chassis.step_energy_drain) + chassis.occupant_message("You disable leg actuators overload.") + UpdateButtonIcon() + +/datum/action/innate/mecha/mech_smoke + name = "Smoke" + button_icon_state = "mech_smoke" + +/datum/action/innate/mecha/mech_smoke/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + if(chassis.smoke_ready && chassis.smoke>0) + chassis.smoke_system.start() + chassis.smoke-- + chassis.smoke_ready = 0 + spawn(chassis.smoke_cooldown) + chassis.smoke_ready = 1 + + +/datum/action/innate/mecha/mech_zoom + name = "Zoom" + button_icon_state = "mech_zoom_off" + +/datum/action/innate/mecha/mech_zoom/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + if(owner.client) + chassis.zoom_mode = !chassis.zoom_mode + button_icon_state = "mech_zoom_[chassis.zoom_mode ? "on" : "off"]" + chassis.log_message("Toggled zoom mode.") + chassis.occupant_message("Zoom mode [chassis.zoom_mode?"en":"dis"]abled.") + if(chassis.zoom_mode) + owner.client.view = 12 + owner << sound('sound/mecha/imag_enh.ogg',volume=50) + else + owner.client.view = world.view//world.view - default mob view size + UpdateButtonIcon() + +/datum/action/innate/mecha/mech_switch_damtype + name = "Reconfigure arm microtool arrays" + button_icon_state = "mech_damtype_brute" + +/datum/action/innate/mecha/mech_switch_damtype/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + var/new_damtype + switch(chassis.damtype) + if("tox") + new_damtype = "brute" + chassis.occupant_message("Your exosuit's hands form into fists.") + if("brute") + new_damtype = "fire" + chassis.occupant_message("A torch tip extends from your exosuit's hand, glowing red.") + if("fire") + new_damtype = "tox" + chassis.occupant_message("A bone-chillingly thick plasteel needle protracts from the exosuit's palm.") + chassis.damtype = new_damtype. + button_icon_state = "mech_damtype_[new_damtype]" + playsound(src, 'sound/mecha/mechmove01.ogg', 50, 1) + UpdateButtonIcon() + +/datum/action/innate/mecha/mech_toggle_phasing + name = "Toggle Phasing" + button_icon_state = "mech_phasing_off" + +/datum/action/innate/mecha/mech_toggle_phasing/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + chassis.phasing = !chassis.phasing + button_icon_state = "mech_phasing_[chassis.phasing ? "on" : "off"]" + chassis.occupant_message("En":"#f00\">Dis"]abled phasing.") + UpdateButtonIcon() diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index 6c6ecde299b..4cef3720702 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -1,7 +1,7 @@ /obj/mecha/proc/get_armour_facing(srcdir,adir) var/facing_hit = armour_facings["[srcdir]"]["[adir]"] var/damage_modifier = facing_modifiers[facing_hit] - return damage_modifier + return damage_modifier || 1 //always return non-0 /obj/mecha/proc/take_damage(amount, type="brute", adir = 0, booster_deflection_modifier = 1, booster_damage_modifier = 1) var/facing_modifier = 1 diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm index a04693ce20f..8084c64a43d 100644 --- a/code/game/mecha/mecha_topic.dm +++ b/code/game/mecha/mecha_topic.dm @@ -52,12 +52,12 @@ /obj/mecha/proc/report_internal_damage() . = "" var/list/dam_reports = list( - "[MECHA_INT_FIRE]" = "INTERNAL FIRE", - "[MECHA_INT_TEMP_CONTROL]" = "LIFE SUPPORT SYSTEM MALFUNCTION", - "[MECHA_INT_TANK_BREACH]" = "GAS TANK BREACH", - "[MECHA_INT_CONTROL_LOST]" = "COORDINATION SYSTEM CALIBRATION FAILURE - Recalibrate", - "[MECHA_INT_SHORT_CIRCUIT]" = "SHORT CIRCUIT" - ) + "[MECHA_INT_FIRE]" = "INTERNAL FIRE", + "[MECHA_INT_TEMP_CONTROL]" = "LIFE SUPPORT SYSTEM MALFUNCTION", + "[MECHA_INT_TANK_BREACH]" = "GAS TANK BREACH", + "[MECHA_INT_CONTROL_LOST]" = "COORDINATION SYSTEM CALIBRATION FAILURE - Recalibrate", + "[MECHA_INT_SHORT_CIRCUIT]" = "SHORT CIRCUIT" + ) for(var/tflag in dam_reports) var/intdamflag = text2num(tflag) if(internal_damage & intdamflag) @@ -176,7 +176,8 @@ var/a_name = get_access_desc(a) if(!a_name) continue //there's some strange access without a name . += "[a_name] - Add
" - . += "
Finish (Warning! The ID upload panel will be locked. It can be unlocked only through Exosuit Interface.)" + . += "
Finish " + . += "(Warning! The ID upload panel will be locked. It can be unlocked only through Exosuit Interface.)" . += "" user << browse(., "window=exosuit_add_access") onclose(user, "exosuit_add_access") @@ -262,7 +263,7 @@ if(href_list["select_equip"]) var/obj/item/mecha_parts/mecha_equipment/equip = filter.getObj("select_equip") - if(equip) + if(equip && equip.selectable) src.selected = equip src.occupant_message("You switch to [equip]") src.visible_message("[src] raises [equip]") diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm index 0a627518e15..99f894aa392 100644 --- a/code/game/objects/effects/decals/misc.dm +++ b/code/game/objects/effects/decals/misc.dm @@ -5,8 +5,11 @@ layer = 16 duration = 25 -/obj/effect/overlay/temp/point/New(loc, set_invis = 0) +/obj/effect/overlay/temp/point/New(atom/target, set_invis = 0) ..() + loc = get_turf(target) + pixel_x = target.pixel_x + pixel_y = target.pixel_y invisibility = set_invis // Used for spray that you spray at walls, tables, hydrovats etc diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index efb3b8c1635..56e99c069fd 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -337,3 +337,14 @@ found += U found |= F return found + + + +//Blueprint Subtypes + +/obj/item/areaeditor/blueprints/cyborg + name = "station schematics" + desc = "A digital copy of the station blueprints stored in your memory." + icon = 'icons/obj/items.dmi' + icon_state = "blueprints" + fluffnotice = "Intellectual Property of Nanotrasen. For use in engineering cyborgs only. Wipe from memory upon departure from the station." \ No newline at end of file diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 1e22c43a028..c101d2fbb61 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -195,15 +195,22 @@ if(C.client) C.blur_eyes(3) C.blind_eyes(1) - if(C.check_eye_prot() <= 0) // no eye protection? ARGH IT BURNS. - C.confused = max(C.confused, 3) - C.Weaken(3) + if(C.check_eye_prot() <= 0) // no eye protection? ARGH IT BURNS. + C.confused = max(C.confused, 3) + C.Weaken(3) if(ishuman(C)) var/mob/living/carbon/human/H = C H.lip_style = "spray_face" H.lip_color = paint_color H.update_body() + // Caution, spray cans contain inflammable substances + if(C.reagents) + C.reagents.add_reagent("welding_fuel", 5) + C.reagents.add_reagent("ethanol", 5) + C.reagents.reaction(C, VAPOR, 10) + uses = max(0,uses-10) + if(istype(target, /obj/structure/window)) if(uses) target.color = paint_color @@ -232,4 +239,27 @@ ..() if(G) paint_color = G.color_hex - update_icon() \ No newline at end of file + update_icon() + +/obj/item/toy/crayon/spraycan/borg + desc = "A metallic container containing shiny paint." + // Use depletion of uses to determine what the energy cost is + uses = 100 + +/obj/item/toy/crayon/spraycan/borg/afterattack(atom/target,mob/user,proximity) + ..() + if(!isrobot(user)) + return FALSE + var/mob/living/silicon/robot/borgy = user + + var/starting_uses = initial(uses) + var/diff = starting_uses - uses + if(diff) + uses = starting_uses + // 25 is our cost per unit of paint, making it cost 25 energy per + // normal tag, 50 per window, and 250 per attack + var/cost = diff * 25 + // Cyborgs shouldn't be able to use modules without a cell. But if they do + // it's free. + if(borgy.cell) + borgy.cell.use(cost) diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm index 0b20a76264e..48cf67cc93b 100644 --- a/code/game/objects/items/dehy_carp.dm +++ b/code/game/objects/items/dehy_carp.dm @@ -7,6 +7,7 @@ /obj/item/toy/carpplushie/dehy_carp var/mob/owner = null //Carp doesn't attack owner, set when using in hand var/owned = 0 //Boolean, no owner to begin with + var/mobtype = /mob/living/simple_animal/hostile/carp //So admins can change what mob spawns via var fuckery //Attack self /obj/item/toy/carpplushie/dehy_carp/attack_self(mob/user) @@ -36,16 +37,16 @@ //Wait for animation to end sleep(6) //Make space carp - var/mob/living/simple_animal/hostile/carp/C = new /mob/living/simple_animal/hostile/carp(get_turf(src)) + var/mob/living/M = new mobtype(get_turf(src)) //Make carp non-hostile to user, and their allies if(owner) var/list/factions = owner.faction for(var/F in factions) if(F == "neutral") factions -= F - C.faction = factions - if (!owner || owner.faction != C.faction) + M.faction = factions + if (!owner || owner.faction != M.faction) visible_message("You have a bad feeling about this.") //welcome to the hostile carp enjoy your die else - visible_message("The newly grown carp looks up at you with friendly eyes.") + visible_message("The newly grown [M.name] looks up at you with friendly eyes.") qdel(src) \ No newline at end of file diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 537b1646462..f2b9bcd472b 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -157,6 +157,16 @@ var/global/list/datum/stack_recipe/sinew_recipes = list ( \ w_class = 3 layer = 4 +/obj/item/stack/sheet/animalhide/ashdrake + name = "ash drake hide" + desc = "The strong, scaled hide of an ash drake." + icon = 'icons/obj/mining.dmi' + icon_state = "dragon_hide" + singular_name = "drake plate" + flags = NOBLUDGEON + w_class = 3 + layer = 4 + //Step one - dehairing. diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 6c9b9254103..a12c51ed506 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -42,6 +42,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \ new/datum/stack_recipe("apc frame", /obj/item/wallframe/apc, 2), \ new/datum/stack_recipe("air alarm frame", /obj/item/wallframe/airalarm, 2), \ new/datum/stack_recipe("fire alarm frame", /obj/item/wallframe/firealarm, 2), \ + new/datum/stack_recipe("extinguisher cabinet frame", /obj/item/wallframe/extinguisher_cabinet, 2), \ new/datum/stack_recipe("button frame", /obj/item/wallframe/button, 1), \ null, \ new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, one_per_turf = 1, on_floor = 1), \ diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm index 0ec9b84479c..ba891f89d78 100644 --- a/code/game/objects/items/weapons/RSF.dm +++ b/code/game/objects/items/weapons/RSF.dm @@ -6,7 +6,7 @@ RSF /obj/item/weapon/rsf name = "\improper Rapid-Service-Fabricator" desc = "A device used to rapidly deploy service items." - icon = 'icons/obj/items.dmi' + icon = 'icons/obj/tools.dmi' icon_state = "rcd" opacity = 0 density = 0 @@ -111,4 +111,4 @@ RSF else matter-- user << "The RSF now holds [matter]/30 fabrication-units." - desc = "A RSF. It currently holds [matter]/30 fabrication-units." \ No newline at end of file + desc = "A RSF. It currently holds [matter]/30 fabrication-units." diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 00da8edcade..1b784656308 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -4,20 +4,19 @@ name = "C-4" desc = "Used to put holes in specific areas without too much extra hole." gender = PLURAL - icon = 'icons/obj/assemblies.dmi' + icon = 'icons/obj/grenade.dmi' icon_state = "plastic-explosive0" item_state = "plasticx" flags = NOBLUDGEON w_class = 2 origin_tech = "syndicate=2" var/timer = 10 - var/atom/target = null var/open_panel = 0 - var/image_overlay = null + parent_type = /obj/item/weapon/grenade/plastic/c4 /obj/item/weapon/c4/New() wires = new /datum/wires/explosive/c4(src) - image_overlay = image('icons/obj/assemblies.dmi', "plastic-explosive2") + image_overlay = image('icons/obj/grenade.dmi', "plastic-explosive2") ..() /obj/item/weapon/c4/Destroy() diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 54c322dee79..e7d18f91de5 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -267,13 +267,15 @@ var/total_volume = 0 for(var/obj/item/weapon/reagent_containers/RC in beakers) total_volume += RC.reagents.total_volume - + if(!total_volume) + qdel(src) + qdel(nadeassembly) + return var/fraction = unit_spread/total_volume var/datum/reagents/reactants = new(unit_spread) reactants.my_atom = src for(var/obj/item/weapon/reagent_containers/RC in beakers) RC.reagents.trans_to(reactants, RC.reagents.total_volume*fraction, threatscale, 1, 1) - chem_splash(get_turf(src), affected_area, list(reactants), ignition_temp, threatscale) if(nadeassembly) @@ -283,15 +285,12 @@ var/area/A = get_area(T) message_admins("grenade primed by an assembly, attached by [key_name_admin(M)](?) (FLW) and last touched by [key_name_admin(last)](?) (FLW) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP).") log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z])") - + else + addtimer(src, "prime", det_time) var/turf/DT = get_turf(src) var/area/DA = get_area(DT) log_game("A grenade detonated at [DA.name] ([DT.x], [DT.y], [DT.z])") - if(total_volume < unit_spread) // If that was the last detonation, delete the grenade to prevent reusing it. Keep in mind, an explosion might destroy the grenade before it can detonate again anyways. - update_mob() - qdel(src) - diff --git a/code/game/objects/items/weapons/grenades/plastic.dm b/code/game/objects/items/weapons/grenades/plastic.dm new file mode 100644 index 00000000000..f4ec3cff3e5 --- /dev/null +++ b/code/game/objects/items/weapons/grenades/plastic.dm @@ -0,0 +1,180 @@ +/obj/item/weapon/grenade/plastic + name = "plastic explosive" + desc = "Used to put holes in specific areas without too much extra hole." + icon_state = "plastic-explosive0" + item_state = "plastic-explosive" + flags = NOBLUDGEON + det_time = 10 + display_timer = 0 + var/atom/target = null + var/image_overlay = null + var/obj/item/device/assembly_holder/nadeassembly = null + var/assemblyattacher + +/obj/item/weapon/grenade/plastic/New() + image_overlay = image('icons/obj/grenade.dmi', "[item_state]2") + ..() + +/obj/item/weapon/grenade/plastic/Destroy() + qdel(nadeassembly) + nadeassembly = null + target = null + ..() + +/obj/item/weapon/grenade/plastic/attackby(obj/item/I, mob/user, params) + if(!nadeassembly && istype(I, /obj/item/device/assembly_holder)) + var/obj/item/device/assembly_holder/A = I + if(!user.unEquip(I)) + return ..() + nadeassembly = A + A.master = src + A.loc = src + assemblyattacher = user.ckey + user << "You add [A] to the [name]." + playsound(src, 'sound/weapons/tap.ogg', 20, 1) + update_icon() + return + if(nadeassembly && istype(I, /obj/item/weapon/wirecutters)) + playsound(src, 'sound/items/Wirecutter.ogg', 20, 1) + nadeassembly.loc = get_turf(src) + nadeassembly.master = null + nadeassembly = null + update_icon() + return + ..() + +//assembly stuff +/obj/item/weapon/grenade/plastic/receive_signal() + prime() + +/obj/item/weapon/grenade/plastic/Crossed(atom/movable/AM) + if(nadeassembly) + nadeassembly.Crossed(AM) + +/obj/item/weapon/grenade/plastic/on_found(mob/finder) + if(nadeassembly) + nadeassembly.on_found(finder) + +/obj/item/weapon/grenade/plastic/attack_self(mob/user) + if(nadeassembly) + nadeassembly.attack_self(user) + return + var/newtime = input(usr, "Please set the timer.", "Timer", 10) as num + if(user.get_active_hand() == src) + newtime = Clamp(newtime, 10, 60000) + det_time = newtime + user << "Timer set for [det_time] seconds." + +/obj/item/weapon/grenade/plastic/afterattack(atom/movable/AM, mob/user, flag) + if (!flag) + return + if (istype(AM, /mob/living/carbon)) + return + user << "You start planting the [src]. The timer is set to [det_time]..." + + if(do_after(user, 50, target = AM)) + if(!user.unEquip(src)) + return + src.target = AM + loc = null + + message_admins("[key_name_admin(user)](?) (FLW) planted [src.name] on [target.name] at ([target.x],[target.y],[target.z] - JMP) with [det_time] second fuse",0,1) + log_game("[key_name(user)] planted [src.name] on [target.name] at ([target.x],[target.y],[target.z]) with [det_time] second fuse") + + target.overlays += image_overlay + if(!nadeassembly) + user << "You plant the bomb. Timer counting down from [det_time]." + addtimer(src, "prime", det_time*10) + +/obj/item/weapon/grenade/plastic/suicide_act(mob/user) + message_admins("[key_name_admin(user)](?) (FLW) suicided with [src.name] at ([user.x],[user.y],[user.z] - JMP)",0,1) + message_admins("[key_name(user)] suicided with [src.name] at ([user.x],[user.y],[user.z])") + user.visible_message("[user] activates the [src.name] and holds it above \his head! It looks like \he's going out with a bang!") + var/message_say = "FOR NO RAISIN!" + if(user.mind) + if(user.mind.special_role) + var/role = lowertext(user.mind.special_role) + if(role == "traitor" || role == "syndicate") + message_say = "FOR THE SYNDICATE!" + else if(role == "changeling") + message_say = "FOR THE HIVE!" + else if(role == "cultist") + message_say = "FOR NAR-SIE!" + else if(role == "revolutionary" || role == "head revolutionary") + message_say = "VIVA LA REVOLUTION!" + else if(user.mind.gang_datum) + message_say = "[uppertext(user.mind.gang_datum.name)] RULES!" + user.say(message_say) + target = user + sleep(10) + prime() + user.gib(no_brain = 1) + +/obj/item/weapon/grenade/plastic/update_icon() + if(nadeassembly) + icon_state = "[item_state]1" + else + icon_state = "[item_state]0" + +////////////////////////// +///// The Explosives ///// +////////////////////////// + +/obj/item/weapon/grenade/plastic/c4 + name = "C4" + desc = "Used to put holes in specific areas without too much extra hole. A saboteurs favourite." + +/obj/item/weapon/grenade/plastic/c4/prime() + var/turf/location + if(target) + if(!qdeleted(target)) + location = get_turf(target) + target.overlays -= image_overlay + else + location = get_turf(src) + if(location) + location.ex_act(2, target) + explosion(location,0,0,3) + if(istype(target, /mob)) + var/mob/M = target + M.gib() + qdel(src) + +// X4 is an upgraded directional variant of c4 which is relatively safe to be standing next to. And much less safe to be standing on the other side of. +// C4 is intended to be used for infiltration, and destroying tech. X4 is intended to be used for heavy breaching and tight spaces. +// Intended to replace C4 for nukeops, and to be a randomdrop in surplus/random traitor purchases. + +/obj/item/weapon/grenade/plastic/x4 + name = "X4" + desc = "A specialized shaped high explosive breaching charge. Designed to be safer for the user, and less so, for the wall." + var/aim_dir = NORTH + icon_state = "plasticx40" + item_state = "plasticx4" + +/obj/item/weapon/grenade/plastic/x4/prime() + var/turf/location + if(target) + if(!qdeleted(target)) + location = get_turf(target) + target.overlays -= image_overlay + else + location = get_turf(src) + if(location) + if(istype(loc, /obj/item/weapon/twohanded/spear)) + explosion(location, 0, 2, 3) + else if(target.density) + var/turf/T = get_step(location, aim_dir) + explosion(get_step(T, aim_dir),0,0,3) + explosion(T,0,2,0) + location.ex_act(2, target) + else + explosion(location, 0, 2, 3) + location.ex_act(2, target) + if(istype(target, /mob)) + var/mob/M = target + M.gib() + qdel(src) + +/obj/item/weapon/grenade/plastic/x4/afterattack(atom/movable/AM, mob/user, flag) + aim_dir = get_dir(user,AM) + ..() diff --git a/code/game/objects/items/weapons/grenades/syndieminibomb.dm b/code/game/objects/items/weapons/grenades/syndieminibomb.dm index e49edb574fe..9fe9e1fb04e 100644 --- a/code/game/objects/items/weapons/grenades/syndieminibomb.dm +++ b/code/game/objects/items/weapons/grenades/syndieminibomb.dm @@ -29,7 +29,7 @@ /obj/item/weapon/grenade/gluon desc = "An advanced grenade that releases a harmful stream of gluons inducing radiation in those nearby. These gluon streams will also make victims feel exhausted, and induce shivering. This extreme coldness will also likely wet any nearby floors." - name = "gluon grenade" + name = "gluon frag grenade" icon = 'icons/obj/grenade.dmi' icon_state = "bluefrag" item_state = "flashbang" @@ -44,7 +44,8 @@ for(var/turf/T in view(freeze_range,loc)) if(istype(T,/turf/open/floor)) var/turf/open/floor/F = T - F.wet = TURF_WET_ICE + F.wet = TURF_WET_PERMAFROST + addtimer(F, "MakeDry", rand(3000, 3100), 0, TURF_WET_PERMAFROST) for(var/mob/living/carbon/L in T) L.adjustStaminaLoss(stamina_damage) L.bodytemperature -= 230 diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 7a327cfa34a..103e0b3f07c 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -332,10 +332,3 @@ icon_state = "bola_r" breakouttime = 70 weaken = 1 - -/obj/item/weapon/restraints/legcuffs/bola/cult //cult variant, comes with armament talisman - name = "nar'sian bola" - desc = "A strong bola, bound with dark magic. Throw it to trip and slow your victim." - icon_state = "bola_cult" - breakouttime = 45 - weaken = 1 diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index bdea527638a..3cab28cd5f8 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -484,9 +484,15 @@ ..() contents = list() for(var/i in 1 to 10) - new /obj/item/weapon/c4(src) + new /obj/item/weapon/grenade/plastic/c4(src) return +/obj/item/weapon/storage/backpack/dufflebag/syndie/x4/New() + ..() + contents = list() + for(var/i in 1 to 3) + new /obj/item/weapon/grenade/plastic/x4(src) + /obj/item/weapon/storage/backpack/dufflebag/syndie/firestarter desc = "A large dufflebag containing New Russian pyro backpack sprayer, a pistol, a pipebomb, fireproof hardsuit, ammo, and other equipment." diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 13988c9e41c..8b4549cc406 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -195,7 +195,7 @@ 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" - max_w_class = 3 + max_w_class = 2 /obj/item/weapon/storage/belt/military/army name = "army belt" diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 3e831000e76..99b3a72e6ae 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -61,31 +61,32 @@ /obj/item/weapon/storage/box/survival/New() ..() - contents = list() new /obj/item/clothing/mask/breath(src) new /obj/item/weapon/tank/internals/emergency_oxygen(src) new /obj/item/weapon/reagent_containers/hypospray/medipen(src) - return /obj/item/weapon/storage/box/engineer /obj/item/weapon/storage/box/engineer/New() ..() - contents = list() new /obj/item/clothing/mask/breath(src) new /obj/item/weapon/tank/internals/emergency_oxygen/engi(src) new /obj/item/weapon/reagent_containers/hypospray/medipen(src) - return + +/obj/item/weapon/storage/box/syndie + +/obj/item/weapon/storage/box/syndie/New() + ..() + new /obj/item/clothing/mask/gas/syndicate(src) + new /obj/item/weapon/tank/internals/emergency_oxygen/engi(src) /obj/item/weapon/storage/box/security /obj/item/weapon/storage/box/security/New() ..() - contents = list() new /obj/item/clothing/mask/gas/sechailer(src) new /obj/item/weapon/tank/internals/emergency_oxygen(src) new /obj/item/weapon/reagent_containers/hypospray/medipen(src) - return /obj/item/weapon/storage/box/gloves name = "box of latex gloves" diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 21949a40966..4ccc4803f1d 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -48,7 +48,7 @@ new /obj/item/weapon/gun/projectile/revolver(src) new /obj/item/ammo_box/a357(src) new /obj/item/weapon/card/emag(src) - new /obj/item/weapon/c4(src) + new /obj/item/weapon/grenade/plastic/c4(src) new /obj/item/clothing/gloves/color/latex/nitrile(src) new /obj/item/clothing/mask/gas/clown_hat(src) new /obj/item/clothing/under/suit_jacket/really_black(src) @@ -86,8 +86,8 @@ return if("sabotage") - new /obj/item/weapon/c4 (src) - new /obj/item/weapon/c4 (src) + new /obj/item/weapon/grenade/plastic/c4 (src) + new /obj/item/weapon/grenade/plastic/c4 (src) new /obj/item/device/doorCharge(src) new /obj/item/device/doorCharge(src) new /obj/item/device/camera_bug(src) diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index ece6bf79a79..e8bbfbed48e 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -321,7 +321,7 @@ explosive.prime() qdel(src) - //THIS MIGHT BE UNBALANCED SO I DUNNO + //THIS MIGHT BE UNBALANCED SO I DUNNO // it totally is. /obj/item/weapon/twohanded/spear/throw_impact(atom/target) . = ..() if(!.) //not caught @@ -329,7 +329,6 @@ explosive.prime() qdel(src) - /obj/item/weapon/twohanded/spear/AltClick() ..() if(!explosive) @@ -340,16 +339,6 @@ if(input) src.war_cry = input -//Placeholder C4 "grenade" for use on this spear -/obj/item/weapon/grenade/C4 - name = "C-4" - desc = "A brick of C-4." - -/obj/item/weapon/grenade/C4/prime() - update_mob() - explosion(src.loc,-1,1,3) - qdel(src) - /obj/item/weapon/twohanded/spear/CheckParts() if(explosive) explosive.loc = get_turf(src.loc) @@ -360,12 +349,6 @@ name = "explosive lance" desc = "A makeshift spear with [G] attached to it. Alt+click on the spear to set your war cry!" return - var/obj/item/weapon/c4/C4 = locate() in contents - if(C4) - var /obj/item/weapon/grenade/C4/C42 = new /obj/item/weapon/grenade/C4(src) - qdel(C4) - explosive = C42 - desc = "A makeshift spear with [C42] attached to it. Alt+click on the spear to set your war cry!" update_icon() // CHAINSAW diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index 65cb20bee21..9da2cc06a11 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -24,7 +24,7 @@ new /obj/item/weapon/reagent_containers/glass/rag(src) new /obj/item/weapon/reagent_containers/glass/rag(src) new /obj/item/weapon/storage/box/beanbag(src) - new /obj/item/clothing/suit/armor/vest(src) + new /obj/item/clothing/suit/armor/vest/alt(src) new /obj/item/clothing/glasses/sunglasses/reagent(src) new /obj/item/weapon/storage/belt/bandolier(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index 67292b52f2d..6b16c70b7ba 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -1,6 +1,6 @@ /obj/structure/closet/secure_closet name = "secure locker" - desc = "It's an immobile card-locked storage unit." + desc = "It's a card-locked storage unit." locked = 1 icon_state = "secure" health = 200 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 2cb1eae867f..c8fa71c24dc 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -43,7 +43,7 @@ new /obj/item/weapon/storage/box/ids(src) new /obj/item/weapon/storage/box/ids(src) new /obj/item/device/megaphone/command(src) - new /obj/item/clothing/suit/armor/vest(src) + new /obj/item/clothing/suit/armor/vest/alt(src) new /obj/item/device/assembly/flash/handheld(src) new /obj/item/clothing/glasses/sunglasses(src) new /obj/item/weapon/restraints/handcuffs/cable/zipties(src) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index ccc043c0188..16b903709f3 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -253,12 +253,5 @@ /obj/structure/displaycase/labcage name = "lab cage" desc = "A glass lab container for storing interesting creatures." - -/obj/structure/displaycase/labcage/New() - ..() - var/obj/item/clothing/mask/facehugger/A = new /obj/item/clothing/mask/facehugger(src) - A.sterile = 1 - A.name = "Lamarr" - showpiece = A - update_icon() + start_showpiece_type = /obj/item/clothing/mask/facehugger/lamarr diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 8741c8698e0..e011d83fa6e 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -5,9 +5,19 @@ icon_state = "extinguisher_closed" anchored = 1 density = 0 - var/obj/item/weapon/extinguisher/has_extinguisher = new/obj/item/weapon/extinguisher + var/obj/item/weapon/extinguisher/has_extinguisher var/opened = 0 +/obj/structure/extinguisher_cabinet/New(loc, ndir, building) + ..() + if(building) + dir = ndir + pixel_x = (dir & 3)? 0 : (dir == 4 ? -27 : 27) + pixel_y = (dir & 3)? (dir ==1 ? -30 : 30) : 0 + opened = 1 + icon_state = "extinguisher_empty" + else + has_extinguisher = new /obj/item/weapon/extinguisher(src) /obj/structure/extinguisher_cabinet/ex_act(severity, target) switch(severity) @@ -24,16 +34,26 @@ return -/obj/structure/extinguisher_cabinet/attackby(obj/item/O, mob/user, params) +/obj/structure/extinguisher_cabinet/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/wrench) && !has_extinguisher) + user << "You start unsecuring [name]..." + playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) + if(do_after(user, 60/I.toolspeed, target = src)) + playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1) + user << "You unsecure [name]." + new /obj/item/wallframe/extinguisher_cabinet(loc) + qdel(src) + return + if(isrobot(user) || isalien(user)) return - if(istype(O, /obj/item/weapon/extinguisher)) + if(istype(I, /obj/item/weapon/extinguisher)) if(!has_extinguisher && opened) if(!user.drop_item()) return - contents += O - has_extinguisher = O - user << "You place [O] in [src]." + contents += I + has_extinguisher = I + user << "You place [I] in [src]." else opened = !opened else @@ -84,3 +104,10 @@ icon_state = "extinguisher_full" else icon_state = "extinguisher_empty" + +/obj/item/wallframe/extinguisher_cabinet + name = "extinguisher cabinet frame" + desc = "Used for building wall-mounted extinguisher cabinets." + icon = 'icons/obj/apc_repair.dmi' + icon_state = "extinguisher_frame" + result_path = /obj/structure/extinguisher_cabinet diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 1a1ece0837b..199c3ddae49 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -264,23 +264,27 @@ canSmoothWith = null health = 50 -/obj/structure/table/glass/tablepush(obj/item/I, mob/user) - if(..()) - visible_message("[src] breaks!") - playsound(src.loc, "shatter", 50, 1) - new frame(src.loc) - new /obj/item/weapon/shard(src.loc) - qdel(src) +/obj/structure/table/glass/Crossed(atom/movable/AM) + . = ..() + if(flags & NODECONSTRUCT) + return + // Don't break if they're just flying past + if(AM.throwing) + return + if(istype(AM, /mob/living)) + var/mob/living/M = AM + if(has_gravity(M) && M.mob_size > MOB_SIZE_SMALL) + table_shatter(M) -/obj/structure/table/glass/climb_structure(mob/user) - if(..()) - visible_message("[src] breaks!") - playsound(src.loc, "shatter", 50, 1) - new frame(src.loc) - new /obj/item/weapon/shard(src.loc) - qdel(src) - user.Weaken(5) +/obj/structure/table/glass/proc/table_shatter(mob/M) + visible_message("[src] breaks!") + playsound(src.loc, "shatter", 50, 1) + new frame(src.loc) + var/obj/item/weapon/shard/S = new(src.loc) + S.throw_impact(M) + M.Weaken(5) + qdel(src) /* * Wooden tables diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 39d63affdfe..099f0da18fa 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -425,7 +425,7 @@ user << "You fill [RG] from [src]." return 1 - else if(istype(O, /obj/item/weapon/melee/baton)) + if(istype(O, /obj/item/weapon/melee/baton)) var/obj/item/weapon/melee/baton/B = O if(B.bcell) if(B.bcell.charge > 0 && B.status == 1) @@ -440,12 +440,12 @@ playsound(src, "sparks", 50, 1) return - else if(istype(O, /obj/item/weapon/mop)) + if(istype(O, /obj/item/weapon/mop)) O.reagents.add_reagent("water", 5) user << "You wet [O] in [src]." playsound(loc, 'sound/effects/slosh.ogg', 25, 1) - else if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube)) + if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube)) var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/M = O user << "You place [src] under a stream of water..." user.drop_item() @@ -453,22 +453,21 @@ M.Expand() return - var/obj/item/I = O - if(!I || !istype(I)) + if(!istype(O)) return - if(I.flags & ABSTRACT) //Abstract items like grabs won't wash. No-drop items will though because it's still technically an item in your hand. + if(O.flags & ABSTRACT) //Abstract items like grabs won't wash. No-drop items will though because it's still technically an item in your hand. return if(user.a_intent != "harm") - user << "You start washing [I]..." + user << "You start washing [O]..." busy = 1 if(!do_after(user, 40, target = src)) busy = 0 return 1 busy = 0 O.clean_blood() - user.visible_message("[user] washes [I] using [src].", \ - "You wash [I] using [src].") + user.visible_message("[user] washes [O] using [src].", \ + "You wash [O] using [src].") return 1 else return ..() diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index e701e606b97..d56212c5835 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -185,7 +185,7 @@ else if(!reinf) user << (anchored ? "You begin to unscrew the window from the floor..." : "You begin to screw the window to the floor...") - if(do_after(user, 40/I.toolspeed, target = src)) + if(do_after(user, 30/I.toolspeed, target = src)) if(reinf && (state == 1 || state == 2)) //If state was unfastened, fasten it, else do the reverse state = (state == 1 ? 2 : 1) diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index 1094c43a496..068f0b945a6 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -96,19 +96,39 @@ wet_overlay = null var/turf/open/floor/F = src if(istype(F)) - wet_overlay = image('icons/effects/water.dmi', src, "wet_floor_static") + if(wet_setting == TURF_WET_ICE) + wet_overlay = image('icons/turf/overlays.dmi', src, "snowfloor") + else + wet_overlay = image('icons/effects/water.dmi', src, "wet_floor_static") else wet_overlay = image('icons/effects/water.dmi', src, "wet_static") overlays += wet_overlay - spawn(rand(790, 820)) // Purely so for visual effect - if(!istype(src, /turf)) //Because turfs don't get deleted, they change, adapt, transform, evolve and deform. they are one and they are all. - return - MakeDry(wet_setting) + if(wet < TURF_WET_ICE) + addtimer(src, "MakeDry", rand(790, 820)) /turf/open/proc/MakeDry(wet_setting = TURF_WET_WATER) - if(wet > wet_setting) + if(!istype(src, /turf)) //Because turfs don't get deleted, they change, adapt, transform, evolve and deform. they are one and they are all. return - wet = TURF_DRY - if(wet_overlay) - overlays -= wet_overlay \ No newline at end of file + if(wet > wet_setting || !wet) + return + if(wet == TURF_WET_PERMAFROST) + wet = TURF_WET_ICE + else + wet = TURF_DRY + if(wet_overlay) + overlays -= wet_overlay + +/turf/open/proc/HandleWet() + if(!istype(src, /turf)) + return + if(!wet || wet > TURF_WET_ICE) + return + if(air.temperature < T0C && wet != TURF_WET_ICE) + MakeDry(TURF_WET_ICE) + MakeSlippery(TURF_WET_ICE) + else if (wet == TURF_WET_ICE) + MakeDry(TURF_WET_ICE) + MakeSlippery(TURF_WET_WATER) + else if (air.temperature > T0C + 40) // Warm rooms will dry up rather quickly. + addtimer(src, "MakeDry", 100, 1, TURF_WET_ICE) diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index c528d622549..c8b395a0c84 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -69,7 +69,7 @@ temperature = 180 baseturf = /turf/open/floor/plating/ice slowdown = 1 - wet = TURF_WET_ICE + wet = TURF_WET_PERMAFROST /turf/open/floor/plating/ice/colder temperature = 140 diff --git a/code/game/turfs/simulated/river.dm b/code/game/turfs/simulated/river.dm index b102cb7ce75..50a7d92bcf7 100644 --- a/code/game/turfs/simulated/river.dm +++ b/code/game/turfs/simulated/river.dm @@ -4,11 +4,11 @@ #define RANDOM_LOWER_X 50 #define RANDOM_LOWER_Y 50 -/proc/spawn_rivers(target_z = 5, nodes = 4, turf_type = /turf/open/floor/plating/lava/smooth/lava_land_surface, whitelist_area = /area/lavaland/surface/outdoors) +/proc/spawn_rivers(target_z = 5, nodes = 4, turf_type = /turf/open/floor/plating/lava/smooth/lava_land_surface, whitelist_area = /area/lavaland/surface/outdoors, min_x = RANDOM_LOWER_X, min_y = RANDOM_LOWER_Y, max_x = RANDOM_UPPER_X, max_y = RANDOM_UPPER_Y) var/list/river_nodes = list() var/num_spawned = 0 while(num_spawned < nodes) - var/turf/F = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), target_z) + var/turf/F = locate(rand(min_x, max_x), rand(min_y, max_y), target_z) river_nodes += new /obj/effect/landmark/river_waypoint(F) num_spawned++ diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index d59cc3f0462..ea8622dd70b 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -105,7 +105,7 @@ M.inertia_dir = 0 if(TURF_WET_LUBE) M.slip(0, 7, null, (SLIDE|GALOSHES_DONT_HELP)) - if(TURF_WET_ICE) + if(TURF_WET_ICE || TURF_WET_PERMAFROST) M.slip(0, 4, null, (SLIDE|NO_SLIP_WHEN_WALKING)) /turf/proc/is_plasteel_floor() diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 032be33b187..60129c99d52 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -6,6 +6,10 @@ var/global/BSACooldown = 0 msg = "ADMIN LOG: [msg]" admins << msg +/proc/relay_msg_admins(msg) + msg = "RELAY: [msg]" + admins << msg + ///////////////////////////////////////////////////////////////////////////////////////////////Panels diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index d0aae03c7b1..b8e4aee8728 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -474,6 +474,8 @@ var/mob/M = N.current if(M) dat += "Red Deity: [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""]" + dat += "PM" + dat += "FLW" dat += "" if(ticker.mode.blue_deities.len) @@ -482,6 +484,8 @@ var/mob/M = N.current if(M) dat += "Blue Deity: [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""]" + dat += "PM" + dat += "FLW" dat += "" if(ticker.mode.red_deity_prophets.len) @@ -490,6 +494,8 @@ var/mob/M = N.current if(M) dat += "Red Deity Prophet: [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""]" + dat += "PM" + dat += "FLW" dat += "" if(ticker.mode.blue_deity_prophets.len) @@ -498,6 +504,8 @@ var/mob/M = N.current if(M) dat += "Blue Deity Prophet: [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""]" + dat += "PM" + dat += "FLW" dat += "" if(ticker.mode.red_deity_followers.len) @@ -506,6 +514,8 @@ var/mob/M = N.current if(M) dat += "Red Deity Followers: [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""]" + dat += "PM" + dat += "FLW" dat += "" if(ticker.mode.blue_deity_followers.len) @@ -514,6 +524,8 @@ var/mob/M = N.current if(M) dat += "Blue Deity Followers: [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""]" + dat += "PM" + dat += "FLW" dat += "" if(ticker.mode.traitors.len > 0) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 16d57a12677..1776f8106b5 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -137,12 +137,26 @@ var/list/adm = get_admin_counts(requiredflags) . = adm["present"] if(. <= 0) + var/final = "" if(!adm["afk"] && !adm["stealth"] && !adm["noflags"]) - send2irc(source, "[msg] - No admins online") + final = "[msg] - No admins online" else - send2irc(source, "[msg] - All admins AFK ([adm["afk"]]/[adm["total"]]), stealthminned ([adm["stealth"]]/[adm["total"]]), or lack[rights2text(requiredflags, " ")] ([adm["noflags"]]/[adm["total"]])") + final = "[msg] - All admins AFK ([adm["afk"]]/[adm["total"]]), stealthminned ([adm["stealth"]]/[adm["total"]]), or lack[rights2text(requiredflags, " ")] ([adm["noflags"]]/[adm["total"]])" + send2irc(source,final) + send2otherserver(source,final) + /proc/send2irc(msg,msg2) if(config.useircbot) shell("python nudge.py [msg] [msg2]") return + +/proc/send2otherserver(source,msg,type = "Ahelp") + if(global.cross_allowed) + var/list/message = list() + message["message"] = "[source]: [msg]" + message["source"] = "([config.cross_name])" + message["key"] = global.comms_key + message["crossmessage"] = type + + world.Export("[global.cross_address]?[list2params(message)]") \ No newline at end of file diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index 308489beabe..8ff8989edc3 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -5,7 +5,7 @@ var/list/forbidden_varedit_object_types = list( /datum/admin_rank //editing my own rank? it's more likely than you think ) -var/list/VVlocked = list("vars", "client", "virus", "viruses", "cuffed", "last_eaten", "unlock_content", "step_x", "step_y", "force_ending") +var/list/VVlocked = list("vars", "var_edited", "client", "virus", "viruses", "cuffed", "last_eaten", "unlock_content", "step_x", "step_y", "force_ending") var/list/VVicon_edit_lock = list("icon", "icon_state", "overlays", "underlays", "resize") var/list/VVckey_edit = list("key", "ckey") diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index a0e9c90e029..cbc9232520c 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -192,6 +192,7 @@ if(air.temperature > MINIMUM_TEMPERATURE_START_SUPERCONDUCTION) if(consider_superconductivity(starting = 1)) remove = 0 + HandleWet() // if the tile is wet, and cold, make ice. Or if it's wet, and warm, dry it off. if(!our_excited_group && remove == 1) SSair.remove_from_active(src) diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 7108940c287..094bcb2cc40 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -284,6 +284,7 @@ health = INFINITY maxhealth = INFINITY var/team = WHITE_TEAM + constructable = FALSE time_between_triggers = 1 alpha = 255 diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 7e7ffc7b3ff..7e1e469d3b0 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -382,12 +382,27 @@ /obj/effect/mob_spawn/human/bartender/alive death = FALSE roundstart = FALSE - mob_name = "Space Bartender" - name = "sleeper" + random = TRUE + name = "bartender sleeper" icon = 'icons/obj/Cryogenic2.dmi' icon_state = "sleeper" flavour_text = "You are a space bartender!" +/obj/effect/mob_spawn/human/beach + glasses = /obj/item/clothing/glasses/sunglasses + uniform = /obj/item/clothing/under/shorts/red + pocket1 = /obj/item/weapon/storage/wallet/random + +/obj/effect/mob_spawn/human/beach/alive + death = FALSE + roundstart = FALSE + random = TRUE + mob_name = "Beach Bum" + name = "beach bum sleeper" + icon = 'icons/obj/Cryogenic2.dmi' + icon_state = "sleeper" + flavour_text = "You are a beach bum!" + /////////////////Officers+Nanotrasen Security////////////////////// /obj/effect/mob_spawn/human/bridgeofficer diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index 14b4e403839..35dcdc3b70d 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -124,7 +124,7 @@ obj/item/weapon/paper/crumpled/snowdin/shovel /obj/item/weapon/storage/firstaid/brute = 27, /obj/item/weapon/storage/firstaid/fire = 27, /obj/item/weapon/storage/toolbox/syndicate = 12, - /obj/item/weapon/c4 = 7, + /obj/item/weapon/grenade/plastic/c4 = 7, /obj/item/weapon/grenade/clusterbuster/smoke = 15, /obj/item/clothing/under/chameleon = 13, /obj/item/clothing/shoes/chameleon = 10, diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 97d8066f690..ef1c1ef85cd 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1317,6 +1317,7 @@ /obj/item/clothing/head/collectable/wizard, /obj/item/clothing/head/collectable/hardhat, /obj/item/clothing/head/collectable/HoS, + /obj/item/clothing/head/collectable/HoP, /obj/item/clothing/head/collectable/thunderdome, /obj/item/clothing/head/collectable/swat, /obj/item/clothing/head/collectable/slime, @@ -1418,3 +1419,18 @@ /obj/item/ammo_box/magazine/toy/pistol, /obj/item/ammo_box/magazine/toy/pistol) crate_name = "foam force crate" + +/datum/supply_pack/misc/artsupply + name = "Art Supplies" + cost = 800 + contains = list(/obj/structure/easel, + /obj/structure/easel, + /obj/item/weapon/canvas/nineteenXnineteen, + /obj/item/weapon/canvas/nineteenXnineteen, + /obj/item/weapon/canvas/twentythreeXnineteen, + /obj/item/weapon/canvas/twentythreeXnineteen, + /obj/item/weapon/canvas/twentythreeXtwentythree, + /obj/item/weapon/canvas/twentythreeXtwentythree, + /obj/item/toy/crayon/rainbow, + /obj/item/toy/crayon/rainbow) + crate_name= "art supply crate" diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 6f8f9f0b464..c459acf5217 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -19,6 +19,38 @@ var/gang //Is this a gang outfit? var/scan_reagents = 0 //Can the wearer see reagents while it's equipped? + //Var modification - PLEASE be careful with this I know who you are and where you live + var/list/user_vars_to_edit = list() //VARNAME = VARVALUE eg: "name" = "butts" + var/list/user_vars_remembered = list() //Auto built by the above + dropped() + equipped() + + +/obj/item/clothing/Destroy() + dropped() + user_vars_remembered = null //Oh god somebody put REFERENCES in here? not to worry, we'll clean it up + return ..() + + +/obj/item/clothing/dropped(mob/user) + ..() + if(user_vars_remembered && user_vars_remembered.len) + for(var/variable in user_vars_remembered) + if(variable in user.vars) + if(user.vars[variable] == user_vars_to_edit[variable]) //Is it still what we set it to? (if not we best not change it) + user.vars[variable] = user_vars_remembered[variable] + user_vars_remembered = list() + + +/obj/item/clothing/equipped(mob/user, slot) + ..() + + if(slot_flags & slotdefine2slotbit(slot)) //Was equipped to a valid slot for this item? + for(var/variable in user_vars_to_edit) + if(variable in user.vars) + user_vars_remembered[variable] = user.vars[variable] + user.vars[variable] = user_vars_to_edit[variable] + + + //Ears: currently only used for headsets and earmuffs /obj/item/clothing/ears name = "ears" diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index 54b704195e2..c969147f9a3 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -126,6 +126,12 @@ desc = "Now you too can beat prisoners, set silly sentences, and arrest for no reason!" icon_state = "hoscap" +/obj/item/clothing/head/collectable/HoP + name = "collectable HoP hat" + desc = "It's your turn to demand excessive paperwork, signatures, stamps, and hire more clowns! Papers, please!" + icon_state = "hopcap" + dog_fashion = /datum/dog_fashion/head/hop + /obj/item/clothing/head/collectable/thunderdome name = "collectable Thunderdome helmet" desc = "Go Red! I mean Green! I mean Red! No Green!" diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index e32ca287c73..e1f8ad0bdcc 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -167,7 +167,7 @@ sec_briefcase.handle_item_insertion(new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow,1) sec_briefcase.handle_item_insertion(new /obj/item/weapon/gun/projectile/revolver/mateba,1) sec_briefcase.handle_item_insertion(new /obj/item/ammo_box/a357,1) - sec_briefcase.handle_item_insertion(new /obj/item/weapon/c4,1) + sec_briefcase.handle_item_insertion(new /obj/item/weapon/grenade/plastic/x4,1) var/obj/item/device/pda/heads/pda = H.belt pda.owner = H.real_name @@ -347,7 +347,7 @@ /obj/item/weapon/storage/firstaid/regular=1,\ /obj/item/weapon/storage/box/flashbangs=1,\ /obj/item/device/flashlight=1,\ - /obj/item/weapon/c4=1) + /obj/item/weapon/grenade/plastic/x4=1) /datum/outfit/death_commando/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) if(visualsOnly) diff --git a/code/modules/clothing/shoes/bananashoes.dm b/code/modules/clothing/shoes/bananashoes.dm index 0f7accc2e5d..da3698024d0 100644 --- a/code/modules/clothing/shoes/bananashoes.dm +++ b/code/modules/clothing/shoes/bananashoes.dm @@ -20,10 +20,11 @@ else footstep++ - new/obj/item/weapon/grown/bananapeel/specialpeel(get_step(src,turn(usr.dir, 180)), 5) //honk + new/obj/item/weapon/grown/bananapeel/specialpeel(get_step(src,turn(usr.dir, 180))) //honk bananium.use_amount_type(100, MAT_BANANIUM) if(bananium.amount(MAT_BANANIUM) < 100) on = !on + flags &= ~NOSLIP update_icon() loc << "You ran out of bananium!" else @@ -37,8 +38,6 @@ user << "You cannot retrieve any bananium from the prototype shoes." /obj/item/clothing/shoes/clown_shoes/banana_shoes/attackby(obj/item/O, mob/user, params) - if(!istype(O,/obj/item/stack/sheet)) - return if(!bananium.get_item_material_amount(O)) user << "This item has no bananium!" return @@ -46,10 +45,10 @@ user << "You can't drop [O]!" return - var/obj/item/stack/sheet/S = O - var/sheet_amount = bananium.insert_stack(O,S.amount) - if(sheet_amount) - user << "You insert [sheet_amount] bananium sheets into the prototype shoes." + var/bananium_amount = bananium.insert_item(O) + if(bananium_amount) + user << "You insert [O] into the prototype shoes." + qdel(O) else user << "You are unable to insert more bananium!" @@ -63,6 +62,10 @@ on = !on update_icon() user << "You [on ? "activate" : "deactivate"] the prototype shoes." + if(on) + flags |= NOSLIP + else + flags &= ~NOSLIP else user << "You need bananium to turn the prototype shoes on!" diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 6e15dfebe7a..2dd3343470f 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -12,12 +12,17 @@ /obj/item/clothing/suit/armor/vest name = "armor" desc = "A slim armored vest that protects against most types of damage." - icon_state = "armor" - item_state = "armor" + icon_state = "armoralt" + item_state = "armoralt" blood_overlay_type = "armor" armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0) dog_fashion = /datum/dog_fashion/back +/obj/item/clothing/suit/armor/vest/alt + desc = "An armored vest that protects against most types of damage." + icon_state = "armor" + item_state = "armor" + /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." @@ -40,8 +45,8 @@ /obj/item/clothing/suit/armor/vest/warden name = "warden's jacket" - desc = "A red jacket with silver rank pips and body armor strapped on top." - icon_state = "warden_jacket" + desc = "A navy-blue armored jacket with blue shoulder designations and '/Warden/' stitched into one of the chest pockets." + icon_state = "warden_alt" item_state = "armor" body_parts_covered = CHEST|GROIN|ARMS cold_protection = CHEST|GROIN|ARMS|HANDS @@ -52,8 +57,8 @@ /obj/item/clothing/suit/armor/vest/warden/alt name = "warden's armored jacket" - desc = "A navy-blue armored jacket with blue shoulder designations and '/Warden/' stitched into one of the chest pockets." - icon_state = "warden_alt" + desc = "A red jacket with silver rank pips and body armor strapped on top." + icon_state = "warden_jacket" /obj/item/clothing/suit/armor/vest/leather name = "security overcoat" diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm index f74ff4feb36..b91ac8ab04f 100644 --- a/code/modules/clothing/suits/cloaks.dm +++ b/code/modules/clothing/suits/cloaks.dm @@ -5,9 +5,18 @@ desc = "It's a cape that can be worn on your back." icon = 'icons/obj/clothing/cloaks.dmi' icon_state = "qmcloak" + item_state = "qmcloak" w_class = 2 body_parts_covered = CHEST|GROIN|LEGS|ARMS +/obj/item/clothing/head/cloakhood + name = "cloak hood" + icon = 'icons/obj/clothing/hats.dmi' + icon_state = "golhood" + desc = "A hood for a cloak" + body_parts_covered = HEAD + flags = NODROP + flags_inv = HIDEHAIR|HIDEEARS /obj/item/clothing/cloak/suicide_act(mob/user) user.visible_message("[user] is strangling themself with [src]! It looks like they're trying to commit suicide.") @@ -52,6 +61,27 @@ allowed = list(/obj/item/weapon/gun/energy/laser/captain) armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 10, rad = 10) +/obj/item/clothing/suit/hooded/cloak/drake + name = "ash drake hide cloak" + icon_state = "golclo" + desc = "A cloak fashioned from the hide of an ash drake, offers incredible defense while still remaining lightweight. " + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals, /obj/item/weapon/resonator, /obj/item/device/mining_scanner, /obj/item/device/t_scanner/adv_mining_scanner, /obj/item/weapon/gun/energy/kinetic_accelerator, /obj/item/weapon/pickaxe, /obj/item/weapon/twohanded/spear) + armor = list(melee = 70, bullet = 30, laser = 50, energy = 40, bomb = 70, bio = 60, rad = 50) + hooded = 1 + hoodtype = /obj/item/clothing/head/cloakhood/drake + heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS + max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + unacidable = 1 + +/obj/item/clothing/head/cloakhood/drake + name = "ash drake hide hood" + icon_state = "golhood" + desc = "A stiff hood made of ash drake hide." + armor = list(melee = 70, bullet = 30, laser = 50, energy = 40, bomb = 70, bio = 60, rad = 50) + heat_protection = HEAD + max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT + unacidable = 1 + /* //wip /obj/item/clothing/cloak/wizard //Not actually obtainable until proper balancing can be done name = "cloak of invisibility" diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index ae65b790782..d3bb738735c 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -5,7 +5,7 @@ item_state = "labcoat" blood_overlay_type = "coat" body_parts_covered = CHEST|ARMS - allowed = list(/obj/item/device/analyzer,/obj/item/stack/medical,/obj/item/weapon/dnainjector,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/hypospray,/obj/item/device/healthanalyzer,/obj/item/device/flashlight/pen,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/pill,/obj/item/weapon/storage/pill_bottle,/obj/item/weapon/paper,/obj/item/weapon/melee/classic_baton/telescopic,/obj/item/weapon/soap,/obj/item/device/sensor_device) + allowed = list(/obj/item/device/analyzer,/obj/item/stack/medical,/obj/item/weapon/dnainjector,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/hypospray,/obj/item/device/healthanalyzer,/obj/item/device/flashlight/pen,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/pill,/obj/item/weapon/storage/pill_bottle,/obj/item/weapon/paper,/obj/item/weapon/melee/classic_baton/telescopic,/obj/item/weapon/soap,/obj/item/device/sensor_device,/obj/item/weapon/tank/internals/emergency_oxygen) armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 0) togglename = "buttons" diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 1842f608827..9fcc55c5ad1 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -490,3 +490,10 @@ /obj/item/clothing/head/winterhood/miner icon_state = "winterhood_miner" + +/obj/item/clothing/suit/spookyghost + name = "spooky ghost" + desc = "this is obviously just a bedsheet, but maybe try it on?" + icon_state = "bedsheet" + user_vars_to_edit = list("name" = "Spooky Ghost", "real_name" = "Spooky Ghost" , "incorporeal_move" = 1, "appearance_flags" = KEEP_TOGETHER|TILE_BOUND, "alpha" = 150) + alternate_worn_layer = ABOVE_BODY_FRONT_LAYER //so the bedsheet goes over everything but fire diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index 975af383f15..6f7f9224e6e 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -13,17 +13,17 @@ name = "security jumpsuit" desc = "A tactical security jumpsuit for officers complete with nanotrasen belt buckle." icon_state = "security" - item_state = "r_suit" + item_state = "gy_suit" item_color = "security" armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) strip_delay = 50 alt_covers_chest = 1 /obj/item/clothing/under/rank/warden - name = "warden's jumpsuit" - desc = "A tactical security jumpsuit for the warden with silver desginations and '/Warden/' stiched into the shoulders." + name = "security suit" + desc = "A formal security suit for officers complete with nanotrasen belt buckle." icon_state = "warden" - item_state = "r_suit" + item_state = "gy_suit" item_color = "warden" armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) strip_delay = 50 @@ -57,7 +57,7 @@ name = "head of security's jumpsuit" desc = "A security jumpsuit decorated for those few with the dedication to achieve the position of Head of Security." icon_state = "hos" - item_state = "r_suit" + item_state = "gy_suit" item_color = "hos" armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) strip_delay = 60 diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 8c1d307d5e5..2c68ecb4ff9 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -31,7 +31,7 @@ category = CAT_WEAPON /datum/table_recipe/lance - name = "explosive lance (grenade)" + name = "explosive lance" result = /obj/item/weapon/twohanded/spear reqs = list(/obj/item/weapon/twohanded/spear = 1, /obj/item/weapon/grenade = 1) @@ -39,15 +39,6 @@ time = 15 category = CAT_WEAPON -/datum/table_recipe/lance2 - name = "explosive lance (C4)" - result = /obj/item/weapon/twohanded/spear - reqs = list(/obj/item/weapon/twohanded/spear = 1, - /obj/item/weapon/c4 = 1) - parts = list(/obj/item/weapon/c4 = 1) - time = 40 - category = CAT_WEAPON - /datum/table_recipe/molotov name = "Molotov" @@ -321,11 +312,11 @@ category = CAT_MISC /datum/table_recipe/chemical_payload - name = "chemical payload (C4)" + name = "Chemical Payload (C4)" result = /obj/item/weapon/bombcore/chemical reqs = list( - /obj/item/weapon/stock_parts/matter_bin/super = 1, - /obj/item/weapon/c4 = 1, + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/grenade/plastic/c4 = 1, /obj/item/weapon/grenade/chem_grenade = 2 ) parts = list(/obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/grenade/chem_grenade = 2) @@ -333,7 +324,7 @@ category = CAT_WEAPON /datum/table_recipe/chemical_payload2 - name = "chemical payload (gibtonite)" + name = "Chemical Payload (gibtonite)" result = /obj/item/weapon/bombcore/chemical reqs = list( /obj/item/weapon/stock_parts/matter_bin = 1, @@ -372,4 +363,13 @@ result = /obj/item/clothing/head/helmet/skull time = 30 reqs = list(/obj/item/stack/sheet/bone = 4) + category = CAT_PRIMAL + +/datum/table_recipe/drakecloak + name = "Ash Drake Cloak" + result = /obj/item/clothing/suit/hooded/cloak/drake + time = 60 + reqs = list(/obj/item/stack/sheet/bone = 10, + /obj/item/stack/sheet/sinew = 2, + /obj/item/stack/sheet/animalhide/ashdrake = 5) category = CAT_PRIMAL \ No newline at end of file diff --git a/code/modules/events/wizard/greentext.dm b/code/modules/events/wizard/greentext.dm index 31123ef86ce..cd4911f231a 100644 --- a/code/modules/events/wizard/greentext.dm +++ b/code/modules/events/wizard/greentext.dm @@ -28,6 +28,7 @@ var/mob/living/last_holder var/mob/living/new_holder var/list/color_altered_mobs = list() + burn_state = FIRE_PROOF /obj/item/weapon/greentext/New() ..() @@ -75,6 +76,8 @@ last_holder = new_holder //long live the king /obj/item/weapon/greentext/Destroy() + if(burn_state != ON_FIRE) + return QDEL_HINT_LETMELIVE poi_list.Remove(src) for(var/mob/M in mob_list) var/message = "A dark temptation has passed from this world" @@ -83,4 +86,4 @@ M.color = initial(M.color) message += "..." M << message - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 70c2a6f2870..9eca1592029 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -467,9 +467,9 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite /obj/item/weapon/cartridge/syndicate, /obj/item/clothing/under/chameleon,\ /obj/item/clothing/shoes/chameleon, /obj/item/weapon/card/id/syndicate,\ /obj/item/clothing/mask/chameleon, /obj/item/clothing/glasses/thermal,\ - /obj/item/device/chameleon, /obj/item/weapon/card/emag,\ + /obj/item/device/chameleon, /obj/item/weapon/card/emag, /obj/item/weapon/grenade/plastic/x4,\ /obj/item/weapon/storage/toolbox/syndicate, /obj/item/weapon/aiModule,\ - /obj/item/device/radio/headset/syndicate, /obj/item/weapon/c4,\ + /obj/item/device/radio/headset/syndicate, /obj/item/weapon/grenade/plastic/c4,\ /obj/item/device/powersink, /obj/item/weapon/storage/box/syndie_kit,\ /obj/item/toy/syndicateballoon, /obj/item/weapon/gun/energy/laser/captain,\ /obj/item/weapon/hand_tele, /obj/item/weapon/rcd, /obj/item/weapon/tank/jetpack,\ @@ -642,7 +642,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite halitem.icon_state = "revolver" halitem.name = "Revolver" if(2) //c4 - halitem.icon = 'icons/obj/assemblies.dmi' + halitem.icon = 'icons/obj/grenade.dmi' halitem.icon_state = "plastic-explosive0" halitem.name = "Mysterious Package" if(prob(25)) @@ -685,7 +685,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite halimage = image('icons/effects/fire.dmi',target,"1",TURF_LAYER) if(3) //src << "C4" - halimage = image('icons/obj/assemblies.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01) + halimage = image('icons/obj/grenade.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01) if(client) client.images += halimage diff --git a/code/modules/food&drinks/drinks/drinks/bottle.dm b/code/modules/food&drinks/drinks/drinks/bottle.dm index 0ad2bf77c07..c71b1aa2a71 100644 --- a/code/modules/food&drinks/drinks/drinks/bottle.dm +++ b/code/modules/food&drinks/drinks/drinks/bottle.dm @@ -236,16 +236,58 @@ list_reagents = list("wine" = 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe - name = "T&T Extra-Strong Absinthe" - desc = "An strong alcoholic drink brewed and distributed by Terb & Tonte Inc." + name = "Extra-Strong Absinthe" + desc = "An strong alcoholic drink brewed and distributed by" icon_state = "absinthebottle" list_reagents = list("absinthe" = 100) +/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe/New() + ..() + redact() + +/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe/proc/redact() + // There was a large fight in the coderbus about a player reference + // in absinthe. Ergo, this is why the name generation is now so + // complicated. Judge us kindly. + var/shortname = pickweight( + list("T&T" = 1, "A&A" = 1, "Generic" = 1)) + var/fullname + switch(shortname) + if("T&T") + fullname = "Teal and Tealer" + if("A&A") + fullname = "Ash and Asher" + if("Generic") + fullname = "Nanotrasen Cheap Imitations" + var/removals = list("\[REDACTED\]", "\[EXPLETIVE DELETED\]", + "\[EXPUNGED\]", "\[INFORMATION ABOVE YOUR SECURITY CLEARANCE\]", + "\[MOVE ALONG CITIZEN\]", "\[NOTHING TO SEE HERE\]") + var/chance = 50 + + if(prob(chance)) + shortname = pick_n_take(removals) + + var/list/final_fullname = list() + for(var/word in splittext(fullname, " ")) + if(prob(chance)) + word = pick_n_take(removals) + final_fullname += word + + fullname = jointext(final_fullname, " ") + + // Actually finally setting the new name and desc + name = "[shortname] [name]" + desc = "[desc] [fullname] Inc." + + /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe/premium name = "Gwyn's Premium Absinthe" desc = "A potent alcoholic beverage, almost makes you forget the ash in your lungs." icon_state = "absinthepremium" +/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe/premium/redact() + return + //////////////////////////JUICES AND STUFF /////////////////////// /obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice diff --git a/code/modules/food&drinks/food/snacks_other.dm b/code/modules/food&drinks/food/snacks_other.dm index 21d3b51ff7d..babef429153 100644 --- a/code/modules/food&drinks/food/snacks_other.dm +++ b/code/modules/food&drinks/food/snacks_other.dm @@ -308,4 +308,11 @@ icon_state = "honeybar" bonus_reagents = list("nutriment" = 2, "honey" = 2, "vitamin" = 2) list_reagents = list("nutriment" = 5, "honey" = 5) - filling_color = "#F2CE91" \ No newline at end of file + filling_color = "#F2CE91" + +/obj/item/weapon/reagent_containers/food/snacks/stuffedlegion + name = "stuffed legion" + desc = "The former skull of a damned human, filled with goliath meat. It has a decorative lava pool made of ketchup and hotsauce." + icon_state = "stuffed_legion" + bonus_reagents = list("vitamin" = 3, "capsaicin" = 1, "tricordrazine" = 5) + list_reagents = list("nutriment" = 5, "vitamin" = 5, "capsaicin" = 2, "tricordrazine" = 10,) \ No newline at end of file diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_misc.dm index 8db215dae2c..6f299b87d31 100644 --- a/code/modules/food&drinks/recipes/tablecraft/recipes_misc.dm +++ b/code/modules/food&drinks/recipes/tablecraft/recipes_misc.dm @@ -256,4 +256,17 @@ /datum/reagent/consumable/honey = 5 ) result = /obj/item/weapon/reagent_containers/food/snacks/honeybar + category = CAT_FOOD + + +/datum/table_recipe/stuffedlegion + name = "Stuffed legion" + time = 40 + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/meat/steak/goliath = 1, + /obj/item/weapon/legion_skull = 1, + /datum/reagent/consumable/ketchup = 2, + /datum/reagent/consumable/capsaicin = 2 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/stuffedlegion category = CAT_FOOD \ No newline at end of file diff --git a/code/modules/games/cas.dm b/code/modules/games/cas.dm index f4798b32f4e..8f1616f882e 100644 --- a/code/modules/games/cas.dm +++ b/code/modules/games/cas.dm @@ -53,6 +53,7 @@ var/global/list/cards_against_space P.name = "Blank Card" P.card_icon = "cas_white" cards += P + shuffle(cards) // distribute blank cards throughout deck /obj/item/toy/cards/deck/cas/attack_hand(mob/user) if(user.lying) @@ -75,6 +76,21 @@ var/global/list/cards_against_space user.visible_message("[user] draws a card from the deck.", "You draw a card from the deck.") update_icon() +/obj/item/toy/cards/deck/cas/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/toy/cards/singlecard/cas)) + var/obj/item/toy/cards/singlecard/cas/SC = I + if(!user.unEquip(SC)) + user << "The card is stuck to your hand, you can't add it to the deck!" + return + var/datum/playingcard/RC // replace null datum for the re-added card + RC = new() + RC.name = "[SC.name]" + RC.card_icon = SC.card_face + cards += RC + user.visible_message("[user] adds a card to the bottom of the deck.","You add the card to the bottom of the deck.") + qdel(SC) + update_icon() + /obj/item/toy/cards/deck/cas/update_icon() if(cards.len < 26) icon_state = "deck_[deckstyle]_low" diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm index 343c655a6e7..c5abc2caf69 100644 --- a/code/modules/hydroponics/grown/banana.dm +++ b/code/modules/hydroponics/grown/banana.dm @@ -114,5 +114,7 @@ desc = "A synthetic banana peel." /obj/item/weapon/grown/bananapeel/specialpeel/Crossed(AM) - if(..()) - qdel(src) \ No newline at end of file + if(iscarbon(AM)) + var/mob/living/carbon/carbon = AM + if(carbon.slip(2, 2, src, FALSE)) + qdel(src) \ No newline at end of file diff --git a/code/modules/jobs/job_types/cargo_service.dm b/code/modules/jobs/job_types/cargo_service.dm index 8a7f561fde5..ed87fcae838 100644 --- a/code/modules/jobs/job_types/cargo_service.dm +++ b/code/modules/jobs/job_types/cargo_service.dm @@ -120,7 +120,7 @@ Bartender belt = /obj/item/device/pda/bar ears = /obj/item/device/radio/headset/headset_srv uniform = /obj/item/clothing/under/rank/bartender - suit = /obj/item/clothing/suit/armor/vest + suit = /obj/item/clothing/suit/armor/vest/alt backpack_contents = list(/obj/item/weapon/storage/box/beanbag=1) shoes = /obj/item/clothing/shoes/laceup diff --git a/code/modules/jobs/job_types/security.dm b/code/modules/jobs/job_types/security.dm index e62a8e155a2..457eed53abd 100644 --- a/code/modules/jobs/job_types/security.dm +++ b/code/modules/jobs/job_types/security.dm @@ -99,7 +99,7 @@ Warden shoes = /obj/item/clothing/shoes/jackboots suit = /obj/item/clothing/suit/armor/vest/warden gloves = /obj/item/clothing/gloves/color/black - head = /obj/item/clothing/head/warden + head = /obj/item/clothing/head/beret/sec/navywarden glasses = /obj/item/clothing/glasses/hud/security/sunglasses r_pocket = /obj/item/device/assembly/flash/handheld l_pocket = /obj/item/weapon/restraints/handcuffs diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index 7134b68e214..d5256375e21 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -87,7 +87,16 @@ Doesn't work on other aliens/AI.*/ if(msg) log_say("AlienWhisper: [key_name(user)]->[M.key] : [msg]") M << "You hear a strange, alien voice in your head...[msg]" - user << {"You said: "[msg]" to [M]"} + user << "You said: \"[msg]\" to [M]" + for(var/ded in dead_mob_list) + if(!isobserver(ded)) + continue + ded << "(F) \ + [user] \ + Alien Whisper --> \ + (F) \ + [M] \ + [msg]" else return 0 return 1 @@ -113,7 +122,7 @@ Doesn't work on other aliens/AI.*/ M.adjustPlasma(amount) user.adjustPlasma(-amount) M << "[user] has transfered [amount] plasma to you." - user << {"You trasfer [amount] plasma to [M]"} + user << "You trasfer [amount] plasma to [M]" else user << "You need to be closer!" return diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 2e165aad75c..040046a08dd 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -29,6 +29,10 @@ var/const/MAX_ACTIVE_TIME = 400 var/attached = 0 +/obj/item/clothing/mask/facehugger/lamarr + name = "Lamarr" + sterile = 1 + /obj/item/clothing/mask/facehugger/attack_alien(mob/user) //can be picked up by aliens attack_hand(user) return diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index d019b6e0afb..34d64e5dc01 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -2,19 +2,6 @@ create_reagents(1000) ..() -/mob/living/carbon/prepare_huds() - ..() - prepare_data_huds() - -/mob/living/carbon/proc/prepare_data_huds() - ..() - med_hud_set_health() - med_hud_set_status() - -/mob/living/carbon/updatehealth() - ..() - med_hud_set_health() - /mob/living/carbon/Destroy() for(var/atom/movable/guts in internal_organs) qdel(guts) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index ffe0f5c594a..5baebc33aec 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -1,6 +1,5 @@ /mob/living/carbon gender = MALE - hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD) var/list/stomach_contents = list() var/list/internal_organs = list() //List of /obj/item/organ in the mob. They don't go in the contents for some reason I don't want to know. var/list/internal_organs_slot = list() //Same as above, but stores "slot ID" - "organ" pairs for easy access. diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index 53a05548f6c..3db1d738a96 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -1,8 +1,6 @@ /mob/living/carbon/death(gibbed) silent = 0 losebreath = 0 - med_hud_set_health() - med_hud_set_status() ..() /mob/living/carbon/gib(no_brain, no_organs) diff --git a/code/modules/mob/living/carbon/human/blood.dm b/code/modules/mob/living/carbon/human/blood.dm index 655fcc7b43d..f67b3a4008f 100644 --- a/code/modules/mob/living/carbon/human/blood.dm +++ b/code/modules/mob/living/carbon/human/blood.dm @@ -224,10 +224,10 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 var/datum/reagent/blood/our = get_blood(vessel) - if (!injected || !our) + if (!injected || !our || !dna) return - if(blood_incompatible(injected.data["blood_type"],our.data["blood_type"],injected.data["species"],our.data["species"]) ) + if(blood_incompatible(injected.data["blood_type"], dna.blood_type,injected.data["species"], dna.species.id) ) reagents.add_reagent("toxin",amount * 0.5) our.on_merge(injected.data) //still transfer viruses and such, even if incompatibles bloods reagents.update_total() diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 4a24b88e2b9..ca45f109c58 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -10,7 +10,7 @@ total_burn += BP.burn_dam health = maxHealth - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute update_stat() - if( ((maxHealth - total_burn) < config.health_threshold_dead) && stat == DEAD ) + if(((maxHealth - total_burn) < config.health_threshold_dead) && stat == DEAD ) ChangeToHusk() if(on_fire) shred_clothing() diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index 640b8b7785d..a7beebc5857 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -498,6 +498,8 @@ var/global/image/plasmaman_on_fire = image("icon"='icons/mob/OnFire.dmi', "icon_ /datum/species/plasmaman/before_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE) var/datum/outfit/plasmaman/O = new /datum/outfit/plasmaman H.equipOutfit(O, visualsOnly) + H.internal = H.r_hand + H.update_internals_hud_icon(1) return 0 /datum/species/plasmaman/qualifies_for_rank(rank, list/features) diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index f7c32c1bf69..e9a142ce5a3 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -46,13 +46,6 @@ create_dna(src) dna.initialize_dna(random_blood_type()) -/mob/living/carbon/monkey/prepare_data_huds() - //Prepare our med HUD... - ..() - //...and display it. - for(var/datum/atom_hud/data/human/medical/hud in huds) - hud.add_to_hud(src) - /mob/living/carbon/monkey/movement_delay() if(reagents) if(reagents.has_reagent("morphine")) diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 4f3528aa1ca..e4c1500e632 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -63,3 +63,5 @@ update_damage_hud() update_health_hud() update_canmove() + med_hud_set_health() + med_hud_set_status() diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 70fdee24d9c..8145741e009 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -2,6 +2,8 @@ //Things like airguitar can be done without arms, and the flap thing makes so little sense it's a keeper. //Intended to be called by a higher up emote proc if the requested emote isn't in the custom emotes. + + /mob/living/emote(act, m_type=1, message = null) if(stat) return @@ -13,6 +15,7 @@ param = copytext(act, t1 + 1, length(act) + 1) act = copytext(act, 1, t1) + act = lowertext(act) switch(act)//Hello, how would you like to order? Alphabetically! if ("aflap") if (!src.restrained()) @@ -47,6 +50,10 @@ message = "[src] chokes!" m_type = 2 + if ("cross","crosses") + message = "[src] crosses their arms." + m_type = 2 + if ("chuckle","chuckles") message = "[src] chuckles." m_type = 2 @@ -94,6 +101,10 @@ message = "[src] frowns." m_type = 1 + if ("gag","gags") + message = "[src] gags!" + m_type = 2 + if ("gasp","gasps") message = "[src] gasps!" m_type = 2 @@ -120,10 +131,33 @@ message = "[src] grins." m_type = 1 + if ("groan","groans") + message = "[src] groans!" + m_type = 1 + + + if ("grimace","grimaces") + message = "[src] grimaces." + m_type = 1 + if ("jump","jumps") message = "[src] jumps!" m_type = 1 + if ("kiss","kisses") //S-so forward uwa~ + var/M = null + if (param) + for (var/mob/A in view(1, src)) + if (param == A.name) + M = A + break + if (!M) + param = null + if (param) + message = "[src] blows a kiss to [param]." //I was gonna make this [src] kisses [param] but then I imagined dealing with an ahelp about someone spamming it and following certain players around and I had a miniature stroke. + else + message = "[src] blows a kiss." + if ("laugh","laughs") message = "[src] laughs." m_type = 2 @@ -175,11 +209,18 @@ else pointed(M) m_type = 1 - + if ("pout","pouts") + message = "[src] pouts." + m_type = 2 + if ("scream","screams") message = "[src] screams!" m_type = 2 + if ("scowl","scowls") + message = "[src] scowls." + m_type = 1 + if ("shake","shakes") message = "[src] shakes its head." m_type = 1 @@ -200,6 +241,10 @@ message = "[src] sneezes." m_type = 2 + if ("smug","smugs") + message = "[src] grins smugly." + m_type = 2 + if ("sniff","sniffs") message = "[src] sniffs." m_type = 2 @@ -222,10 +267,29 @@ else message = "[src] stares." + if ("stretch","stretches") + message = "[src] stretches their arms." + m_type = 2 + if ("sulk","sulks") message = "[src] sulks down sadly." m_type = 1 + if ("surrender","surrenders") + message = "[src] puts their hands on their head and falls to the ground, they surrender!" + if(sleeping) + return //Can't surrender while asleep. + Weaken(20) //So you can't resist. + m_type = 1 + + if ("faint","faints") + message = "[src] faints." + if(sleeping) + return //Can't faint while asleep + SetSleeping(10) //Short-short nap + m_type = 1 + + if ("sway","sways") message = "[src] sways around dizzily." m_type = 1 @@ -250,12 +314,16 @@ message = "[src] whimpers." m_type = 2 + if ("wsmile","wsmiles") + message = "[src] smiles weakly." + m_type = 2 + if ("yawn","yawns") message = "[src] yawns." m_type = 2 if ("help") - src << "Help for emotes. You can use these emotes with say \"*emote\":\n\naflap, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, dance, deathgasp, drool, flap, frown, gasp, giggle, glare-(none)/mob, grin, jump, laugh, look, me, nod, point-atom, scream, shake, sigh, sit, smile, sneeze, sniff, snore, stare-(none)/mob, sulk, sway, tremble, twitch, twitch_s, wave, whimper, yawn" + src << "Help for emotes. You can use these emotes with say \"*emote\":\n\naflap, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, cross, dance, deathgasp, drool, flap, frown, gasp, giggle, glare-(none)/mob, grin, grimace, groan, jump, kiss, laugh, look, me, nod, point-atom, scream, shake, sigh, sit, smile, sneeze, sniff, snore, stare-(none)/mob, stretch, sulk, surrender, sway, tremble, twitch, twitch_s, wave, whimper, wsmile, yawn" else src << "Unusable emote '[act]'. Say *help for a list." diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 2026ad36310..06f6492e9ae 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -23,10 +23,19 @@ Sorry Giacom. Please don't be mad :( if(unique_name) name = "[name] ([rand(1, 1000)])" real_name = name - + var/datum/atom_hud/data/human/medical/advanced/medhud = huds[DATA_HUD_MEDICAL_ADVANCED] + medhud.add_to_hud(src) faction |= "\ref[src]" +/mob/living/prepare_huds() + ..() + prepare_data_huds() + +/mob/living/proc/prepare_data_huds() + med_hud_set_health() + med_hud_set_status() + /mob/living/Destroy() ..() @@ -36,7 +45,7 @@ Sorry Giacom. Please don't be mad :( D.client.images.Remove(I) qdel(I) staticOverlays.len = 0 - + remove_from_all_data_huds() return QDEL_HINT_HARDDEL_NOW @@ -210,7 +219,7 @@ Sorry Giacom. Please don't be mad :( return health = maxHealth - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - getCloneLoss() update_stat() - + med_hud_set_health() //This proc is used for mobs which are affected by pressure to calculate the amount of pressure that actually //affects them once clothing is factored in. ~Errorage diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 85ab36335ad..2406a5ba0ed 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -3,6 +3,7 @@ languages = HUMAN sight = 0 see_in_dark = 2 + hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD) //Health and life related vars var/maxHealth = 100 //Maximum health that should be possible. diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm index fd1e5cf1701..08bfb5e6455 100644 --- a/code/modules/mob/living/silicon/login.dm +++ b/code/modules/mob/living/silicon/login.dm @@ -1,6 +1,6 @@ /mob/living/silicon/Login() if(mind && ticker && ticker.mode) - ticker.mode.remove_cultist(mind, 0) + ticker.mode.remove_cultist(mind, 0, 0) ticker.mode.remove_revolutionary(mind, 0) ticker.mode.remove_gangster(mind, remove_bosses=1) ticker.mode.remove_thrall(mind,0) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index ef48c295882..0f4ecdb8946 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -130,6 +130,7 @@ modules += new /obj/item/weapon/wrench/cyborg(src) modules += new /obj/item/weapon/crowbar/cyborg(src) modules += new /obj/item/device/healthanalyzer(src) + modules += new /obj/item/toy/crayon/spraycan/borg(src) emag = new /obj/item/weapon/melee/energy/sword/cyborg(src) fix_modules() @@ -179,6 +180,7 @@ modules += new /obj/item/device/multitool/cyborg(src) modules += new /obj/item/device/t_scanner(src) modules += new /obj/item/device/analyzer(src) + modules += new /obj/item/areaeditor/blueprints/cyborg(src) add_module(new /obj/item/stack/sheet/metal/cyborg()) add_module(new /obj/item/stack/sheet/glass/cyborg()) @@ -260,6 +262,8 @@ modules += new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src) modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src) modules += new /obj/item/weapon/pen(src) + modules += new /obj/item/toy/crayon/spraycan/borg(src) + modules += new /obj/item/weapon/hand_labeler/borg(src) modules += new /obj/item/weapon/razor(src) modules += new /obj/item/device/instrument/violin(src) modules += new /obj/item/device/instrument/guitar(src) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index c8dd62d7c63..208bd2da166 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -41,6 +41,12 @@ diag_hud_set_status() diag_hud_set_health() +/mob/living/silicon/med_hud_set_health() + return //we use a different hud + +/mob/living/silicon/med_hud_set_status() + return //we use a different hud + /mob/living/silicon/Destroy() radio = null aicamera = null diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 43bb2e55a25..a21e2bd2bf5 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -188,6 +188,12 @@ ..() diag_hud_set_bothealth() +/mob/living/simple_animal/bot/med_hud_set_health() + return //we use a different hud + +/mob/living/simple_animal/bot/med_hud_set_status() + return //we use a different hud + /mob/living/simple_animal/bot/handle_automated_action() //Master process which handles code common across most bots. set background = BACKGROUND_ENABLED diag_hud_set_botmode() diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index f7efbc7c198..5c00a4fc3bf 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -174,7 +174,7 @@ /mob/living/simple_animal/bot/cleanbot/proc/clean(obj/effect/decal/cleanable/target) anchored = 1 icon_state = "cleanbot-c" - visible_message("[src] begins to clean up [target]") + visible_message("[src] begins to clean up [target].") mode = BOT_CLEANING spawn(50) if(mode == BOT_CLEANING) diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 82b7cfae730..0aef48fdc9f 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -20,7 +20,7 @@ minbodytemp = 200 maxbodytemp = 400 unsuitable_atmos_damage = 1 - species = /mob/living/simple_animal/pet/cat + animal_species = /mob/living/simple_animal/pet/cat childtype = list(/mob/living/simple_animal/pet/cat/kitten) butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab = 2) response_help = "pets" diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index bd928eb762c..b0df6fbc666 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -24,7 +24,7 @@ gender = MALE butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi = 3, /obj/item/stack/sheet/animalhide/corgi = 1) childtype = list(/mob/living/simple_animal/pet/dog/corgi/puppy = 95, /mob/living/simple_animal/pet/dog/corgi/puppy/void = 5) - species = /mob/living/simple_animal/pet/dog + animal_species = /mob/living/simple_animal/pet/dog var/shaved = 0 var/obj/item/inventory_head var/obj/item/inventory_back @@ -164,7 +164,7 @@ usr << "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s back!" return - if(istype(item_to_add,/obj/item/weapon/c4)) // last thing he ever wears, I guess + if(istype(item_to_add,/obj/item/weapon/grenade/plastic)) // last thing he ever wears, I guess item_to_add.afterattack(src,usr,1) return @@ -200,7 +200,7 @@ /mob/living/simple_animal/pet/dog/corgi/proc/place_on_head(obj/item/item_to_add, mob/user) - if(istype(item_to_add,/obj/item/weapon/c4)) // last thing he ever wears, I guess + if(istype(item_to_add,/obj/item/weapon/grenade/plastic)) // last thing he ever wears, I guess item_to_add.afterattack(src,user,1) return diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index 4d6632dec56..bb635bb1425 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -42,6 +42,7 @@ has_unlimited_silicon_privilege = 1 damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) staticOverlays = list() + hud_possible = list(DIAG_STAT_HUD, DIAG_HUD, ANTAG_HUD) var/staticChoice = "static" var/list/staticChoices = list("static", "blank", "letter", "animal") var/picked = FALSE //Have we picked our visual appearence (+ colour if applicable) @@ -85,6 +86,22 @@ var/datum/action/generic/drone/select_filter/SF = new(src) SF.Grant(src) + var/datum/atom_hud/data/diagnostic/diag_hud = huds[DATA_HUD_DIAGNOSTIC] + diag_hud.add_to_hud(src) + + +/mob/living/simple_animal/drone/med_hud_set_health() + var/image/holder = hud_list[DIAG_HUD] + holder.icon_state = "huddiag[RoundDiagBar(health/maxHealth)]" + +/mob/living/simple_animal/drone/med_hud_set_status() + var/image/holder = hud_list[DIAG_STAT_HUD] + if(stat == DEAD) + holder.icon_state = "huddead2" + else if(incapacitated()) + holder.icon_state = "hudoffline" + else + holder.icon_state = "hudstat" /mob/living/simple_animal/drone/Destroy() 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 8578e0cc078..66a10c95760 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -25,7 +25,7 @@ melee_damage_upper = 2 environment_smash = 0 stop_automated_movement_when_pulled = 1 - var/obj/udder/udder = null + var/obj/item/udder/udder = null /mob/living/simple_animal/hostile/retaliate/goat/New() udder = new() @@ -98,7 +98,7 @@ attacktext = "kicks" attack_sound = 'sound/weapons/punch1.ogg' health = 50 - var/obj/udder/udder = null + var/obj/item/udder/udder = null gold_core_spawnable = 2 /mob/living/simple_animal/cow/New() @@ -274,28 +274,30 @@ var/global/chicken_count = 0 else SSobj.processing.Remove(src) -/obj/udder -/obj/udder/New() +/obj/item/udder + name = "udder" + +/obj/item/udder/New() reagents = new(50) reagents.my_atom = src reagents.add_reagent("milk", 20) -/obj/udder/proc/generateMilk() +/obj/item/udder/proc/generateMilk() if(prob(5)) reagents.add_reagent("milk", rand(5, 10)) -/obj/udder/proc/milkAnimal(obj/O, mob/user) +/obj/item/udder/proc/milkAnimal(obj/O, mob/user) var/obj/item/weapon/reagent_containers/glass/G = O if(G.reagents.total_volume >= G.volume) user << "[O] is full." return - var/transfered = reagents.trans_id_to(G, "milk", rand(5,10)) + var/transfered = reagents.trans_to(O, rand(5,10)) if(transfered) user.visible_message("[user] milks [src] using \the [O].", "You milk [src] using \the [O].") else user << "The udder is dry. Wait a bit longer..." -/obj/udder/Destroy() +/obj/item/udder/Destroy() qdel(reagents) - return ..() + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 377b89d6e7c..546e4b3a4e2 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -48,6 +48,19 @@ var/global/list/parasites = list() //all currently existing/living guardians ..() +/mob/living/simple_animal/hostile/guardian/med_hud_set_health() + if(summoner) + var/image/holder = hud_list[HEALTH_HUD] + holder.icon_state = "hud[RoundHealth(summoner)]" + +/mob/living/simple_animal/hostile/guardian/med_hud_set_status() + if(summoner) + var/image/holder = hud_list[STATUS_HUD] + if(summoner.stat == DEAD) + holder.icon_state = "huddead" + else + holder.icon_state = "hudhealthy" + /mob/living/simple_animal/hostile/guardian/Destroy() parasites -= src return ..() @@ -103,8 +116,9 @@ var/global/list/parasites = list() //all currently existing/living guardians /mob/living/simple_animal/hostile/guardian/Life() //Dies if the summoner dies ..() - update_health_hud() //we need to update our health display to match our summoner and we can't practically give the summoner a hook to do it - + update_health_hud() //we need to update all of our health displays to match our summoner and we can't practically give the summoner a hook to do it + med_hud_set_health() + med_hud_set_status() if(summoner) if(summoner.stat == DEAD) src << "Your summoner has died!" 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 59fa99f35b3..e3bc381f209 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/support.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm @@ -38,6 +38,10 @@ var/obj/effect/overlay/temp/heal/H = PoolOrNew(/obj/effect/overlay/temp/heal, get_turf(C)) if(namedatum) H.color = namedatum.colour + if(C == summoner) + update_health_hud() + med_hud_set_health() + med_hud_set_status() /mob/living/simple_animal/hostile/guardian/healer/ToggleMode() if(src.loc == summoner) diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 01d04dc084f..7c33ecbe6c4 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -49,7 +49,7 @@ see_invisible = SEE_INVISIBLE_MINIMUM see_in_dark = 4 var/playable_spider = FALSE - + /mob/living/simple_animal/hostile/poison/giant_spider/Topic(href, href_list) if(href_list["activate"]) var/mob/dead/observer/ghost = usr @@ -57,18 +57,20 @@ humanize_spider(ghost) /mob/living/simple_animal/hostile/poison/giant_spider/attack_ghost(mob/user) - humanize_spider(user) + if(!humanize_spider(user)) + return ..() /mob/living/simple_animal/hostile/poison/giant_spider/proc/humanize_spider(mob/user) if(key || !playable_spider)//Someone is in it or the fun police are shutting it down - return + return 0 var/spider_ask = alert("Become a spider?", "Are you australian?", "Yes", "No") if(spider_ask == "No" || !src || qdeleted(src)) - return + return 1 if(key) user << "Someone else already took this spider." - return + return 1 key = user.key + return 1 //nursemaids - these create webs and eggs /mob/living/simple_animal/hostile/poison/giant_spider/nurse diff --git a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm index 0afa18e866b..63d3bd82565 100644 --- a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm +++ b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm @@ -43,7 +43,20 @@ ..() wanted_objects = subtypesof(/obj/mecha/combat) +/mob/living/simple_animal/hostile/syndicate/mecha_pilot/nanotrasen //nanotrasen are syndies! no it's just a weird path. + name = "Nanotrasen Mecha Pilot" + desc = "Death to the Syndicate. This variant comes in MECHA DEATH flavour." + icon_living = "nanotrasen" + icon_state = "nanotrasen" + faction = list("nanotrasen") + spawn_mecha_type = /obj/mecha/combat/marauder/loaded +/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/nanotrasen + name = "Nanotrasen Mecha Pilot" + desc = "Death to the Syndicate. This variant comes in MECHA DEATH flavour." + icon_living = "nanotrasen" + icon_state = "nanotrasen" + faction = list("nanotrasen") /mob/living/simple_animal/hostile/syndicate/mecha_pilot/New() @@ -99,6 +112,7 @@ ranged = 0 minimum_distance = 1 + walk(M,0)//end any lingering movement loops, to prevent the haunted mecha bug //Checks if a mecha is valid for theft /mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/is_valid_mecha(obj/mecha/M) @@ -253,6 +267,10 @@ else //we're not in a mecha, so we check if we can steal it instead. if(is_valid_mecha(M)) return 1 + else if (M.occupant && CanAttack(M.occupant)) + return 1 + else + return 0 . = ..() 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 0fe95918f9f..0267d112d90 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm @@ -24,7 +24,7 @@ aggro_vision_range = 18 idle_vision_range = 5 loot = list(/obj/structure/closet/crate/necropolis/dragon) - butcher_results = list(/obj/item/weapon/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/goliath_hide = 8, /obj/item/stack/sheet/bone = 30) + butcher_results = list(/obj/item/weapon/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30) var/anger_modifier = 0 var/obj/item/device/gps/internal var/swooping = 0 @@ -73,7 +73,7 @@ var/obj/effect/overlay/temp/fireball/F = new(src.loc) animate(F, pixel_z = 0, time = 12) sleep(12) - explosion(T, 0, 0, 1, 0, 1, 0) + explosion(T, 0, 0, 1, 0, 0, 0, 1) qdel(F) qdel(src) @@ -87,7 +87,7 @@ else fire_rain() - else if(prob(10+anger_modifier) && !client) + else if(prob(10+anger_modifier) && !client && !swooping) if(health > maxHealth/2) swoop_attack() else @@ -121,6 +121,10 @@ PoolOrNew(/obj/effect/hotspot,J) J.hotspot_expose(700,50,1) + for(var/mob/living/L in J) + if(L != src) + L.adjustFireLoss(20) + L << "You're hit by the drake's fire breath!" /mob/living/simple_animal/hostile/megafauna/dragon/proc/swoop_attack(fire_rain = 0) if(stat) @@ -150,6 +154,8 @@ sleep(10) playsound(src, 'sound/effects/meteorimpact.ogg', 200, 1) for(var/mob/living/L in range(1,tturf)) + if(L == src) + continue if(L.stat) visible_message("[src] slams down on [L], crushing them!") L.gib() @@ -190,7 +196,9 @@ /obj/item/weapon/melee/ghost_sword/attack_self(mob/user) if(summon_cooldown > world.time) + user << "You just recently called out for aid. You don't want to annoy the spirits." return + user << "You call out for aid, attempting to summon spirits to your side." notify_ghosts("[user] is raising their [src], calling for your help!", source = user) summon_cooldown = world.time + 600 @@ -290,6 +298,7 @@ w_class = 4 force = 25 damtype = BURN + burn_state = LAVA_PROOF hitsound = 'sound/weapons/sear.ogg' var/lava_cooldown = 0 @@ -320,4 +329,4 @@ if(3) new /obj/item/weapon/dragons_blood(src) if(4) - new /obj/item/weapon/lava_staff(src) \ No newline at end of file + new /obj/item/weapon/lava_staff(src) 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 5e765ee17ba..5a267c819f0 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -49,7 +49,7 @@ /mob/living/simple_animal/hostile/asteroid/basilisk name = "basilisk" desc = "A territorial beast, covered in a thick shell that absorbs energy. Its stare causes victims to freeze from the inside." - icon = 'icons/mob/animal.dmi' + icon = 'icons/mob/lavaland/lavaland_monsters.dmi' icon_state = "Basilisk" icon_living = "Basilisk" icon_aggro = "Basilisk_alert" @@ -91,10 +91,7 @@ /mob/living/simple_animal/hostile/asteroid/basilisk/GiveTarget(new_target) if(..()) //we have a target if(isliving(target)) - var/mob/living/L = target - if(L.bodytemperature > 200) - L.bodytemperature = 200 - visible_message("The [src.name]'s stare chills [L.name] to the bone!") + OpenFire(target) /mob/living/simple_animal/hostile/asteroid/basilisk/ex_act(severity, target) switch(severity) @@ -108,7 +105,7 @@ /mob/living/simple_animal/hostile/asteroid/goldgrub name = "goldgrub" desc = "A worm that grows fat from eating everything in its sight. Seems to enjoy precious metals and other shiny things, hence the name." - icon = 'icons/mob/animal.dmi' + icon = 'icons/mob/lavaland/lavaland_monsters.dmi' icon_state = "Goldgrub" icon_living = "Goldgrub" icon_aggro = "Goldgrub_alert" @@ -186,7 +183,7 @@ /mob/living/simple_animal/hostile/asteroid/hivelord name = "hivelord" desc = "A truly alien creature, it is a mass of unknown organic material, constantly fluctuating. When attacking, pieces of it split off and attack in tandem with the original." - icon = 'icons/mob/animal.dmi' + icon = 'icons/mob/lavaland/lavaland_monsters.dmi' icon_state = "Hivelord" icon_living = "Hivelord" icon_aggro = "Hivelord_alert" @@ -240,8 +237,10 @@ flags = NOBLUDGEON slot = "hivecore" force = 0 + actions_types = list(/datum/action/item_action/organ_action/use) var/inert = 0 var/preserved = 0 + var/list/spawned_brood = list() /obj/item/organ/hivelord_core/New() ..() @@ -249,10 +248,25 @@ if(!owner && !preserved) inert = 1 desc = "The remains of a hivelord that have become useless, having been left alone too long after being harvested." - feedback_add_details("hivelord_core", "[src.type]|inert") else preserved = 1 - feedback_add_details("hivelord_core", "[src.type]|implanted") + +/obj/item/organ/internal/hivelord_core/ui_action_click() + var/spawn_amount = 1 + if(!inert) + spawn_amount++ + + for(var/a in spawned_brood) + if(!istype(a, /mob/living/simple_animal/hostile/asteroid/hivelordbrood) || qdeleted(a)) + spawned_brood -= a + continue + spawn_amount -= spawned_brood.len + + for(var/i = 1 to spawn_amount) + var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/B = new (owner.loc) + B.link_host(owner) + spawned_brood |= B + /obj/item/organ/hivelord_core/on_life() ..() @@ -278,11 +292,9 @@ user << "[src] are useless on the dead." return if(H != user) - feedback_add_details("hivelord_core","[src.type]|used|other") H.visible_message("[user] forces [H] to apply [src]... they quickly regenerate all injuries!") else user << "You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments." - feedback_add_details("hivelord_core","[src.type]|used|self") H.revive(full_heal = 1) qdel(src) ..() @@ -293,7 +305,7 @@ /mob/living/simple_animal/hostile/asteroid/hivelordbrood name = "hivelord brood" desc = "A fragment of the original Hivelord, rallying behind its original. One isn't much of a threat, but..." - icon = 'icons/mob/animal.dmi' + icon = 'icons/mob/lavaland/lavaland_monsters.dmi' icon_state = "Hivelordbrood" icon_living = "Hivelordbrood" icon_aggro = "Hivelordbrood" @@ -306,6 +318,7 @@ speed = 3 maxHealth = 1 health = 1 + flying = 1 harm_intent_damage = 5 melee_damage_lower = 2 melee_damage_upper = 2 @@ -320,12 +333,94 @@ /mob/living/simple_animal/hostile/asteroid/hivelordbrood/New() ..() spawn(100) - qdel(src) + death() + +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood + name = "blood brood" + desc = "A living string of blood and alien materials." + icon_state = "bloodbrood" + icon_living = "bloodbrood" + icon_aggro = "bloodbrood" + attacktext = "pierces" + color = "#C80000" + +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/death() + if(loc) // Splash the turf we are on with blood + reagents.reaction(get_turf(src)) + ..() + +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/New() + create_reagents(30) + ..() + +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/AttackingTarget() + ..() + if(iscarbon(target)) + transfer_reagents(target, 1) + + +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/attack_hand(mob/living/carbon/human/M) + if("\ref[M]" in faction) + reabsorb_host(M) + else + return ..() + +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/attack_paw(mob/living/carbon/monkey/M) + if("\ref[M]" in faction) + reabsorb_host(M) + else + return ..() + +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/attack_alien(mob/living/carbon/alien/humanoid/M) + if("\ref[M]" in faction) + reabsorb_host(M) + else + return ..() + + +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/proc/reabsorb_host(mob/living/carbon/C) + C.visible_message("[src] is reabsorbed by [C]'s body.", \ + "[src] is reabsorbed by your body.") + transfer_reagents(C) + death() + +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/proc/transfer_reagents(mob/living/carbon/C, var/volume = 30) + if(!reagents.total_volume) + return + + volume = min(volume, reagents.total_volume) + + var/fraction = min(volume/reagents.total_volume, 1) + reagents.reaction(C, INJECT, fraction) + + var/datum/reagent/blood/B + for(var/datum/reagent/blood/d in reagents.reagent_list) + B = d + break + if(B) + C.inject_blood(src, min(B.volume, volume)) + + reagents.trans_to(C, volume) + +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/proc/link_host(mob/living/carbon/C) + faction = list("\ref[src]", "\ref[C]") // Hostile to everyone except the host. + var/datum/reagent/B = C.take_blood(src, 30) + if(!B) + if(ishuman(C)) + var/mob/living/carbon/human/H = C + if(H.dna.species.exotic_blood && H.reagents.total_volume) + H.reagents.trans_to(src, 10) + + else + reagents.reagent_list += B + reagents.update_total() + + color = mix_color_from_reagents(reagents.reagent_list) /mob/living/simple_animal/hostile/asteroid/goliath name = "goliath" desc = "A massive beast that uses long tentacles to ensare its prey, threatening them is not advised under any conditions." - icon = 'icons/mob/animal.dmi' + icon = 'icons/mob/lavaland/lavaland_monsters.dmi' icon_state = "Goliath" icon_living = "Goliath" icon_aggro = "Goliath_alert" @@ -402,7 +497,7 @@ /obj/effect/goliath_tentacle/ name = "Goliath tentacle" - icon = 'icons/mob/animal.dmi' + icon = 'icons/mob/lavaland/lavaland_monsters.dmi' icon_state = "Goliath_tentacle" var/latched = 0 anchored = 1 @@ -493,7 +588,7 @@ /mob/living/simple_animal/hostile/asteroid/fugu name = "wumborian fugu" desc = "The wumborian fugu rapidly increases its body mass in order to ward off its prey. Great care should be taken to avoid it while it's in this state as it is nearly invincible, but it cannot maintain its form forever." - icon = 'icons/mob/animal.dmi' + icon = 'icons/mob/lavaland/lavaland_monsters.dmi' icon_state = "Fugu" icon_living = "Fugu" icon_aggro = "Fugu" @@ -717,7 +812,6 @@ del_on_death = 1 stat_attack = 1 robust_searching = 1 - layer = 6.1 /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/Life() if(isturf(src.loc)) @@ -738,8 +832,129 @@ icon = 'icons/obj/surgery.dmi' icon_state = "demon_heart" -//Nests +/obj/item/weapon/legion_skull + name = "legion's head" + desc = "The once living, now empty eyes of the former human's skull cut deep into your soul." + icon = 'icons/obj/mining.dmi' + icon_state = "skull" + +//Gutlunches + +/mob/living/simple_animal/hostile/asteroid/gutlunch + name = "gutlunch" + desc = "A scavenger that eats raw meat, often found alongside ash walkers. Produces a thick, nutritious milk." + icon = 'icons/mob/lavaland/lavaland_monsters.dmi' + icon_state = "gutlunch" + icon_living = "gutlunch" + icon_dead = "gutlunch" + speak_emote = list("warbles", "quavers") + emote_hear = list("trills.") + emote_see = list("sniffs.", "burps.") + density = 0 + speak_chance = 1 + turns_per_move = 8 + environment_smash = 0 + move_to_delay = 15 + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "squishes" + friendly = "pinches" + a_intent = "help" + ventcrawler = 2 + gold_core_spawnable = 2 + stat_attack = 1 + gender = NEUTER + stop_automated_movement = FALSE + stop_automated_movement_when_pulled = TRUE + stat_exclusive = TRUE + robust_searching = TRUE + search_objects = TRUE + del_on_death = TRUE + loot = list(/obj/effect/decal/cleanable/blood/gibs) + + animal_species = /mob/living/simple_animal/hostile/asteroid/gutlunch + childtype = list(/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck = 45, /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen = 55) + + wanted_objects = list(/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/blood/gibs/) + var/obj/item/udder/gutlunch/udder = null + + +/mob/living/simple_animal/hostile/asteroid/gutlunch/New() + udder = new() + deathmessage = "[src] is pulped into bugmash." + ..() + +/mob/living/simple_animal/hostile/asteroid/gutlunch/Destroy() + qdel(udder) + udder = null + return ..() + +/mob/living/simple_animal/hostile/asteroid/gutlunch/regenerate_icons() + overlays.Cut() + if(udder.reagents.total_volume == udder.reagents.maximum_volume) + overlays += "gl_full" + ..() + +/mob/living/simple_animal/hostile/asteroid/gutlunch/attackby(obj/item/O, mob/user, params) + if(stat == CONSCIOUS && istype(O, /obj/item/weapon/reagent_containers/glass)) + udder.milkAnimal(O, user) + regenerate_icons() + else + ..() + +/mob/living/simple_animal/hostile/asteroid/gutlunch/AttackingTarget() + if(is_type_in_list(target,wanted_objects)) //we eats + udder.generateMilk() + regenerate_icons() + visible_message("[src] slurps up [target].") + qdel(target) + ..() + + +/obj/item/udder/gutlunch + name = "nutrient sac" + +/obj/item/udder/gutlunch/New() + reagents = new(50) + reagents.my_atom = src + +/obj/item/udder/gutlunch/generateMilk() + if(prob(60)) + reagents.add_reagent("cream", rand(2, 5)) + if(prob(45)) + reagents.add_reagent("salglu_solution", rand(2,5)) + + +//Male gutlunch. They're smaller and more colorful! +/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck + name = "gubbuck" + gender = MALE + +/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck/New() + ..() + color = pick("#E39FBB", "#D97D64", "#CF8C4A") + resize = 0.85 + update_transform() + + +//Lady gutlunch. They make the babby. +/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen + name = "guthen" + gender = FEMALE + +/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen/Life() + ..() + if(udder.reagents.total_volume == udder.reagents.maximum_volume) //Only breed when we're full. + make_babies() + +/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen/make_babies() + if(..()) + udder.reagents.clear_reagents() + regenerate_icons() + + +//Nests /mob/living/simple_animal/hostile/spawner/lavaland name = "necropolis tendril" desc = "A vile tendril of corruption, originating deep underground. Terrible monsters are pouring out of it." diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 2ee585ae7cb..a71f5fe68e9 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -168,4 +168,4 @@ /mob/living/simple_animal/hostile/viscerator/New() ..() - deathmessage = "[src] is smashed into pieces!" + deathmessage = "[src] is smashed into pieces!" diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 81ee2da1dce..fe8d46b2137 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -56,7 +56,7 @@ //Hot simple_animal baby making vars var/list/childtype = null var/scan_ready = 1 - var/species //Sorry, no spider+corgi buttbabies. + var/animal_species //Sorry, no spider+corgi buttbabies. //simple_animal access var/obj/item/weapon/card/id/access_card = null //innate access uses an internal ID card @@ -111,6 +111,7 @@ death() else stat = CONSCIOUS + med_hud_set_status() /mob/living/simple_animal/handle_status_effects() @@ -461,8 +462,8 @@ ..() /mob/living/simple_animal/proc/make_babies() // <3 <3 <3 - if(gender != FEMALE || stat || !scan_ready || !childtype || !species || ticker.current_state != GAME_STATE_PLAYING) - return + if(gender != FEMALE || stat || !scan_ready || !childtype || !animal_species || ticker.current_state != GAME_STATE_PLAYING) + return 0 scan_ready = 0 spawn(400) scan_ready = 1 @@ -474,7 +475,7 @@ continue else if(istype(M, childtype)) //Check for children FIRST. children++ - else if(istype(M, species)) + else if(istype(M, animal_species)) if(M.ckey) continue else if(!istype(M, childtype) && M.gender == MALE) //Better safe than sorry ;_; @@ -485,6 +486,8 @@ if(alone && partner && children < 3) var/childspawn = pickweight(childtype) new childspawn(loc) + return 1 + return 0 /mob/living/simple_animal/stripPanelUnequip(obj/item/what, mob/who, where, child_override) if(!child_override) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 377eef4dbe4..ab66b6c9f73 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -326,7 +326,7 @@ var/next_mob_id = 0 if (!tile) return 0 - PoolOrNew(/obj/effect/overlay/temp/point, list(tile,invisibility)) + PoolOrNew(/obj/effect/overlay/temp/point, list(A,invisibility)) return 1 @@ -932,4 +932,4 @@ var/next_mob_id = 0 updatehealth() if("resize") update_transform() - + ..() diff --git a/code/modules/ninja/ninja_event.dm b/code/modules/ninja/ninja_event.dm index 26e3f2f5302..903a523d884 100644 --- a/code/modules/ninja/ninja_event.dm +++ b/code/modules/ninja/ninja_event.dm @@ -206,7 +206,7 @@ Contents: equip_to_slot_or_del(new /obj/item/clothing/glasses/night(src), slot_glasses) equip_to_slot_or_del(EK, slot_belt) equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_r_store) - equip_to_slot_or_del(new /obj/item/weapon/c4(src), slot_l_store) + equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/x4(src), slot_l_store) equip_to_slot_or_del(new /obj/item/weapon/tank/internals/emergency_oxygen(src), slot_s_store) equip_to_slot_or_del(new /obj/item/weapon/tank/jetpack/carbondioxide(src), slot_back) diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index d679df9e53a..7a54cc402c3 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -1,5 +1,6 @@ /obj/item/weapon/hand_labeler name = "hand labeler" + desc = "A combined label printer and applicator in a portable device, designed to be easy to operate and use." icon = 'icons/obj/bureaucracy.dmi' icon_state = "labeler0" item_state = "flight" @@ -7,6 +8,33 @@ var/labels_left = 30 var/mode = 0 +/obj/item/weapon/hand_labeler/suicide_act(mob/user) + user.visible_message("[user] is pointing \the [src] \ + at \himself. They're going to label themselves as a suicide!") + labels_left = max(labels_left - 1, 0) + + var/old_real_name = user.real_name + user.real_name += " (suicide)" + // no conflicts with their identification card + for(var/atom/A in user) + if(istype(A, /obj/item/weapon/card/id)) + var/obj/item/weapon/card/id/their_card = A + + // only renames their card, as opposed to tagging everyone's + if(their_card.registered_name != old_real_name) + continue + + their_card.registered_name = user.real_name + their_card.update_label() + + // NOT EVEN DEATH WILL TAKE AWAY THE STAIN + user.mind.name += " (suicide)" + + mode = 1 + icon_state = "labeler[mode]" + label = "suicide" + + return OXYLOSS /obj/item/weapon/hand_labeler/afterattack(atom/A, mob/user,proximity) if(!proximity) return @@ -63,10 +91,32 @@ labels_left = initial(labels_left) return +/obj/item/weapon/hand_labeler/borg + name = "cyborg-hand labeler" + +/obj/item/weapon/hand_labeler/borg/afterattack(atom/A, mob/user, proximity) + ..(A, user, proximity) + if(!isrobot(user)) + return + + var/mob/living/silicon/robot/borgy = user + + var/starting_labels = initial(labels_left) + var/diff = starting_labels - labels_left + if(diff) + labels_left = starting_labels + // 50 per label. Magical cyborg paper doesn't come cheap. + var/cost = diff * 50 + + // If the cyborg manages to use a module without a cell, they get the paper + // for free. + if(borgy.cell) + borgy.cell.use(cost) + /obj/item/hand_labeler_refill name = "hand labeler paper roll" icon = 'icons/obj/bureaucracy.dmi' desc = "A roll of paper. Use it on a hand labeler to refill it." icon_state = "labeler_refill" item_state = "electropack" - w_class = 1 \ No newline at end of file + w_class = 1 diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index bbde5e50c49..95d67cbdbc2 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -95,7 +95,7 @@ if(..() || !ishuman(hit_atom))//if the plane is caught or it hits a nonhuman return var/mob/living/carbon/human/H = hit_atom - if(prob(15)) + if(prob(2)) if((H.head && H.head.flags_cover & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags_cover & MASKCOVERSEYES) || (H.glasses && H.glasses.flags_cover & GLASSESCOVERSEYES)) return visible_message("\The [src] hits [H] in the eye!") diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index d5d7b12abd0..f1b3d4ccbbc 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -37,6 +37,7 @@ SSobj.processing |= src else SSobj.processing -= src + ..() /obj/item/weapon/stock_parts/cell/process() if(self_recharge) diff --git a/code/modules/procedural mapping/mapGenerators/lava_river.dm b/code/modules/procedural mapping/mapGenerators/lava_river.dm index 90f9a6c0949..336a7786acb 100644 --- a/code/modules/procedural mapping/mapGenerators/lava_river.dm +++ b/code/modules/procedural mapping/mapGenerators/lava_river.dm @@ -1,9 +1,17 @@ /datum/mapGenerator/lavaland var/start_z = 5 + var/min_x = 0 + var/min_y = 0 + var/max_x = 0 + var/max_y = 0 modules = list(/datum/mapGeneratorModule/river) /datum/mapGenerator/lavaland/defineRegion(turf/Start, turf/End, replace = 0) start_z = Start.z + min_x = min(Start.x,End.x) + min_y = min(Start.y,End.y) + max_x = max(Start.x,End.x) + max_y = max(Start.y,End.y) ..() /datum/mapGeneratorModule/river @@ -12,7 +20,8 @@ var/start_z = 5 /datum/mapGeneratorModule/river/generate() - if(istype(mother, /datum/mapGenerator/lavaland)) - var/datum/mapGenerator/lavaland/L = mother - start_z = L.start_z - spawn_rivers(start_z, river_nodes, river_type) + var/datum/mapGenerator/lavaland/L = mother + if(!istype(L)) + return + start_z = L.start_z + spawn_rivers(start_z, river_nodes, river_type, min_x = L.min_x, min_y = L.min_y, max_x = L.max_x, max_y = L.max_y) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index b2766731b3b..8f79ac1c510 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -163,3 +163,4 @@ SSobj.processing |= src else SSobj.processing -= src + ..() \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 8342edc0ce2..ddd2bab6064 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -21,10 +21,10 @@ fire_sound = 'sound/weapons/gunshot.ogg' e_cost = 200 select_name = "stun" - projectile_type = /obj/item/projectile/shock_revolver + projectile_type = /obj/item/projectile/energy/shock_revolver -/obj/item/projectile/shock_revolver +/obj/item/projectile/energy/shock_revolver name = "shock bolt" icon_state = "purple_laser" var/chain @@ -35,7 +35,7 @@ spawn(1) P.chain = P.Beam(user,icon_state="purple_lightning",icon = 'icons/effects/effects.dmi',time=1000, maxdistance = 30) -/obj/item/projectile/shock_revolver/on_hit(atom/target) +/obj/item/projectile/energy/shock_revolver/on_hit(atom/target) . = ..() if(isliving(target)) tesla_zap(src, 3, 10000) diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 7537b9a67ec..46759d13382 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -709,7 +709,8 @@ All effects don't start immediately, but rather get worse over time; the rate is step_towards(O, get_turf(M)) return ..() -/datum/reagent/consumable/ethanol/hearty_punch //Another reference. Heals those in critical condition extremely quickly. If you die with it in your system, it will be removed and you will live! +// Another reference. Heals those in critical condition extremely quickly. +/datum/reagent/consumable/ethanol/hearty_punch name = "Hearty Punch" id = "hearty_punch" description = "Brave bull/syndicate bomb/absinthe mixture resulting in an energizing beverage. Mild alcohol content." diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 878e2c2ad0a..bca21857b2d 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -119,7 +119,7 @@ /datum/reagent/consumable/frostoil name = "Frost Oil" id = "frostoil" - description = "A special oil that noticably chills the body. Extraced from Icepeppers." + description = "A special oil that noticably chills the body. Extracted from Icepeppers and slimes." color = "#8BA6E9" // rgb: 139, 166, 233 /datum/reagent/consumable/frostoil/on_mob_life(mob/living/M) @@ -152,8 +152,11 @@ if(reac_volume >= 5) for(var/mob/living/simple_animal/slime/M in T) M.adjustToxLoss(rand(15,30)) - //if(istype(T)) - // T.atmos_spawn_air(SPAWN_COLD) + if(reac_volume >= 1) // Make Freezy Foam and anti-fire grenades! + if(istype(T, /turf/open)) + var/turf/open/OT = T + OT.MakeSlippery(TURF_WET_WATER) // Is less effective in high pressure/high heat capacity environments. More effective in low pressure. + OT.air.temperature -= MOLES_CELLSTANDARD*100*reac_volume/OT.air.heat_capacity() // reduces environment temperature by 5K per unit. /datum/reagent/consumable/condensedcapsaicin name = "Condensed Capsaicin" diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 6b821adc2f7..a12a1d56bfe 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -406,7 +406,7 @@ /datum/reagent/medicine/pen_acid name = "Pentetic Acid" id = "pen_acid" - description = "Reduces massive amounts of radiation and toxin damage while purging other chemicals from the body. Has a chance of dealing brute damage." + description = "Reduces massive amounts of radiation and toxin damage while purging other chemicals from the body." reagent_state = LIQUID color = "#C8A5DC" metabolization_rate = 0.5 * REAGENTS_METABOLISM @@ -1057,4 +1057,4 @@ datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/M) M.status_flags |= GOTTAGOREALLYFAST M.adjustToxLoss(2, 0) . = 1 - ..() \ No newline at end of file + ..() diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index dd753c9c057..f0020af71d8 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -188,7 +188,7 @@ M.confused = 1 M.confused += 3 if(iscultist(M) || (is_handofgod_cultist(M) && !is_handofgod_prophet(M))) - ticker.mode.remove_cultist(M.mind) + ticker.mode.remove_cultist(M.mind, 1, 1) ticker.mode.remove_hog_follower(M.mind) holder.remove_reagent(src.id, src.volume) // maybe this is a little too perfect and a max() cap on the statuses would be better?? M.jitteriness = 0 @@ -254,7 +254,7 @@ /datum/reagent/lube/reaction_turf(turf/open/T, reac_volume) if (!istype(T)) return if(reac_volume >= 1) - T.MakeSlippery(2) + T.MakeSlippery(TURF_WET_LUBE) /datum/reagent/spraytan name = "Spray Tan" diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 4a9eb41cbc2..f999590d933 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -136,6 +136,13 @@ desc = "BLAM!-brand non-foaming space cleaner!" list_reagents = list("cleaner" = 250) +/obj/item/weapon/reagent_containers/spray/spraytan + name = "spray tan" + volume = 50 + desc = "Gyaro brand spray tan. Do not spray near eyes or other orifices." + list_reagents = list("spraytan" = 50) + + //pepperspray /obj/item/weapon/reagent_containers/spray/pepper name = "pepperspray" diff --git a/code/modules/research/designs/mecha_designs.dm b/code/modules/research/designs/mecha_designs.dm index 5ddcd742dc8..a2028a40d54 100644 --- a/code/modules/research/designs/mecha_designs.dm +++ b/code/modules/research/designs/mecha_designs.dm @@ -3,7 +3,7 @@ /////////////////////////////////// /datum/design/ripley_main - name = "Exosuit Module (APLU \"Ripley\" Central Control module)" + name = "APLU \"Ripley\" Central Control module" desc = "Allows for the construction of a \"Ripley\" Central Control module." id = "ripley_main" req_tech = list("programming" = 3) @@ -13,7 +13,7 @@ category = list("Exosuit Modules") /datum/design/ripley_peri - name = "Exosuit Module (APLU \"Ripley\" Peripherals Control module)" + name = "APLU \"Ripley\" Peripherals Control module" desc = "Allows for the construction of a \"Ripley\" Peripheral Control module." id = "ripley_peri" req_tech = list("programming" = 3) @@ -23,7 +23,7 @@ category = list("Exosuit Modules") /datum/design/odysseus_main - name = "Exosuit Module (\"Odysseus\" Central Control module)" + name = "\"Odysseus\" Central Control module" desc = "Allows for the construction of a \"Odysseus\" Central Control module." id = "odysseus_main" req_tech = list("programming" = 3,"biotech" = 2) @@ -33,7 +33,7 @@ category = list("Exosuit Modules") /datum/design/odysseus_peri - name = "Exosuit Module (\"Odysseus\" Peripherals Control module)" + name = "\"Odysseus\" Peripherals Control module" desc = "Allows for the construction of a \"Odysseus\" Peripheral Control module." id = "odysseus_peri" req_tech = list("programming" = 3,"biotech" = 2) @@ -43,7 +43,7 @@ category = list("Exosuit Modules") /datum/design/gygax_main - name = "Exosuit Module (\"Gygax\" Central Control module)" + name = "\"Gygax\" Central Control module" desc = "Allows for the construction of a \"Gygax\" Central Control module." id = "gygax_main" req_tech = list("programming" = 4) @@ -53,7 +53,7 @@ category = list("Exosuit Modules") /datum/design/gygax_peri - name = "Exosuit Module (\"Gygax\" Peripherals Control module)" + name = "\"Gygax\" Peripherals Control module" desc = "Allows for the construction of a \"Gygax\" Peripheral Control module." id = "gygax_peri" req_tech = list("programming" = 4) @@ -63,7 +63,7 @@ category = list("Exosuit Modules") /datum/design/gygax_targ - name = "Exosuit Module (\"Gygax\" Weapons & Targeting Control module)" + name = "\"Gygax\" Weapons & Targeting Control module" desc = "Allows for the construction of a \"Gygax\" Weapons & Targeting Control module." id = "gygax_targ" req_tech = list("programming" = 4, "combat" = 2) @@ -73,7 +73,7 @@ category = list("Exosuit Modules") /datum/design/durand_main - name = "Exosuit Module (\"Durand\" Central Control module)" + name = "\"Durand\" Central Control module" desc = "Allows for the construction of a \"Durand\" Central Control module." id = "durand_main" req_tech = list("programming" = 4) @@ -83,7 +83,7 @@ category = list("Exosuit Modules") /datum/design/durand_peri - name = "Exosuit Module (\"Durand\" Peripherals Control module)" + name = "\"Durand\" Peripherals Control module" desc = "Allows for the construction of a \"Durand\" Peripheral Control module." id = "durand_peri" req_tech = list("programming" = 4) @@ -93,7 +93,7 @@ category = list("Exosuit Modules") /datum/design/durand_targ - name = "Exosuit Module (\"Durand\" Weapons & Targeting Control module)" + name = "\"Durand\" Weapons & Targeting Control module" desc = "Allows for the construction of a \"Durand\" Weapons & Targeting Control module." id = "durand_targ" req_tech = list("programming" = 4, "combat" = 2) @@ -103,7 +103,7 @@ category = list("Exosuit Modules") /datum/design/honker_main - name = "Exosuit Module (\"H.O.N.K\" Central Control module)" + name = "\"H.O.N.K\" Central Control module" desc = "Allows for the construction of a \"H.O.N.K\" Central Control module." id = "honker_main" req_tech = list("programming" = 3) @@ -113,7 +113,7 @@ category = list("Exosuit Modules") /datum/design/honker_peri - name = "Exosuit Module (\"H.O.N.K\" Peripherals Control module)" + name = "\"H.O.N.K\" Peripherals Control module" desc = "Allows for the construction of a \"H.O.N.K\" Peripheral Control module." id = "honker_peri" req_tech = list("programming" = 3) @@ -123,7 +123,7 @@ category = list("Exosuit Modules") /datum/design/honker_targ - name = "Exosuit Module (\"H.O.N.K\" Weapons & Targeting Control module)" + name = "\"H.O.N.K\" Weapons & Targeting Control module" desc = "Allows for the construction of a \"H.O.N.K\" Weapons & Targeting Control module." id = "honker_targ" req_tech = list("programming" = 3) @@ -133,7 +133,7 @@ category = list("Exosuit Modules") /datum/design/phazon_main - name = "Exosuit Module (\"Phazon\" Central Control module)" + name = "\"Phazon\" Central Control module" desc = "Allows for the construction of a \"Phazon\" Central Control module." id = "phazon_main" req_tech = list("programming" = 5, "materials" = 7, "powerstorage" = 6) @@ -143,7 +143,7 @@ category = list("Exosuit Modules") /datum/design/phazon_peri - name = "Exosuit Module (\"Phazon\" Peripherals Control module)" + name = "\"Phazon\" Peripherals Control module" desc = "Allows for the construction of a \"Phazon\" Peripheral Control module." id = "phazon_peri" req_tech = list("programming" = 5, "bluespace" = 6) @@ -153,7 +153,7 @@ category = list("Exosuit Modules") /datum/design/phazon_targ - name = "Exosuit Module (\"Phazon\" Weapons & Targeting Control module)" + name = "\"Phazon\" Weapons & Targeting Control module" desc = "Allows for the construction of a \"Phazon\" Weapons & Targeting Control module." id = "phazon_targ" req_tech = list("programming" = 5, "magnets" = 6) diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index 576cf63d6ba..935d38df73c 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -208,6 +208,8 @@ meat_counter += 20 else meat_counter ++ + for(var/obj/item/W in H) + H.unEquip(W) H.gib() /mob/living/simple_animal/hostile/spawner/ash_walker/spawn_mob() diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 4a440f22c75..da204476df6 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -1,7 +1,7 @@ /obj/docking_port/mobile/supply name = "supply shuttle" id = "supply" - callTime = 1200 + callTime = 600 dir = 8 travelDir = 90 diff --git a/code/modules/stock_market/events.dm b/code/modules/stock_market/events.dm index 61b1ba86e34..1e34fddf03d 100644 --- a/code/modules/stock_market/events.dm +++ b/code/modules/stock_market/events.dm @@ -129,7 +129,7 @@ A.subtitle = "Investors panic, bailout pending" if (prob(15)) A.opinion = rand(-1, 1) - var/article = "Another one might bite the dust: [company.current_trend > 0 ? "despite their positive trend" : "in line with their failing model"], [company.name] is files for bankruptcy citing [pick(bankrupt_reason)]. The president of %country% has been asked to bail the company out, " + var/article = "Another one might bite the dust: [company.current_trend > 0 ? "despite their positive trend" : "in line with their failing model"], [company.name] files for bankruptcy citing [pick(bankrupt_reason)]. The president of %country% has been asked to bail the company out, " if (!A.opinion) article += "but no answer has been given by the government to date. Our tip to stay safe is: %sell%" else if (A.opinion > 0) diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm index 51fd2ce160e..ef819cb7189 100644 --- a/code/modules/uplink/uplink_item.dm +++ b/code/modules/uplink/uplink_item.dm @@ -844,10 +844,10 @@ var/list/uplink_items = list() // Global list so we only initialize this once. /datum/uplink_item/device_tools/c4 name = "Composition C-4" - desc = "C-4 is plastic explosive of the common variety Composition C. You can use it to breach walls or connect \ - a signaler to its wiring to make it remotely detonable. It has a modifiable timer with a \ + desc = "C-4 is plastic explosive of the common variety Composition C. You can use it to breach walls, sabotage equipment, or connect \ + an assembly to it in order to alter the way it detonates. It has a modifiable timer with a \ minimum setting of 10 seconds." - item = /obj/item/weapon/c4 + item = /obj/item/weapon/grenade/plastic/c4 cost = 1 /datum/uplink_item/device_tools/c4bag @@ -856,6 +856,13 @@ var/list/uplink_items = list() // Global list so we only initialize this once. item = /obj/item/weapon/storage/backpack/dufflebag/syndie/c4 cost = 9 //10% discount! +/datum/uplink_item/device_tools/x4bag + name = "Bag of X-4 explosives" + desc = "Contains 3 X-4 plastic explosives. Similar, but more powerful than C-4. X-4 can be placed on a solid surface, such as a wall or window, and it will \ + blast through the wall, injuring anything on the opposite side, while being safer to the user. For when you want a wider, deeper, hole." + item = /obj/item/weapon/storage/backpack/dufflebag/syndie/x4 + cost = 4 // + /datum/uplink_item/device_tools/powersink name = "Power Sink" desc = "When screwed to wiring attached to a power grid and activated, this large device places excessive \ diff --git a/code/world.dm b/code/world.dm index cbd4046227d..478b3790af7 100644 --- a/code/world.dm +++ b/code/world.dm @@ -149,6 +149,13 @@ var/last_irc_status = 0 C << "PR: [input["announce"]]" #undef CHAT_PULLR + else if("crossmessage" in input) + if(!key_valid) + return + else + if(input["crossmessage"] == "Ahelp") + relay_msg_admins("HELP: [input["source"]] [input["message"]]") + /world/Reboot(var/reason, var/feedback_c, var/feedback_r, var/time) if (reason == 1) //special reboot, do none of the normal stuff if (usr) @@ -283,21 +290,13 @@ var/inerror = 0 else if (n > 0) features += "~[n] player" - /* - is there a reason for this? the byond site shows 'hosted by X' when there is a proper host already. - if (host) - features += "hosted by [host]" - */ - if (!host && config && config.hostedby) features += "hosted by [config.hostedby]" if (features) s += ": [jointext(features, ", ")]" - /* does this help? I do not know */ - if (src.status != s) - src.status = s + status = s #define FAILED_DB_CONNECTION_CUTOFF 5 var/failed_db_connections = 0 diff --git a/config/admins.txt b/config/admins.txt index 8db72174aa7..b5d7d797fff 100644 --- a/config/admins.txt +++ b/config/admins.txt @@ -114,6 +114,6 @@ coiax = Game Master RandomMarine = Game Master PKPenguin321 = Game Master TechnoAlchemist = Game Master - +Aloraydrel = Game Master diff --git a/config/config.txt b/config/config.txt index 2bab69b8652..f1b4078f00f 100644 --- a/config/config.txt +++ b/config/config.txt @@ -168,6 +168,12 @@ TICKLAG 0.9 ## Communication key for receiving data through world/Topic(), you don't want to give this out #COMMS_KEY default_pwd +## World address and port for server recieving cross server messages +#CROSS_SERVER_ADDRESS byond:\\address:port + +## Name that the server calls itself in communications +#CROSS_COMMS_NAME + ## Uncomment this to let players see their own notes (they can still be set by admins only) #SEE_OWN_NOTES diff --git a/config/tips.txt b/config/tips.txt index d7e342157af..c7f7241a456 100644 --- a/config/tips.txt +++ b/config/tips.txt @@ -130,15 +130,19 @@ As an Alien, you take double damage from all burn attacks, such as lasers, weldi As an Alien, resin floors not only regenerate your plasma supply, but also passively heal you. Fight on resin floors to gain a home turf advantage! As an Alien, the facehugger is by far your most powerful weapon because of its ability to instantly win a fight. Remember however that certain helmets, such as biohoods or space helmets will completely block facehugger attacks. As an Alien, you are unable to pick up or use any human items or machinery. Instead, you should focus on sabotaging APCs, computers, cameras and either stowing, spacing, or melting any weapons you find. -As the Blob, you will spawn from your character from between a minute to 5 minutes after the round starts. Use this time to find a safe and well hidden location and evaluate where you will strike! -As the Blob, you can do various sabotage before you spawn, such as spacing the armory or disabling R&D. +When fighting the Blob, you can hit it with an analyzer to check its chemical effects and the type of blob analyzed. Examining it with a research scanner active will also reveal this information. +As the Blob, you can place your core at any clear, unobserved, spot you can move to after 3 minutes have passed. If you wait too long, you will be automatically placed at a random location. Use this wait time to coordinate with any other overminds. As the Blob, keep your core some distance from space, as it is both expensive to expand onto space, easy to be attacked from, and does not count towards your win condition. Emitter platforms built in space are especially dangerous. As the Blob, you can randomly repick your reagent type if the crew has adapted and protected themselves against your current one. As the Blob, you fight a war of attrition: Take out medbay and fight in chokepoints to prevent continued assaults and coordinated burst damage attacks! As the Blob, remember that you can only expand onto tiles from cardinal directions, while the crew can attack you diagonally. Fight in narrow corridors or expand and widen across the width of the hallway to force confrontations where you can hit them! As the Blob, don't neglect the creation of factories. These create spores that carry your reagent and can chase crewmembers far further than you. Spores can also be rallied to swarm the crew and cause panic, and can even take over corpses to create much more dangerous blob zombies! +As the Blob, you can produce a Blobbernaut from a factory for 40 resources. Blobbernauts are smart, gradually regenerate near nodes, and apply your chemical when attacking, but die when too far from the blob or if their factory is killed. However, the factory used becomes fragile and stops spawning spores. As the Blob, you can expand by clicking, create strong blobs with ctrl-click, rally spores with middle-click, and remove blobs with alt-click. -As the Blob, removing strong blobs, resource nodes, factories, and nodes will give you 2, 15, 25, and 25 resources back, respectively. +As the Blob, removing strong blobs, resource nodes, factories, and nodes will give you 4, 15, 25, and 25 resources back, respectively. +As the Blob, talking will send a message to all other overminds and all Blobbernauts, allowing you to direct attacks and coordinate. +As a Blobbernaut, you can communicate with overminds and other Blobbernauts via :b. +As a Blobbernaut, your HUD shows your health and the core health of the overmind that created you. As a Revolutionary, you cannot convert a head of staff or someone who has a loyalty implant, such as a security officer or those they implant. Implants can however be surgically removed, and do not carry over with cloning. Take control of medbay to keep control of conversions! As a Revolutionary, cargo can be your best friend or your worst nightmare. In the best case scenario you will be able to order a limitless amount of guns and armor, in the worst case scenario security will take control and order a limitless number of loyalty implants to turn your fellow revolutionaries against you. As a Revolutionary, your main power comes from how quickly you spread. Convert people as fast as you can and overwhelm the heads of staff before security can arm up. diff --git a/html/changelog.html b/html/changelog.html index dec2902c511..98666b981de 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,17 +55,130 @@ -->
+

05 May 2016

+

Joan updated:

+
    +
  • Revenants are slower while revealed.
  • +
  • Revenants can no longer cast inside dense objects.
  • +
  • Lying down will cure Blight much, much faster.
  • +
+

\"Macho Man\" Randy Savage updated:

+
    +
  • OOOHHH YEAAAAHHHH
  • +
  • SNAP INTO A JLIM SIM WITH THE ALL NEW WRESTLING BELT
  • +
  • YOU CAN FREAKOUT YOUR OPPONENTS WITH THE 5 HOT MOVES ON THIS BELT YEAH
  • +
  • PRAY TO THE LOCAL SPACE GODS TO EXCHANGE YOUR TELECRYSTALS TO ENSURE THE CREAM RISES TO THE TOP
  • +
+ +

04 May 2016

+

Fox McCloud updated:

+
    +
  • shock revolver projectiles are now energy instead of bullets
  • +
+

Joan updated:

+
    +
  • Cultists no longer communicate via tomes.
  • +
  • Cultists now communicate via the 'Communion' action button.
  • +
  • Examining the blob with an active research scanner or medical hud will display effects, akin to hitting it with an analyzer.
  • +
  • Improved medical HUDs to work on all living creatures.
  • +
  • Drones and swarmers, being machines, require a diagnostic HUD for analysis instead.
  • +
+

TechnoAlchemist updated:

+
    +
  • You can now craft cloaks from the scales of fallen ash drakes, look for the recipe in tablecrafting!
  • +
+

coiax updated:

+
    +
  • The Service and the Standard cyborg module now have a spraycan built in, for hijinks and passing on important urban messages. The Service cyborg module also has a cyborg-hand labeler, in case anything needs to be labelled.
  • +
  • Centcom Suicide Prevention wishes to remind the station: Please do not kill yourself with a hand labeler.
  • +
+

xxalpha updated:

+
    +
  • Fixed the mk-honk prototype shoes.
  • +
+ +

03 May 2016

+

coiax, Robustin updated:

+
    +
  • Changeling Fleshmend is much less effective when used repeatedly in a short time. Changeling Panacea is much more effective at purging reagents, reducing radiation and now reduces braindamage.
  • +
+ +

02 May 2016

+

Joan updated:

+
    +
  • Blob spores spawn from factories 2 seconds faster, but the factory goes on cooldown when any of its spores die.
  • +
  • You can examine tomes, soulstones, and construct shells to see what you can do with them.
  • +
  • Releasing a shade from a soulstone now allows you to reuse that soulstone for capturing shades or souls, instead of preventing the stone's use forever if the shade dies.
  • +
  • Runes now actually pulse red on failure.
  • +
  • The Summon Cultist rune no longer includes the cultists invoking it in the selection menu.
  • +
  • Imperfect Communication renamed to Emergency Communication.
  • +
  • You can no longer hide the Nar-Sie rune with a Talisman of Veiling/Revealing.
  • +
+

Kor updated:

+
    +
  • Engineering cyborgs now have internal blueprints.
  • +
+

Lzimann updated:

+
    +
  • Automatic nexus placing time changed from 2 to 15 minutes.
  • +
  • Prophet's gear(hat and staff) prioritizes the backpack instead of automatically equipping.
  • +
  • Divine telepathy and prophet to god speak now have a follow button for ghosts.
  • +
  • Divine telepathy and prophet to god speak now has the god's color.
  • +
  • CTF spawn protection trap is no longer constructable
  • +
+

Mercenaryblue updated:

+
    +
  • Drastically reduced the chances of eye damage when throwing a paper plane.
  • +
+

RandomMarine updated:

+
    +
  • Medical HUDs improved. To better prioritize patients, subjects deep into critical condition have a blinking red outline around the entire HUD icon, and will blink more rapidly when very close to death.
  • +
+

TechnoAlchemisto updated:

+
    +
  • Security uniforms have been made more professional, and more tactical.
  • +
+

TrustyGun updated:

+
    +
  • By crafting together a legion skull, a goliath steak, ketchup, and capsaicin oil, you can create Stuffed Legion! Be careful, it's hot.
  • +
+

coiax updated:

+
    +
  • Centcom Department of [REDACTED] have announced a change of supplier of [EXPLETIVE DELETED]. As such, for security reasons, the absinthe [MOVE ALONG CITIZEN] will instead be [NOTHING TO SEE HERE]. We hope that this will not affect the performance of the [INFORMATION ABOVE YOUR SECURITY CLEARANCE].
  • +
+

nullbear updated:

+
    +
  • A reminder for crew to avoid mopping floors in cold rooms, as the water will freeze and provide a dangerous slipping hazard known as 'ice'. Running on it is not recommended.
  • +
  • Frostoil is an effective chemical for rapidly cooling areas in the event of a fire.
  • +
  • Added X4, a breaching charge more destructive than C4, it can be purchased from uplinks.
  • +
  • C4 can be used with assemblies.
  • +
  • Fixes chembomb recipe to use any matter bin. Again.
  • +
  • ARG's disappear once finished reacting.
  • +
+

30 April 2016

Joan updated:

  • Blobs attempting to attack the supermatter will instead be eaten by it.
  • This doesn't mean throwing a supermatter shard at the blob is a good idea; blobs attacking it will gradually damage it, eventually resulting in a massive explosion, and it will not consume blobs if on a space turf.
  • +
  • Hitting a locker or crate with an ID, PDA with ID, or wallet with ID will try to toggle the lock instead of trying to open it.
  • +
  • Cable coils, cablecuffs, and zipties now all have properly colored inhands.
  • +
+

Kor updated:

+
    +
  • Megafauna have been added to lavaland.
  • +
  • Ash Drakes have been spotted roaming the wastes. Use your GPS to track their fiery signals.
  • +
  • You can now knock on the Necropolis door, but it's probably best that you don't.

Mercenaryblue updated:

  • Adds a basic paper plane to the game. Fold paper with alt-clicking.
  • Paper planes are now fully compatible with every stamps on station.
+

bgobandit updated:

+
    +
  • Nanotrasen has released Cards Against Spess! Visit your local library for a copy. Warning: may cause breakage of the fourth wall.
  • +

29 April 2016

Bawhoppen updated:

@@ -498,104 +611,6 @@
  • An experimental plant DNA manipulator, based on machinery recovered from ancient seed vaults, has been installed in the Botany department.
- -

07 April 2016

-

Kor updated:

-
    -
  • The Laser Cannon in RD has been replaced with the Accelerator Laser Cannon. Try it out!
  • -
  • Mechas now have armour facings. Attacking the front will deal far less damage, while attacking the back will deal massive bonus damage.
  • -
  • EMPs now deal far less damage/drain to mechas.
  • -
-

Kor and Ausops updated:

-
    -
  • Survival pod interiors have been redone.
  • -
  • Survival pods now contain a stationary GPS computer.
  • -
  • You can now toggle your GPS off with alt+click.
  • -
-

bgobandit updated:

-
    -
  • Due to budget cuts, Nanotrasen is no longer utilizing copy-protected paper for its classified documents. Fortunately, our world-class security team has always prevented any thefts or photocopies from being made!
  • -
  • Secret documents can be photocopied. If you have an objective to steal any set of documents, a photocopy will be accepted. If you must steal red or blue documents, a photocopy will NOT be accepted. Enterprising traitors can forge the red/blue seal with a crayon to take advantage of this.
  • -
- -

06 April 2016

-

CoreOverload updated:

-
    -
  • You can now put slimes in stasis by exposing them to room temp CO2. Useful for both fighting the slimes and safely storing them.
  • -
-

Erwgd updated:

-
    -
  • The autolathe can now make hydroponics tools! Access the design routines in the Misc. category of the machine.
  • -
-

LanCartwright updated:

-
    -
  • Custom viruses with stealth values of 3 or above are now invisible on the PANDEMIC and no longer visible on health huds.
  • -
-

MrStonedOne updated:

-
    -
  • Centcom is happy to report that our single sided windows and our windoors should once again create an airtight seal.
  • -
-

bgobandit updated:

-
    -
  • Honk! Nanotrasen's clowning and development department has invented the clown megaphone, standard in all clowning loadouts! Honk honk!
  • -
- -

05 April 2016

-

Erwgd updated:

-
    -
  • Utility belts of all kinds can now accept gloves. Most belts, except janitorial belts, may now also hold station bounced radios.
  • -
  • Hazard vests and most jackets can carry a station bounced radio as well. Labcoats can be used to store a handheld crew monitor.
  • -
  • The autolathe can now make toolboxes.
  • -
-

Joan updated:

-
    -
  • Adds protector holoparasites to traitor holoparasite injectors.
  • -
  • Protector holoparasites cause the summoner to teleport to them when out of range, instead of the other way around.
  • -
  • Protector holoparasites have two modes; Combat, where they do and take medium damage, and Protection, where they do and take almost no damage, but move slightly slower.
  • -
  • Explosive Holoparasites no longer teleport non-mobs when attacking, but have a higher chance to teleport mobs.
  • -
  • Explosive Holoparasite bombs no longer trigger on their summoner or any other parasites their summoner has.
  • -
  • Ranged Holoparasites no longer have nightvision active by default. It can still be toggled on.
  • -
  • Ranged Holoparasite snares no longer alert if the crossing mob is their summoner or one of the parasites their summoner has.
  • -
  • Ranged Holoparasites are slightly less visible in scout mode.
  • -
  • Standard Holoparasites attack 20% faster than other parasite types.
  • -
  • Support Holoparasite beacons no longer require safe atmospheric conditions, but the warp channel takes slightly longer, and is preceded with a visible message.
  • -
  • Zombies can no longer destroy more than one airlock at a time.
  • -
  • The mining station has been updated.
  • -
-

MrStonedOne updated:

-
    -
  • Centcom is glad to announce the end of sending workers to our control group for space exposure testing, a fake station in "space" that noticeably had air in "space".
  • -
-

TechnoAlchemisto updated:

-
    -
  • Detective scanners are now smaller.
  • -
  • Pickaxes now fit in explorer suit exosuit slots.
  • -
-

bgobandit updated:

-
    -
  • Alt-clicking a fire extinguisher cabinet opens and closes it. That is all.
  • -
- -

04 April 2016

-

TechnoAlchemisto updated:

-
    -
  • The recipes for some Trekchems are now back in the game
  • -
  • Bicaridine can be made with carbon, oxygen, and sugar.
  • -
  • Kelotane can be made with silicon and carbon.
  • -
  • Antitoxin can be made with nitrogen, silicon, and potassium
  • -
  • tricordrazine can be made by combining all three.
  • -
- -

03 April 2016

-

Erwgd updated:

-
    -
  • Our valued colleagues in the security department are reminded to search boots for hidden items (such as knives or syringes) as part of standard search procedures. Alt-click a pair of boots to remove any hidden items.
  • -
-

Isratosh updated:

-
    -
  • Fixed rudimentary transform not working properly on ghosts with minds.
  • -
  • Admin logs for bluespace capsules not activated on the mining Z level.
  • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 94109b63f59..04a637821c3 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -4788,6 +4788,107 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - experiment: This doesn't mean throwing a supermatter shard at the blob is a good idea; blobs attacking it will gradually damage it, eventually resulting in a massive explosion, and it will not consume blobs if on a space turf. + - tweak: Hitting a locker or crate with an ID, PDA with ID, or wallet with ID will + try to toggle the lock instead of trying to open it. + - imageadd: Cable coils, cablecuffs, and zipties now all have properly colored inhands. + Kor: + - rscadd: Megafauna have been added to lavaland. + - rscadd: Ash Drakes have been spotted roaming the wastes. Use your GPS to track + their fiery signals. + - rscadd: You can now knock on the Necropolis door, but it's probably best that + you don't. Mercenaryblue: - rscadd: Adds a basic paper plane to the game. Fold paper with alt-clicking. - rscadd: Paper planes are now fully compatible with every stamps on station. + bgobandit: + - rscadd: 'Nanotrasen has released Cards Against Spess! Visit your local library + for a copy. Warning: may cause breakage of the fourth wall.' +2016-05-02: + Joan: + - tweak: Blob spores spawn from factories 2 seconds faster, but the factory goes + on cooldown when any of its spores die. + - experiment: You can examine tomes, soulstones, and construct shells to see what + you can do with them. + - rscadd: Releasing a shade from a soulstone now allows you to reuse that soulstone + for capturing shades or souls, instead of preventing the stone's use forever + if the shade dies. + - imageadd: Runes now actually pulse red on failure. + - rscadd: The Summon Cultist rune no longer includes the cultists invoking it in + the selection menu. + - tweak: Imperfect Communication renamed to Emergency Communication. + - rscdel: You can no longer hide the Nar-Sie rune with a Talisman of Veiling/Revealing. + Kor: + - rscadd: Engineering cyborgs now have internal blueprints. + Lzimann: + - tweak: Automatic nexus placing time changed from 2 to 15 minutes. + - tweak: Prophet's gear(hat and staff) prioritizes the backpack instead of automatically + equipping. + - rscadd: Divine telepathy and prophet to god speak now have a follow button for + ghosts. + - rscadd: Divine telepathy and prophet to god speak now has the god's color. + - bugfix: CTF spawn protection trap is no longer constructable + Mercenaryblue: + - tweak: Drastically reduced the chances of eye damage when throwing a paper plane. + RandomMarine: + - tweak: Medical HUDs improved. To better prioritize patients, subjects deep into + critical condition have a blinking red outline around the entire HUD icon, and + will blink more rapidly when very close to death. + TechnoAlchemisto: + - tweak: Security uniforms have been made more professional, and more tactical. + TrustyGun: + - rscadd: By crafting together a legion skull, a goliath steak, ketchup, and capsaicin + oil, you can create Stuffed Legion! Be careful, it's hot. + coiax: + - rscadd: Centcom Department of [REDACTED] have announced a change of supplier of + [EXPLETIVE DELETED]. As such, for security reasons, the absinthe [MOVE ALONG + CITIZEN] will instead be [NOTHING TO SEE HERE]. We hope that this will not affect + the performance of the [INFORMATION ABOVE YOUR SECURITY CLEARANCE]. + nullbear: + - rscadd: A reminder for crew to avoid mopping floors in cold rooms, as the water + will freeze and provide a dangerous slipping hazard known as 'ice'. Running + on it is not recommended. + - rscadd: Frostoil is an effective chemical for rapidly cooling areas in the event + of a fire. + - rscadd: Added X4, a breaching charge more destructive than C4, it can be purchased + from uplinks. + - rscadd: C4 can be used with assemblies. + - bugfix: Fixes chembomb recipe to use any matter bin. Again. + - bugfix: ARG's disappear once finished reacting. +2016-05-03: + coiax, Robustin: + - tweak: Changeling Fleshmend is much less effective when used repeatedly in a short + time. Changeling Panacea is much more effective at purging reagents, reducing + radiation and now reduces braindamage. +2016-05-04: + Fox McCloud: + - tweak: shock revolver projectiles are now energy instead of bullets + Joan: + - rscdel: Cultists no longer communicate via tomes. + - rscadd: Cultists now communicate via the 'Communion' action button. + - rscadd: Examining the blob with an active research scanner or medical hud will + display effects, akin to hitting it with an analyzer. + - rscadd: Improved medical HUDs to work on all living creatures. + - rscadd: Drones and swarmers, being machines, require a diagnostic HUD for analysis + instead. + TechnoAlchemist: + - rscadd: You can now craft cloaks from the scales of fallen ash drakes, look for + the recipe in tablecrafting! + coiax: + - rscadd: The Service and the Standard cyborg module now have a spraycan built in, + for hijinks and passing on important urban messages. The Service cyborg module + also has a cyborg-hand labeler, in case anything needs to be labelled. + - rscadd: 'Centcom Suicide Prevention wishes to remind the station: Please do not + kill yourself with a hand labeler.' + xxalpha: + - bugfix: Fixed the mk-honk prototype shoes. +2016-05-05: + Joan: + - tweak: Revenants are slower while revealed. + - rscdel: Revenants can no longer cast inside dense objects. + - tweak: Lying down will cure Blight much, much faster. + \"Macho Man\" Randy Savage: + - rscadd: OOOHHH YEAAAAHHHH + - rscadd: SNAP INTO A JLIM SIM WITH THE ALL NEW WRESTLING BELT + - rscadd: YOU CAN FREAKOUT YOUR OPPONENTS WITH THE 5 HOT MOVES ON THIS BELT YEAH + - rscadd: PRAY TO THE LOCAL SPACE GODS TO EXCHANGE YOUR TELECRYSTALS TO ENSURE THE + CREAM RISES TO THE TOP diff --git a/html/changelogs/AutoChangeLog-pr-15872.yml b/html/changelogs/AutoChangeLog-pr-15872.yml deleted file mode 100644 index e8006c6be50..00000000000 --- a/html/changelogs/AutoChangeLog-pr-15872.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: bgobandit -delete-after: True -changes: - - rscadd: "Nanotrasen has released Cards Against Spess! Visit your local library for a copy. Warning: may cause breakage of the fourth wall." diff --git a/html/changelogs/AutoChangeLog-pr-17018.yml b/html/changelogs/AutoChangeLog-pr-17018.yml deleted file mode 100644 index a6b4149e70f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-17018.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: Kor -delete-after: True -changes: - - rscadd: "Megafauna have been added to lavaland." - - rscadd: "Ash Drakes have been spotted roaming the wastes. Use your GPS to track their fiery signals." - - rscadd: "You can now knock on the Necropolis door, but it's probably best that you don't." diff --git a/html/changelogs/AutoChangeLog-pr-17224.yml b/html/changelogs/AutoChangeLog-pr-17224.yml deleted file mode 100644 index c657ab9f167..00000000000 --- a/html/changelogs/AutoChangeLog-pr-17224.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Joan -delete-after: True -changes: - - tweak: "Hitting a locker or crate with an ID, PDA with ID, or wallet with ID will try to toggle the lock instead of trying to open it." diff --git a/html/changelogs/AutoChangeLog-pr-17262.yml b/html/changelogs/AutoChangeLog-pr-17262.yml deleted file mode 100644 index 76ab51f12e2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-17262.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Joan -delete-after: True -changes: - - imageadd: "Cable coils, cablecuffs, and zipties now all have properly colored inhands." diff --git a/html/changelogs/__CHANGELOG_README.txt b/html/changelogs/__CHANGELOG_README.txt index b15854c38ac..048d67d3d21 100644 --- a/html/changelogs/__CHANGELOG_README.txt +++ b/html/changelogs/__CHANGELOG_README.txt @@ -4,6 +4,8 @@ Changelogs are included with commits as text .yml files created individually by TO MAKE A CHANGELOG .YML ENTRRY +0. Consider carefully if a change you make really needs a changelog, and if it does how many lines should be dedicated to it. A set of changes with no forward facing player effects like a refactor almost certainly doesn't need a changelog, nor does something that makes itself obvious during the normal course of play like adding an action button to an item players already commonly pick up. Likewise if you DO need a changelog consider packaging similar changes under a generalized line instead of listing out every little change as its own thing. Only you can prevent changelog clutter. + 1. Make a copy of the file example.yml in html/changelogs and rename it to [YOUR USERNAME]-PR-[YOUR PR NUMBER].yml (the pr and pr number are organizational and can be ignored if you so wish) 2. Change the author to yourself diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi index 7dee0928ecb..365d550bce6 100644 Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index 2135433d792..06905f87d76 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 7a45a41000e..7ff3d653fec 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index 2c4309a7893..80fd29fbd21 100644 Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ diff --git a/icons/mob/lavaland/lavaland_monsters.dmi b/icons/mob/lavaland/lavaland_monsters.dmi index b7808452186..8cf32385df3 100644 Binary files a/icons/mob/lavaland/lavaland_monsters.dmi and b/icons/mob/lavaland/lavaland_monsters.dmi differ diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi index 05cb8392c08..116fbe4090c 100644 Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 11f55cbc902..cce17c5a3fb 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 97bcb38d571..3677aa37478 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/apc_repair.dmi b/icons/obj/apc_repair.dmi index 8f66aa27c86..220a267fe7a 100644 Binary files a/icons/obj/apc_repair.dmi and b/icons/obj/apc_repair.dmi differ diff --git a/icons/obj/assemblies.dmi b/icons/obj/assemblies.dmi index 5a8719da0d8..6a862a263a8 100644 Binary files a/icons/obj/assemblies.dmi and b/icons/obj/assemblies.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 1b82adf78b1..d3ffb548b3e 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index b44076fdda4..623836f5898 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index cbee4708202..73016befbb0 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index 20fcc6a2450..956304f1fba 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi index e17974ecd19..4e38271e7ee 100644 Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi index 28259f75fc5..11f388bc1af 100644 Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ diff --git a/strings/cas_black.txt b/strings/cas_black.txt index dec808fa46a..a3274c5be44 100644 --- a/strings/cas_black.txt +++ b/strings/cas_black.txt @@ -19,6 +19,7 @@ What's the Captain's fetish? ___________: more robust than a toolbox to the head! ________ is the crew's friend. Would you abandon a friend? _______ tastes good like a ________ should. +How did the detective conduct a successful interrogation? New in syndicate uplinks: __________! NanoTrasen's labor union decided to use _______ to raise employee morale. The Chemist's drug of choice is ______ @@ -26,6 +27,7 @@ According to space law, ________ is now punishable by ______. ________ is why I'm afraid of maintenance. ________ is the most robust person on the station. What made the nuclear operatives fluke? +Why did the Chief Engineer disable comms? Every spaceman receives an internals box and ________. What brought the space orgy to a grinding halt? Scientists are no longer allowed to make _____. @@ -50,15 +52,20 @@ My lizard name is _____-And-_____. What can solve any station crisis? The traitorous atmos tech slowly replaced the station's air with ________. _______ and _______ were found together in the dorms. +What's the Syndicate's real beef with Nanotrasen? What finally killed the Head of Security? +Code Delta: __________ has escaped containment! The rogue virologist released a disease with symptoms of __________ and ______. How do you drive an assistant to suicide? +With no chef on board, the crew was reduced to eating ________. Why was the emergency shuttle called? In the future, all ERP will involve ____________. Law 2 is not to be used for __________! What really goes on in the Prisoner Transfer Center? What will get you bluespace artilleried every time? This isn't omnizine, it's _________! +What's stopping the Space Station 13 remake? +When they make a movie about Space Station 13, they better include________. What's the worst thing an abductor can give you? One day while Andy was __________, Woody got _________. A good engineer always carries ________. @@ -85,6 +92,7 @@ The chaplain stopped performing marriages after seeing ___________. The gods were too busy with _______ to respond to _______. The Roboticist was fired after naming the borgs ______ and _________. What's funnier than a dead clown? +What made the mime speak? How do you get an assistant to assist? What was I last brigged for? Why does Security no longer use the gulag? diff --git a/strings/cas_white.txt b/strings/cas_white.txt index 45a38d2c2fa..4e5e920a959 100644 --- a/strings/cas_white.txt +++ b/strings/cas_white.txt @@ -12,12 +12,14 @@ A catsplosion. Mime porn. That fukken disk. G-g-g-ghosts! +A PDA shaped like a set of breasts. Woody-chan. Meaty ores. Yet another explosion in Toxins. The Captain thinking they're a badass. Mech bumper cars. Purrbation. +Baymed. Being in a cult. Racially biased lawsets. Abusing Law 2 to get laid. @@ -39,11 +41,13 @@ The grey tide. ASS BLAST USA. Fucking plasmamen. Lavaland. +Chainsaws for hands. Photocopies of the entire crew's asses. Venus human traps. Clown's Tears. Walking mushroom cockfights. Greentext. +Coating the whole station in blood. Defusing a syndicate bomb with another bomb. A petsplosion. Meat spikes. @@ -71,7 +75,7 @@ Cablecuffs. Hulk, TK and X-Ray. Paranoia. ERP-seeking meteors. -Paperwork Nazi HoPs. +Paperwork HoPs. A sexy clown. Rampant vending machines. The prisoner transfer center. @@ -88,14 +92,19 @@ Inviting all the lizards onto the holodeck for a party. A used corgi suit. Saxing. Carbon dioxide. +Lewd alien abduction. Warm donk pockets. Fucking your own cloned body. +MULEbot manslaughter. Hiding in a locker like a little bitch. Tabling. Gyrating slimes. A motherfucking sorcerer. Ash storms. Telescience. +Anatomically correct borgs. +The dixel. +Friendly neighborhood death squads. Rage cages. Lore that no one will read. A robust mongoloid. @@ -119,6 +128,8 @@ Six max-cap bombs. Xenos pleasuring their victims with anal. Forgetting you're a traitor. Itching powder. +Some overpowered bullshit. +Griff. Ash walkers. A fascist captain. FREE DRONE. @@ -134,6 +145,7 @@ Immulsions. The crotchety IBM piece of shit you're supposed to call an AI. An irritatingly chipper borg. The lizard fuckpile. +Fat sprites. The throbbing erection that the HoS gets at the thought of shooting something. Trying to stab someone and hugging them instead. Buttbots. @@ -142,6 +154,7 @@ The spread-eagled Honkmother. A disposal loop full of corpses. Assistant-on-assistant violence. The mystery of atmos. +PDA sexting. A cult rune drawn with menstrual blood. Magic missile spam. Double dongs. @@ -187,13 +200,16 @@ Farting in the air distro loop. Krokodil addiction. A H.O.N.K. mech. A dominatrix HoS. +Sexcurity. The Experimentor. That goddamn fucking mime. Actually taking a hostage instead of just murdering them. Spacing the clown at shift start. A rage suicide. +The Warden furiously masturbating to the prison monitor. Welderbombing. Validhunting. +Nar'Sie making love to Lord Singulo. Fun. Crashing the stock market. HONK! @@ -202,6 +218,7 @@ A defective comdom. Cleanbot. A beaker of dried space carp penis. voxtest2. +Nuking it from orbit. Harmbatonning. A Nanotrasen D-Notice. TALKING MIMES. @@ -209,6 +226,7 @@ The lusty xenomorph maid, Using assistants as human shields. Sentient securitrons. Decorative C4. +A universal recorder endlessly reciting porn. The suicide HoPline. Cultism. A corgi orgy. @@ -228,6 +246,7 @@ Writing out Woody's Got Wood in crayon. Begging the gods for free stuff. Whining to the gods after getting robusted. Committing sudoku. +A blood-soaked clown popping out of a morgue tray. SS13's toxic community. Wheelchair Ian. An actually helpful assistant. diff --git a/tgstation.dme b/tgstation.dme index 639fa0aff96..fc85ee4a9ce 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -223,6 +223,7 @@ #include "code\datums\helper_datums\teleport.dm" #include "code\datums\helper_datums\topic_input.dm" #include "code\datums\martial\krav_maga.dm" +#include "code\datums\martial\wrestling.dm" #include "code\datums\wires\airalarm.dm" #include "code\datums\wires\airlock.dm" #include "code\datums\wires\apc.dm" @@ -299,6 +300,7 @@ #include "code\game\gamemodes\changeling\powers\tiny_prick.dm" #include "code\game\gamemodes\changeling\powers\transform.dm" #include "code\game\gamemodes\cult\cult.dm" +#include "code\game\gamemodes\cult\cult_comms.dm" #include "code\game\gamemodes\cult\cult_items.dm" #include "code\game\gamemodes\cult\cult_structures.dm" #include "code\game\gamemodes\cult\ritual.dm" @@ -469,6 +471,7 @@ #include "code\game\mecha\mech_bay.dm" #include "code\game\mecha\mech_fabricator.dm" #include "code\game\mecha\mecha.dm" +#include "code\game\mecha\mecha_actions.dm" #include "code\game\mecha\mecha_construction_paths.dm" #include "code\game\mecha\mecha_control_console.dm" #include "code\game\mecha\mecha_defense.dm" @@ -643,6 +646,7 @@ #include "code\game\objects\items\weapons\grenades\flashbang.dm" #include "code\game\objects\items\weapons\grenades\ghettobomb.dm" #include "code\game\objects\items\weapons\grenades\grenade.dm" +#include "code\game\objects\items\weapons\grenades\plastic.dm" #include "code\game\objects\items\weapons\grenades\smokebomb.dm" #include "code\game\objects\items\weapons\grenades\spawnergrenade.dm" #include "code\game\objects\items\weapons\grenades\syndieminibomb.dm" @@ -1354,6 +1358,7 @@ #include "code\modules\mob\living\simple_animal\shade.dm" #include "code\modules\mob\living\simple_animal\simple_animal.dm" #include "code\modules\mob\living\simple_animal\spawner.dm" +#include "code\modules\mob\living\simple_animal\status_procs.dm" #include "code\modules\mob\living\simple_animal\bot\bot.dm" #include "code\modules\mob\living\simple_animal\bot\cleanbot.dm" #include "code\modules\mob\living\simple_animal\bot\construction.dm"