diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm index 0a2280a5a53..d41cfaa3a68 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm @@ -1,34 +1,35 @@ "a" = (/turf/template_noop,/area/template_noop) -"b" = (/turf/closed/wall/shuttle/smooth/nodiagonal{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"c" = (/obj/structure/closet/crate,/obj/item/weapon/pickaxe,/obj/item/weapon/pickaxe,/obj/item/weapon/pickaxe,/obj/item/weapon/storage/bag/ore,/obj/item/weapon/storage/bag/ore,/obj/item/device/mining_scanner,/obj/item/device/flashlight/lantern,/obj/item/weapon/card/id/mining,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"d" = (/obj/structure/closet/crate,/obj/item/weapon/pickaxe,/obj/item/weapon/pickaxe,/obj/item/weapon/storage/bag/ore,/obj/item/weapon/storage/bag/ore,/obj/item/device/mining_scanner,/obj/item/device/flashlight/lantern,/obj/item/weapon/card/id/mining,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"e" = (/obj/item/weapon/storage/toolbox/mechanical,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"f" = (/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"g" = (/obj/structure/reagent_dispensers/watertank,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"h" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "o2=14;n2=23;TEMP=300"},/area/ruin/powered) -"i" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "o2=14;n2=23;TEMP=300"},/area/ruin/powered) -"j" = (/obj/machinery/door/airlock/shuttle,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"k" = (/obj/machinery/computer/arcade/battle,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"l" = (/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"m" = (/obj/effect/mob_spawn/human/golem/adamantine,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"n" = (/obj/machinery/mineral/equipment_vendor/golem,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"o" = (/obj/item/weapon/resonator,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"p" = (/obj/machinery/mineral/ore_redemption,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"q" = (/obj/structure/statue/gold/rd,/obj/structure/window/reinforced{dir = 4; name = "shrine of the liberator"; pixel_x = 0},/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"r" = (/obj/machinery/computer/shuttle,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"s" = (/obj/structure/extinguisher_cabinet{pixel_y = 30},/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"t" = (/obj/structure/table/wood,/obj/item/weapon/bedsheet/rd{desc = "Majestic."; layer = 3; name = "Royal Cape of the Liberator"; pixel_x = 5; pixel_y = 9},/obj/item/weapon/book/manual/research_and_development{name = "Sacred Text of the Liberator"; pixel_x = -4; pixel_y = 3},/obj/structure/window/reinforced{dir = 4; name = "shrine of the liberator"; pixel_x = 0},/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"u" = (/obj/item/weapon/resonator/upgraded,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"v" = (/obj/machinery/autolathe,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"w" = (/obj/structure/table/wood,/obj/machinery/reagentgrinder,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"x" = (/obj/machinery/computer/arcade/orion_trail,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"y" = (/obj/structure/extinguisher_cabinet{pixel_y = -30},/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"z" = (/obj/structure/table/wood,/obj/item/weapon/surgical_drapes{pixel_x = 15},/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/fire,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"A" = (/obj/item/weapon/storage/firstaid/fire,/obj/structure/table/wood,/obj/item/weapon/storage/firstaid/fire,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"B" = (/obj/item/weapon/storage/firstaid/brute,/obj/structure/table/wood,/obj/item/weapon/storage/firstaid/brute,/obj/item/areaeditor/blueprints{desc = "Use to build new structures in the wastes."; name = "land claim"},/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"C" = (/obj/item/weapon/storage/firstaid/brute,/obj/structure/table/wood,/obj/item/weapon/storage/firstaid/brute,/obj/item/weapon/disk/design_disk/golem_shell,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"D" = (/obj/structure/reagent_dispensers/fueltank,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"E" = (/obj/structure/ore_box,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"b" = (/turf/closed/wall/shuttle/smooth/nodiagonal{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"c" = (/obj/structure/closet/crate,/obj/item/weapon/pickaxe,/obj/item/weapon/pickaxe,/obj/item/weapon/pickaxe,/obj/item/weapon/storage/bag/ore,/obj/item/weapon/storage/bag/ore,/obj/item/device/mining_scanner,/obj/item/device/flashlight/lantern,/obj/item/weapon/card/id/mining,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"d" = (/obj/structure/closet/crate,/obj/item/weapon/pickaxe,/obj/item/weapon/pickaxe,/obj/item/weapon/storage/bag/ore,/obj/item/weapon/storage/bag/ore,/obj/item/device/mining_scanner,/obj/item/device/flashlight/lantern,/obj/item/weapon/card/id/mining,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"e" = (/obj/item/weapon/storage/toolbox/mechanical,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"f" = (/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"g" = (/obj/structure/reagent_dispensers/watertank,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"h" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "o2=14;n2=23;TEMP=300"},/area/ruin/powered/golem_ship) +"i" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "o2=14;n2=23;TEMP=300"},/area/ruin/powered/golem_ship) +"j" = (/obj/machinery/door/airlock/shuttle,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"k" = (/obj/machinery/computer/arcade/battle,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"l" = (/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"m" = (/obj/effect/mob_spawn/human/golem/adamantine,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"n" = (/obj/machinery/mineral/equipment_vendor/golem,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"o" = (/obj/item/weapon/resonator,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"p" = (/obj/machinery/mineral/ore_redemption,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"q" = (/obj/structure/statue/gold/rd,/obj/structure/window/reinforced{dir = 4; name = "shrine of the liberator"; pixel_x = 0},/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"r" = (/obj/machinery/computer/shuttle,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"s" = (/obj/machinery/bluespace_beacon,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"t" = (/obj/structure/extinguisher_cabinet{pixel_y = 30},/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"u" = (/obj/structure/table/wood,/obj/item/weapon/bedsheet/rd{desc = "Majestic."; layer = 3; name = "Royal Cape of the Liberator"; pixel_x = 5; pixel_y = 9},/obj/item/weapon/book/manual/research_and_development{name = "Sacred Text of the Liberator"; pixel_x = -4; pixel_y = 3},/obj/structure/window/reinforced{dir = 4; name = "shrine of the liberator"; pixel_x = 0},/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"v" = (/obj/item/weapon/resonator/upgraded,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"w" = (/obj/machinery/autolathe,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"x" = (/obj/structure/table/wood,/obj/machinery/reagentgrinder,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"y" = (/obj/machinery/computer/arcade/orion_trail,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"z" = (/obj/structure/extinguisher_cabinet{pixel_y = -30},/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"A" = (/obj/structure/table/wood,/obj/item/weapon/surgical_drapes{pixel_x = 15},/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/fire,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"B" = (/obj/item/weapon/storage/firstaid/fire,/obj/structure/table/wood,/obj/item/weapon/storage/firstaid/fire,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"C" = (/obj/item/weapon/storage/firstaid/brute,/obj/structure/table/wood,/obj/item/weapon/storage/firstaid/brute,/obj/item/areaeditor/blueprints{desc = "Use to build new structures in the wastes."; name = "land claim"},/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"D" = (/obj/item/weapon/storage/firstaid/brute,/obj/structure/table/wood,/obj/item/weapon/storage/firstaid/brute,/obj/item/weapon/disk/design_disk/golem_shell,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"E" = (/obj/structure/reagent_dispensers/fueltank,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) +"F" = (/obj/structure/ore_box,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaa @@ -40,14 +41,14 @@ aabbbbjjbbbbjjbbbbbb aabkllllmmbllllllnhi aabllllloojlllllllhi bbbjjbbbbbblllllpbbb -bqrllllllljlllllljsj -btlllllllljlllllljlj -bbbjjbbbbbblllluvbbb -aabllllloojllllllwhi -aabxllllmmbyllzABChi +bqrllllllljlslllljtj +bulllllllljlllllljlj +bbbjjbbbbbbllllvwbbb +aabllllloojllllllxhi +aabyllllmmbzllABCDhi aabbbbjjbbbbjjbbbbbb -aaaaabfffffffffffDhi -aaaaabEEEEEEEefffDhi +aaaaabfffffffffffEhi +aaaaabFFFFFFFefffEhi aaaaabbbbbbbbbbbbbbb aaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaa diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm new file mode 100644 index 00000000000..5d7751cb668 --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm @@ -0,0 +1,372 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"c" = ( +/obj/structure/sign/mining/survival{ + pixel_y = -32 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"d" = ( +/turf/closed/wall/shuttle/survival/pod{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"e" = ( +/obj/structure/sign/mining/survival{ + dir = 4; + icon_state = "survival"; + pixel_x = 32; + tag = "icon-survival (EAST)" + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"f" = ( +/obj/structure/fans, +/turf/open/floor/pod/dark{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"g" = ( +/obj/machinery/smartfridge/survival_pod/empty, +/turf/open/floor/pod/dark{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"h" = ( +/obj/item/device/gps/computer, +/obj/structure/tubes, +/turf/open/floor/pod/dark{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"i" = ( +/obj/structure/sign/mining/survival{ + dir = 8; + icon_state = "survival"; + pixel_x = -32; + tag = "icon-survival (WEST)" + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"j" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"k" = ( +/obj/machinery/sleeper/survival_pod, +/turf/open/floor/pod/dark{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"l" = ( +/obj/item/weapon/pickaxe, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/pod/dark{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"m" = ( +/obj/structure/bed/pod, +/obj/item/weapon/bedsheet/black, +/obj/structure/tubes, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/pod/dark{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"n" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"o" = ( +/obj/effect/decal/cleanable/blood, +/mob/living/simple_animal/hostile/asteroid/goliath/beast{ + health = 0 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"p" = ( +/obj/structure/table/survival_pod, +/obj/item/weapon/kitchen/knife/combat/survival, +/turf/open/floor/pod/dark{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"q" = ( +/obj/effect/mob_spawn/human/miner/explorer{ + brute_damage = 150; + oxy_damage = 50 + }, +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/blood/footprints{ + tag = "icon-blood1 (NORTH)"; + icon_state = "blood1"; + dir = 1 + }, +/turf/open/floor/pod/dark{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"r" = ( +/obj/structure/tubes, +/obj/item/weapon/crowbar, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/pod/dark{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"s" = ( +/obj/effect/decal/cleanable/blood/footprints{ + icon_state = "blood1" + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"t" = ( +/obj/effect/decal/cleanable/blood/footprints{ + tag = "icon-blood1 (NORTH)"; + icon_state = "blood1"; + dir = 1 + }, +/obj/machinery/door/airlock/survival_pod, +/turf/open/floor/pod/dark{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"u" = ( +/obj/effect/decal/cleanable/blood/footprints{ + tag = "icon-blood1 (WEST)"; + icon_state = "blood1"; + dir = 8 + }, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"v" = ( +/obj/effect/decal/cleanable/blood/footprints{ + tag = "icon-blood1 (WEST)"; + icon_state = "blood1"; + dir = 8 + }, +/obj/effect/decal/cleanable/blood/footprints{ + icon_state = "blood1" + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"w" = ( +/obj/structure/sign/mining/survival{ + pixel_y = 32 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"x" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/blood/footprints{ + tag = "icon-blood1 (NORTH)"; + icon_state = "blood1"; + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"y" = ( +/obj/structure/sign/mining{ + pixel_y = 32 + }, +/obj/effect/decal/cleanable/blood/footprints{ + tag = "icon-blood1 (WEST)"; + icon_state = "blood1"; + dir = 8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"z" = ( +/obj/effect/decal/cleanable/blood/footprints{ + tag = "icon-blood1 (WEST)"; + icon_state = "blood1"; + dir = 8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"A" = ( +/obj/effect/decal/cleanable/blood/footprints{ + icon_state = "blood1" + }, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +b +b +b +b +b +a +a +a +"} +(3,1,1) = {" +a +a +a +b +b +e +b +e +b +b +a +a +"} +(4,1,1) = {" +a +a +a +b +d +d +d +d +d +b +a +a +"} +(5,1,1) = {" +a +a +b +c +d +f +k +p +d +w +b +b +"} +(6,1,1) = {" +a +a +b +b +d +g +l +q +t +x +b +b +"} +(7,1,1) = {" +a +b +b +c +d +h +m +r +d +y +b +b +"} +(8,1,1) = {" +a +a +b +b +d +d +d +d +d +z +j +j +"} +(9,1,1) = {" +a +a +a +b +b +i +b +i +u +A +b +b +"} +(10,1,1) = {" +a +a +a +b +b +j +n +s +v +a +a +a +"} +(11,1,1) = {" +a +a +a +a +a +a +o +j +b +a +a +a +"} +(12,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_tomb.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_tomb.dmm new file mode 100644 index 00000000000..dc5f71c3e89 --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_tomb.dmm @@ -0,0 +1,877 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/closed/mineral/volcanic/lava_land_surface, +/area/lavaland/underground) +"c" = ( +/turf/template_noop, +/area/lavaland/underground) +"d" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/underground) +"e" = ( +/obj/effect/decal/remains/human, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/underground) +"f" = ( +/turf/open/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/underground) +"g" = ( +/turf/closed/indestructible/riveted{ + icon = 'icons/turf/walls/iron_wall.dmi'; + icon_state = "iron"; + name = "dense wall" + }, +/area/ruin/powered) +"h" = ( +/obj/structure/table, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"i" = ( +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"j" = ( +/mob/living/simple_animal/hostile/skeleton, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"k" = ( +/obj/structure/bodycontainer/morgue{ + desc = "An oddly modernized tomb, at least compared to where it currently is."; + name = "tomb" + }, +/obj/effect/mob_spawn/human/skeleton, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"l" = ( +/obj/structure/bodycontainer/morgue{ + desc = "An oddly modernized tomb, at least compared to where it currently is."; + name = "tomb" + }, +/obj/effect/mob_spawn/human/skeleton, +/obj/item/weapon/shovel/cursed, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"m" = ( +/obj/item/weapon/grown/bananapeel, +/obj/structure/mineral_door/transparent/diamond, +/turf/open/floor/vault{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"n" = ( +/obj/item/weapon/ore/diamond, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"o" = ( +/turf/open/floor/vault{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"p" = ( +/obj/item/weapon/ore/gold, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"q" = ( +/turf/open/floor/plating/lava/smooth/lava_land_surface, +/area/ruin/powered) +"r" = ( +/obj/structure/bodycontainer/morgue{ + desc = "An oddly modernized tomb, at least compared to where it currently is."; + name = "tomb" + }, +/obj/effect/mob_spawn/human/skeleton{ + helmet = /obj/item/clothing/head/helmet/stahlhelm; + name = "german remains"; + uniform = /obj/item/clothing/under/wwii + }, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"s" = ( +/obj/structure/table, +/obj/item/weapon/tome, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"t" = ( +/obj/item/weapon/grown/bananapeel, +/obj/structure/mineral_door/silver, +/turf/open/floor/vault{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"u" = ( +/obj/item/weapon/ore/bananium, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"v" = ( +/obj/item/weapon/grown/bananapeel, +/obj/structure/mineral_door/gold, +/turf/open/floor/vault{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"w" = ( +/obj/structure/table/optable/abductor{ + desc = "A strange, alien-like table for cutting up things, like people."; + name = "strange alien slab" + }, +/obj/effect/gibspawner/human, +/obj/effect/mob_spawn/human/skeleton, +/obj/item/weapon/veilrender/honkrender, +/obj/item/clothing/mask/gas/clown_hat, +/turf/open/floor/vault{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"x" = ( +/obj/structure/table, +/obj/item/weapon/spellbook/oneuse/charge, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"y" = ( +/obj/structure/bodycontainer/morgue{ + desc = "An oddly modernized tomb, at least compared to where it currently is."; + name = "tomb" + }, +/obj/effect/mob_spawn/human/skeleton{ + helmet = /obj/item/clothing/head/ushanka; + name = "russian remains"; + uniform = /obj/item/clothing/under/soviet + }, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"z" = ( +/obj/item/weapon/ore/uranium, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"A" = ( +/obj/item/weapon/ore/plasma, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"B" = ( +/obj/item/weapon/grown/bananapeel, +/obj/structure/mineral_door/iron, +/turf/open/floor/vault{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"C" = ( +/obj/structure/table, +/obj/item/weapon/twohanded/spear, +/obj/item/weapon/shield/riot/buckler, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"D" = ( +/obj/item/weapon/grown/bananapeel, +/obj/structure/mineral_door/iron, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +b +b +b +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +b +d +d +e +d +b +b +d +a +a +a +a +a +a +"} +(3,1,1) = {" +a +a +a +a +a +a +a +a +d +b +b +b +e +b +b +b +b +b +e +d +d +a +a +a +a +"} +(4,1,1) = {" +a +a +a +b +a +e +d +d +b +g +g +g +g +g +g +g +g +g +b +f +f +d +a +a +a +"} +(5,1,1) = {" +a +a +a +b +b +d +d +e +b +g +k +h +j +k +j +x +y +g +b +b +f +d +a +a +a +"} +(6,1,1) = {" +a +a +b +b +b +d +f +b +g +g +j +i +i +i +i +i +j +g +b +f +f +e +d +a +a +"} +(7,1,1) = {" +a +a +b +b +b +e +b +g +g +g +g +g +t +g +t +g +g +g +g +e +b +b +b +a +a +"} +(8,1,1) = {" +a +b +b +b +g +g +g +g +g +n +o +o +o +i +o +o +o +z +g +g +b +b +b +b +b +"} +(9,1,1) = {" +a +b +b +b +g +h +i +j +g +o +n +o +o +i +o +o +z +o +g +g +g +g +g +b +b +"} +(10,1,1) = {" +a +a +b +b +g +i +k +i +g +o +i +q +q +i +q +q +i +o +g +C +C +C +g +b +b +"} +(11,1,1) = {" +a +a +c +d +g +i +i +i +g +o +q +i +q +i +q +i +q +o +g +i +i +i +g +b +b +"} +(12,1,1) = {" +a +a +b +e +g +j +i +i +m +o +q +q +o +u +o +q +q +o +B +i +j +i +D +b +b +"} +(13,1,1) = {" +a +a +b +b +g +i +l +i +g +i +i +i +u +w +u +i +i +i +g +i +i +i +g +d +d +"} +(14,1,1) = {" +a +a +b +b +g +j +i +i +m +o +q +q +o +u +o +q +q +o +B +i +j +i +D +b +b +"} +(15,1,1) = {" +a +a +b +b +g +i +i +i +g +o +q +i +q +i +q +i +q +o +g +i +i +i +g +b +b +"} +(16,1,1) = {" +a +a +b +e +g +i +k +i +g +o +i +q +q +i +q +q +i +o +g +C +C +C +g +b +b +"} +(17,1,1) = {" +a +a +b +d +g +h +i +j +g +o +p +o +o +i +o +o +A +o +g +g +g +g +g +b +b +"} +(18,1,1) = {" +a +a +b +f +g +g +g +g +g +p +o +o +o +i +o +o +o +A +g +g +b +e +b +b +b +"} +(19,1,1) = {" +a +a +b +d +b +b +d +g +g +g +g +g +v +g +v +g +g +g +g +b +e +d +d +d +d +"} +(20,1,1) = {" +a +a +a +a +b +b +e +d +g +g +r +s +i +k +i +h +k +g +b +b +d +f +d +a +a +"} +(21,1,1) = {" +a +a +a +a +a +b +b +e +d +g +j +i +j +i +j +i +j +g +b +e +d +a +a +a +a +"} +(22,1,1) = {" +a +a +a +a +a +b +b +b +d +g +g +g +g +g +g +g +g +g +b +b +b +a +a +a +a +"} +(23,1,1) = {" +a +a +a +a +a +d +b +b +f +b +b +b +b +b +e +f +b +b +b +b +b +a +a +a +a +"} +(24,1,1) = {" +a +a +a +a +a +a +a +a +a +b +b +d +e +b +b +d +d +b +b +a +a +a +a +a +a +"} +(25,1,1) = {" +a +a +a +a +a +a +a +a +a +a +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_wwiioutpost.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_wwiioutpost.dmm new file mode 100644 index 00000000000..5e745c1c7d8 --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_wwiioutpost.dmm @@ -0,0 +1,2489 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/template_noop, +/area/template_noop) +"ab" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ac" = ( +/obj/item/stack/rods, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ad" = ( +/obj/item/stack/sheet/metal, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ae" = ( +/turf/open/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"af" = ( +/obj/item/stack/rods, +/turf/open/floor/plating{ + baseturf = /turf/open/chasm/straight_down/lava_land_surface + }, +/area/lavaland/surface/outdoors) +"ag" = ( +/turf/open/floor/plating{ + baseturf = /turf/open/chasm/straight_down/lava_land_surface + }, +/area/lavaland/surface/outdoors) +"ah" = ( +/obj/effect/mob_spawn/human/skeleton{ + helmet = /obj/item/clothing/head/ushanka; + name = "russian remains"; + uniform = /obj/item/clothing/under/soviet + }, +/obj/item/weapon/gun/projectile/revolver/nagant, +/obj/effect/decal/cleanable/blood/old, +/obj/item/ammo_casing/a357, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ai" = ( +/obj/item/weapon/c4, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"aj" = ( +/turf/closed/wall/r_wall{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"ak" = ( +/obj/item/stack/sheet/plasteel, +/obj/item/ammo_casing/a357, +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; + icon_plating = "platingdmg1"; + icon_state = "platingdmg1" + }, +/area/ruin/powered) +"al" = ( +/obj/item/stack/sheet/plasteel, +/obj/item/stack/rods, +/obj/item/ammo_casing/a357, +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; + icon_plating = "platingdmg1"; + icon_state = "platingdmg1" + }, +/area/ruin/powered) +"am" = ( +/obj/item/stack/rods, +/obj/item/ammo_casing/a357, +/obj/item/ammo_casing/mm556x45, +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; + icon_plating = "platingdmg1"; + icon_state = "platingdmg1" + }, +/area/ruin/powered) +"an" = ( +/obj/effect/mob_spawn/human/skeleton{ + helmet = /obj/item/clothing/head/ushanka; + name = "russian remains"; + uniform = /obj/item/clothing/under/soviet + }, +/obj/item/stack/sheet/plasteel, +/obj/item/weapon/gun/projectile/shotgun/boltaction, +/obj/effect/decal/cleanable/blood/old, +/obj/item/ammo_casing/mm556x45, +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; + icon_plating = "platingdmg1"; + icon_state = "platingdmg1" + }, +/area/ruin/powered) +"ao" = ( +/obj/structure/filingcabinet, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"ap" = ( +/obj/structure/window{ + icon_state = "rwindow"; + dir = 4 + }, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aq" = ( +/obj/structure/table, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"ar" = ( +/obj/effect/mob_spawn/human/skeleton{ + helmet = /obj/item/clothing/head/helmet/stahlhelm; + name = "german remains"; + uniform = /obj/item/clothing/under/wwii + }, +/obj/item/weapon/gun/projectile/automatic/pistol/APS, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"as" = ( +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; + icon_plating = "platingdmg1"; + icon_state = "platingdmg1" + }, +/area/ruin/powered) +"at" = ( +/obj/item/ammo_casing/mm556x45, +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; + icon_plating = "platingdmg1"; + icon_state = "platingdmg1" + }, +/area/ruin/powered) +"au" = ( +/obj/item/ammo_casing/a357, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"av" = ( +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aw" = ( +/obj/structure/window{ + icon_state = "rwindow"; + dir = 8 + }, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"ax" = ( +/obj/structure/window{ + icon_state = "rwindow"; + dir = 4 + }, +/obj/item/weapon/shard, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"ay" = ( +/obj/effect/gibspawner/human, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"az" = ( +/obj/machinery/constructable_frame/machine_frame{ + desc = "A specialized hypersleep chamber meant to keep its occupent in suspended animation for long periods of time. The initials 'A.D' are marked on a specialized plaque. The hypersleeper is empty. "; + dir = 2; + icon = 'icons/obj/Cryogenic2.dmi'; + icon_state = "sleeper-o"; + name = "broken hypersleep chamber"; + pixel_y = 3 + }, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aA" = ( +/obj/effect/mob_spawn/human/skeleton{ + helmet = /obj/item/clothing/head/ushanka; + name = "russian remains"; + uniform = /obj/item/clothing/under/soviet + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aB" = ( +/obj/structure/filingcabinet, +/obj/item/weapon/paper/pamphlet{ + icon = 'icons/obj/items.dmi'; + icon_state = "blueprints"; + info = "A strange looking set of blueprints with the actual schematics for whatever was once on it ripped out in what appears to be in a haste. The top of what remains of the blueprints spells out 'aus der Asche'."; + name = "ripped blueprints" + }, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aC" = ( +/obj/item/weapon/shard, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aD" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aE" = ( +/obj/effect/mob_spawn/human/skeleton{ + helmet = /obj/item/clothing/head/helmet/stahlhelm; + name = "german remains"; + uniform = /obj/item/clothing/under/wwii + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aF" = ( +/obj/effect/mob_spawn/human/skeleton{ + helmet = /obj/item/clothing/head/helmet/stahlhelm; + name = "german remains"; + uniform = /obj/item/clothing/under/wwii + }, +/obj/structure/table_frame, +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/light, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aG" = ( +/obj/item/stack/sheet/metal, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aH" = ( +/obj/structure/table, +/obj/machinery/light, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aI" = ( +/obj/machinery/door/poddoor/preopen{ + id = "lavagerman" + }, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aJ" = ( +/turf/open/floor/plasteel/stairs{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aK" = ( +/mob/living/simple_animal/hostile/wwii/bomber, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aL" = ( +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/open/floor/plasteel{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aM" = ( +/turf/open/floor/plasteel{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aN" = ( +/obj/item/ammo_casing/c9mm, +/turf/open/floor/plasteel{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aO" = ( +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/turf/open/floor/plasteel{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aP" = ( +/obj/structure/table, +/obj/item/device/flashlight/lamp, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aQ" = ( +/mob/living/simple_animal/hostile/wwii/melee, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aR" = ( +/obj/effect/spawner/lootdrop/crate_spawner, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aS" = ( +/obj/effect/mob_spawn/human/skeleton{ + helmet = /obj/item/clothing/head/ushanka; + name = "russian remains"; + uniform = /obj/item/clothing/under/soviet + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aT" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/item/ammo_casing/c9mm, +/turf/open/floor/plasteel{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aU" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aV" = ( +/obj/effect/gibspawner/human, +/turf/open/floor/plasteel{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aW" = ( +/obj/structure/closet/crate, +/obj/item/weapon/dnainjector/dwarf, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aX" = ( +/obj/structure/table, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/item/weapon/storage/firstaid/regular{ + empty = 1; + name = "first-aid kit" + }, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aY" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"aZ" = ( +/obj/structure/closet/crate, +/obj/item/weapon/dnainjector/timed/hulk, +/obj/item/weapon/dnainjector/wackymut, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"ba" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bb" = ( +/obj/structure/table, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bc" = ( +/obj/structure/table, +/obj/item/weapon/paper_bin, +/obj/item/weapon/pen, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bd" = ( +/obj/item/weapon/c4, +/turf/open/floor/plasteel{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"be" = ( +/obj/item/stack/sheet/plasteel, +/turf/open/floor/plasteel{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bf" = ( +/obj/effect/mob_spawn/human/skeleton{ + helmet = /obj/item/clothing/head/helmet/stahlhelm; + name = "german remains"; + uniform = /obj/item/clothing/under/wwii + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bg" = ( +/obj/structure/closet/crate, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bh" = ( +/obj/structure/table, +/obj/item/weapon/paper_bin, +/obj/item/weapon/pen/edagger, +/obj/item/weapon/storage/firstaid/regular, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bi" = ( +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bj" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bk" = ( +/turf/closed/wall{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bl" = ( +/obj/machinery/door/poddoor{ + id = "lavagerman" + }, +/turf/open/floor/plasteel{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bm" = ( +/obj/item/stack/rods, +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; + icon_plating = "platingdmg1"; + icon_state = "platingdmg1" + }, +/area/ruin/powered) +"bn" = ( +/obj/item/ammo_casing/c9mm, +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bo" = ( +/obj/item/ammo_casing/c9mm, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bp" = ( +/obj/machinery/door/poddoor{ + id = "lavagerman1"; + name = "secure storage a" + }, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bq" = ( +/obj/item/stack/sheet/plasteel, +/turf/open/floor/plasteel/stairs{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"br" = ( +/obj/item/stack/sheet/metal, +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface; + icon_plating = "platingdmg1"; + icon_state = "platingdmg1" + }, +/area/ruin/powered) +"bs" = ( +/obj/machinery/door/poddoor{ + id = "lavagerman2"; + name = "secure storage b" + }, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bt" = ( +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bu" = ( +/obj/effect/mob_spawn/human/skeleton{ + helmet = /obj/item/clothing/head/helmet/stahlhelm; + name = "german remains"; + uniform = /obj/item/clothing/under/wwii + }, +/obj/item/weapon/gun/projectile/automatic/pistol/APS, +/obj/effect/decal/cleanable/blood/old, +/obj/item/ammo_casing/c9mm, +/obj/item/ammo_casing/c9mm, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bv" = ( +/obj/effect/gibspawner/human, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bw" = ( +/obj/machinery/button/door{ + id = "lavagerman1"; + pixel_y = 32 + }, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bx" = ( +/obj/machinery/door/airlock/highsecurity, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"by" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bz" = ( +/obj/machinery/button/door{ + id = "lavagerman2"; + pixel_y = 32 + }, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bA" = ( +/obj/structure/table, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bB" = ( +/obj/effect/mob_spawn/human/skeleton{ + helmet = /obj/item/clothing/head/ushanka; + name = "russian remains"; + uniform = /obj/item/clothing/under/soviet + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bC" = ( +/obj/item/ammo_casing/a357, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bD" = ( +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bE" = ( +/obj/item/stack/sheet/metal, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bF" = ( +/obj/effect/mob_spawn/human/skeleton{ + helmet = /obj/item/clothing/head/helmet/stahlhelm; + name = "german remains"; + uniform = /obj/item/clothing/under/wwii + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bG" = ( +/obj/structure/table_frame, +/obj/item/stack/sheet/metal, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bH" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/item/ammo_casing/c9mm, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bI" = ( +/obj/structure/table, +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bJ" = ( +/obj/effect/mob_spawn/human/skeleton{ + helmet = /obj/item/clothing/head/ushanka; + name = "russian remains"; + uniform = /obj/item/clothing/under/soviet + }, +/obj/item/weapon/gun/projectile/shotgun/boltaction, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bK" = ( +/obj/structure/table, +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bL" = ( +/obj/effect/mob_spawn/human/skeleton{ + helmet = /obj/item/clothing/head/helmet/stahlhelm; + name = "german remains"; + uniform = /obj/item/clothing/under/wwii + }, +/obj/item/weapon/gun/projectile/automatic/pistol/APS, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bM" = ( +/obj/machinery/door/poddoor{ + id = "lavagerman" + }, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bN" = ( +/obj/machinery/door/airlock/glass_external, +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bO" = ( +/obj/structure/window{ + icon_state = "rwindow"; + dir = 8 + }, +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bP" = ( +/obj/machinery/porta_turret/stationary, +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bQ" = ( +/obj/structure/window{ + icon_state = "rwindow"; + dir = 4 + }, +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bR" = ( +/obj/structure/sign/xeno_warning_mining{ + pixel_y = -32 + }, +/obj/structure/closet/emcloset, +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bS" = ( +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bT" = ( +/obj/structure/sign/xeno_warning_mining{ + pixel_y = -32 + }, +/obj/item/weapon/rcd/loaded, +/obj/structure/closet/emcloset, +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bU" = ( +/obj/structure/window{ + icon_state = "rwindow"; + dir = 8 + }, +/obj/structure/window{ + tag = "icon-rwindow"; + icon_state = "rwindow"; + dir = 2 + }, +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bV" = ( +/obj/structure/window{ + tag = "icon-rwindow"; + icon_state = "rwindow"; + dir = 2 + }, +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) +"bW" = ( +/obj/structure/window{ + icon_state = "rwindow"; + dir = 4 + }, +/obj/structure/window{ + tag = "icon-rwindow"; + icon_state = "rwindow"; + dir = 2 + }, +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface + }, +/area/ruin/powered) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +aa +ae +ae +ae +ae +ae +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ab +aa +aa +aa +aa +aa +aa +aa +"} +(3,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +ab +ab +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +aa +aa +aa +aa +aa +aa +aa +"} +(4,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ab +ab +ab +ae +ae +ae +ae +ae +ae +ab +ab +aa +aa +aa +aa +aa +"} +(5,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ae +ae +ae +ae +ae +ae +ae +ae +ae +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ae +ae +ae +ab +ab +aa +aa +aa +aa +aa +"} +(6,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ae +ae +ae +ae +ae +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ae +ae +ae +ab +ab +aa +aa +aa +aa +aa +"} +(7,1,1) = {" +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ae +ae +ae +ae +ae +ab +ab +ab +ab +ab +aj +bi +bn +bi +bA +bA +bA +bi +aj +ab +ae +ae +ae +ab +ab +aa +aa +aa +aa +aa +"} +(8,1,1) = {" +aa +aa +aa +aa +aa +ab +ab +ae +ae +ae +ae +ae +ae +ae +ae +ab +ab +ab +ab +ab +aj +bi +bo +bu +bi +bi +bi +bi +aj +ab +ae +ae +ae +ab +ab +aa +aa +aa +aa +aa +"} +(9,1,1) = {" +aa +aa +aa +aa +aa +aa +ab +ae +ae +ae +ae +ae +ab +ab +ab +ab +ab +ab +ab +ab +aj +bj +bi +bv +bo +bi +bi +bi +aj +ab +ae +ae +ae +ae +ab +aa +aa +aa +aa +aa +"} +(10,1,1) = {" +aa +aa +aa +aa +aa +ab +ab +ae +ae +ae +ae +ae +ab +ab +ab +aj +aj +aj +aj +aj +aj +bk +bk +bw +bi +bi +bF +bi +aj +ab +ae +ae +ae +ae +ab +ab +aa +aa +aa +aa +"} +(11,1,1) = {" +aa +aa +aa +aa +ab +ae +ae +ae +ae +ae +ae +ae +ab +ab +ab +aj +ao +av +aP +aX +bc +av +bp +bi +bA +bA +bI +bi +aj +ab +ae +ae +ae +ae +ab +ab +aa +aa +aa +aa +"} +(12,1,1) = {" +aa +aa +aa +aa +ab +ae +ae +ae +ae +ae +ae +ae +ab +ab +ab +aj +ao +av +aQ +aY +av +av +bk +as +bk +bk +bk +bM +aj +ab +ab +ae +ae +ae +ab +ab +aa +aa +aa +aa +"} +(13,1,1) = {" +aa +aa +aa +aa +ab +ae +ae +ae +ab +ab +ab +ab +ab +ab +ab +aj +ao +aK +aR +aZ +aR +aR +bk +bi +bi +bD +bi +bi +aj +ab +ab +ae +ae +ae +ab +ab +aa +aa +aa +aa +"} +(14,1,1) = {" +aa +aa +ab +ab +ab +ae +ae +ae +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +bk +bi +bB +bC +bi +bi +aj +bO +bU +ae +ae +ae +ab +ab +aa +aa +aa +aa +"} +(15,1,1) = {" +aa +aa +ab +ab +ab +ae +ae +ae +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +bi +bC +bi +bF +bi +aj +bP +bV +ae +ae +ae +ab +aa +aa +aa +aa +aa +"} +(16,1,1) = {" +aa +aa +aa +ab +ab +ae +ae +ae +ab +aj +aj +ao +ao +aB +ao +aj +aj +aL +aM +aM +aL +aj +aj +bi +bi +bi +bi +bi +aj +bQ +bW +ae +ae +ae +ab +ab +aa +aa +aa +aa +"} +(17,1,1) = {" +aa +aa +aa +ab +ae +ae +ae +ae +ab +aj +aj +ap +ax +av +ap +aj +aj +aM +aM +aM +aM +aj +aj +bx +bk +bk +bk +bk +aj +ab +ab +ae +ae +ae +ab +ab +aa +aa +aa +aa +"} +(18,1,1) = {" +aa +aa +aa +ab +ae +ae +ae +ae +ab +aj +aj +aq +av +aC +aF +aj +aj +aM +aM +aS +aM +aj +aj +bi +bD +bi +bi +bi +aj +ab +ab +ae +ae +ae +ab +ab +aa +aa +aa +aa +"} +(19,1,1) = {" +aa +aa +aa +ab +ae +ae +ae +ab +ab +aj +aj +ar +ay +av +aG +aj +aj +aM +aS +aN +aM +aj +aj +bi +bi +bi +by +bi +bk +aj +aj +ae +ae +ae +ab +ab +aa +aa +aa +aa +"} +(20,1,1) = {" +aa +aa +ac +ab +ae +ae +ae +ab +ad +ak +aj +as +av +au +aD +aI +aJ +aM +aM +aM +bd +bl +bq +by +bB +bi +bi +bi +bk +bR +aj +ae +ae +ae +ab +ab +aa +aa +aa +aa +"} +(21,1,1) = {" +aa +aa +ad +ab +af +ae +ag +ab +ah +al +am +at +az +aD +av +aj +aj +aM +aT +aM +be +bm +br +bi +bi +bi +bi +bi +bN +bS +bN +ae +ae +ab +ab +aa +aa +aa +aa +aa +"} +(22,1,1) = {" +aa +aa +aa +ab +ae +ae +ae +ab +ai +aj +an +au +aA +av +av +aI +aJ +aM +aU +aM +aN +bl +bq +bi +bi +bi +bJ +bi +bk +bT +aj +ae +ae +ab +ab +aa +aa +aa +aa +aa +"} +(23,1,1) = {" +aa +aa +aa +ad +ae +ae +ae +ab +ab +aj +aj +av +av +av +av +aj +aj +aM +aM +aM +bf +aj +aj +bi +by +bi +bi +bi +bk +aj +aj +ae +ae +ab +ab +aa +aa +aa +aa +aa +"} +(24,1,1) = {" +aa +aa +aa +ab +ae +ae +ae +ab +ab +aj +aj +aq +av +aE +aH +aj +aj +aN +aM +aM +aM +aj +aj +bi +bt +bi +bi +bi +aj +ab +ab +ae +ae +ab +ab +aa +aa +aa +aa +aa +"} +(25,1,1) = {" +aa +aa +aa +ab +ae +ae +ae +ae +ab +aj +aj +aw +aw +aw +aw +aj +aj +aM +aV +aM +aM +aj +aj +bx +bk +bk +bk +bk +aj +ab +ab +ae +ae +ae +ab +aa +aa +aa +aa +aa +"} +(26,1,1) = {" +aa +aa +ab +ab +ae +ae +ae +ae +ab +aj +aj +ao +ao +ao +ao +aj +aj +aO +aM +aM +aO +aj +aj +bi +bi +bi +bi +bi +aj +bO +bU +ae +ae +ae +ab +aa +aa +aa +aa +aa +"} +(27,1,1) = {" +aa +aa +ab +ab +ae +ae +ae +ae +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +bi +bi +bi +bi +bi +aj +bP +bV +ae +ae +ae +ab +aa +aa +aa +aa +aa +"} +(28,1,1) = {" +aa +aa +ab +ab +ae +ae +ae +ae +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +bk +bi +bB +bi +by +bi +aj +bQ +bW +ae +ae +ae +aa +aa +aa +aa +aa +aa +"} +(29,1,1) = {" +aa +ab +ab +ab +ae +ae +ae +ae +ab +ab +ab +ab +ab +ab +ab +aj +ao +aK +aW +aR +bg +aR +bk +bi +bE +bi +bt +bi +aj +ab +ae +ae +ae +ab +ab +aa +aa +aa +aa +aa +"} +(30,1,1) = {" +aa +ab +ab +ab +ae +ae +ae +ae +ab +ab +ab +ab +ab +ab +ab +aj +ao +av +aQ +ba +av +av +bk +bk +bk +br +bk +bM +aj +ab +ae +ae +ae +ae +ab +ab +aa +aa +aa +aa +"} +(31,1,1) = {" +aa +ab +ab +ab +ae +ae +ae +ae +ab +ab +ab +ab +ab +ab +ab +aj +ao +av +aP +bb +bh +av +bs +bi +bA +bG +bK +bi +aj +ab +ab +ae +ae +ae +ab +ab +aa +aa +aa +aa +"} +(32,1,1) = {" +aa +ab +ab +ab +ae +ae +ae +ae +ae +ae +ae +ae +ab +ab +ab +aj +aj +aj +aj +aj +aj +bk +bk +bz +bi +bi +bi +bi +aj +ab +ab +ae +ae +ae +ab +ab +aa +aa +aa +aa +"} +(33,1,1) = {" +aa +aa +aa +aa +ab +ab +ae +ae +ae +ae +ae +ae +ab +ab +ab +ab +ab +ab +ab +ab +aj +bj +bi +bi +bF +bo +bL +bo +aj +ab +ab +ae +ae +ae +ab +ab +aa +aa +aa +aa +"} +(34,1,1) = {" +aa +aa +aa +aa +ab +ab +ae +ae +ae +ae +ae +ae +ab +ab +ab +ab +ab +ab +ab +ab +aj +bi +bi +bi +bi +bH +bi +bo +aj +ab +ab +ae +ae +ae +ab +ab +aa +aa +aa +aa +"} +(35,1,1) = {" +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ae +ae +ae +ae +ae +ae +ae +ab +ab +ab +aj +bi +bt +bi +bA +bA +bA +bi +aj +ab +ab +ae +ae +ae +ab +ab +aa +aa +aa +aa +"} +(36,1,1) = {" +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ae +ae +ae +ae +ae +ae +ae +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ae +ae +ab +ab +ab +aa +aa +aa +aa +"} +(37,1,1) = {" +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ae +ae +ae +ae +ae +ae +ae +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ae +ae +ab +ab +aa +aa +aa +aa +aa +"} +(38,1,1) = {" +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ab +ab +ab +ab +ab +ab +ae +ae +ae +ae +ae +ab +ab +aa +aa +aa +aa +aa +"} +(39,1,1) = {" +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ab +ab +ab +aa +aa +aa +aa +aa +"} +(40,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ab +ab +aa +aa +aa +aa +aa +aa +"} diff --git a/_maps/birdstation.dm b/_maps/birdstation.dm index e35fa7106cf..b1f4350ed1e 100644 --- a/_maps/birdstation.dm +++ b/_maps/birdstation.dm @@ -31,7 +31,6 @@ A small map intended for lowpop(40 players and less). #if !defined(MAP_OVERRIDE_FILES) #define MAP_OVERRIDE_FILES #include "map_files\BirdStation\telecomms.dm" - #include "map_files\BirdStation\misc.dm" #include "map_files\BirdStation\job\job_changes.dm" #include "map_files\BirdStation\job\removed_jobs.dm" #endif @@ -40,4 +39,4 @@ A small map intended for lowpop(40 players and less). #warn a map has already been included, ignoring birdstation. -#endif \ No newline at end of file +#endif diff --git a/_maps/map_files/BirdStation/BirdStation.dmm b/_maps/map_files/BirdStation/BirdStation.dmm index b08b7ff7e43..23fe48b8871 100644 --- a/_maps/map_files/BirdStation/BirdStation.dmm +++ b/_maps/map_files/BirdStation/BirdStation.dmm @@ -1469,7 +1469,7 @@ "aCm" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/obj/structure/disposaloutlet{dir = 4},/obj/structure/disposalpipe/trunk,/turf/open/floor/plating,/area/maintenance/disposal) "aCn" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/obj/machinery/light,/turf/open/floor/plating,/area/maintenance/disposal) "aCo" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/obj/machinery/door/poddoor{id = "crusherdoor"; layer = 3.1; name = "crusher safety blast door"},/turf/open/floor/plating,/area/maintenance/disposal) -"aCp" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/obj/machinery/recycler/birdstation{emagged = 1; name = "dangerous old crusher"},/turf/open/floor/plating,/area/maintenance/disposal) +"aCp" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/obj/machinery/recycler/deathtrap,/turf/open/floor/plating,/area/maintenance/disposal) "aCq" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/turf/open/floor/plating,/area/maintenance/disposal) "aCr" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal/deliveryChute{dir = 8},/turf/open/floor/plating,/area/maintenance/disposal) "aCs" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/closed/wall/r_wall,/area/maintenance/disposal) diff --git a/_maps/map_files/BirdStation/job/job_changes.dm b/_maps/map_files/BirdStation/job/job_changes.dm index 679c212c7ee..cca341cc117 100644 --- a/_maps/map_files/BirdStation/job/job_changes.dm +++ b/_maps/map_files/BirdStation/job/job_changes.dm @@ -6,7 +6,7 @@ supervisors = "the captain and the head of personnel" /datum/outfit/job/New() - box = /obj/item/weapon/storage/box/birdsurv + box = /obj/item/weapon/storage/box/survival/radio /datum/job/assistant // Here so assistant appears on the top of the select job list. @@ -29,7 +29,7 @@ ..() /datum/outfit/job/hos/New() - box = /obj/item/weapon/storage/box/birdsec + box = /obj/item/weapon/storage/box/security/radio /datum/job/officer/New() ..() @@ -39,7 +39,7 @@ minimal_access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_morgue, access_weapons, access_forensics_lockers) /datum/outfit/job/officer/New() - box = /obj/item/weapon/storage/box/birdsec + box = /obj/item/weapon/storage/box/security/radio /datum/job/detective/New() ..() @@ -47,7 +47,7 @@ minimal_access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_morgue, access_weapons, access_forensics_lockers) /datum/outfit/job/detective/New() - box = /obj/item/weapon/storage/box/birdsec + box = /obj/item/weapon/storage/box/security/radio //Medbay @@ -69,7 +69,7 @@ minimal_access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_tcomsat) /datum/outfit/job/engineer/New() - box = /obj/item/weapon/storage/box/birdeng + box = /obj/item/weapon/storage/box/engineer/radio //Science @@ -93,7 +93,7 @@ minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station, access_mineral_storeroom) /datum/outfit/job/mining/New() - box = /obj/item/weapon/storage/box/birdeng + box = /obj/item/weapon/storage/box/engineer/radio //Service @@ -123,4 +123,4 @@ /datum/job/clown/New() ..() - supervisors = "nobody but yourself" //Honk \ No newline at end of file + supervisors = "nobody but yourself" //Honk diff --git a/_maps/map_files/BirdStation/misc.dm b/_maps/map_files/BirdStation/misc.dm deleted file mode 100644 index b86c9247888..00000000000 --- a/_maps/map_files/BirdStation/misc.dm +++ /dev/null @@ -1,63 +0,0 @@ - -// modified crusher -// only does 120 brute damage and won't eat the victims items - - -/obj/machinery/recycler/birdstation/eat(mob/living/L) - - L.loc = src.loc - - if(istype(L,/mob/living/silicon)) - playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) - else - playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) - - var/gib = 1 - if(istype(L,/mob/living/carbon)) - gib = 0 - add_blood(L) - - if(!blood && !istype(L,/mob/living/silicon)) - blood = 1 - update_icon() - L.Paralyse(5) - if(gib || emagged == 2) - L.gib() - else if(emagged == 1) - L.adjustBruteLoss(120) - -// we don't want anyone to dismantle or disable the crusher easily - -/obj/machinery/recycler/birdstation/attackby(obj/item/I, mob/user, params) - if (istype(I, /obj/item/weapon/wrench) || istype(I, /obj/item/weapon/screwdriver)) - return - - -//special birdstation survival boxes - -/obj/item/weapon/storage/box/birdsurv/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) - new /obj/item/device/radio/off(src) - return - -/obj/item/weapon/storage/box/birdeng/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) - new /obj/item/device/radio/off(src) - return - -/obj/item/weapon/storage/box/birdsec/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) - new /obj/item/device/radio/off(src) - return diff --git a/_maps/map_files/DreamStation/dreamstation04.dmm b/_maps/map_files/DreamStation/dreamstation04.dmm index 801662b4f4d..edc3968db14 100644 --- a/_maps/map_files/DreamStation/dreamstation04.dmm +++ b/_maps/map_files/DreamStation/dreamstation04.dmm @@ -13394,6 +13394,7 @@ pixel_x = 0; pixel_y = 0 }, +/obj/machinery/portable_atmospherics/canister/bz, /turf/open/floor/plasteel{ tag = "icon-escape (NORTH)"; icon_state = "escape"; @@ -70349,6 +70350,7 @@ dir = 4; network = list("SS13","Sci") }, +/obj/machinery/portable_atmospherics/canister/bz, /turf/open/floor/plasteel{ icon_state = "floorgrime" }, @@ -70931,6 +70933,7 @@ icon_state = "tube1"; dir = 8 }, +/obj/machinery/portable_atmospherics/canister/bz, /turf/open/floor/plasteel{ icon_state = "floorgrime" }, diff --git a/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm b/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm index f030f88a39d..217c291374e 100644 --- a/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm +++ b/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm @@ -26523,6 +26523,7 @@ /obj/machinery/camera{ c_tag = "Atmospherics Monitoring" }, +/obj/machinery/portable_atmospherics/canister/bz, /turf/open/floor/plasteel{ icon_state = "cautioncorner"; dir = 1 @@ -61750,6 +61751,12 @@ icon_state = "diagonalWall3" }, /area/shuttle/syndicate) +"ckj" = ( +/obj/machinery/portable_atmospherics/canister/bz, +/turf/open/floor/plasteel{ + icon_state = "floorgrime" + }, +/area/toxins/storage) (1,1,1) = {" aaa @@ -89101,7 +89108,7 @@ aze aAw aBE aCO -aFp +ckj aFn aGo aCO diff --git a/_maps/map_files/MetaStation/MetaStation.v41I.dmm b/_maps/map_files/MetaStation/MetaStation.dmm similarity index 99% rename from _maps/map_files/MetaStation/MetaStation.v41I.dmm rename to _maps/map_files/MetaStation/MetaStation.dmm index f7fb1af28c9..f75d12eaf7b 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41I.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -3422,9 +3422,7 @@ name = "\improper Recreation Area" }) "afB" = ( -/obj/structure/chair/stool{ - pixel_y = 8 - }, +/obj/structure/easel, /turf/open/floor/plasteel{ icon_state = "dark" }, @@ -3752,7 +3750,6 @@ }, /area/ai_monitored/security/armory) "agf" = ( -/obj/machinery/flasher/portable, /obj/item/device/radio/intercom{ freerange = 0; frequency = 1459; @@ -3760,6 +3757,20 @@ pixel_x = 0; pixel_y = 24 }, +/obj/structure/rack, +/obj/item/weapon/grenade/barrier{ + pixel_x = -3; + pixel_y = 1 + }, +/obj/item/weapon/grenade/barrier, +/obj/item/weapon/grenade/barrier{ + pixel_x = 3; + pixel_y = -1 + }, +/obj/item/weapon/grenade/barrier{ + pixel_x = 6; + pixel_y = -2 + }, /turf/open/floor/plasteel{ icon_state = "vault"; dir = 1 @@ -3767,9 +3778,13 @@ /area/ai_monitored/security/armory) "agg" = ( /mob/living/simple_animal/bot/secbot{ - health = 35; - name = "Securitron #359"; - on = 0 + arrest_type = 1; + health = 45; + icon_state = "secbot1"; + idcheck = 1; + name = "Sergeant-at-Armsky"; + on = 1; + weaponscheck = 1 }, /turf/open/floor/plasteel{ icon_state = "vault"; @@ -4263,13 +4278,14 @@ }, /area/ai_monitored/security/armory) "agX" = ( -/obj/machinery/flasher/portable, /obj/machinery/airalarm{ dir = 4; locked = 0; pixel_x = -23; pixel_y = 0 }, +/obj/structure/rack, +/obj/item/weapon/storage/fancy, /turf/open/floor/plasteel{ icon_state = "vault"; dir = 1 @@ -4666,7 +4682,14 @@ d2 = 4; icon_state = "2-4" }, -/obj/machinery/flasher/portable, +/obj/structure/rack, +/obj/item/weapon/storage/box/flashes{ + pixel_x = 3 + }, +/obj/item/weapon/storage/box/teargas{ + pixel_x = 1; + pixel_y = -2 + }, /turf/open/floor/plasteel{ icon_state = "vault"; dir = 1 @@ -4728,7 +4751,6 @@ pixel_x = 3; pixel_y = -3 }, -/obj/item/weapon/storage/box/teargas, /obj/machinery/button/door{ id = "armory"; name = "Armory Shutters"; @@ -5042,6 +5064,7 @@ /turf/open/floor/plating, /area/maintenance/disposal) "aio" = ( +/obj/structure/easel, /turf/open/floor/plating, /area/maintenance/disposal) "aip" = ( @@ -5594,7 +5617,7 @@ name = "HIGH VOLTAGE"; pixel_y = 0 }, -/turf/closed/wall/r_wall, +/turf/closed/wall, /area/maintenance/auxsolarport) "ajp" = ( /obj/structure/table, @@ -5736,6 +5759,10 @@ lootcount = 2; name = "2maintenance loot spawner" }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 28 + }, /turf/open/floor/plasteel{ icon_state = "vault"; dir = 4 @@ -6455,7 +6482,6 @@ }, /area/security/warden) "akI" = ( -/obj/item/weapon/grenade/barrier, /obj/structure/extinguisher_cabinet{ pixel_x = -27; pixel_y = 0 @@ -6465,12 +6491,13 @@ dir = 4; network = list("SS13") }, +/obj/machinery/flasher/portable, /turf/open/floor/plasteel{ icon_state = "bot" }, /area/security/warden) "akJ" = ( -/obj/item/weapon/grenade/barrier, +/obj/machinery/flasher/portable, /turf/open/floor/plasteel{ icon_state = "bot" }, @@ -8159,10 +8186,6 @@ /obj/structure/filingcabinet/security{ pixel_x = 4 }, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 28 - }, /turf/open/floor/plasteel{ icon_state = "vault"; dir = 10 @@ -8178,6 +8201,11 @@ /obj/item/weapon/storage/lockbox/loyalty, /obj/item/weapon/reagent_containers/glass/bottle/morphine, /obj/machinery/light/small, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -26; + pixel_y = 0 + }, /turf/open/floor/plasteel{ icon_state = "bot" }, @@ -9297,7 +9325,7 @@ }, /obj/item/weapon/storage/belt{ desc = "Can hold quite a lot of stuff."; - name = "mutli-belt" + name = "multi-belt" }, /obj/item/clothing/gloves/color/fyellow, /obj/effect/spawner/lootdrop/maintenance, @@ -9379,7 +9407,7 @@ /turf/open/floor/plating, /area/engine/gravity_generator) "apu" = ( -/turf/closed/wall/r_wall, +/turf/closed/wall, /area/maintenance/auxsolarstarboard) "apv" = ( /obj/machinery/power/solar_control{ @@ -10349,11 +10377,11 @@ /turf/open/floor/plating, /area/maintenance/fore) "arf" = ( -/obj/effect/decal/cleanable/blood, /obj/structure/chair, /obj/item/weapon/restraints/handcuffs, /obj/effect/decal/remains/human, /obj/item/clothing/under/soviet, +/obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating, /area/maintenance/fore) "arg" = ( @@ -11957,7 +11985,7 @@ name = "HIGH VOLTAGE"; pixel_y = 0 }, -/turf/closed/wall/r_wall, +/turf/closed/wall, /area/maintenance/auxsolarstarboard) "atw" = ( /turf/closed/wall/r_wall, @@ -12735,8 +12763,8 @@ icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; - pixel_x = 0; - pixel_y = 32 + pixel_x = 32; + pixel_y = 0 }, /turf/open/floor/plating, /area/maintenance/starboard) @@ -13987,8 +14015,8 @@ /obj/machinery/door/airlock/security{ name = "Interrogation"; req_access = null; - req_access_txt = "0"; - req_one_access_txt = "1;4" + req_access_txt = "63"; + req_one_access_txt = "0" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -14949,7 +14977,11 @@ /turf/closed/wall/r_wall, /area/engine/engineering) "ayp" = ( -/obj/structure/closet/emcloset, +/obj/structure/closet/emcloset{ + anchored = 1; + desc = "It's a storage unit for emergency breath masks and O2 tanks, and is securely bolted in place."; + name = "anchored emergency closet" + }, /turf/open/floor/plating, /area/engine/engineering) "ayq" = ( @@ -17411,6 +17443,7 @@ dir = 4; network = list("Singulo") }, +/obj/structure/lattice, /turf/open/space, /area/space) "aCi" = ( @@ -20832,13 +20865,13 @@ amount = 50 }, /obj/item/stack/sheet/glass{ - amount = 12 + amount = 50 }, /obj/item/stack/sheet/glass{ - amount = 12 + amount = 50 }, /obj/item/stack/sheet/glass{ - amount = 12 + amount = 50 }, /obj/item/weapon/crowbar, /obj/item/weapon/grenade/chem_grenade/metalfoam, @@ -24449,12 +24482,12 @@ /turf/open/floor/wood, /area/lawoffice) "aNP" = ( +/obj/structure/filingcabinet/chestdrawer, /obj/machinery/airalarm{ dir = 8; icon_state = "alarm0"; pixel_x = 24 }, -/obj/structure/filingcabinet/employment, /turf/open/floor/wood, /area/lawoffice) "aNQ" = ( @@ -24749,8 +24782,11 @@ }, /area/engine/engineering) "aOo" = ( -/turf/open/floor/plating, -/area/maintenance/starboard) +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plasteel{ + icon_state = "bot" + }, +/area/atmos) "aOp" = ( /turf/open/floor/plating{ icon_plating = "warnplate"; @@ -25058,10 +25094,7 @@ /area/quartermaster/qm) "aOT" = ( /obj/structure/table, -/obj/item/weapon/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, +/obj/machinery/computer/stockexchange, /turf/open/floor/plasteel{ dir = 1; icon_state = "brown" @@ -26649,7 +26682,18 @@ pixel_y = 0; supply_display = 1 }, -/obj/machinery/computer/stockexchange, +/obj/item/weapon/cartridge/quartermaster{ + pixel_x = 6; + pixel_y = 5 + }, +/obj/item/weapon/cartridge/quartermaster, +/obj/item/weapon/cartridge/quartermaster{ + pixel_x = -4; + pixel_y = 7 + }, +/obj/item/device/gps{ + gpstag = "QM0" + }, /turf/open/floor/plasteel, /area/quartermaster/qm) "aRC" = ( @@ -27565,18 +27609,10 @@ /area/quartermaster/qm) "aSY" = ( /obj/structure/table, -/obj/item/weapon/cartridge/quartermaster{ - pixel_x = 6; - pixel_y = 5 - }, -/obj/item/weapon/cartridge/quartermaster, -/obj/item/weapon/cartridge/quartermaster{ - pixel_x = -4; +/obj/item/weapon/paper_bin{ + pixel_x = -3; pixel_y = 7 }, -/obj/item/device/gps{ - gpstag = "QM0" - }, /turf/open/floor/plasteel{ dir = 2; icon_state = "brown" @@ -29711,11 +29747,7 @@ /turf/open/floor/plating/airless, /area/engine/engineering) "aWD" = ( -/obj/machinery/camera/emp_proof{ - c_tag = "Aft Arm - Far"; - dir = 8; - network = list("Singulo") - }, +/obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating/airless, /area/engine/engineering) "aWE" = ( @@ -30089,6 +30121,10 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ req_access_txt = 1 }, +/obj/item/weapon/storage/firstaid/regular{ + pixel_x = 0; + pixel_y = 0 + }, /turf/open/floor/plasteel{ icon_state = "delivery"; name = "floor" @@ -31654,18 +31690,21 @@ dir = 8; layer = 2.9 }, -/obj/item/weapon/circuitboard/computer/powermonitor{ - pixel_x = -2; - pixel_y = 2 +/obj/item/weapon/circuitboard/computer/pandemic{ + pixel_x = -3; + pixel_y = 3 }, -/obj/item/weapon/circuitboard/computer/stationalert{ - pixel_x = 1; - pixel_y = -1 - }, -/obj/item/weapon/circuitboard/computer/atmos_alert{ +/obj/item/weapon/circuitboard/computer/rdconsole, +/obj/item/weapon/circuitboard/machine/rdserver{ pixel_x = 3; pixel_y = -3 }, +/obj/item/weapon/circuitboard/machine/destructive_analyzer, +/obj/item/weapon/circuitboard/machine/protolathe, +/obj/item/weapon/circuitboard/computer/aifixer, +/obj/item/weapon/circuitboard/computer/teleporter, +/obj/item/weapon/circuitboard/machine/circuit_imprinter, +/obj/item/weapon/circuitboard/machine/mechfab, /turf/open/floor/plasteel{ icon_state = "dark" }, @@ -31675,14 +31714,12 @@ dir = 8; layer = 2.9 }, -/obj/item/weapon/circuitboard/computer/secure_data{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/weapon/circuitboard/computer/security{ - pixel_x = 1; - pixel_y = -1 +/obj/item/weapon/circuitboard/computer/mining, +/obj/item/weapon/circuitboard/machine/autolathe{ + pixel_x = 3; + pixel_y = -3 }, +/obj/item/weapon/circuitboard/computer/arcade/battle, /obj/machinery/ai_status_display{ pixel_x = 0; pixel_y = 31 @@ -31692,20 +31729,10 @@ }, /area/storage/tech) "aZI" = ( -/obj/structure/rack{ - dir = 8; - layer = 2.9 - }, -/obj/item/weapon/circuitboard/computer/cloning{ - pixel_x = 0 - }, -/obj/item/weapon/circuitboard/computer/med_data{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/weapon/circuitboard/machine/clonescanner, -/obj/item/weapon/circuitboard/machine/clonepod, -/obj/item/weapon/circuitboard/computer/scan_consolenew, +/obj/structure/rack, +/obj/item/weapon/circuitboard/machine/telecomms/processor, +/obj/item/weapon/circuitboard/machine/telecomms/receiver, +/obj/machinery/computer/telecomms/server, /turf/open/floor/plasteel{ icon_state = "dark" }, @@ -31838,6 +31865,14 @@ /turf/closed/wall, /area/security/checkpoint/engineering) "aZS" = ( +/obj/structure/sign/securearea{ + desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; + icon_state = "space"; + layer = 4; + name = "EXTERNAL AIRLOCK"; + pixel_x = 32; + pixel_y = 0 + }, /turf/open/floor/plating{ dir = 2; icon_state = "warnplate" @@ -32749,13 +32784,14 @@ }, /area/security/checkpoint/engineering) "bbn" = ( -/obj/machinery/door/airlock/external{ - name = "South Containment Arm Access" +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plasteel{ + icon_state = "bot" }, -/turf/open/floor/plating, -/area/engine/engineering) +/area/atmos) "bbo" = ( /obj/machinery/space_heater, +/obj/effect/decal/cleanable/cobweb2, /turf/open/floor/plating{ icon_state = "platingdmg3" }, @@ -33263,6 +33299,7 @@ pixel_x = 0; pixel_y = 30 }, +/obj/item/weapon/pen/red, /turf/open/floor/plasteel{ dir = 9; icon_state = "brown" @@ -33271,11 +33308,6 @@ name = "\improper Cargo Office" }) "bbW" = ( -/obj/item/weapon/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/weapon/pen/red, /obj/structure/table/reinforced, /obj/machinery/computer/stockexchange, /turf/open/floor/plasteel{ @@ -33760,14 +33792,6 @@ dir = 8; layer = 2.9 }, -/obj/item/weapon/circuitboard/computer/borgupload{ - pixel_x = -1; - pixel_y = 1 - }, -/obj/item/weapon/circuitboard/computer/aiupload{ - pixel_x = 2; - pixel_y = -2 - }, /turf/open/floor/plasteel{ icon_state = "vault"; dir = 4 @@ -33804,50 +33828,18 @@ dir = 8; layer = 2.9 }, -/obj/item/weapon/circuitboard/computer/message_monitor{ - pixel_y = -5 - }, -/obj/item/weapon/circuitboard/computer/arcade/battle{ - pixel_x = -4; - pixel_y = 2 - }, -/obj/item/weapon/circuitboard/computer/arcade/orion_trail{ - pixel_x = 4 - }, /turf/open/floor/plasteel{ icon_state = "dark" }, /area/storage/tech) "bcN" = ( -/obj/structure/rack{ - dir = 8; - layer = 2.9 - }, -/obj/item/weapon/circuitboard/computer/mining, -/obj/item/weapon/circuitboard/machine/autolathe{ - pixel_x = 3; - pixel_y = -3 - }, -/turf/open/floor/plasteel{ - icon_state = "dark" - }, -/area/storage/tech) +/turf/closed/wall, +/area/maintenance/auxsolarport) "bcO" = ( /obj/structure/rack{ dir = 8; layer = 2.9 }, -/obj/item/weapon/circuitboard/computer/pandemic{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/weapon/circuitboard/computer/rdconsole, -/obj/item/weapon/circuitboard/machine/rdserver{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/weapon/circuitboard/machine/destructive_analyzer, -/obj/item/weapon/circuitboard/machine/protolathe, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel{ icon_state = "dark" @@ -34078,8 +34070,8 @@ icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; - pixel_x = 0; - pixel_y = 32 + pixel_x = 32; + pixel_y = -32 }, /turf/open/floor/plating{ icon_state = "warnplate"; @@ -34227,10 +34219,16 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ req_access_txt = 1 }, -/obj/machinery/light_switch{ - pixel_x = -25; +/obj/machinery/power/apc{ + dir = 8; + name = "Cargo Office APC"; + pixel_x = -24; pixel_y = 0 }, +/obj/structure/cable/yellow{ + d2 = 4; + icon_state = "0-4" + }, /turf/open/floor/plasteel{ dir = 9; icon_state = "brown" @@ -34245,6 +34243,12 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 8; + icon_state = "2-8"; + tag = "" + }, /turf/open/floor/plasteel{ dir = 1; icon_state = "brown" @@ -34296,13 +34300,17 @@ }) "bdz" = ( /obj/structure/table/reinforced, -/obj/item/weapon/folder/yellow, /obj/machinery/door/firedoor, /obj/machinery/door/window/westleft{ dir = 8; name = "Cargo Desk"; req_access_txt = "50" }, +/obj/item/weapon/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/weapon/pen, /turf/open/floor/plasteel, /area/quartermaster/office{ name = "\improper Cargo Office" @@ -34518,18 +34526,6 @@ dir = 8; layer = 2.9 }, -/obj/item/weapon/circuitboard/computer/crew{ - pixel_x = -1; - pixel_y = 1 - }, -/obj/item/weapon/circuitboard/computer/card{ - pixel_x = 2; - pixel_y = -2 - }, -/obj/item/weapon/circuitboard/computer/communications{ - pixel_x = 5; - pixel_y = -5 - }, /turf/open/floor/plasteel{ icon_state = "vault"; dir = 8 @@ -34757,11 +34753,11 @@ }, /area/security/checkpoint/engineering) "bes" = ( -/obj/structure/closet/emcloset, +/obj/structure/easel, /turf/open/floor/plating{ - icon_state = "platingdmg2" + icon_state = "platingdmg3" }, -/area/engine/engineering) +/area/maintenance/starboard) "bet" = ( /obj/machinery/light{ dir = 8 @@ -35451,14 +35447,6 @@ dir = 8; layer = 2.9 }, -/obj/item/weapon/circuitboard/computer/robotics{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/weapon/circuitboard/computer/mecha_control{ - pixel_x = 1; - pixel_y = -1 - }, /turf/open/floor/plasteel{ icon_state = "vault"; dir = 1 @@ -37123,18 +37111,41 @@ name = "Customs" }) "bin" = ( -/obj/item/weapon/grenade/barrier, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -26; - pixel_y = 0 - }, /obj/machinery/light/small{ dir = 1 }, /obj/machinery/airalarm{ pixel_y = 28 }, +/obj/structure/closet/crate/secure/weapon{ + desc = "A secure clothing crate."; + name = "formal uniform crate"; + req_access_txt = "3" + }, +/obj/item/clothing/under/rank/security/navyblue, +/obj/item/clothing/under/rank/security/navyblue, +/obj/item/clothing/under/rank/security/navyblue, +/obj/item/clothing/under/rank/security/navyblue, +/obj/item/clothing/under/rank/security/navyblue, +/obj/item/clothing/under/rank/security/navyblue, +/obj/item/clothing/suit/security/officer, +/obj/item/clothing/suit/security/officer, +/obj/item/clothing/suit/security/officer, +/obj/item/clothing/suit/security/officer, +/obj/item/clothing/suit/security/officer, +/obj/item/clothing/suit/security/officer, +/obj/item/clothing/under/rank/warden/navyblue, +/obj/item/clothing/suit/security/warden, +/obj/item/clothing/under/rank/head_of_security/navyblue, +/obj/item/clothing/suit/security/hos, +/obj/item/clothing/head/beret/sec/navyofficer, +/obj/item/clothing/head/beret/sec/navyofficer, +/obj/item/clothing/head/beret/sec/navyofficer, +/obj/item/clothing/head/beret/sec/navyofficer, +/obj/item/clothing/head/beret/sec/navyofficer, +/obj/item/clothing/head/beret/sec/navyofficer, +/obj/item/clothing/head/beret/sec/navywarden, +/obj/item/clothing/head/beret/sec/navyhos, /turf/open/floor/plasteel{ icon_state = "bot" }, @@ -37290,11 +37301,6 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 2 }, -/obj/structure/cable/yellow{ - d1 = 2; - d2 = 4; - icon_state = "2-4" - }, /turf/open/floor/plasteel{ dir = 8; icon_state = "brown" @@ -37311,11 +37317,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 8; - icon_state = "1-8" - }, /turf/open/floor/plasteel, /area/quartermaster/office{ name = "\improper Cargo Office" @@ -38487,18 +38488,9 @@ /obj/structure/table, /obj/item/weapon/clipboard, /obj/item/weapon/folder/yellow, +/obj/item/weapon/folder/yellow, /obj/item/device/multitool, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -26; - pixel_y = 0 - }, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/machinery/computer/stockexchange, +/obj/item/weapon/pen/red, /turf/open/floor/plasteel{ dir = 8; icon_state = "brown" @@ -39532,23 +39524,12 @@ }) "bmb" = ( /obj/structure/table, -/obj/item/device/radio/intercom{ - freerange = 0; - frequency = 1459; - name = "Station Intercom (General)"; - pixel_x = -29 - }, -/obj/item/weapon/storage/firstaid/regular{ - pixel_x = 0; +/obj/machinery/computer/stockexchange, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -26; pixel_y = 0 }, -/obj/machinery/power/apc{ - dir = 2; - name = "Cargo Office APC"; - pixel_x = 1; - pixel_y = -24 - }, -/obj/structure/cable/yellow, /turf/open/floor/plasteel{ dir = 10; icon_state = "brown" @@ -39589,6 +39570,13 @@ pixel_x = 28; pixel_y = 0 }, +/obj/item/device/radio/intercom{ + freerange = 0; + frequency = 1459; + name = "Station Intercom (General)"; + pixel_x = 0; + pixel_y = -28 + }, /turf/open/floor/plasteel{ dir = 6; icon_state = "brown" @@ -40241,7 +40229,7 @@ /area/engine/break_room) "bng" = ( /obj/structure/sign/pods, -/turf/closed/wall, +/turf/closed/wall/r_wall, /area/engine/break_room) "bnh" = ( /obj/structure/grille, @@ -40857,10 +40845,6 @@ /area/crew_quarters/heads) "boh" = ( /obj/machinery/recharger, -/obj/machinery/keycard_auth{ - pixel_x = 0; - pixel_y = 24 - }, /obj/item/weapon/storage/secure/safe{ pixel_x = 34; pixel_y = 0 @@ -44053,8 +44037,6 @@ /area/hallway/primary/central) "btc" = ( /obj/structure/table, -/obj/item/weapon/storage/crayons, -/obj/item/weapon/storage/crayons, /obj/machinery/power/apc{ cell_type = 2500; dir = 8; @@ -44066,6 +44048,11 @@ d2 = 4; icon_state = "0-4" }, +/obj/item/stack/cable_coil/random, +/obj/item/stack/cable_coil/random, +/obj/item/stack/cable_coil/random, +/obj/item/stack/cable_coil/random, +/obj/item/stack/cable_coil/random, /turf/open/floor/plasteel, /area/storage/art) "btd" = ( @@ -45597,10 +45584,15 @@ /area/hallway/primary/central) "bvn" = ( /obj/structure/table, -/obj/item/stack/cable_coil/random, -/obj/item/stack/cable_coil/random, -/obj/item/stack/cable_coil/random, -/obj/item/stack/cable_coil/random, +/obj/item/weapon/canvas/twentythreeXtwentythree, +/obj/item/weapon/canvas/twentythreeXtwentythree, +/obj/item/weapon/canvas/twentythreeXnineteen, +/obj/item/weapon/canvas/twentythreeXnineteen, +/obj/item/weapon/canvas/nineteenXnineteen, +/obj/item/weapon/canvas/nineteenXnineteen, +/obj/item/weapon/storage/crayons, +/obj/item/weapon/storage/crayons, +/obj/item/weapon/storage/crayons, /turf/open/floor/plasteel, /area/storage/art) "bvo" = ( @@ -45643,7 +45635,14 @@ }, /obj/structure/closet/gmcloset, /obj/item/weapon/wrench, -/obj/item/stack/cable_coil/white, +/obj/item/stack/sheet/glass{ + amount = 30 + }, +/obj/item/stack/sheet/metal{ + amount = 30 + }, +/obj/item/stack/cable_coil/random, +/obj/item/stack/cable_coil/random, /turf/open/floor/wood, /area/crew_quarters/bar) "bvt" = ( @@ -49939,7 +49938,10 @@ /area/crew_quarters/bar) "bCu" = ( /obj/structure/table/wood/poker, -/obj/effect/spawner/lootdrop/gambling, +/obj/effect/spawner/lootdrop{ + loot = list(/obj/item/weapon/gun/projectile/revolver/russian = 5, /obj/item/weapon/storage/box/syndie_kit/throwing_weapons, /obj/item/toy/cards/deck/syndicate = 2); + name = "gambling valuables spawner" + }, /turf/open/floor/wood, /area/crew_quarters/bar) "bCv" = ( @@ -50677,7 +50679,7 @@ dir = 4 }, /turf/open/floor/goonplaque{ - desc = "\"This is a plaque in honour of our comrades on the G4407 Stations. Hopefully TG4407 model can live up to your fame and fortune.\" Scratched in beneath that is a crude image of sentient postcards in a realm of darkness. The station model number is MSv41I:151101" + desc = "\"This is a plaque in honour of our comrades on the G4407 Stations. Hopefully TG4407 model can live up to your fame and fortune.\" Scratched in beneath that is a crude image of sentient postcards in a realm of darkness. The station model number is MS-160511" }, /area/hallway/primary/port) "bDM" = ( @@ -50973,15 +50975,7 @@ pixel_x = 24 }, /obj/structure/table/wood, -/obj/item/weapon/reagent_containers/food/snacks/pie/cream{ - pixel_x = 3; - pixel_y = 3 - }, /obj/item/weapon/reagent_containers/food/snacks/pie/cream, -/obj/item/weapon/reagent_containers/food/snacks/pie/cream{ - pixel_x = -3; - pixel_y = -3 - }, /turf/open/floor/wood, /area/crew_quarters/theatre) "bEj" = ( @@ -54497,12 +54491,12 @@ icon_state = "shower"; dir = 4 }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/blood/gibs/limb, /obj/machinery/light/small, /obj/effect/landmark{ name = "revenantspawn" }, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/blood/gibs/old, /turf/open/floor/plasteel{ icon_state = "floorgrime" }, @@ -56450,7 +56444,9 @@ name = "Port Maintenance" }) "bNo" = ( -/obj/machinery/vending/autodrobe, +/obj/machinery/vending/autodrobe{ + req_access_txt = "0" + }, /turf/open/floor/plating, /area/maintenance/fpmaint2{ name = "Port Maintenance" @@ -56971,13 +56967,7 @@ /area/bridge) "bOg" = ( /obj/structure/rack, -/obj/item/weapon/circuitboard/machine/telecomms/processor, -/obj/item/weapon/circuitboard/machine/telecomms/processor, -/obj/item/weapon/circuitboard/machine/telecomms/receiver, -/obj/item/weapon/circuitboard/machine/telecomms/server, -/obj/item/weapon/circuitboard/machine/telecomms/server, -/obj/item/weapon/circuitboard/machine/telecomms/bus, -/obj/item/weapon/circuitboard/machine/telecomms/bus, +/obj/machinery/telecomms/bus, /obj/item/weapon/circuitboard/machine/telecomms/broadcaster, /obj/machinery/atmospherics/components/unary/vent_pump{ dir = 1; @@ -57024,16 +57014,21 @@ name = "Telecoms Storage" }) "bOj" = ( -/obj/structure/closet/wardrobe/grey, -/turf/open/floor/plating, -/area/maintenance/starboard) +/obj/machinery/portable_atmospherics/canister/bz, +/turf/open/floor/plasteel{ + icon_state = "bot" + }, +/area/atmos) "bOk" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/plating, /area/maintenance/starboard) "bOl" = ( +/obj/structure/closet, /obj/item/weapon/storage/box/lights/mixed, -/turf/open/floor/plating, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, /area/maintenance/starboard) "bOm" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -58860,10 +58855,19 @@ }, /area/crew_quarters/kitchen) "bRk" = ( -/turf/open/floor/plasteel{ - icon_state = "showroomfloor" +/obj/structure/sign/securearea{ + desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; + icon_state = "space"; + layer = 4; + name = "EXTERNAL AIRLOCK"; + pixel_x = 32; + pixel_y = 0 }, -/area/crew_quarters/kitchen) +/turf/open/floor/plating{ + icon_state = "warnplate"; + dir = 1 + }, +/area/maintenance/starboard) "bRl" = ( /obj/machinery/chem_master/condimaster{ name = "CondiMaster Neo"; @@ -59357,7 +59361,6 @@ pixel_y = 0 }, /obj/item/clothing/under/suit_jacket/red, -/obj/item/weapon/book/codex_gigas, /turf/open/floor/plasteel{ icon_state = "cult"; dir = 2 @@ -60475,7 +60478,7 @@ pixel_y = 6 }, /obj/structure/table/wood, -/obj/item/toy/AI{ +/obj/item/toy/talking/AI{ name = "NanoTrasen-brand toy AI"; pixel_y = 6 }, @@ -61610,11 +61613,12 @@ name = "HIGH VOLTAGE"; pixel_y = 0 }, -/turf/closed/wall/r_wall, +/turf/closed/wall, /area/maintenance/portsolar) "bVC" = ( -/turf/closed/wall/r_wall, -/area/maintenance/portsolar) +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, +/area/engine/engineering) "bVD" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/maintenance{ @@ -65369,6 +65373,10 @@ pixel_x = -2; pixel_y = 8 }, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, /turf/open/floor/plasteel{ dir = 4; icon_state = "caution" @@ -69921,7 +69929,11 @@ }, /area/crew_quarters/kitchen) "ciS" = ( -/obj/structure/closet/emcloset, +/obj/structure/closet/emcloset{ + anchored = 1; + desc = "It's a storage unit for emergency breath masks and O2 tanks, and is securely bolted in place."; + name = "anchored emergency closet" + }, /turf/open/floor/plating{ icon_state = "warnplate"; dir = 1 @@ -72356,8 +72368,8 @@ name = "old sink"; pixel_y = 28 }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/blood/gibs/limb, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/blood/gibs/old, /turf/open/floor/plating, /area/maintenance/starboard) "cmL" = ( @@ -73286,8 +73298,6 @@ name = "Aft Maintenance" }) "col" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/blood/gibs/limb, /obj/effect/landmark{ name = "xeno_spawn"; pixel_x = -1 @@ -73295,6 +73305,8 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/blood/gibs/old, /turf/open/floor/plating, /area/maintenance/aft{ name = "Aft Maintenance" @@ -73449,14 +73461,14 @@ name = "Sleepers" }) "coC" = ( -/obj/structure/grille, -/obj/structure/window/fulltile{ - layer = 2.9 +/obj/structure/lattice, +/obj/machinery/camera/emp_proof{ + c_tag = "Fore Arm - Far"; + dir = 8; + network = list("Singulo") }, -/turf/open/floor/plating, -/area/medical/sleeper{ - name = "Sleepers" - }) +/turf/open/space, +/area/space) "coD" = ( /obj/machinery/door/firedoor, /obj/structure/extinguisher_cabinet{ @@ -74768,7 +74780,7 @@ name = "Aft Maintenance" }) "cqG" = ( -/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating, /area/maintenance/aft{ name = "Aft Maintenance" @@ -76567,9 +76579,9 @@ }, /area/toxins/explab) "ctj" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/blood/gibs/limb, /obj/structure/bed/roller, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/blood/gibs/old, /turf/open/floor/plating{ icon_state = "warnplate"; dir = 4 @@ -76610,8 +76622,8 @@ }) "ctn" = ( /obj/structure/bed, -/obj/effect/decal/cleanable/blood/gibs/limb, -/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/blood/gibs/old, /turf/open/floor/plating, /area/maintenance/aft{ name = "Aft Maintenance" @@ -79107,7 +79119,6 @@ pixel_x = -2; pixel_y = 4 }, -/obj/item/weapon/circuitboard/computer/teleporter, /turf/open/floor/plasteel{ icon_state = "cafeteria"; dir = 5 @@ -81497,7 +81508,7 @@ pixel_y = 25 }, /obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/portable_atmospherics/canister, +/obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/plasteel{ dir = 2; icon_state = "warning" @@ -81781,6 +81792,7 @@ }, /obj/machinery/power/apc{ dir = 4; + locked = 0; name = "Cloning Lab APC"; pixel_x = 24; pixel_y = 0 @@ -83896,8 +83908,14 @@ }, /area/medical/morgue) "cEt" = ( -/turf/open/floor/plating, -/area/construction) +/obj/structure/sign/securearea{ + desc = "A warning sign which reads 'HIGH VOLTAGE'"; + icon_state = "shock"; + name = "HIGH VOLTAGE"; + pixel_y = 0 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) "cEu" = ( /obj/machinery/firealarm{ dir = 2; @@ -95017,6 +95035,11 @@ /obj/machinery/light/small{ dir = 8 }, +/obj/machinery/camera{ + c_tag = "Xenobiology Lab - Pen #1"; + dir = 4; + network = list("SS13","RD","Xeno") + }, /turf/open/floor/engine, /area/toxins/xenobiology) "cVE" = ( @@ -95114,6 +95137,11 @@ /obj/machinery/light/small{ dir = 4 }, +/obj/machinery/camera{ + c_tag = "Xenobiology Lab - Pen #2"; + dir = 8; + network = list("SS13","RD","Xeno") + }, /turf/open/floor/engine, /area/toxins/xenobiology) "cVN" = ( @@ -96188,9 +96216,7 @@ /area/shuttle/syndicate) "cXn" = ( /obj/structure/closet/cardboard, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/turf/open/floor/plating, /area/maintenance/starboard) "cXo" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -97786,8 +97812,6 @@ }, /area/shuttle/abandoned) "daw" = ( -/obj/structure/frame/machine, -/obj/item/weapon/circuitboard/machine/cyborgrecharger, /obj/effect/decal/cleanable/oil, /obj/effect/decal/cleanable/dirt{ desc = "A thin layer of dust coating the floor."; @@ -97955,7 +97979,6 @@ }, /area/shuttle/abandoned) "daO" = ( -/obj/structure/frame/computer, /obj/effect/decal/cleanable/cobweb, /obj/effect/decal/cleanable/dirt{ desc = "A thin layer of dust coating the floor."; @@ -98043,43 +98066,21 @@ }, /area/shuttle/abandoned) "daW" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" +/obj/machinery/light/small{ + dir = 8 }, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/frame/machine{ - desc = "A NanoTrasen hypersleep chamber - this one appears broken. There are exposed bolts for easy detachment using a wrench."; - dir = 1; - icon = 'icons/obj/Cryogenic2.dmi'; - icon_state = "sleeper-o"; - name = "broken hypersleep chamber"; - pixel_y = 0 - }, -/turf/open/floor/plasteel/shuttle{ - icon_state = "shuttlefloor3" - }, -/area/shuttle/abandoned) +/obj/structure/easel, +/turf/open/floor/plating, +/area/maintenance/starboard) "daX" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" +/obj/structure/lattice, +/obj/machinery/camera/emp_proof{ + c_tag = "Aft Arm - Far"; + dir = 8; + network = list("Singulo") }, -/obj/structure/frame/machine{ - desc = "A NanoTrasen hypersleep chamber - this one appears broken. There are exposed bolts for easy detachment using a wrench."; - dir = 1; - icon = 'icons/obj/Cryogenic2.dmi'; - icon_state = "sleeper-o"; - name = "broken hypersleep chamber"; - pixel_y = 0 - }, -/turf/open/floor/plasteel/shuttle{ - icon_state = "shuttlefloor3" - }, -/area/shuttle/abandoned) +/turf/open/space, +/area/space) "daY" = ( /obj/structure/chair/office/light{ dir = 4 @@ -98355,43 +98356,17 @@ }, /area/shuttle/abandoned) "dbt" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" +/obj/machinery/camera/emp_proof{ + c_tag = "Aft Arm - Near"; + dir = 4; + network = list("Singulo") }, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/frame/machine{ - desc = "A NanoTrasen hypersleep chamber - this one appears broken. There are exposed bolts for easy detachment using a wrench."; - dir = 2; - icon = 'icons/obj/Cryogenic2.dmi'; - icon_state = "sleeper-o"; - name = "broken hypersleep chamber"; - pixel_y = 3 - }, -/turf/open/floor/plasteel/shuttle{ - icon_state = "shuttlefloor3" - }, -/area/shuttle/abandoned) +/obj/structure/lattice, +/turf/open/space, +/area/space) "dbu" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/frame/machine{ - desc = "A NanoTrasen hypersleep chamber - this one appears broken. There are exposed bolts for easy detachment using a wrench."; - dir = 2; - icon = 'icons/obj/Cryogenic2.dmi'; - icon_state = "sleeper-o"; - name = "broken hypersleep chamber"; - pixel_y = 3 - }, -/turf/open/floor/plasteel/shuttle{ - icon_state = "shuttlefloor3" - }, -/area/shuttle/abandoned) +/turf/closed/wall/r_wall, +/area/security/checkpoint/engineering) "dbv" = ( /obj/structure/chair/office/light, /obj/effect/decal/cleanable/dirt{ @@ -98476,15 +98451,9 @@ }, /area/shuttle/abandoned) "dbC" = ( -/obj/structure/frame/computer, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/shuttle{ - icon_state = "shuttlefloor3" - }, -/area/shuttle/abandoned) +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/engine/engineering) "dbD" = ( /obj/structure/table, /obj/item/device/radio/off{ @@ -98654,7 +98623,6 @@ }, /area/shuttle/abandoned) "dbS" = ( -/obj/structure/frame/machine, /obj/effect/decal/cleanable/oil, /obj/effect/decal/cleanable/dirt{ desc = "A thin layer of dust coating the floor."; @@ -98665,16 +98633,13 @@ }, /area/shuttle/abandoned) "dbT" = ( -/obj/structure/frame/machine, -/obj/item/weapon/circuitboard/machine/autolathe, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" +/obj/structure/reagent_dispensers/watertank, +/obj/structure/window/reinforced{ + dir = 8 }, -/turf/open/floor/plasteel/shuttle{ - icon_state = "shuttlefloor3" - }, -/area/shuttle/abandoned) +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/engine/engineering) "dbU" = ( /obj/machinery/sleeper{ dir = 4; @@ -98798,26 +98763,15 @@ /turf/open/floor/plasteel/shuttle, /area/shuttle/abandoned) "dcd" = ( -/obj/structure/frame/machine, -/obj/item/weapon/circuitboard/machine/chem_dispenser, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/shuttle{ - icon_state = "shuttlefloor3" - }, -/area/shuttle/abandoned) +/obj/structure/closet/firecloset, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/engine/engineering) "dce" = ( -/obj/structure/frame/machine, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/shuttle{ - icon_state = "shuttlefloor3" - }, -/area/shuttle/abandoned) +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/engine/engineering) "dcf" = ( /obj/structure/chair/office/light, /obj/effect/decal/cleanable/dirt{ @@ -99285,12 +99239,11 @@ }, /area/shuttle/escape) "dcR" = ( -/obj/machinery/door/airlock/shuttle{ - name = "Emergency Shuttle Airlock"; - req_access_txt = "2" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/turf/open/floor/plasteel/shuttle, -/area/shuttle/escape) +/turf/open/floor/plating, +/area/engine/break_room) "dcS" = ( /obj/structure/closet/crate/medical{ name = "medical crate" @@ -99372,9 +99325,6 @@ }, /area/shuttle/escape) "dcY" = ( -/obj/machinery/door/airlock/shuttle{ - name = "Emergency Shuttle Cargo Bay Airlock" - }, /obj/docking_port/stationary{ dheight = 0; dir = 4; @@ -99391,6 +99341,9 @@ height = 14; width = 25 }, +/obj/machinery/door/airlock/shuttle{ + name = "Emergency Shuttle Airlock" + }, /turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "dcZ" = ( @@ -100417,13 +100370,12 @@ /turf/open/floor/wood, /area/crew_quarters/bar) "dfi" = ( -/obj/machinery/camera/emp_proof{ - c_tag = "Aft Arm - Near"; - dir = 4; - network = list("Singulo") +/obj/machinery/keycard_auth{ + pixel_x = 26; + pixel_y = 0 }, -/turf/open/floor/plating/airless, -/area/space) +/turf/open/floor/carpet, +/area/crew_quarters/heads) "dfj" = ( /obj/structure/cable{ icon_state = "0-2"; @@ -100467,14 +100419,18 @@ /turf/open/floor/plating, /area/maintenance/starboard) "dfo" = ( -/turf/open/floor/wood, -/area/security/vacantoffice) +/obj/item/hand_labeler_refill, +/obj/structure/easel, +/turf/open/floor/plating, +/area/maintenance/fpmaint2{ + name = "Port Maintenance" + }) "dfp" = ( -/turf/open/floor/plasteel{ - icon_state = "cafeteria"; - dir = 5 - }, -/area/crew_quarters/kitchen) +/obj/structure/easel, +/turf/open/floor/plating, +/area/maintenance/aft{ + name = "Aft Maintenance" + }) "dfq" = ( /turf/open/floor/plasteel, /area/ai_monitored/storage/eva{ @@ -100486,13 +100442,27 @@ }, /area/crew_quarters/kitchen) "dfs" = ( -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plasteel, -/area/atmos) +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Xenobiology Lab - Pen #3"; + dir = 4; + network = list("SS13","RD","Xeno") + }, +/turf/open/floor/engine, +/area/toxins/xenobiology) "dft" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/plasteel, -/area/atmos) +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Xenobiology Lab - Pen #4"; + dir = 8; + network = list("SS13","RD","Xeno") + }, +/turf/open/floor/engine, +/area/toxins/xenobiology) "dfu" = ( /turf/open/floor/wood{ icon_state = "wood-broken6" @@ -100511,22 +100481,27 @@ }, /area/medical/morgue) "dfw" = ( -/obj/machinery/portable_atmospherics/canister/bz, -/turf/open/floor/plasteel, -/area/atmos) +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Xenobiology Lab - Pen #5"; + dir = 4; + network = list("SS13","RD","Xeno") + }, +/turf/open/floor/engine, +/area/toxins/xenobiology) "dfx" = ( -/obj/structure/window/reinforced{ +/obj/machinery/light/small{ dir = 4 }, -/obj/structure/table/wood, -/obj/item/clothing/under/burial, -/obj/item/clothing/under/burial, -/obj/item/clothing/under/burial, -/obj/item/clothing/under/burial, -/obj/item/clothing/under/burial, -/obj/item/clothing/under/burial, -/turf/open/floor/plating, -/area/chapel/main) +/obj/machinery/camera{ + c_tag = "Xenobiology Lab - Pen #6"; + dir = 8; + network = list("SS13","RD","Xeno") + }, +/turf/open/floor/engine, +/area/toxins/xenobiology) "dfy" = ( /turf/open/floor/engine/vacuum, /area/atmos) @@ -109776,9 +109751,9 @@ dai dav daE dai -daX +daU dbi -dbu +daU dai cZz cZK @@ -110033,13 +110008,13 @@ dah dau daD dai -daW +daV dbh -dbt +daV dbA daa dbS -dcd +daU dcr cZy aaa @@ -110552,8 +110527,8 @@ dbj cZS dai daE -dbT -dce +daU +daU dcs cZy aaa @@ -110804,9 +110779,9 @@ dal dau daG dai -daX +daU dbm -dbu +daU dai cZz cZK @@ -111061,9 +111036,9 @@ dak daw daa dai -daX +daU dbl -dbt +daV dai dbJ dbU @@ -111835,7 +111810,7 @@ daO daY dai dbv -dbC +daU cZy cLU dcj @@ -113884,10 +113859,10 @@ bRQ asj alQ bVz -bVC -bVC -bVC -bVC +bVz +bVz +bVz +bVz aaa aaf aaa @@ -114911,11 +114886,11 @@ aLU bRT aLU bUA -bVC -bVC -bVC -bVC -bVC +bVz +bVz +bVz +bVz +bVz aaa aaf aaa @@ -118511,7 +118486,7 @@ alQ bQr bQH alI -avZ +dfo bVE caW ccb @@ -118960,10 +118935,10 @@ aaf aaf aaf aek -agG -agG -agG -agG +bcN +bcN +bcN +bcN akr ahv ahv @@ -119220,7 +119195,7 @@ aek agH ahx air -agG +bcN aks alI amY @@ -119988,8 +119963,8 @@ aaf aaf aaf aek -agG -agG +bcN +bcN agG agG aiu @@ -120871,7 +120846,7 @@ cOU cRS cRS cSP -dfx +cRS cOU cUb cOU @@ -124989,7 +124964,7 @@ cOU dcy dcF dcF -dcR +dcB dcz dcY dcF @@ -124999,7 +124974,7 @@ dcz dcK dcB dcz -dcR +dcB dcF dcz dcF @@ -125688,7 +125663,7 @@ bdK bol bfm bsF -buS +dfi bww bys bmn @@ -129623,7 +129598,7 @@ cTC cTC cTC cVt -cVD +dfw cVB cTC cTC @@ -129876,7 +129851,7 @@ cVD cVN cVo cVt -cVD +dfs cVN cVo cVs @@ -132960,7 +132935,7 @@ cVM cVY cVo cVN -cVM +dft cVY cVo cVB @@ -133221,7 +133196,7 @@ cTC cTC cTC cVB -cVM +dfx cVY cTC cTC @@ -133966,7 +133941,7 @@ cIx cJs cKt chP -bZQ +dfp cgG ciY bVE @@ -138271,7 +138246,7 @@ avN aXR aZH baX -bcN +bcM bee bfH aXR @@ -138778,7 +138753,7 @@ aMR aOg apj aQW -asL +daW aTz alw avN @@ -140604,9 +140579,9 @@ bFT bHN bJw bKQ -dfs +aOo atw -atn +bOl bRw bTc bUq @@ -140861,9 +140836,9 @@ bEn bHO bJx bKR -dft +bbn atw -apk +bOk bRx apk aqy @@ -141118,9 +141093,9 @@ bFU bHP bJy bKS -dfw +bOj atw -apk +cXn bRy apk bUr @@ -141375,7 +141350,7 @@ bEn bHQ bJz bKT -dfw +bOj atw bQa bRz @@ -141840,7 +141815,7 @@ aaf aaf acn alx -apn +bes apk apk apk @@ -143153,15 +143128,15 @@ aCf ayo azn aZR -aZR -aZR -aZR -aZR -aZR +dbu +dbu +dbu +dbu +dbu bjQ bly bng -bfV +bjF brj bjF bjF @@ -143409,12 +143384,12 @@ aDp aVe ayo aYd -aZS -bbn +ayp +ayo bdd -bes -bfV -bhH +bdf +dcR +bjR bjR bjR bjF @@ -143669,11 +143644,11 @@ azn ayo ayo aKe -ayo -bfV +dbT +bjF bhI bjR -bjR +bhH bjF bsD brm @@ -143907,8 +143882,8 @@ ayq azp aaf aCh +aaf aIK -aoa aDq aDq aDq @@ -143918,16 +143893,16 @@ aDq aDq aDq aDq -dfi aIK -aaa +aaf +dbt aaf aYe aZT ayo -aKe -ayo -bfV +dbC +dcd +bjF bhJ bjS blz @@ -144162,7 +144137,7 @@ avP atw ayr azq -aaf +aoa aaf aIM aLy @@ -144178,13 +144153,13 @@ aLy aLy dfk aaf -aaf +aoa azq ayr ayo bde -ayo -bnn +dce +brr bhK cXk bhK @@ -144440,8 +144415,8 @@ aYf aZU ayo aKe -ayo -bnn +aBZ +brr bhK cWO bhK @@ -144675,7 +144650,7 @@ apk avN atw ayr -azq +bVC aAO aaa aIN @@ -144693,11 +144668,11 @@ dfj dfl aaa aWC -azq +bVC ayr ayo bdf -ayo +aBZ aaf bhL bjV @@ -144953,8 +144928,8 @@ azq ayq azu ayo -aKe -ayo +dbC +aBZ aaf aaa cYF @@ -145211,7 +145186,7 @@ ayr ayo ayo aKe -ayo +aBZ aaf aaf aaf @@ -145442,7 +145417,7 @@ apu apu apu apu -atw +alw apk anU atw @@ -145468,7 +145443,7 @@ aYg ayo bbo aKe -ayo +aBZ aaf aaa aaa @@ -145698,7 +145673,7 @@ aaf aaa aaa aaa -atw +alw auL avD atw @@ -145725,7 +145700,7 @@ ayr ayo ayo bdg -ayo +aBZ aaf aaa aaa @@ -145981,7 +145956,7 @@ azq ayt aZT ayo -aKe +dbC aDq aaf aaa @@ -146212,12 +146187,12 @@ aaa aaa aaf aaa -atw +alw auN avS atw ayr -azq +bVC aAP aaa aIN @@ -146235,11 +146210,11 @@ dfj dfl aaa azq -azq +bVC ayr ayo bdh -ayo +aBZ aaf aaf aaa @@ -146469,8 +146444,8 @@ aaa aaa aaf aaa -atw -atw +alw +alw atx atw ayt @@ -146496,8 +146471,8 @@ aYf azu ayo bdi -ayo -ayo +aBZ +aBZ aaf aaa aaa @@ -146727,13 +146702,13 @@ aaa acn acn atx -anV -avT +bRk +avS atw ayu azq azq -aaa +aaf aIL aoa aoa @@ -146752,7 +146727,7 @@ azq azq ayu ayo -bdh +aKg aZS bdi acn @@ -146983,14 +146958,14 @@ aaf aaf aaf aaf -atw -atw +alw +alw atx -awY +atw ayu ayu -aAQ -aoa +azq +aaa aLw aSG aSG @@ -147004,14 +146979,14 @@ aTN aSG aSG dfm -aoa +aaf aWD ayu ayu -aHA +ayo bdi -ayo -ayo +aBZ +aBZ aaf aaa aaa @@ -147245,25 +147220,25 @@ aaf acn atw ayo -azv ayo -azq -aoa -aoa -aaf -aaf -aoa -apy -aoa -aaf -aaf -aaf -aaf -aaf -aaf -azq ayo -azv +aaa +coC +aIK +aaf +aaa +aaa +aaf +aIK +aaf +aaa +aaa +aaf +aIK +daX +aaa +ayo +ayo ayo ayo acn @@ -147502,7 +147477,7 @@ aaf acn aaf aaf -azw +aaf ayo ayo ayo @@ -147758,25 +147733,25 @@ aaa aaa aaa aaa +aaa aaf -aaf +ayo azw azw azw -azw -aGc +aHA azw azw azw +cEt azw azw azw -azw -aGc -azw +aHA azw azw azw +ayo aaf aaa aaf @@ -148277,17 +148252,17 @@ aaa aaa aaa aaa -aaa +aaf aaf aaa aaa aaf -aaa +aaf aaa aaa aaa aaf -aaa +aaf aaa aaa aaa @@ -148539,7 +148514,7 @@ aaf aaa aaa aaa -aaa +aaf aaa aaa aaa @@ -149057,7 +149032,7 @@ aaa aaa aaa aaa -aaf +aaa aaa aaa aaa diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index 1f25a28a73b..f3edb7bcab8 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -2792,6 +2792,15 @@ possible_destinations = "pod_asteroid3"; shuttleId = "pod3" }, +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/status_display{ + density = 0; + layer = 3; + pixel_x = 0; + pixel_y = 32 + }, /turf/open/floor/plasteel/shuttle, /area/shuttle/pod_3) "afr" = ( @@ -2802,6 +2811,9 @@ pixel_x = 6; pixel_y = -32 }, +/obj/structure/chair{ + dir = 4 + }, /turf/open/floor/plasteel/shuttle, /area/shuttle/pod_3) "afs" = ( @@ -6369,9 +6381,12 @@ /turf/open/floor/plating, /area/maintenance/fpmaint2) "alX" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/maintenance/fpmaint2) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/bz, +/turf/open/floor/plasteel, +/area/atmos) "alY" = ( /obj/machinery/door/airlock/shuttle{ name = "Labor Shuttle Airlock"; @@ -6661,8 +6676,11 @@ /turf/open/floor/plating, /area/maintenance/auxsolarport) "amB" = ( -/turf/open/floor/plating, -/area/security/prison) +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel/shuttle, +/area/shuttle/escape) "amC" = ( /turf/open/floor/plating, /area/maintenance/fpmaint2) @@ -7060,12 +7078,13 @@ }, /area/maintenance/fpmaint2) "anq" = ( -/obj/structure/disposalpipe/segment{ +/obj/structure/chair{ dir = 4 }, -/obj/machinery/portable_atmospherics/canister/bz, -/turf/open/floor/plasteel, -/area/atmos) +/turf/open/floor/plasteel/shuttle{ + icon_state = "shuttlefloor3" + }, +/area/shuttle/escape) "anr" = ( /obj/structure/chair{ dir = 8 @@ -62814,6 +62833,9 @@ }, /area/shuttle/escape) "cxr" = ( +/obj/structure/chair{ + dir = 4 + }, /obj/structure/window/reinforced{ dir = 8 }, @@ -63710,6 +63732,15 @@ possible_destinations = "pod_asteroid4"; shuttleId = "pod4" }, +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/status_display{ + density = 0; + layer = 3; + pixel_x = 0; + pixel_y = 32 + }, /turf/open/floor/plasteel/shuttle, /area/shuttle/pod_4) "czM" = ( @@ -63720,6 +63751,9 @@ pixel_x = 6; pixel_y = -32 }, +/obj/structure/chair{ + dir = 4 + }, /turf/open/floor/plasteel/shuttle, /area/shuttle/pod_4) "czN" = ( @@ -95066,7 +95100,7 @@ bJs bKy bLM bLM -anq +alX bOV bQk bRt @@ -115848,11 +115882,11 @@ cxd cxe cwU cwL -cxa -cxa -cxa -cxa -cxa +anq +anq +anq +anq +anq cwL cwU cxQ @@ -117130,7 +117164,7 @@ cwL cwX cwL cwL -cxa +anq cxj cwL cxq @@ -117382,8 +117416,8 @@ aaa aaa crx cwG -cwL -cwL +amB +amB cwW cxa cwL diff --git a/_maps/map_files/generic/z2.dmm b/_maps/map_files/generic/z2.dmm index fda763709db..83ac1904f6a 100644 --- a/_maps/map_files/generic/z2.dmm +++ b/_maps/map_files/generic/z2.dmm @@ -2716,7 +2716,7 @@ /area/centcom/evac) "io" = ( /obj/structure/table/reinforced, -/obj/item/toy/AI, +/obj/item/toy/talking/AI, /obj/structure/window/reinforced{ dir = 4 }, diff --git a/_maps/metastation.dm b/_maps/metastation.dm index d574427fca1..a75489a671d 100644 --- a/_maps/metastation.dm +++ b/_maps/metastation.dm @@ -19,7 +19,7 @@ z7 = empty space #define MINETYPE "lavaland" - #include "map_files\MetaStation\MetaStation.v41I.dmm" + #include "map_files\MetaStation\MetaStation.dmm" #include "map_files\generic\z2.dmm" #include "map_files\generic\z3.dmm" #include "map_files\generic\z4.dmm" @@ -30,7 +30,7 @@ z7 = empty space #include "map_files\generic\z9.dmm" #define MAP_PATH "map_files/MetaStation" - #define MAP_FILE "MetaStation.v41I.dmm" + #define MAP_FILE "MetaStation.dmm" #define MAP_NAME "MetaStation" #define MAP_TRANSITION_CONFIG list(MAIN_STATION = CROSSLINKED, CENTCOMM = SELFLOOPING, ABANDONED_SATELLITE = CROSSLINKED, DERELICT = CROSSLINKED, MINING = SELFLOOPING, EMPTY_AREA_1 = CROSSLINKED, EMPTY_AREA_2 = CROSSLINKED, EMPTY_AREA_3 = CROSSLINKED, EMPTY_AREA_4 = CROSSLINKED) diff --git a/_maps/shuttles/emergency_bar.dmm b/_maps/shuttles/emergency_bar.dmm index 3846904216b..387ebe9f888 100644 --- a/_maps/shuttles/emergency_bar.dmm +++ b/_maps/shuttles/emergency_bar.dmm @@ -34,7 +34,7 @@ "aH" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{name = "The Emergency Escape Bar"},/turf/open/floor/plasteel/bar,/area/shuttle/escape) "aI" = (/obj/structure/table,/obj/machinery/chem_dispenser/drinks/beer,/turf/open/floor/plasteel/bar,/area/shuttle/escape) "aJ" = (/obj/structure/chair,/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aK" = (/mob/living/simple_animal/drone/snowflake{desc = "A barkeeping drone, an indestructible robot built to tend bars."; dir = 8; health = 3000; languages = 127; laws = "1. Serve drinks. 2. Talk to patrons. 3. Don't get messed up in their affairs."; maxHealth = 3000; name = "Bardrone"; seeStatic = 0},/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aK" = (/mob/living/simple_animal/drone/snowflake/bardrone,/turf/open/floor/plasteel/bar,/area/shuttle/escape) "aL" = (/obj/machinery/vending/boozeomat,/turf/open/floor/plasteel/bar,/area/shuttle/escape) "aM" = (/obj/structure/table,/turf/open/floor/plasteel/bar,/area/shuttle/escape) "aN" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker,/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 6; pixel_y = 4},/turf/open/floor/plasteel/bar,/area/shuttle/escape) diff --git a/_maps/shuttles/emergency_goon.dmm b/_maps/shuttles/emergency_goon.dmm new file mode 100644 index 00000000000..3d8ebf08142 --- /dev/null +++ b/_maps/shuttles/emergency_goon.dmm @@ -0,0 +1,56 @@ +"a" = (/turf/open/space,/area/space) +"b" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 4},/turf/open/floor/plating,/area/shuttle/escape) +"c" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/turf/open/floor/plating,/area/shuttle/escape) +"d" = (/turf/closed/wall/shuttle{tag = "icon-swall0"; icon_state = "swall0"},/area/shuttle/escape) +"e" = (/turf/closed/wall/shuttle{tag = "icon-wall_space (NORTH)"; icon_state = "wall_space"; dir = 1},/area/shuttle/escape) +"f" = (/turf/closed/wall/shuttle{tag = "icon-swall2"; icon_state = "swall2"},/area/shuttle/escape) +"g" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"h" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{dheight = 0; dir = 2; dwidth = 9; name = "NES Port"; width = 19},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"i" = (/turf/closed/wall/shuttle{tag = "icon-wall_space (WEST)"; icon_state = "wall_space"; dir = 8},/area/shuttle/escape) +"j" = (/turf/closed/wall/shuttle{tag = "icon-swall4"; icon_state = "swall4"},/area/shuttle/escape) +"k" = (/turf/closed/wall/shuttle{tag = "icon-swall12"; icon_state = "swall12"},/area/shuttle/escape) +"l" = (/obj/machinery/vending/wallmed,/turf/closed/wall/shuttle{tag = "icon-swall8"; icon_state = "swall8"},/area/shuttle/escape) +"m" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"n" = (/turf/closed/wall/shuttle{tag = "icon-swall1"; icon_state = "swall1"},/area/shuttle/escape) +"o" = (/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"p" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/open/floor/plating,/area/shuttle/escape) +"q" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 4},/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape) +"r" = (/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape) +"s" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"t" = (/turf/closed/wall/shuttle{tag = "icon-wall_floor"; icon_state = "wall_floor"},/area/shuttle/escape) +"u" = (/turf/open/space,/area/shuttle/escape) +"v" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape) +"w" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Infirmary"},/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape) +"x" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"y" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/toolbox/emergency,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"z" = (/obj/structure/table/reinforced,/obj/item/device/radio,/obj/structure/window/reinforced{dir = 1; layer = 2.9},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"A" = (/obj/structure/chair/comfy/brown{dir = 4},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"B" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced{dir = 1},/obj/structure/table/reinforced,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"C" = (/turf/closed/wall/shuttle{tag = "icon-swall8"; icon_state = "swall8"},/area/shuttle/escape) +"D" = (/turf/closed/wall/shuttle{tag = "icon-swall3"; icon_state = "swall3"},/area/shuttle/escape) +"E" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Cockpit"; req_access_txt = "19"},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"F" = (/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"G" = (/obj/machinery/computer/emergency_shuttle,/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"H" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) +"I" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"J" = (/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) +"K" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Brig"; req_access_txt = "2"},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) +"L" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/regular,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"M" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/regular,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"N" = (/turf/closed/wall/shuttle{tag = "icon-wall_space (EAST)"; icon_state = "wall_space"; dir = 4},/area/shuttle/escape) +"O" = (/turf/closed/wall/shuttle{tag = "icon-wall_floor (WEST)"; icon_state = "wall_floor"; dir = 8},/area/shuttle/escape) +"P" = (/turf/closed/wall/shuttle{tag = "icon-wall_space"; icon_state = "wall_space"},/area/shuttle/escape) + +(1,1,1) = {" +abcdeaafghfaaaaaaaa +ijklfdmnoonmmdeaaaa +bpqrnsssoossstddeua +bpvrwooooossssxyzxe +bpqrfssdooosssdAABx +jkkCDssmooooooEFAGx +bpHHnssdooosssdAAIx +bpHJKooooossssxLMxN +bpHHfsssoosssOddNua +PjkCndmfoofmmdNaaaa +abcdNaanggnaaaaaaaa +"} diff --git a/_maps/shuttles/emergency_imfedupwiththisworld.dmm b/_maps/shuttles/emergency_imfedupwiththisworld.dmm new file mode 100644 index 00000000000..4ecb0e8fd64 --- /dev/null +++ b/_maps/shuttles/emergency_imfedupwiththisworld.dmm @@ -0,0 +1,42 @@ +"a" = (/turf/closed/wall/mineral/wood,/area/shuttle/escape) +"b" = (/obj/machinery/light_switch,/turf/closed/wall/mineral/wood,/area/shuttle/escape) +"c" = (/obj/machinery/door/unpowered/shuttle,/obj/docking_port/mobile/emergency{dheight = 0; dir = 4; dwidth = 1; height = 10; name = "Oh Hi Mark"; width = 12},/turf/open/floor/wood,/area/shuttle/escape) +"d" = (/turf/open/floor/wood,/area/shuttle/escape) +"e" = (/obj/machinery/light{dir = 1},/turf/open/floor/carpet,/area/shuttle/escape) +"f" = (/obj/structure/chair/comfy/teal,/turf/open/floor/carpet,/area/shuttle/escape) +"g" = (/obj/structure/table/wood,/obj/item/device/flashlight/lamp,/turf/open/floor/carpet,/area/shuttle/escape) +"h" = (/turf/open/floor/carpet,/area/shuttle/escape) +"i" = (/obj/structure/table/reinforced,/obj/item/weapon/kitchen/knife,/turf/open/floor/carpet,/area/shuttle/escape) +"j" = (/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"k" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/vending/boozeomat,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"l" = (/obj/machinery/computer/security/wooden_tv,/turf/open/floor/carpet,/area/shuttle/escape) +"m" = (/obj/structure/table/glass,/turf/open/floor/carpet,/area/shuttle/escape) +"n" = (/obj/structure/chair/comfy/teal{tag = "icon-comfychair (WEST)"; icon_state = "comfychair"; dir = 8},/turf/open/floor/carpet,/area/shuttle/escape) +"o" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/snacks/store/cake/birthday,/turf/open/floor/carpet,/area/shuttle/escape) +"p" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/shaker,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"q" = (/obj/structure/table/reinforced,/turf/open/floor/carpet,/area/shuttle/escape) +"r" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"s" = (/obj/machinery/door/window{dir = 8},/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"t" = (/obj/structure/table/reinforced,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"u" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/open/floor/wood,/area/shuttle/escape) +"v" = (/obj/structure/chair/office/dark,/turf/open/floor/wood,/area/shuttle/escape) +"w" = (/obj/effect/decal/cleanable/blood,/obj/effect/decal/cleanable/blood/drip,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/mob_spawn/human/corpse,/obj/item/weapon/gun/projectile/automatic/pistol/m1911,/obj/machinery/light/small{dir = 8},/obj/item/weapon/reagent_containers/food/snacks/cakeslice/birthday,/turf/open/floor/carpet,/area/shuttle/escape) +"x" = (/obj/structure/bed,/obj/item/weapon/bedsheet/red,/obj/item/weapon/paper{info = "i love daniel
daniel is my best friend

you are tearing me apart elise"},/turf/open/floor/carpet,/area/shuttle/escape) +"y" = (/obj/structure/flora/kirbyplants,/turf/open/floor/wood,/area/shuttle/escape) +"z" = (/obj/structure/table/wood,/obj/item/weapon/papercutter,/turf/open/floor/wood,/area/shuttle/escape) +"A" = (/obj/structure/table/wood,/obj/machinery/computer/libraryconsole/bookmanagement,/turf/open/floor/wood,/area/shuttle/escape) +"B" = (/obj/machinery/light,/obj/structure/table/wood,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/open/floor/wood,/area/shuttle/escape) +"C" = (/obj/structure/mineral_door/wood,/turf/open/floor/wood,/area/shuttle/escape) +"D" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/carpet,/area/shuttle/escape) + +(1,1,1) = {" +abaaaaaaaa +cdefghijka +adlmnhojpa +adhmnhqjra +adhhhhsjta +auddddaaaa +addvddawxa +ayzABdChDa +aaaaaaaaaa +"} diff --git a/_maps/shuttles/emergency_narnar.dmm b/_maps/shuttles/emergency_narnar.dmm index c85ddedd921..d4cf6ff501d 100644 --- a/_maps/shuttles/emergency_narnar.dmm +++ b/_maps/shuttles/emergency_narnar.dmm @@ -15,20 +15,20 @@ "o" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -29},/turf/open/floor/plasteel/cult,/area/shuttle/escape) "p" = (/obj/machinery/computer/communications,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "q" = (/obj/item/stack/sheet/metal,/obj/effect/decal/remains/human,/turf/open/floor/plasteel/cult,/area/shuttle/escape) -"r" = (/obj/machinery/door/airlock/cult/unruned/glass,/turf/open/floor/plasteel/cult,/area/shuttle/escape) +"r" = (/obj/machinery/door/airlock/cult/unruned/glass/friendly,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "s" = (/obj/machinery/status_display,/turf/closed/wall/cult,/area/shuttle/escape) "t" = (/obj/structure/closet/emcloset,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "u" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "v" = (/obj/effect/decal/cleanable/blood,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "w" = (/mob/living/simple_animal/hostile/construct/builder,/turf/open/floor/plasteel/cult,/area/shuttle/escape) -"x" = (/obj/machinery/door/airlock/cult,/turf/open/floor/plating,/area/shuttle/escape) +"x" = (/obj/machinery/door/airlock/cult/friendly,/turf/open/floor/plating,/area/shuttle/escape) "y" = (/obj/effect/decal/cleanable/blood/gibs/up,/obj/item/candle/infinite,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "z" = (/obj/effect/rune/raise_dead,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "A" = (/obj/item/candle/infinite,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "B" = (/obj/effect/rune/true_sight,/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/gibs/body,/obj/effect/decal/cleanable/blood/gibs/core,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "C" = (/mob/living/simple_animal/hostile/construct/armored,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "D" = (/obj/effect/rune/true_sight,/obj/effect/decal/remains/human,/turf/open/floor/plasteel/cult,/area/shuttle/escape) -"E" = (/obj/machinery/door/airlock/cult,/obj/docking_port/mobile/emergency{name = "shuttle 667"},/turf/open/floor/plating,/area/shuttle/escape) +"E" = (/obj/machinery/door/airlock/cult/friendly,/obj/docking_port/mobile/emergency{name = "shuttle 667"},/turf/open/floor/plating,/area/shuttle/escape) "F" = (/obj/effect/decal/cleanable/blood/gibs/down,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "G" = (/obj/structure/extinguisher_cabinet{has_extinguisher = null; icon_state = "extinguisher_empty"; opened = 1; pixel_x = 27; pixel_y = 0},/obj/item/weapon/extinguisher{safety = 0},/turf/open/floor/plasteel/cult,/area/shuttle/escape) "H" = (/mob/living/simple_animal/hostile/construct/wraith,/turf/open/floor/plasteel/cult,/area/shuttle/escape) @@ -37,7 +37,7 @@ "K" = (/mob/living/simple_animal/hostile/carp/eyeball{faction = list("cult"); name = "right eyeball"},/turf/open/floor/plasteel/cult,/area/shuttle/escape) "L" = (/obj/effect/decal/cleanable/blood/drip,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "M" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/plasteel/cult,/area/shuttle/escape) -"N" = (/obj/machinery/door/airlock/cult/glass,/turf/open/floor/plasteel/cult,/area/shuttle/escape) +"N" = (/obj/machinery/door/airlock/cult/glass/friendly,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "O" = (/obj/structure/dresser,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "P" = (/obj/structure/showcase/horrific_experiment,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "Q" = (/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/item/stack/sheet/metal,/turf/open/floor/plasteel/cult,/area/shuttle/escape) diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 0cbd606660e..04e5a8fbf0d 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -70,3 +70,13 @@ #define UNARMED_ATTACK 2 #define PROJECTILE_ATTACK 3 #define THROWN_PROJECTILE_ATTACK 4 + + +//Gun Stuff + #define SAWN_INTACT 0 + #define SAWN_OFF 1 + #define SAWN_SAWING -1 + + #define WEAPON_LIGHT 0 + #define WEAPON_MEDIUM 1 + #define WEAPON_HEAVY 2 \ No newline at end of file diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index d5c37b89886..8685d41921c 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -18,6 +18,7 @@ #define NODECONSTRUCT 128 // For machines and structures that should not break into parts, eg, holodeck stuff #define FPRINT 256 // takes a fingerprint #define ON_BORDER 512 // item has priority to check when entering or leaving +#define HOLOGRAM 32768 // HOlodeck shit should not be used in any fucking things #define HEADBANGPROTECT 4096 @@ -52,21 +53,20 @@ #define MUTCOLORS 1 #define HAIR 2 -#define FACEHAIR 4 -#define EYECOLOR 8 -#define LIPS 16 -#define RESISTCOLD 32 -#define RESISTHEAT 64 -#define RADIMMUNE 128 -#define NOBREATH 256 -#define NOGUNS 512 -#define NOBLOOD 1024 -#define NOFIRE 2048 -#define VIRUSIMMUNE 4096 -#define PIERCEIMMUNE 8192 -#define NOTRANSSTING 16384 - -#define MUTCOLORS_PARTSONLY 32768 //Used if we want the mutant colour to be only used by mutant bodyparts. Don't combine this with MUTCOLORS, or it will be useless. +#define FACEHAIR 3 +#define EYECOLOR 4 +#define LIPS 5 +#define RESISTTEMP 6 +#define RADIMMUNE 7 +#define NOBREATH 8 +#define NOGUNS 9 +#define NOBLOOD 10 +#define NOFIRE 11 +#define VIRUSIMMUNE 12 +#define PIERCEIMMUNE 13 +#define NOTRANSSTING 14 +#define MUTCOLORS_PARTSONLY 15 //Used if we want the mutant colour to be only used by mutant bodyparts. Don't combine this with MUTCOLORS, or it will be useless. +#define NODISMEMBER 16 /* These defines are used specifically with the atom/movable/languages bitmask. diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index f05b74117d9..7daf7eeaf3c 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -8,6 +8,14 @@ #define ishuman(A) (istype(A, /mob/living/carbon/human)) +// Human sub-species +#define isabductor(A) (is_species(A, /datum/species/abductor)) +#define isgolem(A) (is_species(A, /datum/species/golem)) +#define islizard(A) (is_species(A, /datum/species/lizard)) +#define isplasmaman(A) (is_species(A, /datum/species/plasmaman)) +#define ispodperson(A) (is_species(A, /datum/species/podperson)) +#define isflyperson(A) (is_species(A, /datum/species/fly)) + #define ismonkey(A) (istype(A, /mob/living/carbon/monkey)) #define isbrain(A) (istype(A, /mob/living/carbon/brain)) @@ -32,6 +40,8 @@ #define ismouse(A) (istype(A, /mob/living/simple_animal/mouse)) +#define isconstruct(A) (istype(A, /mob/living/simple_animal/hostile/construct)) + #define isbear(A) (istype(A, /mob/living/simple_animal/hostile/bear)) #define iscarp(A) (istype(A, /mob/living/simple_animal/hostile/carp)) @@ -78,4 +88,4 @@ #define issignaler(O) (istype(O, /obj/item/device/assembly/signaler)) -#define istimer(O) (istype(O, /obj/item/device/assembly/timer)) \ No newline at end of file +#define istimer(O) (istype(O, /obj/item/device/assembly/timer)) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 39c68439420..5fc6b1400d6 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -317,4 +317,11 @@ Proc for attack log creation, because really why not . = 0 break mainloop if(progbar) - qdel(progbar) \ No newline at end of file + qdel(progbar) + +/proc/is_species(A, species_datum) + . = FALSE + if(ishuman(A)) + var/mob/living/carbon/human/H = A + if(H.dna && istype(H.dna.species, species_datum)) + . = TRUE diff --git a/code/datums/material_container.dm b/code/datums/material_container.dm index d7c5c307bc5..21752e31bd6 100644 --- a/code/datums/material_container.dm +++ b/code/datums/material_container.dm @@ -120,8 +120,7 @@ /datum/material_container/proc/use_amount_type(amt, material_type) - var/datum/material/M - M = materials[material_type] + var/datum/material/M = materials[material_type] if(M) if(M.amount >= amt) M.amount -= amt @@ -129,6 +128,20 @@ return amt return 0 +/datum/material_container/proc/can_use_amount(amt, material_type, list/mats) + if(amt && material_type) + var/datum/material/M = materials[material_type] + if(M && M.amount >= amt) + return TRUE + else if(istype(mats)) + for(var/M in mats) + if(materials[M] && mats[M] <= materials[M]) + continue + else + return FALSE + return TRUE + return FALSE + //For spawning mineral sheets; internal use only /datum/material_container/proc/retrieve(sheet_amt, datum/material/M) if(sheet_amt > 0) diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index 9409e9b3b6f..5591c02439b 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -174,3 +174,28 @@ making sure people work on their cardio." suffix = "lavaland_gym.dmm" cost = 10 + +/datum/map_template/ruin/lavaland/survivalcapsule + name = "Survival Capsule Ruins" + id = "survivalcapsule" + description = "What was once sanctuary to the common miner, \ + is now their tomb." + suffix = "lavaland_surface_survivalpod.dmm" + cost = 5 + +/datum/map_template/ruin/lavaland/wwiioutpost + name = "Strange Outpost" + id = "nazi" + description = "The ruins of an outpost, skeletons and empty shell casings litter the interior of \ + the structure. Some of these uniforms look awfully strange.." + suffix = "lavaland_surface_wwiioutpost.dmm" + cost = 20 + allow_duplicates = FALSE + +/datum/map_template/ruin/lavaland/tomb + name = "Strange Outpost" + id = "tomb" + description = "A strange tomb, housing the dead of whatever strange civilization \ + lived here before. You swear you hear rattling coming from the inside." + suffix = "lavaland_surface_tomb.dmm" + cost = 10 diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index d7497bbe415..f34e49e96a0 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -112,6 +112,24 @@ without protective goggles. Emitters spawn powered on, expect \ admin notices, they are harmless." +/datum/map_template/shuttle/emergency/imfedupwiththisworld + suffix = "imfedupwiththisworld" + name = "Oh, Hi Daniel" + description = "How was space work today? \ + Oh, pretty good. We got a new space station and the company will make a lot of money. \ + What space station? \ + I cannot tell you; it's space confidential. \ + Aw, come space on. Why not? \ + No, I can't. Anyway, how is your space roleplay life?" + +/datum/map_template/shuttle/emergency/goon + suffix = "goon" + name = "NES Port" + description = "The Nanotrasen Emergency Shuttle Port(NES Port for short) \ + is a shuttle used at other less known nanotrasen facilities \ + and has a more open inside for larger crowds." + + /datum/map_template/shuttle/ferry/base suffix = "base" name = "transport ferry" diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm index f5a415985fe..e1ade57fe22 100644 --- a/code/game/gamemodes/blob/blob_finish.dm +++ b/code/game/gamemodes/blob/blob_finish.dm @@ -1,9 +1,9 @@ /datum/game_mode/blob/check_finished() - if(blob_overminds.len > cores_to_spawn && cores_to_spawn > blob_cores.len)//Some blobs have yet to burst + if(overminds.len) return 0 if(blobwincount <= blobs_legit.len)//Blob took over return 1 - if(!overminds.len && !blob_cores.len) //blob is dead + if(!blob_cores.len) //blob is dead if(config.continuous["blob"]) continuous_sanity_checked = 1 //Nonstandard definition of "alive" gets past the check otherwise SSshuttle.emergencyNoEscape = 0 diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm index e4c68a8537c..1331788dc4e 100644 --- a/code/game/gamemodes/changeling/powers/fleshmend.dm +++ b/code/game/gamemodes/changeling/powers/fleshmend.dm @@ -1,13 +1,17 @@ /obj/effect/proc_holder/changeling/fleshmend name = "Fleshmend" - desc = "Our flesh rapidly regenerates, healing our wounds. Effectiveness decreases with quick, repeated use." - helptext = "Heals a moderate amount of damage over a short period of time. Can be used while unconscious, and will alert nearby crew." + desc = "Our flesh rapidly regenerates, healing our wounds, and growing \ + back missing limbs. Effectiveness decreases with quick, repeated use." + helptext = "Heals a moderate amount of damage over a short period of \ + time. Can be used while unconscious. Will alert nearby crew if \ + any limbs are regenerated." chemical_cost = 25 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 + // The ideal total healing amount, + // divided by healing_ticks to get heal/tick var/total_healing = 100 /obj/effect/proc_holder/changeling/fleshmend/New() @@ -22,25 +26,29 @@ if(recent_uses > 1) recent_uses = max(1, recent_uses - (1 / healing_ticks)) -//Starts healing you every second for 10 seconds. Can be used whilst unconscious. +//Starts healing you every second for 10 seconds. +//Can be used whilst unconscious. /obj/effect/proc_holder/changeling/fleshmend/sting_action(mob/living/user) user << "We begin to heal rapidly." if(recent_uses > 1) - user << "Our healing's effectiveness is reduced by quickly repeated use!" + user << "Our healing's effectiveness is reduced \ + by quick repeated use!" spawn(0) recent_uses++ if(ishuman(user)) var/mob/living/carbon/human/H = user H.restore_blood() H.remove_all_embedded_objects() - if(H.get_missing_limbs()) + var/list/missing = H.get_missing_limbs() + if(missing.len) playsound(user, 'sound/magic/Demon_consume.ogg', 50, 1) H.visible_message("[user]'s missing limbs reform, making a loud, grotesque sound!", "Your limbs regrow, making a loud, crunchy sound and giving you great pain!", "You hear organic matter ripping and tearing!") H.emote("scream") H.regenerate_limbs(1) - // 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 the effectiveness decreases with + // each use in a short timespan for(var/i in 1 to healing_ticks) if(user) var/healpertick = -(total_healing / healing_ticks) diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm index 2d906e37ed0..861ded33da2 100644 --- a/code/game/gamemodes/changeling/traitor_chan.dm +++ b/code/game/gamemodes/changeling/traitor_chan.dm @@ -43,6 +43,7 @@ for(var/j = 0, j < num_changelings, j++) if(!possible_changelings.len) break var/datum/mind/changeling = pick(possible_changelings) + antag_candidates -= changeling possible_changelings -= changeling changelings += changeling modePlayer += changelings diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index dc706d3934f..e5cc534da09 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -21,8 +21,14 @@ return 0 if(isloyal(mind.current)) return 0 - if (ticker.mode.name == "cult") //redundant? - if(is_sacrifice_target(mind)) return 0 + if(issilicon(mind.current) || isbot(mind.current) || isdrone(mind.current)) + return 0 //can't convert machines, that's ratvar's thing + if(isguardian(mind.current)) + var/mob/living/simple_animal/hostile/guardian/G = mind.current + if(!iscultist(G.summoner)) + return 0 //can't convert it unless the owner is converted + if(is_sacrifice_target(mind)) + return 0 return 1 /datum/game_mode/cult diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index a4648b5fac6..a5a299d068c 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -8,9 +8,21 @@ /obj/structure/cult/examine(mob/user) ..() + user << "\The [src] is [anchored ? "":"not "]secured to the floor." if(iscultist(user) && cooldowntime > world.time) user << "The magic in [src] is weak, it will be ready to use again in [getETA()]." +/obj/structure/cult/attackby(obj/I, mob/user, params) + if(istype(I, /obj/item/weapon/tome) && iscultist(user)) + anchored = !anchored + user << "You [anchored ? "":"un"]secure \the [src] [anchored ? "to":"from"] the floor." + if(!anchored) + icon_state = "[initial(icon_state)]_off" + else + icon_state = initial(icon_state) + else + return ..() + /obj/structure/cult/proc/getETA() var/time = (cooldowntime - world.time)/600 var/eta = "[round(time, 1)] minutes" @@ -28,6 +40,9 @@ if(!iscultist(user)) user << "You're pretty sure you know exactly what this is used for and you can't seem to touch it." return + if(!anchored) + user << "You need to anchor [src] to the floor with a tome first." + return if(cooldowntime > world.time) user << "The magic in [src] is weak, it will be ready to use again in [getETA()]." return @@ -40,7 +55,7 @@ pickedtype = /obj/item/clothing/glasses/night/cultblind if("Flask of Unholy Water") pickedtype = /obj/item/weapon/reagent_containers/food/drinks/bottle/unholywater - if(pickedtype && Adjacent(user) && src && !qdeleted(src) && !user.incapacitated() && cooldowntime <= world.time) + if(src && !qdeleted(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time) cooldowntime = world.time + 2400 var/obj/item/N = new pickedtype(get_turf(src)) user << "You kneel before the altar and your faith is rewarded with an [N]!" @@ -56,6 +71,9 @@ if(!iscultist(user)) user << "The heat radiating from [src] pushes you back." return + if(!anchored) + user << "You need to anchor [src] to the floor with a tome first." + return if(cooldowntime > world.time) user << "The magic in [src] is weak, it will be ready to use again in [getETA()]." return @@ -68,7 +86,7 @@ pickedtype = /obj/item/clothing/suit/hooded/cultrobes/berserker if("Nar-Sien Hardsuit") pickedtype = /obj/item/clothing/suit/space/hardsuit/cult - if(pickedtype && Adjacent(user) && src && !qdeleted(src) && !user.incapacitated() && cooldowntime <= world.time) + if(src && !qdeleted(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time) cooldowntime = world.time + 2400 var/obj/item/N = new pickedtype(get_turf(src)) user << "You work the forge as dark knowledge guides your hands, creating [N]!" @@ -79,44 +97,49 @@ desc = "A floating crystal that slowly heals those faithful to Nar'Sie." icon_state = "pylon" luminosity = 5 - var/heal_delay = 50 - var/last_shot = 0 - var/list/corruption = list() + var/heal_delay = 25 + var/last_heal = 0 + var/corrupt_delay = 50 + var/last_corrupt = 0 /obj/structure/cult/pylon/New() - SSobj.processing |= src - corruption += get_turf(src) - for(var/i in 1 to 5) - for(var/t in corruption) - var/turf/T = t - corruption |= T.GetAtmosAdjacentTurfs() + SSfastprocess.processing |= src ..() /obj/structure/cult/pylon/Destroy() - SSobj.processing.Remove(src) + SSfastprocess.processing.Remove(src) return ..() /obj/structure/cult/pylon/process() - if((last_shot + heal_delay) <= world.time) - last_shot = world.time + if(!anchored) + return + if(last_heal <= world.time) + last_heal = world.time + heal_delay for(var/mob/living/L in range(5, src)) - if(iscultist(L)) - var/mob/living/carbon/human/H = L - if(istype(H)) - L.adjustBruteLoss(-1, 0) - L.adjustFireLoss(-1, 0) - L.updatehealth() - if(istype(L, /mob/living/simple_animal/hostile/construct)) - var/mob/living/simple_animal/M = L - if(M.health < M.maxHealth) - M.adjustHealth(-2) - if(corruption.len) - var/turf/T = pick_n_take(corruption) - corruption -= T - if(istype(T, /turf/open/floor/engine/cult) || istype(T, /turf/open/space) || istype(T, /turf/open/floor/plating/lava)) - return + if(iscultist(L) || istype(L, /mob/living/simple_animal/shade) || istype(L, /mob/living/simple_animal/hostile/construct)) + if(L.health != L.maxHealth) + PoolOrNew(/obj/effect/overlay/temp/heal, list(get_turf(src), "#960000")) + if(ishuman(L)) + L.adjustBruteLoss(-1, 0) + L.adjustFireLoss(-1, 0) + L.updatehealth() + if(istype(L, /mob/living/simple_animal/shade) || istype(L, /mob/living/simple_animal/hostile/construct)) + var/mob/living/simple_animal/M = L + if(M.health < M.maxHealth) + M.adjustHealth(-1) + CHECK_TICK + if(last_corrupt <= world.time) + var/list/validturfs = list() + for(var/T in circleviewturfs(src, 5)) + if(istype(T, /turf/closed) || istype(T, /turf/open/floor/engine/cult) || istype(T, /turf/open/space) || istype(T, /turf/open/floor/plating/lava)) + continue + validturfs |= T + var/turf/T = safepick(validturfs) + if(T) T.ChangeTurf(/turf/open/floor/engine/cult) - + last_corrupt = world.time + corrupt_delay + else + last_corrupt = world.time + corrupt_delay*2 /obj/structure/cult/tome name = "archives" @@ -128,6 +151,9 @@ if(!iscultist(user)) user << "All of these books seem to be gibberish." return + if(!anchored) + user << "You need to anchor [src] to the floor with a tome first." + return if(cooldowntime > world.time) user << "The magic in [src] is weak, it will be ready to use again in [getETA()]." return @@ -140,7 +166,7 @@ pickedtype = /obj/item/device/shuttle_curse if("Veil Shifter") pickedtype = /obj/item/device/cult_shift - if(pickedtype && Adjacent(user) && src && !qdeleted(src) && !user.incapacitated() && cooldowntime <= world.time) + if(src && !qdeleted(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time) cooldowntime = world.time + 2400 var/obj/item/N = new pickedtype(get_turf(src)) user << "You summon [N] from the archives!" diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index ecd8c75aa6e..de7f5cb0a92 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -17,6 +17,7 @@ This file contains the arcane tome files. ..() 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 a cult structure will unanchor or reanchor it." user << "Striking another cultist with it will purge holy water from them." user << "Striking a noncultist, however, will sear their flesh." @@ -154,7 +155,7 @@ This file contains the arcane tome files. text += "Juggernaut
The Juggernaut is a slow, but durable, melee attacker which can produce temporary forcewalls. It will also reflect most lethal energy weapons.

" - text += "Artificer
The Artificer is a weak and fragile construct, able to heal other constructs, produce more soulstones and construct shells, \ + text += "Artificer
The Artificer is a weak and fragile construct, able to heal other constructs, shades, or itself, 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.

" diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 44e546a9f76..fd97b4f73a8 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -24,7 +24,6 @@ To draw a rune, use an arcane tome. unacidable = 1 layer = TURF_LAYER + 0.08 color = rgb(255,0,0) - mouse_opacity = 2 var/invocation = "Aiy ele-mayo!" //This is said by cultists when the rune is invoked. var/req_cultists = 1 //The amount of cultists required around the rune to invoke it. If only 1, any cultist can invoke it. @@ -203,7 +202,7 @@ structure_check() searches for nearby cultist structures required for the invoca 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) + for(var/I in subtypesof(/obj/item/weapon/paper/talisman) - /obj/item/weapon/paper/talisman/malformed - /obj/item/weapon/paper/talisman/supply - /obj/item/weapon/paper/talisman/supply/weak) var/obj/item/weapon/paper/talisman/J = I var/talisman_cult_name = initial(J.cultist_name) if(talisman_cult_name) @@ -300,7 +299,7 @@ var/list/teleport_runes = list() fail_invoke() -//Rite of Enlightenment: Converts a normal crewmember to the cult. Faster for every cultist nearby. +//Rite of Enlightenment: Converts a normal crewmember to the cult. /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." @@ -312,21 +311,22 @@ var/list/teleport_runes = list() /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) - if(!iscultist(M) && !isloyal(M)) - convertees.Add(M) + for(var/mob/living/M in T) + if(M.stat != DEAD && !iscultist(M) && is_convertable_to_cult(M.mind)) + convertees |= M + else if(is_sacrifice_target(M.mind)) + for(var/C in invokers) + C << "\"I desire this one for myself. SACRIFICE THEM!\"" if(!convertees.len) fail_invoke() log_game("Convert rune failed - no eligible convertees") return var/mob/living/new_cultist = pick(convertees) - if(!is_convertable_to_cult(new_cultist.mind) || new_cultist.null_rod_check()) + if(new_cultist.null_rod_check()) 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") + log_game("Convert rune failed - convertee had null rod") return ..() new_cultist.visible_message("[new_cultist] writhes in pain as the markings below them glow a bloody red!", \ @@ -448,7 +448,6 @@ var/list/teleport_runes = list() 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 @@ -534,40 +533,29 @@ var/list/teleport_runes = list() var/mob/living/user = invokers[1] if(rune_in_use) return - for(var/mob/living/M in orange(1,src)) - if(M.stat == DEAD) - potential_sacrifice_mobs.Add(M) + for(var/mob/living/M in orange(1,T)) + if(M.stat == DEAD && !iscultist(M)) + potential_sacrifice_mobs |= 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 || rune_in_use) + log_game("Raise Dead rune failed - no catalyst corpses") + fail_invoke() return for(var/mob/living/M in T.contents) if(M.stat == DEAD) - potential_revive_mobs.Add(M) + potential_revive_mobs |= M 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") + log_game("Raise Dead rune failed - no corpses to revive") + fail_invoke() + return + mob_to_sacrifice = input(user, "Choose a corpse to sacrifice.", "Corpse to Sacrifice") as null|anything in potential_sacrifice_mobs + if(!src || qdeleted(src) || rune_in_use || !validness_checks(mob_to_sacrifice, user, 1)) 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() || rune_in_use) + if(!src || qdeleted(src) || rune_in_use || !validness_checks(mob_to_sacrifice, user, 1)) return - if(!in_range(mob_to_sacrifice,src)) - user << "The sacrificial target has been moved!" - fail_invoke() - log_game("Raise Dead rune failed - catalyst corpse moved") - return - if(!(mob_to_revive in T.contents)) - user << "The corpse to revive has been moved!" - fail_invoke() - log_game("Raise Dead rune failed - revival target moved") - return - if(mob_to_sacrifice.stat != DEAD) - user << "The sacrificial target must be dead!" - fail_invoke() - log_game("Raise Dead rune failed - catalyst corpse is not dead") + if(!validness_checks(mob_to_revive, user, 0)) return rune_in_use = 1 if(user.name == "Herbert West") @@ -579,19 +567,47 @@ var/list/teleport_runes = list() mob_to_revive.Beam(mob_to_sacrifice,icon_state="sendbeam",icon='icons/effects/effects.dmi',time=20) sleep(20) if(!mob_to_sacrifice || !in_range(mob_to_sacrifice, src)) - mob_to_sacrifice.visible_message("[mob_to_sacrifice] disintegrates into a pile of bones") + rune_in_use = 0 return - mob_to_sacrifice.dust() if(!mob_to_revive || mob_to_revive.stat != DEAD) visible_message("The glowing tendril snaps against the rune with a shocking crack.") rune_in_use = 0 + fail_invoke() return - mob_to_revive.revive() //This does remove disabilities and such, but the rune might actually see some use because of it! + mob_to_sacrifice.visible_message("[mob_to_sacrifice] disintegrates into a pile of bones.") + mob_to_sacrifice.dust() + mob_to_revive.revive(1, 1) //This does remove disabilities and such, but the rune might actually see some use because of it! mob_to_revive << "\"PASNAR SAVRAE YAM'TOTH. Arise.\"" mob_to_revive.visible_message("[mob_to_revive] draws in a huge breath, red light shining from their eyes.", \ "You awaken suddenly from the void. You're alive!") rune_in_use = 0 +/obj/effect/rune/raise_dead/proc/validness_checks(mob/living/target_mob, mob/living/user, saccing) + var/turf/T = get_turf(src) + if(!user) + return 0 + if(!Adjacent(user) || user.incapacitated()) + return 0 + if(!target_mob) + fail_invoke() + return 0 + if(saccing) + if(!in_range(target_mob, src)) + user << "The sacrificial target has been moved!" + fail_invoke() + log_game("Raise Dead rune failed - catalyst corpse moved") + return 0 + if(target_mob.stat != DEAD) + user << "The sacrificial target must be dead!" + fail_invoke() + log_game("Raise Dead rune failed - catalyst corpse is not dead") + return 0 + else if(!(target_mob in T.contents)) + user << "The corpse to revive has been moved!" + fail_invoke() + log_game("Raise Dead rune failed - revival target moved") + return 0 + return 1 /obj/effect/rune/raise_dead/fail_invoke() ..() @@ -783,8 +799,9 @@ var/list/teleport_runes = list() /obj/effect/rune/blood_boil/invoke(var/list/invokers) ..() + var/turf/T = get_turf(src) visible_message("[src] briefly bubbles before exploding!") - for(var/mob/living/carbon/C in viewers(src)) + for(var/mob/living/carbon/C in viewers(T)) if(!iscultist(C)) var/obj/item/weapon/nullrod/N = C.null_rod_check() if(N) @@ -797,8 +814,8 @@ var/list/teleport_runes = list() 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) + explosion(T, -1, 0, 1, 5) //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. diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm index b43ee71186c..8628b91fb87 100644 --- a/code/game/gamemodes/gang/gang.dm +++ b/code/game/gamemodes/gang/gang.dm @@ -263,8 +263,10 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple" if(gangs.len) if(!winner) world << "The station was [station_was_nuked ? "destroyed!" : "evacuated before a gang could claim it! The station wins!"]
" + feedback_set_details("round_end_result","win - gang domination complete") else world << "The [winner.name] Gang successfully performed a hostile takeover of the station!
" + feedback_set_details("round_end_result","loss - gangs failed takeover") for(var/datum/gang/G in gangs) var/text = "The [G.name] Gang was [winner==G ? "victorious" : "defeated"] with [round((G.territory.len/start_state.num_territories)*100, 1)]% control of the station!" diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm index 3e602b824e4..c5f3dfa2a70 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction.dm @@ -236,8 +236,8 @@ console.vest = V V.flags |= NODROP agent.equip_to_slot_or_del(V, slot_wear_suit) - agent.equip_to_slot_or_del(new /obj/item/weapon/abductor_baton(agent), slot_in_backpack) - agent.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/alien(agent), slot_belt) + agent.equip_to_slot_or_del(new /obj/item/weapon/abductor_baton(agent), slot_belt) + agent.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/alien(agent), slot_in_backpack) agent.equip_to_slot_or_del(new /obj/item/device/abductor/silencer(agent), slot_in_backpack) agent.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/abductor(agent), slot_head) diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index 914dfa1c9d0..989c076a27f 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -112,19 +112,11 @@ if(combat_cooldown==initial(combat_cooldown)) SSobj.processing.Remove(src) -/obj/item/device/abductor/proc/IsAbductor(user) - if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(H.dna.species.id != "abductor") - return 0 - return 1 - return 0 - /obj/item/device/abductor/proc/AbductorCheck(user) - if(IsAbductor(user)) - return 1 + if(isabductor(user)) + return TRUE user << "You can't figure how this works!" - return 0 + return FALSE /obj/item/device/abductor/proc/ScientistCheck(user) var/mob/living/carbon/human/H = user @@ -194,7 +186,7 @@ user << "This specimen is already marked!" return if(istype(target,/mob/living/carbon/human)) - if(IsAbductor(target)) + if(isabductor(target)) marked = target user << "You mark [target] for future retrieval." else @@ -304,27 +296,26 @@ break return console - -/obj/item/device/firing_pin/alien +/obj/item/device/firing_pin/abductor name = "alien firing pin" - desc = "An odd device that resembles a firing pin." - fail_message = "UNAUTHORIZED -- UNAUTHORIZED" + icon_state = "firing_pin_ayy" + desc = "This firing pin is slimy and warm; you can swear you feel it \ + constantly trying to mentally probe you." + fail_message = "\ + Firing error, please contact Command." -/obj/item/device/firing_pin/alien/pin_auth(mob/living/user) - if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(H.dna.species.id != "abductor") - return 0 - return 1 +/obj/item/device/firing_pin/abductor/pin_auth(mob/living/user) + . = isabductor(user) /obj/item/weapon/gun/energy/alien name = "alien pistol" desc = "A complicated gun that fires bursts of high-intensity radiation." ammo_type = list(/obj/item/ammo_casing/energy/declone) - pin = /obj/item/device/firing_pin/alien + pin = /obj/item/device/firing_pin/abductor icon_state = "alienpistol" item_state = "alienpistol" origin_tech = "combat=5;materials=4;powerstorage=3;abductor=3" + trigger_guard = TRIGGER_GUARD_ALLOW_ALL /obj/item/weapon/paper/abductor name = "Dissection Guide" @@ -402,16 +393,8 @@ Congratulations! You are now trained for xenobiology research!"} icon_state = "wonderprodProbe" item_state = "wonderprodProbe" -/obj/item/weapon/abductor_baton/proc/IsAbductor(mob/living/user) - if(!ishuman(user)) - return 0 - var/mob/living/carbon/human/H = user - if(H.dna.species.id != "abductor") - return 0 - return 1 - /obj/item/weapon/abductor_baton/attack(mob/target, mob/living/user) - if(!IsAbductor(user)) + if(!isabductor(user)) return if(isrobot(target)) @@ -689,4 +672,4 @@ Congratulations! You are now trained for xenobiology research!"} else if(istype(W, /obj/item/stack/sheet)) return // no material modding else - ..() \ No newline at end of file + ..() diff --git a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm index 2a69da0950a..9c06517bd95 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm @@ -45,15 +45,12 @@ set_droppoint_action.target = console set_droppoint_action.Grant(user) -/obj/machinery/computer/camera_advanced/abductor/proc/IsAbductor(mob/living/carbon/human/H) - return H.dna.species.id == "abductor" - /obj/machinery/computer/camera_advanced/abductor/proc/IsScientist(mob/living/carbon/human/H) var/datum/species/abductor/S = H.dna.species return S.scientist /obj/machinery/computer/camera_advanced/abductor/attack_hand(mob/user) - if(!iscarbon(user) || !IsAbductor(user)) + if(!isabductor(user)) return return ..() @@ -154,4 +151,4 @@ var/mob/camera/aiEye/remote/remote_eye = C.remote_control var/obj/machinery/abductor/console/console = target - console.SetDroppoint(remote_eye.loc,owner) \ No newline at end of file + console.SetDroppoint(remote_eye.loc,owner) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/console.dm b/code/game/gamemodes/miniantags/abduction/machinery/console.dm index a2f029725a3..de3a3b468ea 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/console.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/console.dm @@ -3,9 +3,6 @@ /obj/machinery/abductor var/team = 0 -/obj/machinery/abductor/proc/IsAbductor(mob/living/carbon/human/H) - return H.dna.species.id == "abductor" - /obj/machinery/abductor/proc/IsAgent(mob/living/carbon/human/H) if(H.dna.species.id == "abductor") var/datum/species/abductor/S = H.dna.species @@ -37,7 +34,7 @@ /obj/machinery/abductor/console/attack_hand(mob/user) if(..()) return - if(!IsAbductor(user)) + if(!isabductor(user)) user << "You start mashing alien buttons at random!" if(do_after(user,100, target = src)) TeleporterSend() @@ -208,4 +205,4 @@ new item(src.loc) else say("Insufficent data!") - return \ No newline at end of file + return diff --git a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm index dc1a5ec85f7..09f63616766 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm @@ -25,7 +25,7 @@ /obj/machinery/abductor/gland_dispenser/attack_hand(mob/user) if(..()) return - if(!IsAbductor(user)) + if(!isabductor(user)) return user.set_machine(src) var/box_css = {" @@ -82,4 +82,4 @@ if(amounts[count]>0) amounts[count]-- var/T = gland_types[count] - new T(get_turf(src)) \ No newline at end of file + new T(get_turf(src)) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm index 19fbe24f92d..7b32758a6dd 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm @@ -15,7 +15,7 @@ /obj/machinery/abductor/experiment/MouseDrop_T(mob/target, mob/user) if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user) || !ishuman(target)) return - if(IsAbductor(target)) + if(isabductor(target)) return close_machine(target) @@ -30,8 +30,8 @@ ..() /obj/machinery/abductor/experiment/close_machine(mob/target) - for(var/mob/living/carbon/C in loc) - if(IsAbductor(C)) + for(var/A in loc) + if(isabductor(A)) return if(state_open && !panel_open) ..(target) diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index 9ea427013e0..5ef9970bb3c 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -254,10 +254,10 @@ Made by Xhuis name = "Shadowling" id = "shadowling" say_mod = "chitters" - specflags = list(NOBREATH,NOBLOOD,RADIMMUNE,NOGUNS) //Can't use guns due to muzzle flash + specflags = list(NOBREATH,NOBLOOD,RADIMMUNE,NOGUNS,NODISMEMBER) //Can't use guns due to muzzle flash burnmod = 1.5 //1.5x burn damage, 2x is excessive heatmod = 1.5 - has_dismemberment = 0 + /datum/species/shadow/ling/spec_life(mob/living/carbon/human/H) if(!H.weakeyes) H.weakeyes = 1 //Makes them more vulnerable to flashes and flashbangs diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 4014ad407ec..a26857fd63b 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -133,6 +133,9 @@ busy = 0 return 1 + if(O.flags & HOLOGRAM) + return 1 + var/material_amount = materials.get_item_material_amount(O) if(!material_amount) user << "This object does not contain sufficient amounts of metal or glass to be accepted by the autolathe." diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 253a3c1c8d7..7f80531c354 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -1,1115 +1,1111 @@ -/obj/machinery/computer/arcade/ - name = "random arcade" - desc = "random arcade machine" - icon_state = "arcade" - icon_keyboard = null - icon_screen = "invaders" - var/list/prizes = list( /obj/item/weapon/storage/box/snappops = 2, - /obj/item/toy/AI = 2, - /obj/item/toy/codex_gigas = 2, - /obj/item/clothing/under/syndicate/tacticool = 2, - /obj/item/toy/sword = 2, - /obj/item/toy/gun = 2, - /obj/item/weapon/gun/projectile/shotgun/toy/crossbow = 2, - /obj/item/weapon/storage/box/fakesyndiesuit = 2, - /obj/item/weapon/storage/crayons = 2, - /obj/item/toy/spinningtoy = 2, - /obj/item/toy/prize/ripley = 1, - /obj/item/toy/prize/fireripley = 1, - /obj/item/toy/prize/deathripley = 1, - /obj/item/toy/prize/gygax = 1, - /obj/item/toy/prize/durand = 1, - /obj/item/toy/prize/honk = 1, - /obj/item/toy/prize/marauder = 1, - /obj/item/toy/prize/seraph = 1, - /obj/item/toy/prize/mauler = 1, - /obj/item/toy/prize/odysseus = 1, - /obj/item/toy/prize/phazon = 1, - /obj/item/toy/prize/reticence = 1, - /obj/item/toy/cards/deck = 2, - /obj/item/toy/nuke = 2, - /obj/item/toy/minimeteor = 2, - /obj/item/toy/carpplushie = 2, - /obj/item/toy/foamblade = 2, - /obj/item/toy/redbutton = 2, - /obj/item/toy/talking/owl = 2, - /obj/item/toy/talking/griffin = 2, - /obj/item/weapon/coin/antagtoken = 2, - /obj/item/stack/tile/fakespace/loaded = 2, - /obj/item/toy/toy_xeno = 2, - /obj/item/weapon/restraints/handcuffs/fake = 2 - ) - -/obj/machinery/computer/arcade/New() - ..() - // If it's a generic arcade machine, pick a random arcade - // circuit board for it and make the new machine - if(!circuit) - var/choice = pick(subtypesof(/obj/item/weapon/circuitboard/computer/arcade)) - var/obj/item/weapon/circuitboard/CB = new choice() - new CB.build_path(loc, CB) - qdel(src) - -/obj/machinery/computer/arcade/proc/prizevend() - if(prob(0.0001)) //1 in a million - new /obj/item/weapon/gun/energy/pulse(src) - - if(!contents.len) - var/prizeselect = pickweight(prizes) - new prizeselect(src.loc) - - if(istype(prizeselect, /obj/item/toy/gun)) //Ammo comes with the gun - new /obj/item/toy/ammo/gun(src.loc) - - else if(istype(prizeselect, /obj/item/clothing/suit/syndicatefake)) //Helmet is part of the suit - new /obj/item/clothing/head/syndicatefake(src.loc) - - else - var/atom/movable/prize = pick(contents) - prize.loc = src.loc - -/obj/machinery/computer/arcade/emp_act(severity) - ..(severity) - - if(stat & (NOPOWER|BROKEN)) - return - - var/empprize = null - var/num_of_prizes = 0 - switch(severity) - if(1) - num_of_prizes = rand(1,4) - if(2) - num_of_prizes = rand(0,2) - for(var/i = num_of_prizes; i > 0; i--) - empprize = pickweight(prizes) - new empprize(src.loc) - explosion(src.loc, -1, 0, 1+num_of_prizes, flame_range = 1+num_of_prizes) - - -// ** BATTLE ** // - - -/obj/machinery/computer/arcade/battle - name = "arcade machine" - desc = "Does not support Pinball." - icon_state = "arcade" - circuit = /obj/item/weapon/circuitboard/computer/arcade/battle - var/enemy_name = "Space Villian" - var/temp = "Winners don't use space drugs" //Temporary message, for attack messages, etc - var/player_hp = 30 //Player health/attack points - var/player_mp = 10 - var/enemy_hp = 45 //Enemy health/attack points - var/enemy_mp = 20 - var/gameover = 0 - var/blocked = 0 //Player cannot attack/heal while set - var/turtle = 0 - -/obj/machinery/computer/arcade/battle/New() - ..() - var/name_action - var/name_part1 - var/name_part2 - - name_action = pick("Defeat ", "Annihilate ", "Save ", "Strike ", "Stop ", "Destroy ", "Robust ", "Romance ", "Pwn ", "Own ", "Ban ") - - name_part1 = pick("the Automatic ", "Farmer ", "Lord ", "Professor ", "the Cuban ", "the Evil ", "the Dread King ", "the Space ", "Lord ", "the Great ", "Duke ", "General ") - name_part2 = pick("Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Ectoplasm", "Crushulon", "Uhangoid", "Vhakoid", "Peteoid", "slime", "Griefer", "ERPer", "Lizard Man", "Unicorn", "Bloopers") - - src.enemy_name = replacetext((name_part1 + name_part2), "the ", "") - src.name = (name_action + name_part1 + name_part2) - -/obj/machinery/computer/arcade/battle/attack_hand(mob/user) - if(..()) - return - user.set_machine(src) - var/dat = "Close" - dat += "

[src.enemy_name]

" - - dat += "

[src.temp]

" - dat += "
Health: [src.player_hp] | Magic: [src.player_mp] | Enemy Health: [src.enemy_hp]
" - - if (src.gameover) - dat += "
New Game" - else - dat += "
Attack | " - dat += "Heal | " - dat += "Recharge Power" - - dat += "
" - - //user << browse(dat, "window=arcade") - //onclose(user, "arcade") - var/datum/browser/popup = new(user, "arcade", "Space Villian 2000") - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - return - -/obj/machinery/computer/arcade/battle/Topic(href, href_list) - if(..()) - return - - if (!src.blocked && !src.gameover) - if (href_list["attack"]) - src.blocked = 1 - var/attackamt = rand(2,6) - src.temp = "You attack for [attackamt] damage!" - playsound(src.loc, 'sound/arcade/Hit.ogg', 50, 1, extrarange = -3, falloff = 10) - src.updateUsrDialog() - if(turtle > 0) - turtle-- - - sleep(10) - src.enemy_hp -= attackamt - src.arcade_action() - - else if (href_list["heal"]) - src.blocked = 1 - var/pointamt = rand(1,3) - var/healamt = rand(6,8) - src.temp = "You use [pointamt] magic to heal for [healamt] damage!" - playsound(src.loc, 'sound/arcade/Heal.ogg', 50, 1, extrarange = -3, falloff = 10) - src.updateUsrDialog() - turtle++ - - sleep(10) - src.player_mp -= pointamt - src.player_hp += healamt - src.blocked = 1 - src.updateUsrDialog() - src.arcade_action() - - else if (href_list["charge"]) - src.blocked = 1 - var/chargeamt = rand(4,7) - src.temp = "You regain [chargeamt] points" - playsound(src.loc, 'sound/arcade/Mana.ogg', 50, 1, extrarange = -3, falloff = 10) - src.player_mp += chargeamt - if(turtle > 0) - turtle-- - - src.updateUsrDialog() - sleep(10) - src.arcade_action() - - if (href_list["close"]) - usr.unset_machine() - usr << browse(null, "window=arcade") - - else if (href_list["newgame"]) //Reset everything - temp = "New Round" - player_hp = 30 - player_mp = 10 - enemy_hp = 45 - enemy_mp = 20 - gameover = 0 - turtle = 0 - - if(emagged) - src.New() - emagged = 0 - - src.add_fingerprint(usr) - src.updateUsrDialog() - return - -/obj/machinery/computer/arcade/battle/proc/arcade_action() - if ((src.enemy_mp <= 0) || (src.enemy_hp <= 0)) - if(!gameover) - src.gameover = 1 - src.temp = "[src.enemy_name] has fallen! Rejoice!" - playsound(src.loc, 'sound/arcade/Win.ogg', 50, 1, extrarange = -3, falloff = 10) - - if(emagged) - feedback_inc("arcade_win_emagged") - new /obj/effect/spawner/newbomb/timer/syndicate(src.loc) - new /obj/item/clothing/head/collectable/petehat(src.loc) - message_admins("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.") - log_game("[key_name(usr)] has outbombed Cuban Pete and been awarded a bomb.") - src.New() - emagged = 0 - else - feedback_inc("arcade_win_normal") - prizevend() - - else if (emagged && (turtle >= 4)) - var/boomamt = rand(5,10) - src.temp = "[src.enemy_name] throws a bomb, exploding you for [boomamt] damage!" - playsound(src.loc, 'sound/arcade/Boom.ogg', 50, 1, extrarange = -3, falloff = 10) - src.player_hp -= boomamt - - else if ((src.enemy_mp <= 5) && (prob(70))) - var/stealamt = rand(2,3) - src.temp = "[src.enemy_name] steals [stealamt] of your power!" - playsound(src.loc, 'sound/arcade/Steal.ogg', 50, 1, extrarange = -3, falloff = 10) - src.player_mp -= stealamt - src.updateUsrDialog() - - if (src.player_mp <= 0) - src.gameover = 1 - sleep(10) - src.temp = "You have been drained! GAME OVER" - playsound(src.loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -3, falloff = 10) - if(emagged) - feedback_inc("arcade_loss_mana_emagged") - usr.gib() - else - feedback_inc("arcade_loss_mana_normal") - - else if ((src.enemy_hp <= 10) && (src.enemy_mp > 4)) - src.temp = "[src.enemy_name] heals for 4 health!" - playsound(src.loc, 'sound/arcade/Heal.ogg', 50, 1, extrarange = -3, falloff = 10) - src.enemy_hp += 4 - src.enemy_mp -= 4 - - else - var/attackamt = rand(3,6) - src.temp = "[src.enemy_name] attacks for [attackamt] damage!" - playsound(src.loc, 'sound/arcade/Hit.ogg', 50, 1, extrarange = -3, falloff = 10) - src.player_hp -= attackamt - - if ((src.player_mp <= 0) || (src.player_hp <= 0)) - src.gameover = 1 - src.temp = "You have been crushed! GAME OVER" - playsound(src.loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -3, falloff = 10) - if(emagged) - feedback_inc("arcade_loss_hp_emagged") - usr.gib() - else - feedback_inc("arcade_loss_hp_normal") - - src.blocked = 0 - return - - -/obj/machinery/computer/arcade/battle/emag_act(mob/user) - if(!emagged) - temp = "If you die in the game, you die for real!" - player_hp = 30 - player_mp = 10 - enemy_hp = 45 - enemy_mp = 20 - gameover = 0 - blocked = 0 - - emagged = 1 - - enemy_name = "Cuban Pete" - name = "Outbomb Cuban Pete" - - - src.updateUsrDialog() - - - -// *** THE ORION TRAIL ** // - -#define ORION_TRAIL_WINTURN 9 - -//Orion Trail Events -#define ORION_TRAIL_RAIDERS "Raiders" -#define ORION_TRAIL_FLUX "Interstellar Flux" -#define ORION_TRAIL_ILLNESS "Illness" -#define ORION_TRAIL_BREAKDOWN "Breakdown" -#define ORION_TRAIL_LING "Changelings?" -#define ORION_TRAIL_LING_ATTACK "Changeling Ambush" -#define ORION_TRAIL_MALFUNCTION "Malfunction" -#define ORION_TRAIL_COLLISION "Collision" -#define ORION_TRAIL_SPACEPORT "Spaceport" -#define ORION_TRAIL_BLACKHOLE "BlackHole" - -#define ORION_STATUS_START 1 -#define ORION_STATUS_NORMAL 2 -#define ORION_STATUS_GAMEOVER 3 -#define ORION_STATUS_MARKET 4 - -/obj/machinery/computer/arcade/orion_trail - name = "The Orion Trail" - desc = "Learn how our ancestors got to Orion, and have fun in the process!" - icon_state = "arcade" - circuit = /obj/item/weapon/circuitboard/computer/arcade/orion_trail - var/busy = 0 //prevent clickspam that allowed people to ~speedrun~ the game. - var/engine = 0 - var/hull = 0 - var/electronics = 0 - var/food = 80 - var/fuel = 60 - var/turns = 4 - var/alive = 4 - var/eventdat = null - var/event = null - var/list/settlers = list("Harry","Larry","Bob") - var/list/events = list(ORION_TRAIL_RAIDERS = 3, - ORION_TRAIL_FLUX = 1, - ORION_TRAIL_ILLNESS = 3, - ORION_TRAIL_BREAKDOWN = 2, - ORION_TRAIL_LING = 3, - ORION_TRAIL_MALFUNCTION = 2, - ORION_TRAIL_COLLISION = 1, - ORION_TRAIL_SPACEPORT = 2 - ) - var/list/stops = list() - var/list/stopblurbs = list() - var/lings_aboard = 0 - var/spaceport_raided = 0 - var/spaceport_freebie = 0 - var/last_spaceport_action = "" - var/gameStatus = ORION_STATUS_START - var/canContinueEvent = 0 - -/obj/machinery/computer/arcade/orion_trail/New() - ..() - // Sets up the main trail - stops = list("Pluto","Asteroid Belt","Proxima Centauri","Dead Space","Rigel Prime","Tau Ceti Beta","Black Hole","Space Outpost Beta-9","Orion Prime") - stopblurbs = list( - "Pluto, long since occupied with long-range sensors and scanners, stands ready to, and indeed continues to probe the far reaches of the galaxy.", - "At the edge of the Sol system lies a treacherous asteroid belt. Many have been crushed by stray asteroids and misguided judgement.", - "The nearest star system to Sol, in ages past it stood as a reminder of the boundaries of sub-light travel, now a low-population sanctuary for adventurers and traders.", - "This region of space is particularly devoid of matter. Such low-density pockets are known to exist, but the vastness of it is astounding.", - "Rigel Prime, the center of the Rigel system, burns hot, basking its planetary bodies in warmth and radiation.", - "Tau Ceti Beta has recently become a waypoint for colonists headed towards Orion. There are many ships and makeshift stations in the vicinity.", - "Sensors indicate that a black hole's gravitational field is affecting the region of space we were headed through. We could stay of course, but risk of being overcome by its gravity, or we could change course to go around, which will take longer.", - "You have come into range of the first man-made structure in this region of space. It has been constructed not by travellers from Sol, but by colonists from Orion. It stands as a monument to the colonists' success.", - "You have made it to Orion! Congratulations! Your crew is one of the few to start a new foothold for mankind!" - ) - -/obj/machinery/computer/arcade/orion_trail/proc/newgame() - // Set names of settlers in crew - settlers = list() - for(var/i = 1; i <= 3; i++) - add_crewmember() - add_crewmember("[usr]") - // Re-set items to defaults - engine = 1 - hull = 1 - electronics = 1 - food = 80 - fuel = 60 - alive = 4 - turns = 1 - event = null - gameStatus = ORION_STATUS_NORMAL - lings_aboard = 0 - - //spaceport junk - spaceport_raided = 0 - spaceport_freebie = 0 - last_spaceport_action = "" - -/obj/machinery/computer/arcade/orion_trail/attack_hand(mob/user) - if(..()) - return - if(fuel <= 0 || food <=0 || settlers.len == 0) - gameStatus = ORION_STATUS_GAMEOVER - event = null - user.set_machine(src) - var/dat = "" - if(gameStatus == ORION_STATUS_GAMEOVER) - dat = "

Game Over

" - dat += "Like many before you, your crew never made it to Orion, lost to space...
Forever." - if(settlers.len == 0) - dat += "
Your entire crew died, your ship joins the fleet of ghost-ships littering the galaxy." - else - if(food <= 0) - dat += "
You ran out of food and starved." - if(emagged) - user.nutrition = 0 //yeah you pretty hongry - user << "Your body instantly contracts to that of one who has not eaten in months. Agonizing cramps seize you as you fall to the floor." - if(fuel <= 0) - dat += "
You ran out of fuel, and drift, slowly, into a star." - if(emagged) - var/mob/living/M = user - M.adjust_fire_stacks(5) - M.IgniteMob() //flew into a star, so you're on fire - user << "You feel an immense wave of heat emanate from the arcade machine. Your skin bursts into flames." - dat += "

OK...

" - - if(emagged) - user << "You're never going to make it to Orion..." - user.death() - emagged = 0 //removes the emagged status after you lose - gameStatus = ORION_STATUS_START - name = "The Orion Trail" - desc = "Learn how our ancestors got to Orion, and have fun in the process!" - - else if(event) - dat = eventdat - else if(gameStatus == ORION_STATUS_NORMAL) - var/title = stops[turns] - var/subtext = stopblurbs[turns] - dat = "

[title]

" - dat += "[subtext]" - dat += "

Crew:

" - dat += english_list(settlers) - dat += "
Food: [food] | Fuel: [fuel]" - dat += "
Engine Parts: [engine] | Hull Panels: [hull] | Electronics: [electronics]" - if(turns == 7) - dat += "

Go Around Continue

" - else - dat += "

Continue

" - dat += "

Kill a crewmember

" - dat += "

Close

" - else - dat = "

The Orion Trail

" - dat += "

Experience the journey of your ancestors!



" - dat += "
New Game
" - dat += "

Close

" - var/datum/browser/popup = new(user, "arcade", "The Orion Trail",400,700) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - return - -/obj/machinery/computer/arcade/orion_trail/Topic(href, href_list) - if(..()) - return - if(href_list["close"]) - usr.unset_machine() - usr << browse(null, "window=arcade") - - if(busy) - return - busy = 1 - - if (href_list["continue"]) //Continue your travels - if(gameStatus == ORION_STATUS_NORMAL && !event && turns != 7) - if(turns >= ORION_TRAIL_WINTURN) - win() - else - food -= (alive+lings_aboard)*2 - fuel -= 5 - if(turns == 2 && prob(30)) - event = ORION_TRAIL_COLLISION - event() - else if(prob(75)) - event = pickweight(events) - if(lings_aboard) - if(event == ORION_TRAIL_LING || prob(55)) - event = ORION_TRAIL_LING_ATTACK - event() - turns += 1 - if(emagged) - var/mob/living/carbon/M = usr //for some vars - switch(event) - if(ORION_TRAIL_RAIDERS) - if(prob(50)) - usr << "You hear battle shouts. The tramping of boots on cold metal. Screams of agony. The rush of venting air. Are you going insane?" - M.hallucination += 30 - else - usr << "Something strikes you from behind! It hurts like hell and feel like a blunt weapon, but nothing is there..." - M.take_organ_damage(30) - playsound(loc, 'sound/weapons/genhit2.ogg', 100, 1) - if(ORION_TRAIL_ILLNESS) - var/severity = rand(1,3) //pray to RNGesus. PRAY, PIGS - if(severity == 1) - M << "You suddenly feel slightly nauseous." //got off lucky - if(severity == 2) - usr << "You suddenly feel extremely nauseous and hunch over until it passes." - M.Stun(3) - if(severity >= 3) //you didn't pray hard enough - M << "An overpowering wave of nausea consumes over you. You hunch over, your stomach's contents preparing for a spectacular exit." - M.Stun(5) - sleep(30) - M.vomit(50) - if(ORION_TRAIL_FLUX) - if(prob(75)) - M.Weaken(3) - say("A sudden gust of powerful wind slams [M] into the floor!") - M.take_organ_damage(25) - playsound(src.loc, 'sound/weapons/Genhit.ogg', 100, 1) - else - M << "A violent gale blows past you, and you barely manage to stay standing!" - if(ORION_TRAIL_COLLISION) //by far the most damaging event - if(prob(90)) - playsound(src.loc, 'sound/effects/bang.ogg', 100, 1) - var/turf/open/floor/F - for(F in orange(1, src)) - F.ChangeTurf(F.baseturf) - say("Something slams into the floor around [src], exposing it to space!") - if(hull) - sleep(10) - say("A new floor suddenly appears around [src]. What the hell?") - playsound(src.loc, 'sound/weapons/Genhit.ogg', 100, 1) - var/turf/open/space/T - for(T in orange(1, src)) - T.ChangeTurf(/turf/open/floor/plating/) - else - say("Something slams into the floor around [src] - luckily, it didn't get through!") - playsound(src.loc, 'sound/effects/bang.ogg', 50, 1) - if(ORION_TRAIL_MALFUNCTION) - playsound(src.loc, 'sound/effects/EMPulse.ogg', 50, 1) - src.visible_message("[src] malfunctions, randomizing in-game stats!") - var/oldfood = food - var/oldfuel = fuel - food = rand(10,80) / rand(1,2) - fuel = rand(10,60) / rand(1,2) - if(electronics) - sleep(10) - if(oldfuel > fuel && oldfood > food) - src.audible_message("[src] lets out a somehow reassuring chime.") - else if(oldfuel < fuel || oldfood < food) - src.audible_message("[src] lets out a somehow ominous chime.") - food = oldfood - fuel = oldfuel - playsound(src.loc, 'sound/machines/chime.ogg', 50, 1) - - else if(href_list["newgame"]) //Reset everything - if(gameStatus == ORION_STATUS_START) - newgame() - else if(href_list["menu"]) //back to the main menu - if(gameStatus == ORION_STATUS_GAMEOVER) - gameStatus = ORION_STATUS_START - event = null - food = 80 - fuel = 60 - settlers = list("Harry","Larry","Bob") - else if(href_list["slow"]) //slow down - if(event == ORION_TRAIL_FLUX) - food -= (alive+lings_aboard)*2 - fuel -= 5 - event = null - else if(href_list["pastblack"]) //slow down - if(turns == 7) - food -= ((alive+lings_aboard)*2)*3 - fuel -= 15 - turns += 1 - event = null - else if(href_list["useengine"]) //use parts - if(event == ORION_TRAIL_BREAKDOWN) - engine = max(0, --engine) - event = null - else if(href_list["useelec"]) //use parts - if(event == ORION_TRAIL_MALFUNCTION) - electronics = max(0, --electronics) - event = null - else if(href_list["usehull"]) //use parts - if(event == ORION_TRAIL_COLLISION) - hull = max(0, --hull) - event = null - else if(href_list["wait"]) //wait 3 days - if(event == ORION_TRAIL_BREAKDOWN || event == ORION_TRAIL_MALFUNCTION || event == ORION_TRAIL_COLLISION) - food -= ((alive+lings_aboard)*2)*3 - event = null - else if(href_list["keepspeed"]) //keep speed - if(event == ORION_TRAIL_FLUX) - if(prob(75)) - event = "Breakdown" - event() - else - event = null - else if(href_list["blackhole"]) //keep speed past a black hole - if(turns == 7) - if(prob(75)) - event = ORION_TRAIL_BLACKHOLE - event() - if(emagged) //has to be here because otherwise it doesn't work - playsound(src.loc, 'sound/effects/supermatter.ogg', 100, 1) - say("A miniature black hole suddenly appears in front of [src], devouring [usr] alive!") - usr.Stun(10) //you can't run :^) - var/S = new /obj/singularity/academy(usr.loc) - emagged = 0 //immediately removes emagged status so people can't kill themselves by sprinting up and interacting - sleep(50) - say("[S] winks out, just as suddenly as it appeared.") - qdel(S) - else - event = null - turns += 1 - else if(href_list["holedeath"]) - if(event == ORION_TRAIL_BLACKHOLE) - gameStatus = ORION_STATUS_GAMEOVER - event = null - else if(href_list["eventclose"]) //end an event - if(canContinueEvent) - event = null - - else if(href_list["killcrew"]) //shoot a crewmember - if(gameStatus == ORION_STATUS_NORMAL || event == ORION_TRAIL_LING) - var/sheriff = remove_crewmember() //I shot the sheriff - playsound(loc,'sound/weapons/Gunshot.ogg', 100, 1) - - if(settlers.len == 0 || alive == 0) - say("The last crewmember [sheriff], shot themselves, GAME OVER!") - if(emagged) - usr.death(0) - emagged = 0 - gameStatus = ORION_STATUS_GAMEOVER - event = null - else if(emagged) - if(usr.name == sheriff) - say("The crew of the ship chose to kill [usr.name]!") - usr.death(0) - - if(event == ORION_TRAIL_LING) //only ends the ORION_TRAIL_LING event, since you can do this action in multiple places - event = null - - //Spaceport specific interactions - //they get a header because most of them don't reset event (because it's a shop, you leave when you want to) - //they also call event() again, to regen the eventdata, which is kind of odd but necessary - else if(href_list["buycrew"]) //buy a crewmember - if(gameStatus == ORION_STATUS_MARKET) - if(!spaceport_raided && food >= 10 && fuel >= 10) - var/bought = add_crewmember() - last_spaceport_action = "You hired [bought] as a new crewmember." - fuel -= 10 - food -= 10 - event() - - else if(href_list["sellcrew"]) //sell a crewmember - if(gameStatus == ORION_STATUS_MARKET) - if(!spaceport_raided && settlers.len > 1) - var/sold = remove_crewmember() - last_spaceport_action = "You sold your crewmember, [sold]!" - fuel += 7 - food += 7 - event() - - else if(href_list["leave_spaceport"]) - if(gameStatus == ORION_STATUS_MARKET) - event = null - gameStatus = ORION_STATUS_NORMAL - spaceport_raided = 0 - spaceport_freebie = 0 - last_spaceport_action = "" - - else if(href_list["raid_spaceport"]) - if(gameStatus == ORION_STATUS_MARKET) - if(!spaceport_raided) - var/success = min(15 * alive,100) //default crew (4) have a 60% chance - spaceport_raided = 1 - - var/FU = 0 - var/FO = 0 - if(prob(success)) - FU = rand(5,15) - FO = rand(5,15) - last_spaceport_action = "You successfully raided the spaceport! you gained [FU] Fuel and [FO] Food! (+[FU]FU,+[FO]FO)" - else - FU = rand(-5,-15) - FO = rand(-5,-15) - last_spaceport_action = "You failed to raid the spaceport! you lost [FU*-1] Fuel and [FO*-1] Food in your scramble to escape! ([FU]FU,[FO]FO)" - - //your chance of lose a crewmember is 1/2 your chance of success - //this makes higher % failures hurt more, don't get cocky space cowboy! - if(prob(success*5)) - var/lost_crew = remove_crewmember() - last_spaceport_action = "You failed to raid the spaceport! you lost [FU*-1] Fuel and [FO*-1] Food, AND [lost_crew] in your scramble to escape! ([FU]FI,[FO]FO,-Crew)" - if(emagged) - say("WEEWOO WEEWOO, Spaceport Security en route!") - for(var/i, i<=3, i++) - var/mob/living/simple_animal/hostile/syndicate/ranged/orion/O = new/mob/living/simple_animal/hostile/syndicate/ranged/orion(get_turf(src)) - O.target = usr - - - fuel += FU - food += FO - event() - - else if(href_list["buyparts"]) - if(gameStatus == ORION_STATUS_MARKET) - if(!spaceport_raided && fuel > 5) - switch(text2num(href_list["buyparts"])) - if(1) //Engine Parts - engine++ - last_spaceport_action = "Bought Engine Parts" - if(2) //Hull Plates - hull++ - last_spaceport_action = "Bought Hull Plates" - if(3) //Spare Electronics - electronics++ - last_spaceport_action = "Bought Spare Electronics" - fuel -= 5 //they all cost 5 - event() - - else if(href_list["trade"]) - if(gameStatus == ORION_STATUS_MARKET) - if(!spaceport_raided) - switch(text2num(href_list["trade"])) - if(1) //Fuel - if(fuel > 5) - fuel -= 5 - food += 5 - last_spaceport_action = "Traded Fuel for Food" - event() - if(2) //Food - if(food > 5) - fuel += 5 - food -= 5 - last_spaceport_action = "Traded Food for Fuel" - event() - - src.add_fingerprint(usr) - src.updateUsrDialog() - busy = 0 - return - - -/obj/machinery/computer/arcade/orion_trail/proc/event() - eventdat = "

[event]

" - canContinueEvent = 0 - switch(event) - if(ORION_TRAIL_RAIDERS) - eventdat += "Raiders have come aboard your ship!" - if(prob(50)) - var/sfood = rand(1,10) - var/sfuel = rand(1,10) - food -= sfood - fuel -= sfuel - eventdat += "
They have stolen [sfood] Food and [sfuel] Fuel." - else if(prob(10)) - var/deadname = remove_crewmember() - eventdat += "
[deadname] tried to fight back but was killed." - else - eventdat += "
Fortunately you fended them off without any trouble." - eventdat += "

Continue

" - eventdat += "

Close

" - canContinueEvent = 1 - - if(ORION_TRAIL_FLUX) - eventdat += "This region of space is highly turbulent.
If we go slowly we may avoid more damage, but if we keep our speed we won't waste supplies." - eventdat += "
What will you do?" - eventdat += "

Slow Down Continue

" - eventdat += "

Close

" - - if(ORION_TRAIL_ILLNESS) - eventdat += "A deadly illness has been contracted!" - var/deadname = remove_crewmember() - eventdat += "
[deadname] was killed by the disease." - eventdat += "

Continue

" - eventdat += "

Close

" - canContinueEvent = 1 - - if(ORION_TRAIL_BREAKDOWN) - eventdat += "Oh no! The engine has broken down!" - eventdat += "
You can repair it with an engine part, or you can make repairs for 3 days." - if(engine >= 1) - eventdat += "

Use PartWait

" - else - eventdat += "

Wait

" - eventdat += "

Close

" - - if(ORION_TRAIL_MALFUNCTION) - eventdat += "The ship's systems are malfunctioning!" - eventdat += "
You can replace the broken electronics with spares, or you can spend 3 days troubleshooting the AI." - if(electronics >= 1) - eventdat += "

Use PartWait

" - else - eventdat += "

Wait

" - eventdat += "

Close

" - - if(ORION_TRAIL_COLLISION) - eventdat += "Something hit us! Looks like there's some hull damage." - if(prob(25)) - var/sfood = rand(5,15) - var/sfuel = rand(5,15) - food -= sfood - fuel -= sfuel - eventdat += "
[sfood] Food and [sfuel] Fuel was vented out into space." - if(prob(10)) - var/deadname = remove_crewmember() - eventdat += "
[deadname] was killed by rapid depressurization." - eventdat += "
You can repair the damage with hull plates, or you can spend the next 3 days welding scrap together." - if(hull >= 1) - eventdat += "

Use PartWait

" - else - eventdat += "

Wait

" - eventdat += "

Close

" - - if(ORION_TRAIL_BLACKHOLE) - eventdat += "You were swept away into the black hole." - eventdat += "

Oh...

" - eventdat += "

Close

" - settlers = list() - - if(ORION_TRAIL_LING) - eventdat += "Strange reports warn of changelings infiltrating crews on trips to Orion..." - if(settlers.len <= 2) - eventdat += "
Your crew's chance of reaching Orion is so slim the changelings likely avoided your ship..." - eventdat += "

Continue

" - eventdat += "

Close

" - if(prob(10)) // "likely", I didn't say it was guaranteed! - lings_aboard = min(++lings_aboard,2) - else - if(lings_aboard) //less likely to stack lings - if(prob(20)) - lings_aboard = min(++lings_aboard,2) - else if(prob(70)) - lings_aboard = min(++lings_aboard,2) - - eventdat += "

Kill a crewmember

" - eventdat += "

Risk it

" - eventdat += "

Close

" - canContinueEvent = 1 - - if(ORION_TRAIL_LING_ATTACK) - if(lings_aboard <= 0) //shouldn't trigger, but hey. - eventdat += "Haha, fooled you, there are no changelings on board!" - eventdat += "
(You should report this to a coder :S)" - else - var/ling1 = remove_crewmember() - var/ling2 = "" - if(lings_aboard >= 2) - ling2 = remove_crewmember() - - eventdat += "Oh no, some of your crew are Changelings!" - if(ling2) - eventdat += "
[ling1] and [ling2]'s arms twist and contort into grotesque blades!" - else - eventdat += "
[ling1]'s arm twists and contorts into a grotesque blade!" - - var/chance2attack = alive*20 - if(prob(chance2attack)) - var/chancetokill = 30*lings_aboard-(5*alive) //eg: 30*2-(10) = 50%, 2 lings, 2 crew is 50% chance - if(prob(chancetokill)) - var/deadguy = remove_crewmember() - eventdat += "
The Changeling[ling2 ? "s":""] run[ling2 ? "":"s"] up to [deadguy] and capitulates them!" - else - eventdat += "
You valiantly fight off the Changeling[ling2 ? "s":""]!" - eventdat += "
You cut the Changeling[ling2 ? "s":""] up into meat... Eww" - if(ling2) - food += 30 - lings_aboard = max(0,lings_aboard-2) - else - food += 15 - lings_aboard = max(0,--lings_aboard) - else - eventdat += "
The Changeling[ling2 ? "s":""] run[ling2 ? "":"s"] away, What wimps!" - if(ling2) - lings_aboard = max(0,lings_aboard-2) - else - lings_aboard = max(0,--lings_aboard) - - eventdat += "

Continue

" - eventdat += "

Close

" - canContinueEvent = 1 - - - if(ORION_TRAIL_SPACEPORT) - gameStatus = ORION_STATUS_MARKET - if(spaceport_raided) - eventdat += "The Spaceport is on high alert! they wont let you dock since you tried to attack them!" - if(last_spaceport_action) - eventdat += "
Last Spaceport Action: [last_spaceport_action]" - eventdat += "

Depart Spaceport

" - eventdat += "

Close

" - else - eventdat += "You pull the ship up to dock at a nearby Spaceport, lucky find!" - eventdat += "
This Spaceport is home to travellers who failed to reach Orion, but managed to find a different home..." - eventdat += "
Trading terms: FU = Fuel, FO = Food" - if(last_spaceport_action) - eventdat += "
Last Spaceport Action: [last_spaceport_action]" - eventdat += "

Crew:

" - eventdat += english_list(settlers) - eventdat += "
Food: [food] | Fuel: [fuel]" - eventdat += "
Engine Parts: [engine] | Hull Panels: [hull] | Electronics: [electronics]" - - - //If your crew is pathetic you can get freebies (provided you haven't already gotten one from this port) - if(!spaceport_freebie && (fuel < 20 || food < 20)) - spaceport_freebie++ - var/FU = 10 - var/FO = 10 - var/freecrew = 0 - if(prob(30)) - FU = 25 - FO = 25 - - if(prob(10)) - add_crewmember() - freecrew++ - - eventdat += "
The traders of the spaceport take pitty on you, and give you some food and fuel (+[FU]FU,+[FO]FO)" - if(freecrew) - eventdat += "
You also gain a new crewmember!" - - fuel += FU - food += FO - - //CREW INTERACTIONS - eventdat += "

Crew Management:

" - - //Buy crew - if(food >= 10 && fuel >= 10) - eventdat += "

Hire a new Crewmember (-10FU,-10FO)

" - else - eventdat += "

Cant afford a new Crewmember

" - - //Sell crew - if(settlers.len > 1) - eventdat += "

Sell crew for Fuel and Food (+7FU,+7FO)

" - else - eventdat += "

Cant afford to sell a Crewmember

" - - //BUY/SELL STUFF - eventdat += "

Spare Parts:

" - - //Engine parts - if(fuel > 5) - eventdat += "

Buy Engine Parts (-5FU)

" - else - eventdat += "

Cant afford to buy Engine Parts" - - //Hull plates - if(fuel > 5) - eventdat += "

Buy Hull Plates (-5FU)

" - else - eventdat += "

Cant afford to buy Hull Plates" - - //Electronics - if(fuel > 5) - eventdat += "

Buy Spare Electronics (-5FU)

" - else - eventdat += "

Cant afford to buy Spare Electronics" - - //Trade - if(fuel > 5) - eventdat += "

Trade Fuel for Food (-5FU,+5FO)

" - else - eventdat += "

Cant afford to Trade Fuel for Food 5) - eventdat += "

Trade Food for Fuel (+5FU,-5FO)

" - else - eventdat += "

Cant afford to Trade Food for FuelYou override the cheat code menu and skip to Cheat #[rand(1, 50)]: Realism Mode." - name = "The Orion Trail: Realism Edition" - desc = "Learn how our ancestors got to Orion, and try not to die in the process!" - newgame() - emagged = 1 - -/mob/living/simple_animal/hostile/syndicate/ranged/orion - name = "Spaceport Security" - desc = "The Premier security forces for all spaceports found along the Orion Trail." - faction = list("orion") - loot = list(/obj/effect/mob_spawn/human/corpse/orionsecurity, - /obj/item/weapon/gun/projectile/automatic/c20r/unrestricted, - /obj/item/weapon/shield/energy) - -/obj/effect/mob_spawn/human/corpse/orionsecurity - name = "Spaceport Security" - uniform = /obj/item/clothing/under/syndicate - suit = /obj/item/clothing/suit/armor/vest - shoes = /obj/item/clothing/shoes/combat - gloves = /obj/item/clothing/gloves/combat - radio = /obj/item/device/radio/headset - mask = /obj/item/clothing/mask/gas - helmet = /obj/item/clothing/head/helmet/swat - back = /obj/item/weapon/storage/backpack - has_id = 1 - id_job = "Officer" - id_access = "Syndicate" - -/obj/item/weapon/orion_ship - name = "model settler ship" - desc = "A model spaceship, it looks like those used back in the day when travelling to Orion! It even has a miniature FX-293 reactor, which was renowned for its instability and tendency to explode..." - icon = 'icons/obj/toy.dmi' - icon_state = "ship" - w_class = 2 - var/active = 0 //if the ship is on - -/obj/item/weapon/orion_ship/examine(mob/user) - ..() - if(!(in_range(user, src))) - return - if(!active) - user << "There's a little switch on the bottom. It's flipped down." - else - user << "There's a little switch on the bottom. It's flipped up." - -/obj/item/weapon/orion_ship/attack_self(mob/user) //Minibomb-level explosion. Should probably be more because of how hard it is to survive the machine! Also, just over a 5-second fuse - if(active) - return - - message_admins("[key_name_admin(usr)] primed an explosive Orion ship for detonation.") - log_game("[key_name(usr)] primed an explosive Orion ship for detonation.") - - user << "You flip the switch on the underside of [src]." - active = 1 - src.visible_message("[src] softly beeps and whirs to life!") - playsound(src.loc, 'sound/machines/defib_SaftyOn.ogg', 25, 1) - say("This is ship ID #[rand(1,1000)] to Orion Port Authority. We're coming in for landing, over.") - sleep(20) - src.visible_message("[src] begins to vibrate...") - say("Uh, Port? Having some issues with our reactor, could you check it out? Over.") - sleep(30) - say("Oh, God! Code Eight! CODE EIGHT! IT'S GONNA BL-") - playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 25, 1) - sleep(3.6) - src.visible_message("[src] explodes!") - explosion(src.loc, 2,4,8, flame_range = 16) - qdel(src) - - -#undef ORION_TRAIL_WINTURN -#undef ORION_TRAIL_RAIDERS -#undef ORION_TRAIL_FLUX -#undef ORION_TRAIL_ILLNESS -#undef ORION_TRAIL_BREAKDOWN -#undef ORION_TRAIL_LING -#undef ORION_TRAIL_LING_ATTACK -#undef ORION_TRAIL_MALFUNCTION -#undef ORION_TRAIL_COLLISION -#undef ORION_TRAIL_SPACEPORT -#undef ORION_TRAIL_BLACKHOLE - -#undef ORION_STATUS_START -#undef ORION_STATUS_NORMAL -#undef ORION_STATUS_GAMEOVER -#undef ORION_STATUS_MARKET +/obj/machinery/computer/arcade/ + name = "random arcade" + desc = "random arcade machine" + icon_state = "arcade" + icon_keyboard = null + icon_screen = "invaders" + var/list/prizes = list( + /obj/item/weapon/storage/box/snappops = 2, + /obj/item/toy/talking/AI = 2, + /obj/item/toy/talking/codex_gigas = 2, + /obj/item/clothing/under/syndicate/tacticool = 2, + /obj/item/toy/sword = 2, + /obj/item/toy/gun = 2, + /obj/item/weapon/gun/projectile/shotgun/toy/crossbow = 2, + /obj/item/weapon/storage/box/fakesyndiesuit = 2, + /obj/item/weapon/storage/crayons = 2, + /obj/item/toy/spinningtoy = 2, + /obj/item/toy/prize/ripley = 1, + /obj/item/toy/prize/fireripley = 1, + /obj/item/toy/prize/deathripley = 1, + /obj/item/toy/prize/gygax = 1, + /obj/item/toy/prize/durand = 1, + /obj/item/toy/prize/honk = 1, + /obj/item/toy/prize/marauder = 1, + /obj/item/toy/prize/seraph = 1, + /obj/item/toy/prize/mauler = 1, + /obj/item/toy/prize/odysseus = 1, + /obj/item/toy/prize/phazon = 1, + /obj/item/toy/prize/reticence = 1, + /obj/item/toy/cards/deck = 2, + /obj/item/toy/nuke = 2, + /obj/item/toy/minimeteor = 2, + /obj/item/toy/redbutton = 2, + /obj/item/toy/talking/owl = 2, + /obj/item/toy/talking/griffin = 2, + /obj/item/toy/talking/skeleton = 2, + /obj/item/weapon/coin/antagtoken = 2, + /obj/item/stack/tile/fakespace/loaded = 2, + /obj/item/toy/toy_xeno = 2, + /obj/item/weapon/restraints/handcuffs/fake = 2) + +/obj/machinery/computer/arcade/New() + ..() + // If it's a generic arcade machine, pick a random arcade + // circuit board for it and make the new machine + if(!circuit) + var/choice = pick(subtypesof(/obj/item/weapon/circuitboard/computer/arcade)) + var/obj/item/weapon/circuitboard/CB = new choice() + new CB.build_path(loc, CB) + qdel(src) + +/obj/machinery/computer/arcade/proc/prizevend() + if(prob(0.0001)) //1 in a million + new /obj/item/weapon/gun/energy/pulse(src) + + if(!contents.len) + var/prizeselect = pickweight(prizes) + new prizeselect(src) + + var/atom/movable/prize = pick(contents) + visible_message( + "[src] dispenses a [prize]!", + "You hear a chime and a clunk.") + + prize.loc = src.loc + +/obj/machinery/computer/arcade/emp_act(severity) + ..(severity) + + if(stat & (NOPOWER|BROKEN)) + return + + var/empprize = null + var/num_of_prizes = 0 + switch(severity) + if(1) + num_of_prizes = rand(1,4) + if(2) + num_of_prizes = rand(0,2) + for(var/i = num_of_prizes; i > 0; i--) + empprize = pickweight(prizes) + new empprize(src.loc) + explosion(src.loc, -1, 0, 1+num_of_prizes, flame_range = 1+num_of_prizes) + + +// ** BATTLE ** // + + +/obj/machinery/computer/arcade/battle + name = "arcade machine" + desc = "Does not support Pinball." + icon_state = "arcade" + circuit = /obj/item/weapon/circuitboard/computer/arcade/battle + var/enemy_name = "Space Villian" + var/temp = "Winners don't use space drugs" //Temporary message, for attack messages, etc + var/player_hp = 30 //Player health/attack points + var/player_mp = 10 + var/enemy_hp = 45 //Enemy health/attack points + var/enemy_mp = 20 + var/gameover = 0 + var/blocked = 0 //Player cannot attack/heal while set + var/turtle = 0 + +/obj/machinery/computer/arcade/battle/New() + ..() + var/name_action + var/name_part1 + var/name_part2 + + name_action = pick("Defeat ", "Annihilate ", "Save ", "Strike ", "Stop ", "Destroy ", "Robust ", "Romance ", "Pwn ", "Own ", "Ban ") + + name_part1 = pick("the Automatic ", "Farmer ", "Lord ", "Professor ", "the Cuban ", "the Evil ", "the Dread King ", "the Space ", "Lord ", "the Great ", "Duke ", "General ") + name_part2 = pick("Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Ectoplasm", "Crushulon", "Uhangoid", "Vhakoid", "Peteoid", "slime", "Griefer", "ERPer", "Lizard Man", "Unicorn", "Bloopers") + + src.enemy_name = replacetext((name_part1 + name_part2), "the ", "") + src.name = (name_action + name_part1 + name_part2) + +/obj/machinery/computer/arcade/battle/attack_hand(mob/user) + if(..()) + return + user.set_machine(src) + var/dat = "Close" + dat += "

[src.enemy_name]

" + + dat += "

[src.temp]

" + dat += "
Health: [src.player_hp] | Magic: [src.player_mp] | Enemy Health: [src.enemy_hp]
" + + if (src.gameover) + dat += "
New Game" + else + dat += "
Attack | " + dat += "Heal | " + dat += "Recharge Power" + + dat += "
" + + //user << browse(dat, "window=arcade") + //onclose(user, "arcade") + var/datum/browser/popup = new(user, "arcade", "Space Villian 2000") + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + return + +/obj/machinery/computer/arcade/battle/Topic(href, href_list) + if(..()) + return + + if (!src.blocked && !src.gameover) + if (href_list["attack"]) + src.blocked = 1 + var/attackamt = rand(2,6) + src.temp = "You attack for [attackamt] damage!" + playsound(src.loc, 'sound/arcade/Hit.ogg', 50, 1, extrarange = -3, falloff = 10) + src.updateUsrDialog() + if(turtle > 0) + turtle-- + + sleep(10) + src.enemy_hp -= attackamt + src.arcade_action() + + else if (href_list["heal"]) + src.blocked = 1 + var/pointamt = rand(1,3) + var/healamt = rand(6,8) + src.temp = "You use [pointamt] magic to heal for [healamt] damage!" + playsound(src.loc, 'sound/arcade/Heal.ogg', 50, 1, extrarange = -3, falloff = 10) + src.updateUsrDialog() + turtle++ + + sleep(10) + src.player_mp -= pointamt + src.player_hp += healamt + src.blocked = 1 + src.updateUsrDialog() + src.arcade_action() + + else if (href_list["charge"]) + src.blocked = 1 + var/chargeamt = rand(4,7) + src.temp = "You regain [chargeamt] points" + playsound(src.loc, 'sound/arcade/Mana.ogg', 50, 1, extrarange = -3, falloff = 10) + src.player_mp += chargeamt + if(turtle > 0) + turtle-- + + src.updateUsrDialog() + sleep(10) + src.arcade_action() + + if (href_list["close"]) + usr.unset_machine() + usr << browse(null, "window=arcade") + + else if (href_list["newgame"]) //Reset everything + temp = "New Round" + player_hp = 30 + player_mp = 10 + enemy_hp = 45 + enemy_mp = 20 + gameover = 0 + turtle = 0 + + if(emagged) + src.New() + emagged = 0 + + src.add_fingerprint(usr) + src.updateUsrDialog() + return + +/obj/machinery/computer/arcade/battle/proc/arcade_action() + if ((src.enemy_mp <= 0) || (src.enemy_hp <= 0)) + if(!gameover) + src.gameover = 1 + src.temp = "[src.enemy_name] has fallen! Rejoice!" + playsound(src.loc, 'sound/arcade/Win.ogg', 50, 1, extrarange = -3, falloff = 10) + + if(emagged) + feedback_inc("arcade_win_emagged") + new /obj/effect/spawner/newbomb/timer/syndicate(src.loc) + new /obj/item/clothing/head/collectable/petehat(src.loc) + message_admins("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.") + log_game("[key_name(usr)] has outbombed Cuban Pete and been awarded a bomb.") + src.New() + emagged = 0 + else + feedback_inc("arcade_win_normal") + prizevend() + + else if (emagged && (turtle >= 4)) + var/boomamt = rand(5,10) + src.temp = "[src.enemy_name] throws a bomb, exploding you for [boomamt] damage!" + playsound(src.loc, 'sound/arcade/Boom.ogg', 50, 1, extrarange = -3, falloff = 10) + src.player_hp -= boomamt + + else if ((src.enemy_mp <= 5) && (prob(70))) + var/stealamt = rand(2,3) + src.temp = "[src.enemy_name] steals [stealamt] of your power!" + playsound(src.loc, 'sound/arcade/Steal.ogg', 50, 1, extrarange = -3, falloff = 10) + src.player_mp -= stealamt + src.updateUsrDialog() + + if (src.player_mp <= 0) + src.gameover = 1 + sleep(10) + src.temp = "You have been drained! GAME OVER" + playsound(src.loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -3, falloff = 10) + if(emagged) + feedback_inc("arcade_loss_mana_emagged") + usr.gib() + else + feedback_inc("arcade_loss_mana_normal") + + else if ((src.enemy_hp <= 10) && (src.enemy_mp > 4)) + src.temp = "[src.enemy_name] heals for 4 health!" + playsound(src.loc, 'sound/arcade/Heal.ogg', 50, 1, extrarange = -3, falloff = 10) + src.enemy_hp += 4 + src.enemy_mp -= 4 + + else + var/attackamt = rand(3,6) + src.temp = "[src.enemy_name] attacks for [attackamt] damage!" + playsound(src.loc, 'sound/arcade/Hit.ogg', 50, 1, extrarange = -3, falloff = 10) + src.player_hp -= attackamt + + if ((src.player_mp <= 0) || (src.player_hp <= 0)) + src.gameover = 1 + src.temp = "You have been crushed! GAME OVER" + playsound(src.loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -3, falloff = 10) + if(emagged) + feedback_inc("arcade_loss_hp_emagged") + usr.gib() + else + feedback_inc("arcade_loss_hp_normal") + + src.blocked = 0 + return + + +/obj/machinery/computer/arcade/battle/emag_act(mob/user) + if(!emagged) + temp = "If you die in the game, you die for real!" + player_hp = 30 + player_mp = 10 + enemy_hp = 45 + enemy_mp = 20 + gameover = 0 + blocked = 0 + + emagged = 1 + + enemy_name = "Cuban Pete" + name = "Outbomb Cuban Pete" + + + src.updateUsrDialog() + + + +// *** THE ORION TRAIL ** // + +#define ORION_TRAIL_WINTURN 9 + +//Orion Trail Events +#define ORION_TRAIL_RAIDERS "Raiders" +#define ORION_TRAIL_FLUX "Interstellar Flux" +#define ORION_TRAIL_ILLNESS "Illness" +#define ORION_TRAIL_BREAKDOWN "Breakdown" +#define ORION_TRAIL_LING "Changelings?" +#define ORION_TRAIL_LING_ATTACK "Changeling Ambush" +#define ORION_TRAIL_MALFUNCTION "Malfunction" +#define ORION_TRAIL_COLLISION "Collision" +#define ORION_TRAIL_SPACEPORT "Spaceport" +#define ORION_TRAIL_BLACKHOLE "BlackHole" + +#define ORION_STATUS_START 1 +#define ORION_STATUS_NORMAL 2 +#define ORION_STATUS_GAMEOVER 3 +#define ORION_STATUS_MARKET 4 + +/obj/machinery/computer/arcade/orion_trail + name = "The Orion Trail" + desc = "Learn how our ancestors got to Orion, and have fun in the process!" + icon_state = "arcade" + circuit = /obj/item/weapon/circuitboard/computer/arcade/orion_trail + var/busy = 0 //prevent clickspam that allowed people to ~speedrun~ the game. + var/engine = 0 + var/hull = 0 + var/electronics = 0 + var/food = 80 + var/fuel = 60 + var/turns = 4 + var/alive = 4 + var/eventdat = null + var/event = null + var/list/settlers = list("Harry","Larry","Bob") + var/list/events = list(ORION_TRAIL_RAIDERS = 3, + ORION_TRAIL_FLUX = 1, + ORION_TRAIL_ILLNESS = 3, + ORION_TRAIL_BREAKDOWN = 2, + ORION_TRAIL_LING = 3, + ORION_TRAIL_MALFUNCTION = 2, + ORION_TRAIL_COLLISION = 1, + ORION_TRAIL_SPACEPORT = 2 + ) + var/list/stops = list() + var/list/stopblurbs = list() + var/lings_aboard = 0 + var/spaceport_raided = 0 + var/spaceport_freebie = 0 + var/last_spaceport_action = "" + var/gameStatus = ORION_STATUS_START + var/canContinueEvent = 0 + +/obj/machinery/computer/arcade/orion_trail/New() + ..() + // Sets up the main trail + stops = list("Pluto","Asteroid Belt","Proxima Centauri","Dead Space","Rigel Prime","Tau Ceti Beta","Black Hole","Space Outpost Beta-9","Orion Prime") + stopblurbs = list( + "Pluto, long since occupied with long-range sensors and scanners, stands ready to, and indeed continues to probe the far reaches of the galaxy.", + "At the edge of the Sol system lies a treacherous asteroid belt. Many have been crushed by stray asteroids and misguided judgement.", + "The nearest star system to Sol, in ages past it stood as a reminder of the boundaries of sub-light travel, now a low-population sanctuary for adventurers and traders.", + "This region of space is particularly devoid of matter. Such low-density pockets are known to exist, but the vastness of it is astounding.", + "Rigel Prime, the center of the Rigel system, burns hot, basking its planetary bodies in warmth and radiation.", + "Tau Ceti Beta has recently become a waypoint for colonists headed towards Orion. There are many ships and makeshift stations in the vicinity.", + "Sensors indicate that a black hole's gravitational field is affecting the region of space we were headed through. We could stay of course, but risk of being overcome by its gravity, or we could change course to go around, which will take longer.", + "You have come into range of the first man-made structure in this region of space. It has been constructed not by travellers from Sol, but by colonists from Orion. It stands as a monument to the colonists' success.", + "You have made it to Orion! Congratulations! Your crew is one of the few to start a new foothold for mankind!" + ) + +/obj/machinery/computer/arcade/orion_trail/proc/newgame() + // Set names of settlers in crew + settlers = list() + for(var/i = 1; i <= 3; i++) + add_crewmember() + add_crewmember("[usr]") + // Re-set items to defaults + engine = 1 + hull = 1 + electronics = 1 + food = 80 + fuel = 60 + alive = 4 + turns = 1 + event = null + gameStatus = ORION_STATUS_NORMAL + lings_aboard = 0 + + //spaceport junk + spaceport_raided = 0 + spaceport_freebie = 0 + last_spaceport_action = "" + +/obj/machinery/computer/arcade/orion_trail/attack_hand(mob/user) + if(..()) + return + if(fuel <= 0 || food <=0 || settlers.len == 0) + gameStatus = ORION_STATUS_GAMEOVER + event = null + user.set_machine(src) + var/dat = "" + if(gameStatus == ORION_STATUS_GAMEOVER) + dat = "

Game Over

" + dat += "Like many before you, your crew never made it to Orion, lost to space...
Forever." + if(settlers.len == 0) + dat += "
Your entire crew died, your ship joins the fleet of ghost-ships littering the galaxy." + else + if(food <= 0) + dat += "
You ran out of food and starved." + if(emagged) + user.nutrition = 0 //yeah you pretty hongry + user << "Your body instantly contracts to that of one who has not eaten in months. Agonizing cramps seize you as you fall to the floor." + if(fuel <= 0) + dat += "
You ran out of fuel, and drift, slowly, into a star." + if(emagged) + var/mob/living/M = user + M.adjust_fire_stacks(5) + M.IgniteMob() //flew into a star, so you're on fire + user << "You feel an immense wave of heat emanate from the arcade machine. Your skin bursts into flames." + dat += "

OK...

" + + if(emagged) + user << "You're never going to make it to Orion..." + user.death() + emagged = 0 //removes the emagged status after you lose + gameStatus = ORION_STATUS_START + name = "The Orion Trail" + desc = "Learn how our ancestors got to Orion, and have fun in the process!" + + else if(event) + dat = eventdat + else if(gameStatus == ORION_STATUS_NORMAL) + var/title = stops[turns] + var/subtext = stopblurbs[turns] + dat = "

[title]

" + dat += "[subtext]" + dat += "

Crew:

" + dat += english_list(settlers) + dat += "
Food: [food] | Fuel: [fuel]" + dat += "
Engine Parts: [engine] | Hull Panels: [hull] | Electronics: [electronics]" + if(turns == 7) + dat += "

Go Around Continue

" + else + dat += "

Continue

" + dat += "

Kill a crewmember

" + dat += "

Close

" + else + dat = "

The Orion Trail

" + dat += "

Experience the journey of your ancestors!



" + dat += "
New Game
" + dat += "

Close

" + var/datum/browser/popup = new(user, "arcade", "The Orion Trail",400,700) + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + return + +/obj/machinery/computer/arcade/orion_trail/Topic(href, href_list) + if(..()) + return + if(href_list["close"]) + usr.unset_machine() + usr << browse(null, "window=arcade") + + if(busy) + return + busy = 1 + + if (href_list["continue"]) //Continue your travels + if(gameStatus == ORION_STATUS_NORMAL && !event && turns != 7) + if(turns >= ORION_TRAIL_WINTURN) + win() + else + food -= (alive+lings_aboard)*2 + fuel -= 5 + if(turns == 2 && prob(30)) + event = ORION_TRAIL_COLLISION + event() + else if(prob(75)) + event = pickweight(events) + if(lings_aboard) + if(event == ORION_TRAIL_LING || prob(55)) + event = ORION_TRAIL_LING_ATTACK + event() + turns += 1 + if(emagged) + var/mob/living/carbon/M = usr //for some vars + switch(event) + if(ORION_TRAIL_RAIDERS) + if(prob(50)) + usr << "You hear battle shouts. The tramping of boots on cold metal. Screams of agony. The rush of venting air. Are you going insane?" + M.hallucination += 30 + else + usr << "Something strikes you from behind! It hurts like hell and feel like a blunt weapon, but nothing is there..." + M.take_organ_damage(30) + playsound(loc, 'sound/weapons/genhit2.ogg', 100, 1) + if(ORION_TRAIL_ILLNESS) + var/severity = rand(1,3) //pray to RNGesus. PRAY, PIGS + if(severity == 1) + M << "You suddenly feel slightly nauseous." //got off lucky + if(severity == 2) + usr << "You suddenly feel extremely nauseous and hunch over until it passes." + M.Stun(3) + if(severity >= 3) //you didn't pray hard enough + M << "An overpowering wave of nausea consumes over you. You hunch over, your stomach's contents preparing for a spectacular exit." + M.Stun(5) + sleep(30) + M.vomit(50) + if(ORION_TRAIL_FLUX) + if(prob(75)) + M.Weaken(3) + say("A sudden gust of powerful wind slams [M] into the floor!") + M.take_organ_damage(25) + playsound(src.loc, 'sound/weapons/Genhit.ogg', 100, 1) + else + M << "A violent gale blows past you, and you barely manage to stay standing!" + if(ORION_TRAIL_COLLISION) //by far the most damaging event + if(prob(90)) + playsound(src.loc, 'sound/effects/bang.ogg', 100, 1) + var/turf/open/floor/F + for(F in orange(1, src)) + F.ChangeTurf(F.baseturf) + say("Something slams into the floor around [src], exposing it to space!") + if(hull) + sleep(10) + say("A new floor suddenly appears around [src]. What the hell?") + playsound(src.loc, 'sound/weapons/Genhit.ogg', 100, 1) + var/turf/open/space/T + for(T in orange(1, src)) + T.ChangeTurf(/turf/open/floor/plating/) + else + say("Something slams into the floor around [src] - luckily, it didn't get through!") + playsound(src.loc, 'sound/effects/bang.ogg', 50, 1) + if(ORION_TRAIL_MALFUNCTION) + playsound(src.loc, 'sound/effects/EMPulse.ogg', 50, 1) + src.visible_message("[src] malfunctions, randomizing in-game stats!") + var/oldfood = food + var/oldfuel = fuel + food = rand(10,80) / rand(1,2) + fuel = rand(10,60) / rand(1,2) + if(electronics) + sleep(10) + if(oldfuel > fuel && oldfood > food) + src.audible_message("[src] lets out a somehow reassuring chime.") + else if(oldfuel < fuel || oldfood < food) + src.audible_message("[src] lets out a somehow ominous chime.") + food = oldfood + fuel = oldfuel + playsound(src.loc, 'sound/machines/chime.ogg', 50, 1) + + else if(href_list["newgame"]) //Reset everything + if(gameStatus == ORION_STATUS_START) + newgame() + else if(href_list["menu"]) //back to the main menu + if(gameStatus == ORION_STATUS_GAMEOVER) + gameStatus = ORION_STATUS_START + event = null + food = 80 + fuel = 60 + settlers = list("Harry","Larry","Bob") + else if(href_list["slow"]) //slow down + if(event == ORION_TRAIL_FLUX) + food -= (alive+lings_aboard)*2 + fuel -= 5 + event = null + else if(href_list["pastblack"]) //slow down + if(turns == 7) + food -= ((alive+lings_aboard)*2)*3 + fuel -= 15 + turns += 1 + event = null + else if(href_list["useengine"]) //use parts + if(event == ORION_TRAIL_BREAKDOWN) + engine = max(0, --engine) + event = null + else if(href_list["useelec"]) //use parts + if(event == ORION_TRAIL_MALFUNCTION) + electronics = max(0, --electronics) + event = null + else if(href_list["usehull"]) //use parts + if(event == ORION_TRAIL_COLLISION) + hull = max(0, --hull) + event = null + else if(href_list["wait"]) //wait 3 days + if(event == ORION_TRAIL_BREAKDOWN || event == ORION_TRAIL_MALFUNCTION || event == ORION_TRAIL_COLLISION) + food -= ((alive+lings_aboard)*2)*3 + event = null + else if(href_list["keepspeed"]) //keep speed + if(event == ORION_TRAIL_FLUX) + if(prob(75)) + event = "Breakdown" + event() + else + event = null + else if(href_list["blackhole"]) //keep speed past a black hole + if(turns == 7) + if(prob(75)) + event = ORION_TRAIL_BLACKHOLE + event() + if(emagged) //has to be here because otherwise it doesn't work + playsound(src.loc, 'sound/effects/supermatter.ogg', 100, 1) + say("A miniature black hole suddenly appears in front of [src], devouring [usr] alive!") + usr.Stun(10) //you can't run :^) + var/S = new /obj/singularity/academy(usr.loc) + emagged = 0 //immediately removes emagged status so people can't kill themselves by sprinting up and interacting + sleep(50) + say("[S] winks out, just as suddenly as it appeared.") + qdel(S) + else + event = null + turns += 1 + else if(href_list["holedeath"]) + if(event == ORION_TRAIL_BLACKHOLE) + gameStatus = ORION_STATUS_GAMEOVER + event = null + else if(href_list["eventclose"]) //end an event + if(canContinueEvent) + event = null + + else if(href_list["killcrew"]) //shoot a crewmember + if(gameStatus == ORION_STATUS_NORMAL || event == ORION_TRAIL_LING) + var/sheriff = remove_crewmember() //I shot the sheriff + playsound(loc,'sound/weapons/Gunshot.ogg', 100, 1) + + if(settlers.len == 0 || alive == 0) + say("The last crewmember [sheriff], shot themselves, GAME OVER!") + if(emagged) + usr.death(0) + emagged = 0 + gameStatus = ORION_STATUS_GAMEOVER + event = null + else if(emagged) + if(usr.name == sheriff) + say("The crew of the ship chose to kill [usr.name]!") + usr.death(0) + + if(event == ORION_TRAIL_LING) //only ends the ORION_TRAIL_LING event, since you can do this action in multiple places + event = null + + //Spaceport specific interactions + //they get a header because most of them don't reset event (because it's a shop, you leave when you want to) + //they also call event() again, to regen the eventdata, which is kind of odd but necessary + else if(href_list["buycrew"]) //buy a crewmember + if(gameStatus == ORION_STATUS_MARKET) + if(!spaceport_raided && food >= 10 && fuel >= 10) + var/bought = add_crewmember() + last_spaceport_action = "You hired [bought] as a new crewmember." + fuel -= 10 + food -= 10 + event() + + else if(href_list["sellcrew"]) //sell a crewmember + if(gameStatus == ORION_STATUS_MARKET) + if(!spaceport_raided && settlers.len > 1) + var/sold = remove_crewmember() + last_spaceport_action = "You sold your crewmember, [sold]!" + fuel += 7 + food += 7 + event() + + else if(href_list["leave_spaceport"]) + if(gameStatus == ORION_STATUS_MARKET) + event = null + gameStatus = ORION_STATUS_NORMAL + spaceport_raided = 0 + spaceport_freebie = 0 + last_spaceport_action = "" + + else if(href_list["raid_spaceport"]) + if(gameStatus == ORION_STATUS_MARKET) + if(!spaceport_raided) + var/success = min(15 * alive,100) //default crew (4) have a 60% chance + spaceport_raided = 1 + + var/FU = 0 + var/FO = 0 + if(prob(success)) + FU = rand(5,15) + FO = rand(5,15) + last_spaceport_action = "You successfully raided the spaceport! you gained [FU] Fuel and [FO] Food! (+[FU]FU,+[FO]FO)" + else + FU = rand(-5,-15) + FO = rand(-5,-15) + last_spaceport_action = "You failed to raid the spaceport! you lost [FU*-1] Fuel and [FO*-1] Food in your scramble to escape! ([FU]FU,[FO]FO)" + + //your chance of lose a crewmember is 1/2 your chance of success + //this makes higher % failures hurt more, don't get cocky space cowboy! + if(prob(success*5)) + var/lost_crew = remove_crewmember() + last_spaceport_action = "You failed to raid the spaceport! you lost [FU*-1] Fuel and [FO*-1] Food, AND [lost_crew] in your scramble to escape! ([FU]FI,[FO]FO,-Crew)" + if(emagged) + say("WEEWOO WEEWOO, Spaceport Security en route!") + for(var/i, i<=3, i++) + var/mob/living/simple_animal/hostile/syndicate/ranged/orion/O = new/mob/living/simple_animal/hostile/syndicate/ranged/orion(get_turf(src)) + O.target = usr + + + fuel += FU + food += FO + event() + + else if(href_list["buyparts"]) + if(gameStatus == ORION_STATUS_MARKET) + if(!spaceport_raided && fuel > 5) + switch(text2num(href_list["buyparts"])) + if(1) //Engine Parts + engine++ + last_spaceport_action = "Bought Engine Parts" + if(2) //Hull Plates + hull++ + last_spaceport_action = "Bought Hull Plates" + if(3) //Spare Electronics + electronics++ + last_spaceport_action = "Bought Spare Electronics" + fuel -= 5 //they all cost 5 + event() + + else if(href_list["trade"]) + if(gameStatus == ORION_STATUS_MARKET) + if(!spaceport_raided) + switch(text2num(href_list["trade"])) + if(1) //Fuel + if(fuel > 5) + fuel -= 5 + food += 5 + last_spaceport_action = "Traded Fuel for Food" + event() + if(2) //Food + if(food > 5) + fuel += 5 + food -= 5 + last_spaceport_action = "Traded Food for Fuel" + event() + + src.add_fingerprint(usr) + src.updateUsrDialog() + busy = 0 + return + + +/obj/machinery/computer/arcade/orion_trail/proc/event() + eventdat = "

[event]

" + canContinueEvent = 0 + switch(event) + if(ORION_TRAIL_RAIDERS) + eventdat += "Raiders have come aboard your ship!" + if(prob(50)) + var/sfood = rand(1,10) + var/sfuel = rand(1,10) + food -= sfood + fuel -= sfuel + eventdat += "
They have stolen [sfood] Food and [sfuel] Fuel." + else if(prob(10)) + var/deadname = remove_crewmember() + eventdat += "
[deadname] tried to fight back but was killed." + else + eventdat += "
Fortunately you fended them off without any trouble." + eventdat += "

Continue

" + eventdat += "

Close

" + canContinueEvent = 1 + + if(ORION_TRAIL_FLUX) + eventdat += "This region of space is highly turbulent.
If we go slowly we may avoid more damage, but if we keep our speed we won't waste supplies." + eventdat += "
What will you do?" + eventdat += "

Slow Down Continue

" + eventdat += "

Close

" + + if(ORION_TRAIL_ILLNESS) + eventdat += "A deadly illness has been contracted!" + var/deadname = remove_crewmember() + eventdat += "
[deadname] was killed by the disease." + eventdat += "

Continue

" + eventdat += "

Close

" + canContinueEvent = 1 + + if(ORION_TRAIL_BREAKDOWN) + eventdat += "Oh no! The engine has broken down!" + eventdat += "
You can repair it with an engine part, or you can make repairs for 3 days." + if(engine >= 1) + eventdat += "

Use PartWait

" + else + eventdat += "

Wait

" + eventdat += "

Close

" + + if(ORION_TRAIL_MALFUNCTION) + eventdat += "The ship's systems are malfunctioning!" + eventdat += "
You can replace the broken electronics with spares, or you can spend 3 days troubleshooting the AI." + if(electronics >= 1) + eventdat += "

Use PartWait

" + else + eventdat += "

Wait

" + eventdat += "

Close

" + + if(ORION_TRAIL_COLLISION) + eventdat += "Something hit us! Looks like there's some hull damage." + if(prob(25)) + var/sfood = rand(5,15) + var/sfuel = rand(5,15) + food -= sfood + fuel -= sfuel + eventdat += "
[sfood] Food and [sfuel] Fuel was vented out into space." + if(prob(10)) + var/deadname = remove_crewmember() + eventdat += "
[deadname] was killed by rapid depressurization." + eventdat += "
You can repair the damage with hull plates, or you can spend the next 3 days welding scrap together." + if(hull >= 1) + eventdat += "

Use PartWait

" + else + eventdat += "

Wait

" + eventdat += "

Close

" + + if(ORION_TRAIL_BLACKHOLE) + eventdat += "You were swept away into the black hole." + eventdat += "

Oh...

" + eventdat += "

Close

" + settlers = list() + + if(ORION_TRAIL_LING) + eventdat += "Strange reports warn of changelings infiltrating crews on trips to Orion..." + if(settlers.len <= 2) + eventdat += "
Your crew's chance of reaching Orion is so slim the changelings likely avoided your ship..." + eventdat += "

Continue

" + eventdat += "

Close

" + if(prob(10)) // "likely", I didn't say it was guaranteed! + lings_aboard = min(++lings_aboard,2) + else + if(lings_aboard) //less likely to stack lings + if(prob(20)) + lings_aboard = min(++lings_aboard,2) + else if(prob(70)) + lings_aboard = min(++lings_aboard,2) + + eventdat += "

Kill a crewmember

" + eventdat += "

Risk it

" + eventdat += "

Close

" + canContinueEvent = 1 + + if(ORION_TRAIL_LING_ATTACK) + if(lings_aboard <= 0) //shouldn't trigger, but hey. + eventdat += "Haha, fooled you, there are no changelings on board!" + eventdat += "
(You should report this to a coder :S)" + else + var/ling1 = remove_crewmember() + var/ling2 = "" + if(lings_aboard >= 2) + ling2 = remove_crewmember() + + eventdat += "Oh no, some of your crew are Changelings!" + if(ling2) + eventdat += "
[ling1] and [ling2]'s arms twist and contort into grotesque blades!" + else + eventdat += "
[ling1]'s arm twists and contorts into a grotesque blade!" + + var/chance2attack = alive*20 + if(prob(chance2attack)) + var/chancetokill = 30*lings_aboard-(5*alive) //eg: 30*2-(10) = 50%, 2 lings, 2 crew is 50% chance + if(prob(chancetokill)) + var/deadguy = remove_crewmember() + eventdat += "
The Changeling[ling2 ? "s":""] run[ling2 ? "":"s"] up to [deadguy] and capitulates them!" + else + eventdat += "
You valiantly fight off the Changeling[ling2 ? "s":""]!" + eventdat += "
You cut the Changeling[ling2 ? "s":""] up into meat... Eww" + if(ling2) + food += 30 + lings_aboard = max(0,lings_aboard-2) + else + food += 15 + lings_aboard = max(0,--lings_aboard) + else + eventdat += "
The Changeling[ling2 ? "s":""] run[ling2 ? "":"s"] away, What wimps!" + if(ling2) + lings_aboard = max(0,lings_aboard-2) + else + lings_aboard = max(0,--lings_aboard) + + eventdat += "

Continue

" + eventdat += "

Close

" + canContinueEvent = 1 + + + if(ORION_TRAIL_SPACEPORT) + gameStatus = ORION_STATUS_MARKET + if(spaceport_raided) + eventdat += "The Spaceport is on high alert! they wont let you dock since you tried to attack them!" + if(last_spaceport_action) + eventdat += "
Last Spaceport Action: [last_spaceport_action]" + eventdat += "

Depart Spaceport

" + eventdat += "

Close

" + else + eventdat += "You pull the ship up to dock at a nearby Spaceport, lucky find!" + eventdat += "
This Spaceport is home to travellers who failed to reach Orion, but managed to find a different home..." + eventdat += "
Trading terms: FU = Fuel, FO = Food" + if(last_spaceport_action) + eventdat += "
Last Spaceport Action: [last_spaceport_action]" + eventdat += "

Crew:

" + eventdat += english_list(settlers) + eventdat += "
Food: [food] | Fuel: [fuel]" + eventdat += "
Engine Parts: [engine] | Hull Panels: [hull] | Electronics: [electronics]" + + + //If your crew is pathetic you can get freebies (provided you haven't already gotten one from this port) + if(!spaceport_freebie && (fuel < 20 || food < 20)) + spaceport_freebie++ + var/FU = 10 + var/FO = 10 + var/freecrew = 0 + if(prob(30)) + FU = 25 + FO = 25 + + if(prob(10)) + add_crewmember() + freecrew++ + + eventdat += "
The traders of the spaceport take pitty on you, and give you some food and fuel (+[FU]FU,+[FO]FO)" + if(freecrew) + eventdat += "
You also gain a new crewmember!" + + fuel += FU + food += FO + + //CREW INTERACTIONS + eventdat += "

Crew Management:

" + + //Buy crew + if(food >= 10 && fuel >= 10) + eventdat += "

Hire a new Crewmember (-10FU,-10FO)

" + else + eventdat += "

Cant afford a new Crewmember

" + + //Sell crew + if(settlers.len > 1) + eventdat += "

Sell crew for Fuel and Food (+7FU,+7FO)

" + else + eventdat += "

Cant afford to sell a Crewmember

" + + //BUY/SELL STUFF + eventdat += "

Spare Parts:

" + + //Engine parts + if(fuel > 5) + eventdat += "

Buy Engine Parts (-5FU)

" + else + eventdat += "

Cant afford to buy Engine Parts" + + //Hull plates + if(fuel > 5) + eventdat += "

Buy Hull Plates (-5FU)

" + else + eventdat += "

Cant afford to buy Hull Plates" + + //Electronics + if(fuel > 5) + eventdat += "

Buy Spare Electronics (-5FU)

" + else + eventdat += "

Cant afford to buy Spare Electronics" + + //Trade + if(fuel > 5) + eventdat += "

Trade Fuel for Food (-5FU,+5FO)

" + else + eventdat += "

Cant afford to Trade Fuel for Food 5) + eventdat += "

Trade Food for Fuel (+5FU,-5FO)

" + else + eventdat += "

Cant afford to Trade Food for FuelYou override the cheat code menu and skip to Cheat #[rand(1, 50)]: Realism Mode." + name = "The Orion Trail: Realism Edition" + desc = "Learn how our ancestors got to Orion, and try not to die in the process!" + newgame() + emagged = 1 + +/mob/living/simple_animal/hostile/syndicate/ranged/orion + name = "Spaceport Security" + desc = "The Premier security forces for all spaceports found along the Orion Trail." + faction = list("orion") + loot = list(/obj/effect/mob_spawn/human/corpse/orionsecurity, + /obj/item/weapon/gun/projectile/automatic/c20r/unrestricted, + /obj/item/weapon/shield/energy) + +/obj/effect/mob_spawn/human/corpse/orionsecurity + name = "Spaceport Security" + uniform = /obj/item/clothing/under/syndicate + suit = /obj/item/clothing/suit/armor/vest + shoes = /obj/item/clothing/shoes/combat + gloves = /obj/item/clothing/gloves/combat + radio = /obj/item/device/radio/headset + mask = /obj/item/clothing/mask/gas + helmet = /obj/item/clothing/head/helmet/swat + back = /obj/item/weapon/storage/backpack + has_id = 1 + id_job = "Officer" + id_access = "Syndicate" + +/obj/item/weapon/orion_ship + name = "model settler ship" + desc = "A model spaceship, it looks like those used back in the day when travelling to Orion! It even has a miniature FX-293 reactor, which was renowned for its instability and tendency to explode..." + icon = 'icons/obj/toy.dmi' + icon_state = "ship" + w_class = 2 + var/active = 0 //if the ship is on + +/obj/item/weapon/orion_ship/examine(mob/user) + ..() + if(!(in_range(user, src))) + return + if(!active) + user << "There's a little switch on the bottom. It's flipped down." + else + user << "There's a little switch on the bottom. It's flipped up." + +/obj/item/weapon/orion_ship/attack_self(mob/user) //Minibomb-level explosion. Should probably be more because of how hard it is to survive the machine! Also, just over a 5-second fuse + if(active) + return + + message_admins("[key_name_admin(usr)] primed an explosive Orion ship for detonation.") + log_game("[key_name(usr)] primed an explosive Orion ship for detonation.") + + user << "You flip the switch on the underside of [src]." + active = 1 + src.visible_message("[src] softly beeps and whirs to life!") + playsound(src.loc, 'sound/machines/defib_SaftyOn.ogg', 25, 1) + say("This is ship ID #[rand(1,1000)] to Orion Port Authority. We're coming in for landing, over.") + sleep(20) + src.visible_message("[src] begins to vibrate...") + say("Uh, Port? Having some issues with our reactor, could you check it out? Over.") + sleep(30) + say("Oh, God! Code Eight! CODE EIGHT! IT'S GONNA BL-") + playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 25, 1) + sleep(3.6) + src.visible_message("[src] explodes!") + explosion(src.loc, 2,4,8, flame_range = 16) + qdel(src) + + +#undef ORION_TRAIL_WINTURN +#undef ORION_TRAIL_RAIDERS +#undef ORION_TRAIL_FLUX +#undef ORION_TRAIL_ILLNESS +#undef ORION_TRAIL_BREAKDOWN +#undef ORION_TRAIL_LING +#undef ORION_TRAIL_LING_ATTACK +#undef ORION_TRAIL_MALFUNCTION +#undef ORION_TRAIL_COLLISION +#undef ORION_TRAIL_SPACEPORT +#undef ORION_TRAIL_BLACKHOLE + +#undef ORION_STATUS_START +#undef ORION_STATUS_NORMAL +#undef ORION_STATUS_GAMEOVER +#undef ORION_STATUS_MARKET diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 836b1fc81d0..04fe6350d4c 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -321,11 +321,15 @@ hackProof = 1 aiControlDisabled = 1 var/openingoverlaytype = /obj/effect/overlay/temp/cult/door + var/friendly = FALSE /obj/machinery/door/airlock/cult/allowed(mob/M) if(!density) return 1 - if(iscultist(M) || istype(M, /mob/living/simple_animal/shade) || istype(M, /mob/living/simple_animal/hostile/construct)) + if(friendly || \ + iscultist(M) || \ + istype(M, /mob/living/simple_animal/shade) || \ + istype(M, /mob/living/simple_animal/hostile/construct)) PoolOrNew(openingoverlaytype, src.loc) return 1 else @@ -345,22 +349,34 @@ /obj/machinery/door/airlock/cult/narsie_act() return +/obj/machinery/door/airlock/cult/friendly + friendly = TRUE + /obj/machinery/door/airlock/cult/glass doortype = /obj/structure/door_assembly/door_assembly_cult/glass glass = 1 opacity = 0 +/obj/machinery/door/airlock/cult/glass/friendly + friendly = TRUE + /obj/machinery/door/airlock/cult/unruned icon = 'icons/obj/doors/airlocks/cult/unruned/cult.dmi' overlays_file = 'icons/obj/doors/airlocks/cult/unruned/overlays.dmi' doortype = /obj/structure/door_assembly/door_assembly_cult/unruned openingoverlaytype = /obj/effect/overlay/temp/cult/door/unruned +/obj/machinery/door/airlock/cult/unruned/friendly + friendly = TRUE + /obj/machinery/door/airlock/cult/unruned/glass doortype = /obj/structure/door_assembly/door_assembly_cult/unruned/glass glass = 1 opacity = 0 +/obj/machinery/door/airlock/cult/unruned/glass/friendly + friendly = TRUE + ////////////////////////////////// /* Misc Airlocks diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm index dc9bf8e0115..c9836d94f24 100644 --- a/code/game/machinery/droneDispenser.dm +++ b/code/game/machinery/droneDispenser.dm @@ -14,8 +14,8 @@ var/icon_recharging = "recharge" var/icon_creating = "make" - var/metal = 0 - var/glass = 0 + var/datum/material_container/materials + var/list/using_materials var/metal_cost = 1000 var/glass_cost = 1000 var/power_used = 1000 @@ -39,25 +39,31 @@ /obj/machinery/droneDispenser/New() ..() health = max_health + materials = new(src, list(MAT_METAL=1, MAT_GLASS=1), MINERAL_MATERIAL_AMOUNT*MAX_STACK_SIZE*2) + using_materials = list(MAT_METAL=metal_cost, MAT_GLASS=glass_cost) SSmachine.processing |= src /obj/machinery/droneDispenser/Destroy() SSmachine.processing -= src + qdel(materials) + materials = null return ..() -/obj/machinery/droneDispenser/preloaded - metal = 5000 - glass = 5000 +/obj/machinery/droneDispenser/preloaded/New() + ..() + materials.insert_amount(5000) /obj/machinery/droneDispenser/syndrone //Please forgive me name = "syndrone shell dispenser" desc = "A suspicious machine that will create Syndicate exterminator drones when supplied with metal and glass. Disgusting." - metal = 25000 - glass = 25000 dispense_type = /obj/item/drone_shell/syndrone cooldownTime = 100 //If we're gonna be a jackass, go the full mile - 10 second recharge timer end_create_message = "dispenses a suspicious drone shell." +/obj/machinery/droneDispenser/syndrone/New() + ..() + materials.insert_amount(25000) + /obj/machinery/droneDispenser/syndrone/badass //Please forgive me name = "badass syndrone shell dispenser" desc = "A suspicious machine that will create Syndicate exterminator drones when supplied with metal and glass. Disgusting. This one seems ominous." @@ -74,9 +80,9 @@ glass_cost = 2000 power_used = 2000 -/obj/machinery/droneDispenser/snowflake/preloaded - metal = 10000 - glass = 10000 +/obj/machinery/droneDispenser/snowflake/preloaded/New() + ..() + materials.insert_amount(10000) /obj/machinery/droneDispenser/hivebot //An example of a custom drone dispenser. This one requires no materials and creates basic hivebots name = "hivebot fabricator" @@ -125,9 +131,9 @@ if(stat & BROKEN) user << "[src] is smoking and steadily buzzing. It seems to be broken." if(metal_cost) - user << "It has [metal] units of metal stored." + user << "It has [materials.amount(MAT_METAL)] units of metal stored." if(glass_cost) - user << "It has [glass] units of glass stored." + user << "It has [materials.amount(MAT_GLASS)] units of glass stored." /obj/machinery/droneDispenser/power_change() ..() @@ -144,7 +150,7 @@ ..() if(stat & (NOPOWER|BROKEN) || !anchored) return - if((metal_cost && glass_cost) && (metal < metal_cost || glass < glass_cost)) + if((metal_cost && glass_cost) && materials.can_use_amount(mats=using_materials)) return if(droneMadeRecently) icon_state = icon_recharging @@ -157,12 +163,7 @@ icon_state = icon_creating sleep(30) icon_state = icon_on - metal -= metal_cost - glass -= glass_cost - if(metal < 0) - metal = 0 - if(glass < 0) - glass = 0 + materials.use_amount(using_materials) if(power_used) use_power(power_used) new dispense_type(loc) @@ -197,19 +198,16 @@ return if(!user.canUseTopic(src)) return - stack = Clamp(stack, 0, sheets.max_amount) - sheets.use(stack) - if(!stack) - if(!user.unEquip(O)) - user << "[O] is stuck to your hand, you can't get it off!" - return - user.drop_item() - O.loc = src - metal += O.materials[MAT_METAL] * stack - glass += O.materials[MAT_GLASS] * stack - user << "You insert [stack] sheet[stack > 1 ? "s" : ""] to [src]." - if((O && O.loc == src) || !stack) - qdel(O) + if(!user.canUnEquip(sheets)) + user << "[O] is stuck to your hand, you can't get it off!" + return + stack = Clamp(stack, 1, sheets.max_amount) + stack = materials.insert_stack(sheets, stack) + if(stack) + user << "You insert [stack] sheet[stack > 1 ? "s" : ""] into [src]." + else + user << "The [src] can't use [sheets]." + else if(istype(O, /obj/item/weapon/weldingtool)) if(stat & BROKEN) var/obj/item/weapon/weldingtool/WT = O diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index a37a0e4d14e..319ce51d949 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -8,13 +8,15 @@ var/const/SAFETY_COOLDOWN = 100 layer = MOB_LAYER+1 // Overhead anchored = 1 density = 1 - var/safety_mode = 0 // Temporality stops the machine if it detects a mob - var/grinding = 0 + var/safety_mode = FALSE // Temporarily stops machine if it detects a mob var/icon_name = "grinder-o" var/blood = 0 var/eat_dir = WEST var/amount_produced = 1 var/datum/material_container/materials + var/crush_damage = 1000 + var/eat_victim_items = TRUE + var/item_recycle_sound = 'sound/items/Welder.ogg' /obj/machinery/recycler/New() ..() @@ -72,9 +74,9 @@ var/const/SAFETY_COOLDOWN = 100 /obj/machinery/recycler/emag_act(mob/user) if(!emagged) - emagged = 1 + emagged = TRUE if(safety_mode) - safety_mode = 0 + safety_mode = FALSE update_icon() playsound(src.loc, "sparks", 75, 1, -1) user << "You use the cryptographic sequencer on the [src.name]." @@ -83,7 +85,7 @@ var/const/SAFETY_COOLDOWN = 100 ..() var/is_powered = !(stat & (BROKEN|NOPOWER)) if(safety_mode) - is_powered = 0 + is_powered = FALSE icon_state = icon_name + "[is_powered]" + "[(blood ? "bld" : "")]" // add the blood tag at the end // This is purely for admin possession !FUN!. @@ -104,24 +106,34 @@ var/const/SAFETY_COOLDOWN = 100 var/move_dir = get_dir(loc, AM.loc) if(move_dir == eat_dir) + eat(AM) + +/obj/machinery/recycler/proc/eat(atom/AM0, sound=TRUE) + var/list/to_eat = list(AM0) + if(istype(AM0, /obj/item)) + to_eat += AM0.GetAllContents() + var/items_recycled = 0 + + for(var/i in to_eat) + var/atom/movable/AM = i if(isliving(AM)) if(emagged) - eat(AM) + crush_living(AM) else - stop(AM) + emergency_stop(AM) else if(istype(AM, /obj/item)) - recycle(AM) - else // Can't recycle + recycle_item(AM) + items_recycled++ + else playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0) AM.loc = src.loc -/obj/machinery/recycler/proc/recycle(obj/item/I, sound = 1) - I.loc = src.loc - if(!istype(I)) - return + if(items_recycled && sound) + playsound(src.loc, item_recycle_sound, 50, 1) + +/obj/machinery/recycler/proc/recycle_item(obj/item/I) + I.loc = src.loc - if(sound) - playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) var/material_amount = materials.get_item_material_amount(I) if(!material_amount) qdel(I) @@ -131,18 +143,18 @@ var/const/SAFETY_COOLDOWN = 100 materials.retrieve_all() -/obj/machinery/recycler/proc/stop(mob/living/L) +/obj/machinery/recycler/proc/emergency_stop(mob/living/L) playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0) - safety_mode = 1 + safety_mode = TRUE update_icon() L.loc = src.loc spawn(SAFETY_COOLDOWN) playsound(src.loc, 'sound/machines/ping.ogg', 50, 0) - safety_mode = 0 + safety_mode = FALSE update_icon() -/obj/machinery/recycler/proc/eat(mob/living/L) +/obj/machinery/recycler/proc/crush_living(mob/living/L) L.loc = src.loc @@ -151,22 +163,23 @@ var/const/SAFETY_COOLDOWN = 100 else playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) - var/gib = 1 + var/gib = TRUE // By default, the emagged recycler will gib all non-carbons. (human simple animal mobs don't count) if(iscarbon(L)) - gib = 0 + gib = FALSE if(L.stat == CONSCIOUS) L.say("ARRRRRRRRRRRGH!!!") add_blood(L) if(!blood && !issilicon(L)) - blood = 1 + blood = TRUE update_icon() - // Remove and recycle the equipped items. - for(var/obj/item/I in L.get_equipped_items()) - if(L.unEquip(I)) - recycle(I, 0) + // Remove and recycle the equipped items + if(eat_victim_items) + for(var/obj/item/I in L.get_equipped_items()) + if(L.unEquip(I)) + eat(I, sound=FALSE) // Instantly lie down, also go unconscious from the pain, before you die. L.Paralyse(5) @@ -175,9 +188,13 @@ var/const/SAFETY_COOLDOWN = 100 if(gib || emagged == 2) L.gib() else if(emagged == 1) - L.adjustBruteLoss(1000) - + L.adjustBruteLoss(crush_damage) +/obj/machinery/recycler/deathtrap + name = "dangerous old crusher" + emagged = TRUE + crush_damage = 120 + flags = NODECONSTRUCT /obj/item/weapon/paper/recycler name = "paper - 'garbage duty instructions'" diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index ed76ccd8768..1ee601cc453 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -224,6 +224,7 @@ if(target == "input") target = input("New target temperature:", name, round(targetTemperature - T0C, 1)) as num|null if(!isnull(target) && !..()) + target += T0C . = TRUE else if(adjust) target = targetTemperature + adjust diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index f7335295aef..eb062334719 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -2,21 +2,15 @@ name = "washing machine" desc = "Gets rid of those pesky bloodstains, or your money back!" icon = 'icons/obj/machines/washing_machine.dmi' - icon_state = "wm_10" + icon_state = "wm_1_0" density = 1 anchored = 1 - var/state = 1 - //1 = empty, open door - //2 = empty, closed door - //3 = full, open door - //4 = full, closed door - //5 = running - //6 = blood, open door - //7 = blood, closed door - //8 = blood, running - var/gibs_ready = 0 - var/obj/crayon - var/obj/paper + state_open = 1 + var/busy = 0 + var/bloody_mess = 0 + var/has_corgi = 0 + var/obj/item/color_source + var/max_wash_capacity = 5 /obj/machinery/washing_machine/examine(mob/user) ..() @@ -26,286 +20,227 @@ if(!user.canUseTopic(src)) return - if( state != 4 ) - usr << "The washing machine cannot run in this state." + if(busy) return - if( locate(/mob,contents) ) - state = 8 - else - state = 5 + if(state_open) + user << "Close the door first" + return + + if(bloody_mess) + user << "[src] must be cleaned up first." + return + + if(has_corgi) + bloody_mess = 1 + + busy = 1 update_icon() sleep(200) - for(var/atom/A in contents) - A.clean_blood() + wash_cycle() - //Tanning! - for(var/obj/item/stack/sheet/hairlesshide/HH in contents) - var/obj/item/stack/sheet/wetleather/WL = new(src) - WL.amount = HH.amount - qdel(HH) - - //Corgi costume says goodbye - for(var/obj/item/clothing/suit/hooded/ian_costume/IC in contents) - new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi(src) - qdel(IC) - - for(var/obj/item/weapon/paper/P in contents) - if(crayon) - var/dye_color - if(istype(crayon,/obj/item/toy/crayon)) - var/obj/item/toy/crayon/CR = crayon - dye_color = CR.paint_color - if(dye_color) - P.color = dye_color - qdel(crayon) - crayon = null - - if(crayon) - var/wash_color - if(istype(crayon,/obj/item/toy/crayon)) - var/obj/item/toy/crayon/CR = crayon - wash_color = CR.paint_color - else if(istype(crayon,/obj/item/weapon/stamp)) - var/obj/item/weapon/stamp/ST = crayon - wash_color = ST.item_color - - - if(wash_color) - var/new_jumpsuit_icon_state = "" - var/new_jumpsuit_item_state = "" - var/new_jumpsuit_name = "" - var/new_can_adjust - var/new_glove_icon_state = "" - var/new_glove_item_state = "" - var/new_glove_name = "" - var/new_shoe_icon_state = "" - var/new_shoe_name = "" - var/new_sheet_icon_state = "" - var/new_sheet_name = "" - var/new_softcap_icon_state = "" - var/new_softcap_name = "" - var/new_desc = "The colors are a bit dodgy." - for(var/T in typesof(/obj/item/clothing/under/color)) - var/obj/item/clothing/under/color/J = new T - //world << "DEBUG: [wash_color] == [J.item_color]" - if(wash_color == J.item_color) - new_jumpsuit_icon_state = J.icon_state - new_jumpsuit_item_state = J.item_state - new_jumpsuit_name = J.name - new_can_adjust = J.can_adjust - qdel(J) - break - qdel(J) - for(var/T in typesof(/obj/item/clothing/gloves/color)) - var/obj/item/clothing/gloves/color/G = new T - if(wash_color == G.item_color) - new_glove_icon_state = G.icon_state - new_glove_item_state = G.item_state - new_glove_name = G.name - qdel(G) - break - qdel(G) - for(var/T in typesof(/obj/item/clothing/shoes/sneakers)) - var/obj/item/clothing/shoes/sneakers/S = new T - if(wash_color == S.item_color) - new_shoe_icon_state = S.icon_state - new_shoe_name = S.name - qdel(S) - break - qdel(S) - for(var/T in typesof(/obj/item/weapon/bedsheet)) - var/obj/item/weapon/bedsheet/B = new T - if(wash_color == B.item_color) - new_sheet_icon_state = B.icon_state - new_sheet_name = B.name - qdel(B) - break - qdel(B) - for(var/T in typesof(/obj/item/clothing/head/soft)) - var/obj/item/clothing/head/soft/H = new T - if(wash_color == H.item_color) - new_softcap_icon_state = H.icon_state - new_softcap_name = H.name - qdel(H) - break - qdel(H) - if(new_jumpsuit_icon_state && new_jumpsuit_item_state && new_jumpsuit_name) - for(var/obj/item/clothing/under/color/J in contents) - J.item_state = new_jumpsuit_item_state - J.icon_state = new_jumpsuit_icon_state - J.item_color = wash_color - J.name = new_jumpsuit_name - J.desc = new_desc - J.suit_color = wash_color - J.can_adjust = new_can_adjust - if(new_glove_icon_state && new_glove_item_state && new_glove_name) - for(var/obj/item/clothing/gloves/color/G in contents) - G.item_state = new_glove_item_state - G.icon_state = new_glove_icon_state - G.item_color = wash_color - G.name = new_glove_name - G.desc = new_desc - if(new_shoe_icon_state && new_shoe_name) - for(var/obj/item/clothing/shoes/sneakers/S in contents) - if (S.chained == 1) - S.chained = 0 - S.slowdown = SHOES_SLOWDOWN - new /obj/item/weapon/restraints/handcuffs( src ) - S.icon_state = new_shoe_icon_state - S.item_color = wash_color - S.name = new_shoe_name - S.desc = new_desc - if(new_sheet_icon_state && new_sheet_name) - for(var/obj/item/weapon/bedsheet/B in contents) - B.icon_state = new_sheet_icon_state - B.item_color = wash_color - B.name = new_sheet_name - B.desc = new_desc - if(new_softcap_icon_state && new_softcap_name) - for(var/obj/item/clothing/head/soft/H in contents) - H.icon_state = new_softcap_icon_state - H.item_color = wash_color - H.name = new_softcap_name - H.desc = new_desc - qdel(crayon) - crayon = null +/obj/machinery/washing_machine/clean_blood() + ..() + if(!busy) + bloody_mess = 0 + update_icon() - if( locate(/mob,contents) ) - state = 7 - gibs_ready = 1 - else - state = 4 +/obj/machinery/washing_machine/proc/wash_cycle() + for(var/X in contents) + var/atom/movable/AM = X + AM.clean_blood() + AM.machine_wash(src) + + busy = 0 + if(color_source) + qdel(color_source) + color_source = null update_icon() -/obj/machinery/washing_machine/verb/climb_out() - set name = "Climb out" - set category = "Object" - set src in usr.loc - sleep(20) - if(state in list(1,3,6) ) - usr.loc = src.loc +//what happens to this object when washed inside a washing machine +/atom/movable/proc/machine_wash(obj/machinery/washing_machine/WM) + return + +/obj/item/stack/sheet/hairlesshide/machine_wash(obj/machinery/washing_machine/WM) + var/obj/item/stack/sheet/wetleather/WL = new(loc) + WL.amount = amount + qdel(src) + +/obj/item/clothing/suit/hooded/ian_costume/machine_wash(obj/machinery/washing_machine/WM) + new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi(loc) + qdel(src) + +/obj/item/weapon/paper/machine_wash(obj/machinery/washing_machine/WM) + if(WM.color_source) + if(istype(WM.color_source,/obj/item/toy/crayon)) + var/obj/item/toy/crayon/CR = WM.color_source + color = CR.paint_color + +/mob/living/simple_animal/pet/dog/corgi/machine_wash(obj/machinery/washing_machine/WM) + gib() + +/obj/item/clothing/under/color/machine_wash(obj/machinery/washing_machine/WM) + jumpsuit_wash(WM) + +/obj/item/clothing/under/rank/machine_wash(obj/machinery/washing_machine/WM) + jumpsuit_wash(WM) + +/obj/item/clothing/under/proc/jumpsuit_wash(obj/machinery/washing_machine/WM) + if(WM.color_source) + var/wash_color = WM.color_source.item_color + var/obj/item/clothing/under/U + for(var/T in typesof(/obj/item/clothing/under/color)) + var/obj/item/clothing/under/color/J = T + if(wash_color == initial(J.item_color)) + U = J + break + if(!U) + for(var/T in typesof(/obj/item/clothing/under/rank)) + var/obj/item/clothing/under/rank/R = T + if(wash_color == initial(R.item_color)) + U = R + break + if(U) + item_state = initial(U.item_state) + icon_state = initial(U.icon_state) + item_color = wash_color + name = initial(U.name) + desc = "The colors are a bit dodgy." + can_adjust = initial(U.can_adjust) + if(!can_adjust && adjusted) //we deadjust the uniform if it's now unadjustable + toggle_jumpsuit_adjust() + +/obj/item/clothing/gloves/color/machine_wash(obj/machinery/washing_machine/WM) + if(WM.color_source) + var/wash_color = WM.color_source.item_color + for(var/T in typesof(/obj/item/clothing/gloves/color)) + var/obj/item/clothing/gloves/color/G = T + if(wash_color == initial(G.item_color)) + item_state = initial(G.item_state) + icon_state = initial(G.icon_state) + item_color = wash_color + name = initial(G.name) + desc = "The colors are a bit dodgy." + break + +/obj/item/clothing/shoes/sneakers/machine_wash(obj/machinery/washing_machine/WM) + if(chained) + chained = 0 + slowdown = SHOES_SLOWDOWN + new /obj/item/weapon/restraints/handcuffs(loc) + if(WM.color_source) + var/wash_color = WM.color_source.item_color + for(var/T in typesof(/obj/item/clothing/shoes/sneakers)) + var/obj/item/clothing/shoes/sneakers/S = T + if(wash_color == initial(S.item_color)) + icon_state = initial(S.icon_state) + item_color = wash_color + name = initial(S.name) + desc = "The colors are a bit dodgy." + break + +/obj/item/weapon/bedsheet/machine_wash(obj/machinery/washing_machine/WM) + if(WM.color_source) + var/wash_color = WM.color_source.item_color + for(var/T in typesof(/obj/item/weapon/bedsheet)) + var/obj/item/weapon/bedsheet/B = T + if(wash_color == initial(B.item_color)) + icon_state = initial(B.icon_state) + item_color = wash_color + name = initial(B.name) + desc = "The colors are a bit dodgy." + break + +/obj/item/clothing/head/soft/machine_wash(obj/machinery/washing_machine/WM) + if(WM.color_source) + var/wash_color = WM.color_source.item_color + for(var/T in typesof(/obj/item/clothing/head/soft)) + var/obj/item/clothing/head/soft/H = T + if(wash_color == initial(H.item_color)) + icon_state = initial(H.icon_state) + item_color = wash_color + name = initial(H.name) + desc = "The colors are a bit dodgy." + break + + +/obj/machinery/washing_machine/relaymove(mob/user) + container_resist(user) + +/obj/machinery/washing_machine/container_resist(mob/user) + if(!busy) + add_fingerprint(user) + open_machine() + /obj/machinery/washing_machine/update_icon() - icon_state = "wm_[state]0" + overlays.Cut() + if(busy) + icon_state = "wm_running_[bloody_mess]" + else if(bloody_mess) + icon_state = "wm_[state_open]_blood" + else + var/full = contents.len ? 1 : 0 + icon_state = "wm_[state_open]_[full]" + if(panel_open) + overlays += image(icon, icon_state = "wm_panel") /obj/machinery/washing_machine/attackby(obj/item/weapon/W, mob/user, params) - if(istype(W,/obj/item/toy/crayon) ||istype(W,/obj/item/weapon/stamp)) - if( state in list( 1, 3, 6 ) ) - if(!crayon) - if(!user.drop_item()) - return - crayon = W - crayon.loc = src - else - ..() - else - ..() + if(default_deconstruction_screwdriver(user, null, null, W)) + update_icon() + return else if(istype(W,/obj/item/weapon/grab)) - if(state == 1) + if(state_open) var/obj/item/weapon/grab/G = W if(iscorgi(G.affecting)) + has_corgi = 1 G.affecting.loc = src qdel(G) - state = 3 - else - ..() + update_icon() - else if(istype(W,/obj/item/stack/sheet/hairlesshide) || \ - istype(W,/obj/item/clothing/under) || \ - istype(W,/obj/item/clothing/mask) || \ - istype(W,/obj/item/clothing/head) || \ - istype(W,/obj/item/clothing/gloves) || \ - istype(W,/obj/item/clothing/shoes) || \ - istype(W,/obj/item/clothing/suit) || \ - istype(W,/obj/item/weapon/bedsheet) || \ - istype(W,/obj/item/weapon/paper)) + else if(user.a_intent != "harm") - //YES, it's hardcoded... saves a var/can_be_washed for every single clothing item. - if ( istype(W,/obj/item/clothing/suit/space ) ) - user << "This item does not fit." - return - if ( istype(W,/obj/item/clothing/suit/syndicatefake ) ) - user << "This item does not fit." - return -// if ( istype(W,/obj/item/clothing/suit/powered ) ) -// user << "This item does not fit." -// return - if ( istype(W,/obj/item/clothing/suit/cyborg_suit ) ) - user << "This item does not fit." - return - if ( istype(W,/obj/item/clothing/suit/bomb_suit ) ) - user << "This item does not fit." - return - if ( istype(W,/obj/item/clothing/suit/armor ) ) - user << "This item does not fit." - return - if ( istype(W,/obj/item/clothing/suit/armor ) ) - user << "This item does not fit." - return - if ( istype(W,/obj/item/clothing/mask/gas ) ) - user << "This item does not fit." - return - if ( istype(W,/obj/item/clothing/mask/cigarette ) ) - user << "This item does not fit." - return - if ( istype(W,/obj/item/clothing/head/syndicatefake ) ) - user << "This item does not fit." - return - if ( istype(W,/obj/item/clothing/head/helmet ) ) - user << "This item does not fit." - return - if(W.flags & NODROP) //if "can't drop" item - user << "\The [W] is stuck to your hand, you cannot put it in the washing machine!" - return + if (!state_open) + user << "Open the door first!" + return 1 - if(contents.len < 5) - if ( state in list(1, 3) ) - if(!user.drop_item()) - return - W.loc = src - state = 3 - else - user << "You can't put the item in right now!" - else + if(bloody_mess) + user << "[src] must be cleaned up first." + return 1 + + if(contents.len >= max_wash_capacity) user << "The washing machine is full!" + return 1 + + if(!user.unEquip(W)) + user << "\The [W] is stuck to your hand, you cannot put it in the washing machine!" + return 1 + + if(istype(W,/obj/item/toy/crayon) || istype(W,/obj/item/weapon/stamp)) + color_source = W + W.loc = src + update_icon() + else - ..() - update_icon() + return ..() /obj/machinery/washing_machine/attack_hand(mob/user) - switch(state) - if(1) - state = 2 - if(2) - state = 1 - for(var/atom/movable/O in contents) - O.loc = src.loc - if(3) - state = 4 - if(4) - state = 3 - for(var/atom/movable/O in contents) - O.loc = src.loc - crayon = null - state = 1 - if(5) - user << "The [src] is busy." - if(6) - state = 7 - if(7) - if(gibs_ready) - gibs_ready = 0 - if(locate(/mob,contents)) - var/mob/M = locate(/mob,contents) - M.gib() - for(var/atom/movable/O in contents) - O.loc = src.loc - crayon = null - state = 1 + if(busy) + user << "[src] is busy." + return + + if(!state_open) + open_machine() + else + state_open = 0 //close the door + update_icon() - update_icon() +/obj/machinery/washing_machine/open_machine(drop = 1) + ..() + density = 1 //because machinery/open_machine() sets it to 0 + color_source = null + has_corgi = 0 diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index dfb1f8c5656..c929d74e5ca 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -43,10 +43,12 @@ icon_state = "heal" duration = 15 -/obj/effect/overlay/temp/heal/New() +/obj/effect/overlay/temp/heal/New(loc, colour) ..() pixel_x = rand(-12, 12) pixel_y = rand(-9, 0) + if(colour) + color = colour /obj/effect/overlay/temp/explosion name = "explosion" diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 1536d5f1f85..7c61b5d152f 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -575,7 +575,22 @@ obj/item/proc/item_action_slot_check(slot, mob/user) /obj/item/proc/is_sharp() return sharpness -/obj/item/proc/can_dismember() - if((sharpness || damtype == BURN) && w_class >= 3) - return 1 - return 0 \ No newline at end of file +/obj/item/proc/get_dismemberment_chance(obj/item/bodypart/affecting) + if(affecting.can_dismember(src)) + if((sharpness || damtype == BURN) && w_class >= 3) + . = force*(w_class-1) + +/obj/item/proc/get_dismember_sound() + if(damtype == BURN) + . = 'sound/weapons/sear.ogg' + else + . = pick('sound/misc/desceration-01.ogg', 'sound/misc/desceration-02.ogg', 'sound/misc/desceration-03.ogg') + +/obj/item/proc/open_flame() + var/turf/location = loc + if(ismob(location)) + var/mob/M = location + if(M.l_hand == src || M.r_hand == src) + location = get_turf(M) + if(isturf(location)) + location.hotspot_expose(700, 5) diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm index 9a20f3b8e37..eced5d1af07 100644 --- a/code/game/objects/items/candle.dm +++ b/code/game/objects/items/candle.dm @@ -1,22 +1,23 @@ #define CANDLE_LUMINOSITY 2 /obj/item/candle name = "red candle" - desc = "a candle" + desc = "In Greek myth, Prometheus stole fire from the Gods and gave it to \ + humankind. The jewelry he kept for himself." icon = 'icons/obj/candle.dmi' icon_state = "candle1" item_state = "candle1" w_class = 1 var/wax = 200 - var/lit = 0 - var/infinite = 0 - var/start_lit = 0 + var/lit = FALSE + var/infinite = FALSE + var/start_lit = FALSE heat = 1000 /obj/item/candle/New() ..() if(start_lit) // No visible message - light(null) + light(show_message = FALSE) /obj/item/candle/update_icon() var/i @@ -56,12 +57,13 @@ light() //honk return -/obj/item/candle/proc/light(flavor_text = "[usr] lights the [name].") +/obj/item/candle/proc/light(show_message) if(!src.lit) - src.lit = 1 + src.lit = TRUE //src.damtype = "fire" - if(flavor_text) - usr.visible_message(flavor_text) + if(show_message) + usr.visible_message( + "[usr] lights the [name].") SetLuminosity(CANDLE_LUMINOSITY) SSobj.processing |= src update_icon() @@ -79,14 +81,13 @@ M.unEquip(src, 1) //src is being deleted anyway qdel(src) update_icon() - if(istype(loc, /turf)) //start a fire if possible - var/turf/T = loc - T.hotspot_expose(700, 5) - + open_flame() /obj/item/candle/attack_self(mob/user) if(lit) - lit = 0 + user.visible_message( + "[user] snuffs [src].") + lit = FALSE update_icon() SetLuminosity(0) user.AddLuminosity(-CANDLE_LUMINOSITY) @@ -110,7 +111,7 @@ /obj/item/candle/infinite - infinite = 1 - start_lit = 1 + infinite = TRUE + start_lit = TRUE #undef CANDLE_LUMINOSITY diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index c101d2fbb61..79848f024f5 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -1,43 +1,263 @@ + +/* + * Crayons + */ + +/obj/item/toy/crayon + name = "crayon" + desc = "A colourful crayon. Looks tasty. Mmmm..." + icon = 'icons/obj/crayons.dmi' + icon_state = "crayonred" + item_color = "red" + w_class = 1 + attack_verb = list("attacked", "coloured") + var/paint_color = "#FF0000" //RGB + var/drawtype = "rune" + var/text_buffer = "" + var/list/graffiti = list("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","body","cyka","arrow","star","poseur tag") + var/list/letters = list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z") + var/list/numerals = list("0","1","2","3","4","5","6","7","8","9") + var/list/oriented = list("arrow","body") // These turn to face the same way as the drawer + var/uses = 30 //-1 or less for unlimited uses + var/instant = 0 + var/dat + var/list/validSurfaces = list(/turf/open/floor) + var/gang = 0 //For marking territory + var/edible = 1 + +/obj/item/toy/crayon/suicide_act(mob/user) + user.visible_message("[user] is jamming the [src.name] up \his nose and into \his brain. It looks like \he's trying to commit suicide.") + return (BRUTELOSS|OXYLOSS) + +/obj/item/toy/crayon/New() + ..() + name = "[item_color] crayon" //Makes crayons identifiable in things like grinders + drawtype = pick(pick(graffiti), pick(letters), "rune[rand(1,6)]") + if(config) + if(config.mutant_races == 1) + graffiti |= "antilizard" + graffiti |= "prolizard" + +/obj/item/toy/crayon/initialize() + if(config.mutant_races == 1) + graffiti |= "antilizard" + graffiti |= "prolizard" + +/obj/item/toy/crayon/attack_self(mob/living/user) + update_window(user) + +/obj/item/toy/crayon/proc/update_window(mob/living/user) + dat += "

Currently selected: [drawtype]


" + dat += "Random letterPick letter/number" + dat += "Write" + dat += "
" + dat += "

Runes:


" + dat += "Random rune" + for(var/i = 1; i <= 6; i++) + dat += "Rune[i]" + if(!((i + 1) % 3)) //3 buttons in a row + dat += "
" + dat += "
" + graffiti.Find() + dat += "

Graffiti:


" + dat += "Random graffiti" + var/c = 1 + for(var/T in graffiti) + dat += "[T]" + if(!((c + 1) % 3)) //3 buttons in a row + dat += "
" + c++ + dat += "
" + var/datum/browser/popup = new(user, "crayon", name, 300, 500) + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + dat = "" + +/obj/item/toy/crayon/proc/crayon_text_strip(text) + var/list/base = char_split(lowertext(text)) + var/list/out = list() + for(var/a in base) + if(a in (letters|numerals)) + out += a + return jointext(out,"") + +/obj/item/toy/crayon/Topic(href, href_list, hsrc) + var/temp = "a" + if(href_list["buffer"]) + text_buffer = crayon_text_strip(stripped_input(usr,"Choose what to write.", "Scribbles",default = text_buffer)) + if(href_list["type"]) + switch(href_list["type"]) + if("random_letter") + temp = pick(letters) + if("letter") + temp = input("Choose what to write.", "Scribbles") in (letters|numerals) + if("random_rune") + temp = "rune[rand(1,6)]" + if("random_graffiti") + temp = pick(graffiti) + else + temp = href_list["type"] + if ((usr.restrained() || usr.stat || usr.get_active_hand() != src)) + return + drawtype = temp + update_window(usr) + +/obj/item/toy/crayon/afterattack(atom/target, mob/user, proximity) + if(!proximity || !check_allowed_items(target)) return + if(!uses) + user << "There is no more of [src.name] left!" + if(!instant) + qdel(src) + return + if(istype(target, /obj/effect/decal/cleanable)) + target = target.loc + if(is_type_in_list(target,validSurfaces)) + + var/temp = "rune" + if(letters.Find(drawtype)) + temp = "letter" + else if(graffiti.Find(drawtype)) + temp = "graffiti" + else if(numerals.Find(drawtype)) + temp = "number" + + ////////////////////////// GANG FUNCTIONS + var/area/territory + var/gangID + if(gang) + //Determine gang affiliation + gangID = user.mind.gang_datum + + //Check area validity. Reject space, player-created areas, and non-station z-levels. + if(gangID) + territory = get_area(target) + if(territory && (territory.z == ZLEVEL_STATION) && territory.valid_territory) + //Check if this area is already tagged by a gang + if(!(locate(/obj/effect/decal/cleanable/crayon/gang) in target)) //Ignore the check if the tile being sprayed has a gang tag + if(territory_claimed(territory, user)) + return + if(locate(/obj/machinery/power/apc) in (user.loc.contents | target.contents)) + user << "You cannot tag here." + return + else + user << "[territory] is unsuitable for tagging." + return + ///////////////////////////////////////// + + var/graf_rot + if(oriented.Find(drawtype)) + switch(user.dir) + if(EAST) + graf_rot = 90 + if(SOUTH) + graf_rot = 180 + if(WEST) + graf_rot = 270 + else + graf_rot = 0 + + user << "You start [instant ? "spraying" : "drawing"] a [temp] on the [target.name]..." + if(instant) + playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5) + if((instant>0) || do_after(user, 50, target = target)) + + if(length(text_buffer)) + drawtype = copytext(text_buffer,1,2) + text_buffer = copytext(text_buffer,2) + + //Gang functions + if(gangID) + //Delete any old markings on this tile, including other gang tags + if(!(locate(/obj/effect/decal/cleanable/crayon/gang) in target)) //Ignore the check if the tile being sprayed has a gang tag + if(territory_claimed(territory, user)) + return + for(var/obj/effect/decal/cleanable/crayon/old_marking in target) + qdel(old_marking) + new /obj/effect/decal/cleanable/crayon/gang(target,gangID,"graffiti",graf_rot) + user << "You tagged [territory] for your gang!" + + else + new /obj/effect/decal/cleanable/crayon(target,paint_color,drawtype,temp,graf_rot) + + user << "You finish [instant ? "spraying" : "drawing"] \the [temp]." + if(instant<0) + playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5) + if(uses < 0) + return + uses = max(0,uses-1) + if(!uses) + user << "There is no more of [src.name] left!" + if(!instant) + qdel(src) + return + +/obj/item/toy/crayon/attack(mob/M, mob/user) + if(edible && (M == user)) + user << "You take a bite of the [src.name]. Delicious!" + user.nutrition += 5 + if(uses < 0) + return + uses = max(0,uses-5) + if(!uses) + user << "There is no more of [src.name] left!" + qdel(src) + else + ..() + +/obj/item/toy/crayon/proc/territory_claimed(area/territory,mob/user) + var/occupying_gang + for(var/datum/gang/G in ticker.mode.gangs) + if(territory.type in (G.territory|G.territory_new)) + occupying_gang = G.name + break + if(occupying_gang) + user << "[territory] has already been tagged by the [occupying_gang] gang! You must get rid of or spray over the old tag first!" + return 1 + return 0 + + + /obj/item/toy/crayon/red icon_state = "crayonred" paint_color = "#DA0000" - colourName = "red" + item_color = "red" /obj/item/toy/crayon/orange icon_state = "crayonorange" paint_color = "#FF9300" - colourName = "orange" + item_color = "orange" /obj/item/toy/crayon/yellow icon_state = "crayonyellow" paint_color = "#FFF200" - colourName = "yellow" + item_color = "yellow" /obj/item/toy/crayon/green icon_state = "crayongreen" paint_color = "#A8E61D" - colourName = "green" + item_color = "green" /obj/item/toy/crayon/blue icon_state = "crayonblue" paint_color = "#00B7EF" - colourName = "blue" + item_color = "blue" /obj/item/toy/crayon/purple icon_state = "crayonpurple" paint_color = "#DA00FF" - colourName = "purple" + item_color = "purple" /obj/item/toy/crayon/white icon_state = "crayonwhite" paint_color = "#FFFFFF" - colourName = "white" + item_color = "white" /obj/item/toy/crayon/mime icon_state = "crayonmime" desc = "A very sad-looking crayon." paint_color = "#FFFFFF" - colourName = "mime" + item_color = "mime" uses = -1 /obj/item/toy/crayon/mime/attack_self(mob/living/user) @@ -62,7 +282,7 @@ /obj/item/toy/crayon/rainbow icon_state = "crayonrainbow" paint_color = "#FFF000" - colourName = "rainbow" + item_color = "rainbow" uses = -1 /obj/item/toy/crayon/rainbow/attack_self(mob/living/user) @@ -110,12 +330,12 @@ /obj/item/weapon/storage/crayons/update_icon() overlays.Cut() for(var/obj/item/toy/crayon/crayon in contents) - overlays += image('icons/obj/crayons.dmi',crayon.colourName) + overlays += image('icons/obj/crayons.dmi',crayon.item_color) /obj/item/weapon/storage/crayons/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/toy/crayon)) var/obj/item/toy/crayon/C = W - switch(C.colourName) + switch(C.item_color) if("mime") usr << "This crayon is too sad to be contained in this box." return diff --git a/code/game/objects/items/devices/PDA/PDA_types.dm b/code/game/objects/items/devices/PDA/PDA_types.dm index 3ee33acd12f..b3c9fa46254 100644 --- a/code/game/objects/items/devices/PDA/PDA_types.dm +++ b/code/game/objects/items/devices/PDA/PDA_types.dm @@ -9,7 +9,7 @@ /obj/item/device/pda/clown/Crossed(AM as mob|obj) if (istype(AM, /mob/living/carbon)) var/mob/living/carbon/M = AM - if(M.slip(8, 5, src, NO_SLIP_WHEN_WALKING)) + if(M.slip(0, 6, src, NO_SLIP_WHEN_WALKING)) if (ishuman(M) && (M.real_name != src.owner)) if (istype(src.cartridge, /obj/item/weapon/cartridge/clown)) var/obj/item/weapon/cartridge/clown/cart = src.cartridge @@ -197,4 +197,4 @@ /obj/item/device/pda/geneticist name = "geneticist PDA" default_cartridge = /obj/item/weapon/cartridge/medical - icon_state = "pda-genetics" \ No newline at end of file + icon_state = "pda-genetics" diff --git a/code/game/objects/items/devices/modificationkit.dm b/code/game/objects/items/devices/modificationkit.dm new file mode 100644 index 00000000000..aefc9aca26d --- /dev/null +++ b/code/game/objects/items/devices/modificationkit.dm @@ -0,0 +1,23 @@ +/obj/item/modkit + name = "modification kit" + desc = "A one-use kit, which enables kinetic accelerators to be fired with only one hand, as well as allowing less dextrous races to use the tool." + icon = 'icons/obj/objects.dmi' + icon_state = "modkit" + origin_tech = "programming=2;materials=2;magnets=4" + var/uses = 1 + +/obj/item/modkit/afterattack(obj/item/weapon/gun/energy/kinetic_accelerator/C, mob/user) + ..() + if(!uses) + qdel(src) + return + if(!istype(C)) + user << "This kit can only modify kinetic accelerators!" + return ..() + user <<"You modify the [C], making it less unwieldy." + C.name = "compact [C.name]" + C.weapon_weight = WEAPON_LIGHT + C.trigger_guard = TRIGGER_GUARD_ALLOW_ALL + uses -- + if(!uses) + qdel(src) \ No newline at end of file diff --git a/code/game/objects/items/documents.dm b/code/game/objects/items/documents.dm index b3335fd4898..043fcd80cb0 100644 --- a/code/game/objects/items/documents.dm +++ b/code/game/objects/items/documents.dm @@ -50,8 +50,8 @@ user << "You have already forged a seal on [src]!" else var/obj/item/toy/crayon/C = O - name = "[C.colourName] secret documents" - icon_state = "docs_[C.colourName]" - forgedseal = C.colourName - user << "You forge the official seal with a [C.colourName] crayon. No one will notice... right?" + name = "[C.item_color] secret documents" + icon_state = "docs_[C.item_color]" + forgedseal = C.item_color + user << "You forge the official seal with a [C.item_color] crayon. No one will notice... right?" update_icon() \ No newline at end of file diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index ce91a198c11..0b5fa01aff8 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -63,6 +63,7 @@ var/global/list/datum/stack_recipe/sandstone_recipes = list ( \ icon_state = "sandbags" singular_name = "sandbag" force = 5 + layer = 2.95 throwforce = 5 w_class = 3 throw_speed = 1 diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 6ff3d3ff714..24f20ce70c5 100755 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -323,223 +323,6 @@ attack_verb = list("attacked", "slashed", "stabbed", "sliced") hitsound = 'sound/weapons/bladeslice.ogg' -/* - * Crayons - */ - -/obj/item/toy/crayon - name = "crayon" - desc = "A colourful crayon. Looks tasty. Mmmm..." - icon = 'icons/obj/crayons.dmi' - icon_state = "crayonred" - w_class = 1 - attack_verb = list("attacked", "coloured") - var/paint_color = "#FF0000" //RGB - var/drawtype = "rune" - var/text_buffer = "" - var/list/graffiti = list("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","body","cyka","arrow","star","poseur tag") - var/list/letters = list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z") - var/list/numerals = list("0","1","2","3","4","5","6","7","8","9") - var/list/oriented = list("arrow","body") // These turn to face the same way as the drawer - var/uses = 30 //-1 or less for unlimited uses - var/instant = 0 - var/colourName = "red" //for updateIcon purposes - var/dat - var/list/validSurfaces = list(/turf/open/floor) - var/gang = 0 //For marking territory - var/edible = 1 - -/obj/item/toy/crayon/suicide_act(mob/user) - user.visible_message("[user] is jamming the [src.name] up \his nose and into \his brain. It looks like \he's trying to commit suicide.") - return (BRUTELOSS|OXYLOSS) - -/obj/item/toy/crayon/New() - ..() - name = "[colourName] crayon" //Makes crayons identifiable in things like grinders - drawtype = pick(pick(graffiti), pick(letters), "rune[rand(1,6)]") - if(config) - if(config.mutant_races == 1) - graffiti |= "antilizard" - graffiti |= "prolizard" - -/obj/item/toy/crayon/initialize() - if(config.mutant_races == 1) - graffiti |= "antilizard" - graffiti |= "prolizard" - -/obj/item/toy/crayon/attack_self(mob/living/user) - update_window(user) - -/obj/item/toy/crayon/proc/update_window(mob/living/user) - dat += "

Currently selected: [drawtype]


" - dat += "Random letterPick letter/number" - dat += "Write" - dat += "
" - dat += "

Runes:


" - dat += "Random rune" - for(var/i = 1; i <= 6; i++) - dat += "Rune[i]" - if(!((i + 1) % 3)) //3 buttons in a row - dat += "
" - dat += "
" - graffiti.Find() - dat += "

Graffiti:


" - dat += "Random graffiti" - var/c = 1 - for(var/T in graffiti) - dat += "[T]" - if(!((c + 1) % 3)) //3 buttons in a row - dat += "
" - c++ - dat += "
" - var/datum/browser/popup = new(user, "crayon", name, 300, 500) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - dat = "" - -/obj/item/toy/crayon/proc/crayon_text_strip(text) - var/list/base = char_split(lowertext(text)) - var/list/out = list() - for(var/a in base) - if(a in (letters|numerals)) - out += a - return jointext(out,"") - -/obj/item/toy/crayon/Topic(href, href_list, hsrc) - var/temp = "a" - if(href_list["buffer"]) - text_buffer = crayon_text_strip(stripped_input(usr,"Choose what to write.", "Scribbles",default = text_buffer)) - if(href_list["type"]) - switch(href_list["type"]) - if("random_letter") - temp = pick(letters) - if("letter") - temp = input("Choose what to write.", "Scribbles") in (letters|numerals) - if("random_rune") - temp = "rune[rand(1,6)]" - if("random_graffiti") - temp = pick(graffiti) - else - temp = href_list["type"] - if ((usr.restrained() || usr.stat || usr.get_active_hand() != src)) - return - drawtype = temp - update_window(usr) - -/obj/item/toy/crayon/afterattack(atom/target, mob/user, proximity) - if(!proximity || !check_allowed_items(target)) return - if(!uses) - user << "There is no more of [src.name] left!" - if(!instant) - qdel(src) - return - if(istype(target, /obj/effect/decal/cleanable)) - target = target.loc - if(is_type_in_list(target,validSurfaces)) - - var/temp = "rune" - if(letters.Find(drawtype)) - temp = "letter" - else if(graffiti.Find(drawtype)) - temp = "graffiti" - else if(numerals.Find(drawtype)) - temp = "number" - - ////////////////////////// GANG FUNCTIONS - var/area/territory - var/gangID - if(gang) - //Determine gang affiliation - gangID = user.mind.gang_datum - - //Check area validity. Reject space, player-created areas, and non-station z-levels. - if(gangID) - territory = get_area(target) - if(territory && (territory.z == ZLEVEL_STATION) && territory.valid_territory) - //Check if this area is already tagged by a gang - if(!(locate(/obj/effect/decal/cleanable/crayon/gang) in target)) //Ignore the check if the tile being sprayed has a gang tag - if(territory_claimed(territory, user)) - return - if(locate(/obj/machinery/power/apc) in (user.loc.contents | target.contents)) - user << "You cannot tag here." - return - else - user << "[territory] is unsuitable for tagging." - return - ///////////////////////////////////////// - - var/graf_rot - if(oriented.Find(drawtype)) - switch(user.dir) - if(EAST) - graf_rot = 90 - if(SOUTH) - graf_rot = 180 - if(WEST) - graf_rot = 270 - else - graf_rot = 0 - - user << "You start [instant ? "spraying" : "drawing"] a [temp] on the [target.name]..." - if(instant) - playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5) - if((instant>0) || do_after(user, 50, target = target)) - - if(length(text_buffer)) - drawtype = copytext(text_buffer,1,2) - text_buffer = copytext(text_buffer,2) - - //Gang functions - if(gangID) - //Delete any old markings on this tile, including other gang tags - if(!(locate(/obj/effect/decal/cleanable/crayon/gang) in target)) //Ignore the check if the tile being sprayed has a gang tag - if(territory_claimed(territory, user)) - return - for(var/obj/effect/decal/cleanable/crayon/old_marking in target) - qdel(old_marking) - new /obj/effect/decal/cleanable/crayon/gang(target,gangID,"graffiti",graf_rot) - user << "You tagged [territory] for your gang!" - - else - new /obj/effect/decal/cleanable/crayon(target,paint_color,drawtype,temp,graf_rot) - - user << "You finish [instant ? "spraying" : "drawing"] \the [temp]." - if(instant<0) - playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5) - if(uses < 0) - return - uses = max(0,uses-1) - if(!uses) - user << "There is no more of [src.name] left!" - if(!instant) - qdel(src) - return - -/obj/item/toy/crayon/attack(mob/M, mob/user) - if(edible && (M == user)) - user << "You take a bite of the [src.name]. Delicious!" - user.nutrition += 5 - if(uses < 0) - return - uses = max(0,uses-5) - if(!uses) - user << "There is no more of [src.name] left!" - qdel(src) - else - ..() - -/obj/item/toy/crayon/proc/territory_claimed(area/territory,mob/user) - var/occupying_gang - for(var/datum/gang/G in ticker.mode.gangs) - if(territory.type in (G.territory|G.territory_new)) - occupying_gang = G.name - break - if(occupying_gang) - user << "[territory] has already been tagged by the [occupying_gang] gang! You must get rid of or spray over the old tag first!" - return 1 - return 0 - /* * Snap pops */ @@ -674,50 +457,6 @@ icon_state = "reticenceprize" quiet = 1 -/* - * AI core prizes - */ -/obj/item/toy/AI - name = "toy AI" - desc = "A little toy model AI core with real law announcing action!" - icon = 'icons/obj/toy.dmi' - icon_state = "AI" - w_class = 2 - var/cooldown = 0 - -/obj/item/toy/AI/attack_self(mob/user) - if(!cooldown) //for the sanity of everyone - var/message = generate_ion_law() - user << "You press the button on [src]." - playsound(user, 'sound/machines/click.ogg', 20, 1) - src.loc.visible_message("\icon[src] [message]") - cooldown = 1 - spawn(30) cooldown = 0 - return - ..() - -/obj/item/toy/codex_gigas - name = "Toy Codex Gigas" - desc = "A tool to help you write fictional devils!" - icon = 'icons/obj/library.dmi' - icon_state = "demonomicon" - w_class = 2 - var/cooldown = 0 - -/obj/item/toy/codex_gigas/attack_self(mob/user) - if(!cooldown) - var/datum/devilinfo/devil = randomDevilInfo() - user << "You press the button on [src]." - cooldown = 1 - playsound(user, 'sound/machines/click.ogg', 20, 1) - src.loc.visible_message("\icon[src]Some fun facts about: [devil.truename]") - src.loc.visible_message("[lawlorify[LORE][devil.bane]]") - src.loc.visible_message("[lawlorify[LORE][devil.obligation]]") - src.loc.visible_message("[lawlorify[LORE][devil.ban]]") - src.loc.visible_message("[lawlorify[LORE][devil.banish]]") - spawn(60) cooldown = 0 - return - ..() /obj/item/toy/talking name = "talking action figure" @@ -725,37 +464,175 @@ icon = 'icons/obj/toy.dmi' icon_state = "owlprize" w_class = 2 - var/cooldown = 0 + var/cooldown = FALSE var/messages = list("I'm super generic!", "Mathematics class is of variable difficulty!") var/span = "danger" var/recharge_time = 30 + var/chattering = FALSE + var/phomeme + +// Talking toys are language universal, and thus all species can use them +/obj/item/toy/talking/attack_alien(mob/user) + . = attack_hand(user) + /obj/item/toy/talking/attack_self(mob/user) if(!cooldown) - var/message = pick(messages) - user << "You pull the string on the [src]." - toy_talk(user, message) - cooldown = 1 - spawn(recharge_time) cooldown = 0 + var/list/messages = generate_messages() + activation_message(user) + playsound(loc, 'sound/machines/click.ogg', 20, 1) + + spawn(0) + for(var/message in messages) + toy_talk(user, message) + sleep(10) + + cooldown = TRUE + spawn(recharge_time) + cooldown = FALSE return ..() -/obj/item/toy/talking/proc/toy_talk(user, message) - playsound(user, 'sound/machines/click.ogg', 20, 1) - src.loc.visible_message("\icon[src] [message]") +/obj/item/toy/talking/proc/activation_message(mob/user) + user.visible_message( + "[user] pulls the string on \the [src].", + "You pull the string on \the [src].", + "You hear a string being pulled.") + +/obj/item/toy/talking/proc/generate_messages() + return list(pick(messages)) + +/obj/item/toy/talking/proc/toy_talk(mob/user, message) + user.loc.visible_message("\icon[src] [message]") + if(chattering) + chatter(message, phomeme, user) + +/* + * AI core prizes + */ +/obj/item/toy/talking/AI + name = "toy AI" + desc = "A little toy model AI core with real law announcing action!" + icon_state = "AI" + +/obj/item/toy/talking/AI/generate_messages() + return list(generate_ion_law()) + +/obj/item/toy/talking/codex_gigas + name = "Toy Codex Gigas" + desc = "A tool to help you write fictional devils!" + icon = 'icons/obj/library.dmi' + icon_state = "demonomicon" + w_class = 2 + recharge_time = 60 + +/obj/item/toy/talking/codex_gigas/activation_message(mob/user) + user.visible_message( + "[user] presses the button on \the [src].", + "You press the button on \the [src].", + "You hear a soft click.") + +/obj/item/toy/talking/codex_gigas/generate_messages() + var/datum/devilinfo/devil = randomDevilInfo() + var/list/messages = list() + messages += "Some fun facts about: [devil.truename]" + messages += "[lawlorify[LORE][devil.bane]]" + messages += "[lawlorify[LORE][devil.obligation]]" + messages += "[lawlorify[LORE][devil.ban]]" + messages += "[lawlorify[LORE][devil.banish]]" + return messages /obj/item/toy/talking/owl name = "owl action figure" desc = "An action figure modeled after 'The Owl', defender of justice." icon_state = "owlprize" messages = list("You won't get away this time, Griffin!", "Stop right there, criminal!", "Hoot! Hoot!", "I am the night!") + chattering = TRUE + phomeme = "owl" /obj/item/toy/talking/griffin name = "griffin action figure" desc = "An action figure modeled after 'The Griffin', criminal mastermind." icon_state = "griffinprize" messages = list("You can't stop me, Owl!", "My plan is flawless! The vault is mine!", "Caaaawwww!", "You will never catch me!") + chattering = TRUE + phomeme = "griffin" +/obj/item/toy/talking/skeleton + name = "skeleton action figure" + desc = "An action figure modeled after 'Oh-cee', the original content \ + skeleton.\nNot suitable for infants or assistants under 36 months \ + of age." + icon_state = "skeletonprize" + attack_verb = list("boned", "dunked on", "worked down to the bone") + chattering = TRUE + + var/list/regular_messages = list( + "Why was the skeleton such a bad liar? \ + Because you can see right through him!", + "When does a skeleton laugh? When something tickles his funny bone!", + "Why couldn't the skeleton win the beauty contest? \ + Because he had no body!", + "What do you call a skeleton in the winter? A numbskull!", + "What did the skeleton say before eating? Bone appetit!", + "What type of art do skeletons like? Skulltures!", + "What instrument do skeletons play? The trom-bone!", + "Why are skeletons always so calm? \ + Because nothing gets under their skin!", + "How did the skeleton know it was going to rain? \ + He could feel it in his bones.", + "Why did the skeleton go to the hospital? \ + To get his ghoul stones removed.", + "Why can't skeletons play music in churches? \ + Because they have no organs.", + "There's a skeleton inside everyone! Except slime people I guess...", + "The birds are too busy to notice me acting in the shadows!", + "Giraffes have the same number of bones in their necks as humans. \ + You should never trust a giraffe.", + "When I meet a dog in the street, I always offer it a bone!", + "In corsetry, a bone is one of the rigid parts of a corset that \ + forms its frame and gives it rigidity.", + "A person who plays the trombone is called a trombonist or \ + trombone player.", + "Remember, compromise is for those without backbones!", + "If you go up to the captain and say the word 'bone' repeatedly, \ + eventually he'll brig you.", + "Yo ho ho, shiver me bones!", + "So what you're saying is, you only love me for my legs?", + "You will never again find socks that match!", + "BONES! BONES! BONES!", + "Bones absorb x-rays, which is why radiation gives you superpowers.", + "Oh-cee! The ORIGINAL CONTENT SKELETON. Suitable for ages 36 months \ + and up.", + "I just don't have the heart to judge you.", + "I don't have the stomach for this.", + "I'm a fighter, not a liver.", + "How can I see without eyeballs?", + "Ask your parents about 'boning', before you get pregnant.", + "Remember, a dog is for life, not just for christmas.") + +/obj/item/toy/talking/skeleton/suicide_act(mob/user) + user.visible_message("[user] is trying to commit \ + suicide with \the [src].") + + if(ishuman(user)) + var/mob/living/carbon/human/H = user + H.set_species(/datum/species/skeleton) + + toy_talk(user, "RATTLE ME BONES") + + user.Stun(5) + sleep(20) + return OXYLOSS + +/obj/item/toy/talking/skeleton/generate_messages() + return list(pick(regular_messages)) + +/obj/item/toy/talking/skeleton/toy_talk(user, message) + phomeme = pick("sans", "papyrus") + + span = "danger [phomeme]" + ..() /* || A Deck of Cards for playing various games of chance || diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index ccc8fc78ce6..a0279af71e9 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -134,4 +134,29 @@ desc = "Damn son, where'd you find this?" icon_state = "air_horn" honksound = 'sound/items/AirHorn2.ogg' - cooldowntime = 50 \ No newline at end of file + cooldowntime = 50 + +/obj/item/weapon/bikehorn/golden + name = "golden bike horn" + desc = "Golden? Clearly, its made with bananium! Honk!" + icon_state = "gold_horn" + item_state = "gold_horn" + +/obj/item/weapon/bikehorn/golden/attack() + ..() + flip_mobs() + +/obj/item/weapon/bikehorn/golden/attack_self(mob/user) + ..() + flip_mobs() + + +/obj/item/weapon/bikehorn/golden/proc/flip_mobs(mob/living/carbon/M, mob/user) + if (!spam_flag) + var/turf/T = get_turf(src) + for(M in ohearers(7, T)) + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + if((istype(H.ears, /obj/item/clothing/ears/earmuffs)) || H.ear_deaf) + continue + M.emote("flip") \ No newline at end of file diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index 205336bfb04..520d043a9ba 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -167,6 +167,7 @@ name = "high frequency blade" desc = "Bad references are the DNA of the soul." attack_verb = list("chopped", "sliced", "cut", "zandatsu'd") + hitsound = 'sound/weapons/bladeslice.ogg' /obj/item/weapon/nullrod/hammmer icon_state = "hammeron" diff --git a/code/game/objects/items/weapons/implants/implant_track.dm b/code/game/objects/items/weapons/implants/implant_track.dm index 7443a22ab3e..a0d58369614 100644 --- a/code/game/objects/items/weapons/implants/implant_track.dm +++ b/code/game/objects/items/weapons/implants/implant_track.dm @@ -13,6 +13,13 @@ ..() tracked_implants -= src +/obj/item/weapon/implanter/tracking/New() + imp = new /obj/item/weapon/implant/tracking( src ) + ..() +/obj/item/weapon/implanter/tracking/gps/New() + imp = new /obj/item/device/gps/mining/internal( src ) + ..() + /obj/item/weapon/implant/tracking/get_data() var/dat = {"Implant Specifications:
Name: Tracking Beacon
diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index 9d3ac9f9fbc..c871f8bcab4 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -111,6 +111,16 @@ /obj/item/weapon/kitchen/knife/combat/survival name = "survival knife" + icon_state = "survivalknife" + desc = "A hunting grade survival knife." + force = 15 + throwforce = 15 + +/obj/item/weapon/kitchen/knife/combat/bone + name = "bone dagger" + item_state = "bone_dagger" + icon_state = "bone_dagger" + desc = "A sharpened bone. The bare mimimum in survival." force = 15 throwforce = 15 diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 8b4549cc406..78ef3d2dea7 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -62,6 +62,7 @@ desc = "Can hold various medical equipment." icon_state = "medicalbelt" item_state = "medical" + max_w_class = 4 can_hold = list( /obj/item/device/healthanalyzer, /obj/item/weapon/dnainjector, @@ -80,7 +81,29 @@ /obj/item/device/rad_laser, /obj/item/device/sensor_device, /obj/item/device/radio, - /obj/item/clothing/gloves/ + /obj/item/clothing/gloves/, + /obj/item/weapon/lazarus_injector, + /obj/item/weapon/bikehorn/rubberducky, + /obj/item/clothing/mask/surgical, + /obj/item/clothing/mask/breath, + /obj/item/clothing/mask/breath/medical, + /obj/item/weapon/surgical_drapes, //for true paramedics + /obj/item/weapon/scalpel, + /obj/item/weapon/circular_saw, + /obj/item/weapon/surgicaldrill, + /obj/item/weapon/retractor, + /obj/item/weapon/cautery, + /obj/item/weapon/hemostat, + /obj/item/device/geiger_counter, + /obj/item/clothing/tie/stethoscope, + /obj/item/weapon/stamp, + /obj/item/clothing/glasses, + /obj/item/weapon/wrench/medical, + /obj/item/clothing/mask/muzzle, + /obj/item/weapon/storage/bag/chemistry, + /obj/item/weapon/storage/bag/bio, + /obj/item/weapon/reagent_containers/blood, + /obj/item/weapon/tank/internals/emergency_oxygen ) diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 6538bba7f06..03ccef5fd1d 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -57,37 +57,45 @@ return ..() -/obj/item/weapon/storage/box/survival - +// Ordinary survival box /obj/item/weapon/storage/box/survival/New() ..() 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) -/obj/item/weapon/storage/box/engineer +/obj/item/weapon/storage/box/survival/radio/New() + ..() + new /obj/item/device/radio/off(src) +// Engineer survival box /obj/item/weapon/storage/box/engineer/New() ..() 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) -/obj/item/weapon/storage/box/syndie +/obj/item/weapon/storage/box/engineer/radio/New() + ..() + new /obj/item/device/radio/off(src) +// Syndie survival box /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 - +// Security survival box /obj/item/weapon/storage/box/security/New() ..() 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) +/obj/item/weapon/storage/box/security/radio/New() + ..() + new /obj/item/device/radio/off(src) + /obj/item/weapon/storage/box/gloves name = "box of latex gloves" desc = "Contains sterile latex gloves." @@ -231,6 +239,19 @@ new /obj/item/weapon/implantpad(src) new /obj/item/weapon/locator(src) +/obj/item/weapon/storage/box/minertracker + name = "boxed tracking implant kit" + desc = "For finding those who have died on the accursed lavaworld." + icon_state = "implant" + +/obj/item/weapon/storage/box/minertracker/New() + ..() + for(var/i in 1 to 3) + new /obj/item/weapon/implantcase/tracking(src) + new /obj/item/weapon/implanter(src) + new /obj/item/weapon/implantpad(src) + new /obj/item/weapon/locator(src) + /obj/item/weapon/storage/box/chemimp name = "boxed chemical implant kit" desc = "Box of stuff used to implant chemicals." diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm index 248f0c7b116..e10c5776a88 100644 --- a/code/game/objects/items/weapons/storage/lockbox.dm +++ b/code/game/objects/items/weapons/storage/lockbox.dm @@ -27,6 +27,7 @@ if(locked) icon_state = icon_locked user << "You lock the [src.name]!" + close_all() return else icon_state = icon_closed diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 83842b332a8..9f7b37c2542 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -290,14 +290,9 @@ remove_fuel(1) update_icon() + //This is to start fires. process() is only called if the welder is on. - var/turf/location = loc - if(ismob(location)) - var/mob/M = location - if(M.l_hand == src || M.r_hand == src) - location = get_turf(M) - if(isturf(location)) - location.hotspot_expose(700, 5) + open_flame() /obj/item/weapon/weldingtool/afterattack(atom/O, mob/user, proximity) diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 7be9a8efa30..2419cd93645 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -5,6 +5,7 @@ * Double-Bladed Energy Swords * Spears * CHAINSAWS + * Bone Axe and Spear */ /*################################################################## @@ -390,9 +391,9 @@ var/datum/action/A = X A.UpdateButtonIcon() -/obj/item/weapon/twohanded/required/chainsaw/can_dismember() - return wielded - +/obj/item/weapon/twohanded/required/chainsaw/get_dismemberment_chance() + if(wielded) + . = ..() //GREY TIDE /obj/item/weapon/twohanded/spear/grey_tide @@ -511,4 +512,39 @@ return 0 /obj/item/weapon/twohanded/vibro_weapon/update_icon() - icon_state = "hfrequency[wielded]" \ No newline at end of file + icon_state = "hfrequency[wielded]" + +/* + * Bone Axe + */ +/obj/item/weapon/twohanded/fireaxe/boneaxe // Blatant imitation of the fireaxe, but made out of bone. + icon_state = "bone_axe0" + name = "bone axe" + desc = "A large, vicious axe crafted out of several sharpened bone plates and crudely tied together. Made of monsters, by killing monsters, for killing monsters." + force_wielded = 23 + +/obj/item/weapon/twohanded/fireaxe/boneaxe/update_icon() + icon_state = "bone_axe[wielded]" + +/* + * Bone Spear + */ +/obj/item/weapon/twohanded/bonespear //Blatant imitation of spear, but made out of bone. Not valid for explosive modification. + icon_state = "bone_spear0" + name = "bone spear" + desc = "A haphazardly-constructed yet still deadly weapon. The pinnacle of modern technology." + force = 11 + w_class = 4 + slot_flags = SLOT_BACK + force_unwielded = 11 + force_wielded = 20 //I have no idea how to balance + throwforce = 22 + throw_speed = 4 + embedded_impact_pain_multiplier = 3 + armour_penetration = 15 //Enhanced armor piercing + hitsound = 'sound/weapons/bladeslice.ogg' + attack_verb = list("attacked", "poked", "jabbed", "torn", "gored") + sharpness = IS_SHARP + +/obj/item/weapon/twohanded/bonespear/update_icon() + icon_state = "bone_spear[wielded]" \ No newline at end of file diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 05c037c478c..faf3b4b8cb3 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -16,7 +16,8 @@ handle_layer() /obj/structure/chair/deconstruct() - if(buildstacktype) + // If we have materials, and don't have the NOCONSTRUCT flag + if(buildstacktype && (!(flags & NODECONSTRUCT))) new buildstacktype(loc,buildstackamount) ..() diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index df6f9ce90db..1265b21905c 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -395,7 +395,7 @@ add_fingerprint(user) locked = !locked user.visible_message("[user] [locked ? null : "un"]locks [src].", - "You [locked ? null : "un"]locks [src].") + "You [locked ? null : "un"]lock [src].") update_icon() else user << "Access Denied" 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 c8fa71c24dc..6c6e0f78446 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -111,6 +111,7 @@ ..() new /obj/item/clothing/suit/armor/vest(src) new /obj/item/clothing/head/helmet/sec(src) + new /obj/item/device/radio/headset/headset_sec(src) new /obj/item/device/radio/headset/headset_sec/alt(src) new /obj/item/clothing/glasses/hud/security/sunglasses(src) new /obj/item/device/flashlight/seclite(src) diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index b699da49dd3..28cc59a701b 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -27,7 +27,9 @@ playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) user.visible_message("[user] unfastens [src].", \ "You unfasten [src].") - new /obj/item/sign_backing(get_turf(user)) + var/obj/item/sign_backing/SB = new (get_turf(user)) + SB.icon_state = icon_state + SB.sign_path = type qdel(src) else if(istype(O, /obj/item/weapon/pen)) var/list/sign_types = list("Secure Area", "Biohazard", "High Voltage", "Radiation", "Hard Vacuum Ahead", "Disposal: Leads To Space", "Danger: Fire", "No Smoking", "Medbay", "Science", "Chemistry", \ @@ -82,11 +84,12 @@ /obj/item/sign_backing name = "sign backing" - desc = "A blank sign with adhesive backing." + desc = "A sign with adhesive backing." icon = 'icons/obj/decals.dmi' icon_state = "backing" w_class = 3 burn_state = FLAMMABLE + var/sign_path = /obj/structure/sign/basic //the type of sign that will be created when placed on a turf /obj/item/sign_backing/afterattack(atom/target, mob/user, proximity) if(isturf(target) && proximity) @@ -94,7 +97,7 @@ user.visible_message("[user] fastens [src] to [T].", \ "You attach a blank sign to [T].") playsound(T, 'sound/items/Deconstruct.ogg', 50, 1) - new /obj/structure/sign/basic(T) + new sign_path(T) user.drop_item() qdel(src) else diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index d56212c5835..9d8f2f93bbc 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -14,10 +14,10 @@ var/reinf = 0 var/wtype = "glass" var/fulltile = 0 - var/list/storeditems = list() // var/silicate = 0 // number of units of silicate // var/icon/silicateIcon = null // the silicated icon var/image/crack_overlay + var/list/debris = list() can_be_unanchored = 1 /obj/structure/window/examine(mob/user) @@ -32,21 +32,25 @@ if(reinf) state = 2*anchored - spawn(5) // The NODECONSTRUCT flag gets added immediately by the holodeck (but not immediately enough) - if(!(flags & NODECONSTRUCT)) - storeditems.Add(new/obj/item/weapon/shard(src)) - if(fulltile) - storeditems.Add(new/obj/item/weapon/shard(src)) - if(reinf) - var/obj/item/stack/rods/R = new/obj/item/stack/rods(src) - storeditems.Add(R) - if(fulltile) - R.add(1) - ini_dir = dir air_update_turf(1) - return + // Precreate our own debris + + var/shards = 1 + if(fulltile) + shards++ + var/rods = 0 + if(reinf) + rods++ + if(fulltile) + rods++ + + for(var/i in 1 to shards) + debris += new /obj/item/weapon/shard(src) + if(rods) + debris += new /obj/item/stack/rods(src, rods) + /obj/structure/window/bullet_act(obj/item/projectile/P) . = ..() @@ -65,7 +69,10 @@ shatter() /obj/structure/window/narsie_act() - color = "#7D1919" + var/evil_color = "#7D1919" + color = evil_color + for(var/obj/item/weapon/shard/shard in debris) + shard.color = evil_color /obj/structure/window/singularity_pull(S, current_size) if(current_size >= STAGE_FIVE) @@ -276,9 +283,13 @@ return playsound(src, "shatter", 70, 1) var/turf/T = loc - for(var/obj/item/I in storeditems) - I.loc = T - transfer_fingerprints_to(I) + + if(!(flags & NODECONSTRUCT)) + for(var/i in debris) + var/obj/item/I = i + + I.loc = T + transfer_fingerprints_to(I) qdel(src) update_nearby_icons() diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index ea8622dd70b..06b7a07c466 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -101,10 +101,13 @@ var/mob/living/carbon/M = AM switch(wet) if(TURF_WET_WATER) - if(!M.slip(3, 1, null, NO_SLIP_WHEN_WALKING)) + if(!M.slip(0, 3, null, NO_SLIP_WHEN_WALKING)) M.inertia_dir = 0 if(TURF_WET_LUBE) - M.slip(0, 7, null, (SLIDE|GALOSHES_DONT_HELP)) + M.slip(0, 4, null, (SLIDE|GALOSHES_DONT_HELP)) + M.confused += 8 + if(TURF_WET_ICE) + M.slip(0, 6, null, (SLIDE|GALOSHES_DONT_HELP)) if(TURF_WET_ICE || TURF_WET_PERMAFROST) M.slip(0, 4, null, (SLIDE|NO_SLIP_WHEN_WALKING)) diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index ee509be5fc9..d7b3be526cd 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -534,7 +534,9 @@ for(var/obj/machinery/capture_the_flag/CTF in machines) ctf_enabled = !CTF.ctf_enabled CTF.ctf_enabled = !CTF.ctf_enabled + CTF.TellGhost() message_admins("[key_name_admin(usr)] has [ctf_enabled? "enabled" : "disabled"] CTF!") + notify_ghosts("CTF has been [ctf_enabled? "enabled" : "disabled"]!",'sound/effects/ghost2.ogg') if(E) E.processing = 0 diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 77dd2e39eee..9da33d33da2 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -26,8 +26,6 @@ var/sound/admin_sound for(var/mob/M in player_list) if(M.client.prefs.toggles & SOUND_MIDI) - var/vol = M.client.prefs.adminmusicvolume - admin_sound.volume = vol M << admin_sound feedback_add_details("admin_verb","PGS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index ea4446dcd21..d5b92844f51 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -172,6 +172,16 @@ M.faction += team M.equipOutfit(ctf_gear) +/obj/machinery/capture_the_flag/proc/TellGhost() + if(ctf_enabled) + notify_ghosts("[name] has been activated!", enter_link="(Click to join the [team] team!) or click on the controller directly!", source = src, attack_not_jump = 0) + +/obj/machinery/capture_the_flag/Topic(href, href_list) + if(href_list["join"]) + var/mob/dead/observer/ghost = usr + if(istype(ghost)) + attack_ghost(ghost) + /obj/machinery/capture_the_flag/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/twohanded/required/ctf)) var/obj/item/weapon/twohanded/required/ctf/flag = I @@ -214,6 +224,12 @@ CTF.ctf_gear = CTF.instagib_gear CTF.respawn_cooldown = INSTAGIB_RESPAWN +/obj/machinery/capture_the_flag/proc/normal_mode() + for(var/obj/machinery/capture_the_flag/CTF in machines) + if(CTF.ctf_enabled == TRUE) + CTF.ctf_gear = initial(ctf_gear) + CTF.respawn_cooldown = DEFAULT_RESPAWN + /obj/item/weapon/gun/projectile/automatic/pistol/deagle/CTF desc = "This looks like it could really hurt in melee." force = 75 diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 7e1e469d3b0..6c45742bb27 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -359,6 +359,11 @@ suit = /obj/item/clothing/suit/space/hardsuit/mining mask = /obj/item/clothing/mask/breath +/obj/effect/mob_spawn/human/miner/explorer + uniform = /obj/item/clothing/under/rank/miner/lavaland + gloves = /obj/item/clothing/gloves/color/black + back = /obj/item/weapon/storage/backpack/security + shoes = /obj/item/clothing/shoes/jackboots /obj/effect/mob_spawn/human/plasmaman mob_species = /datum/species/plasmaman @@ -453,6 +458,17 @@ icon_state = "sleeper" flavour_text = "You are a Nanotrasen Commander!" +/obj/effect/mob_spawn/human/wwii + name = "World War II Reenactor" + uniform = /obj/item/clothing/under/wwii + shoes = /obj/item/clothing/shoes/combat + gloves = /obj/item/clothing/gloves/combat + mask = /obj/item/clothing/mask/gas + helmet = /obj/item/clothing/head/helmet/stahlhelm + back = /obj/item/weapon/storage/backpack/security + has_id = 0 + + /////////////////Spooky Undead////////////////////// /obj/effect/mob_spawn/human/skeleton diff --git a/code/modules/awaymissions/mission_code/Cabin.dm b/code/modules/awaymissions/mission_code/Cabin.dm index b554a8a4547..6f5ba2a4d64 100644 --- a/code/modules/awaymissions/mission_code/Cabin.dm +++ b/code/modules/awaymissions/mission_code/Cabin.dm @@ -73,16 +73,16 @@ /obj/machinery/recycler/lumbermill name = "lumbermill saw" desc = "Faster then the cartoons!" - emagged = 2 //Always grinds people + emagged = 2 //Always gibs people + item_recycle_sound = 'sound/weapons/chainsawhit.ogg' -/obj/machinery/recycler/lumbermill/recycle(obj/item/weapon/grown/log/L, sound = 1) - L.loc = src.loc +/obj/machinery/recycler/lumbermill/recycle_item(obj/item/weapon/grown/log/L) if(!istype(L)) return - if(sound) - playsound(src.loc, 'sound/weapons/chainsawhit.ogg', 100, 1) - new L.plank_type(src.loc, 1 + round(L.seed.potency / 25)) - qdel(L) + else + var/potency = L.seed.potency + ..() + new L.plank_type(src.loc, 1 + round(potency / 25)) /mob/living/simple_animal/chicken/rabbit/normal icon_state = "b_rabbit" @@ -130,4 +130,4 @@ spawnableAtoms = list(/obj/structure/flora/rock/icy = 5, /obj/structure/flora/rock/pile/icy = 5) /obj/effect/landmark/mapGenerator/snowy - mapGeneratorType = /datum/mapGenerator/snowy \ No newline at end of file + mapGeneratorType = /datum/mapGenerator/snowy diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm index 4a3e5bdfec0..968f230be28 100644 --- a/code/modules/cargo/console.dm +++ b/code/modules/cargo/console.dm @@ -5,6 +5,9 @@ circuit = /obj/item/weapon/circuitboard/computer/cargo var/requestonly = FALSE var/contraband = FALSE + var/safety_warning = "For safety reasons the automated supply shuttle \ + cannot transport live organisms, classified nuclear weaponry or \ + homing beacons." /obj/machinery/computer/cargo/request name = "supply request console" @@ -94,7 +97,7 @@ switch(action) if("send") if(SSshuttle.supply.canMove()) - say("For safety reasons the automated supply shuttle cannot transport live organisms, classified nuclear weaponry or homing beacons.") + say(safety_warning) return if(SSshuttle.supply.getDockedId() == "supply_home") SSshuttle.supply.emagged = emagged @@ -110,6 +113,9 @@ if("loan") if(!SSshuttle.shuttle_loan) return + if(SSshuttle.supply.canMove()) + say(safety_warning) + return else if(SSshuttle.supply.mode == SHUTTLE_IDLE) SSshuttle.shuttle_loan.loan_shuttle() say("The supply shuttle has been loaned to Centcom.") diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index e99827f9ca7..69cedb462e2 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -559,6 +559,12 @@ contains = list(/obj/machinery/the_singularitygen) crate_name = "singularity generator crate" +/datum/supply_pack/engineering/engine/tesla_gen + name = "Tesla Generator Crate" + cost = 5000 + contains = list(/obj/machinery/the_singularitygen/tesla) + crate_name = "tesla generator crate" + /datum/supply_pack/engineering/engine/collector name = "Collector Crate" cost = 2500 @@ -1356,9 +1362,10 @@ contains = list(/obj/item/toy/spinningtoy, /obj/item/toy/sword, /obj/item/toy/foamblade, - /obj/item/toy/AI, + /obj/item/toy/talking/AI, /obj/item/toy/talking/owl, /obj/item/toy/talking/griffin, + /obj/item/toy/talking/skeleton, /obj/item/toy/nuke, /obj/item/toy/minimeteor, /obj/item/toy/carpplushie, diff --git a/code/modules/chatter/chatter.dm b/code/modules/chatter/chatter.dm new file mode 100644 index 00000000000..4d1048e3ca9 --- /dev/null +++ b/code/modules/chatter/chatter.dm @@ -0,0 +1,56 @@ +/proc/chatter(message, phomeme, atom/A) + // We want to transform any message into a list of numbers + // and punctuation marks + // For example: + // "Hi." -> [2, '.'] + // "HALP GEROGE MELLONS, that swine, is GRIFFIN ME!" + // -> [4, 6, 7, ',', 4, 5, ',', '2', 7, 2, '!'] + // "fuck,thissentenceissquashed" -> [4, ',', 21] + + var/list/punctuation = list(",",":",";",".","?","!","\'","-") + var/regex/R = regex("(\[\\l\\d]*)(\[^\\l\\d\\s])?", "g") + var/list/letter_count = list() + while(R.Find(message) != 0) + if(R.group[1]) + letter_count += length(R.group[1]) + if(R.group[2]) + letter_count += R.group[2] + + spawn(0) + for(var/item in letter_count) + if (item in punctuation) + // simulate pausing in talking + // ignore semi-colons because of their use in HTML escaping + if (item in list(",", ":")) + sleep(3) + if (item in list("!", "?", ".")) + sleep(6) + continue + + if(isnum(item)) + var/length = min(item, 10) + if (length == 0) + // "verbalise" long spaces + sleep(1) + chatter_speak_word(A.loc, phomeme, length) + +/proc/chatter_speak_word(loc, phomeme, length) + var/path = "sound/chatter/[phomeme]_[length].ogg" + + playsound(loc, path, + vol = 40, vary = 0, extrarange = 3, falloff = FALSE, surround = 1) + + sleep((length + 1) * chatter_get_sleep_multiplier(phomeme)) + +/proc/chatter_get_sleep_multiplier(phomeme) + // These values are tenths of seconds, so 0.5 == 0.05seconds + . = 1 + switch(phomeme) + if("papyrus") + . = 0.5 + if("griffin") + . = 0.5 + if("sans") + . = 0.7 + if("owl") + . = 0.7 diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 333b764203a..22a6805431c 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -62,7 +62,6 @@ var/list/preferences_datums = list() var/list/features = list("mcolor" = "FFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "ears" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None") var/list/custom_names = list("clown", "mime", "ai", "cyborg", "religion", "deity") - var/adminmusicvolume = 50 //Mob preview var/icon/preview_icon = null diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index b988dd25e1e..33ff7efcaed 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -2,7 +2,7 @@ #define SAVEFILE_VERSION_MIN 8 //This is the current version, anything below this will attempt to update (if it's not obsolete) -#define SAVEFILE_VERSION_MAX 14 +#define SAVEFILE_VERSION_MAX 15 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn This proc checks if the current directory of the savefile S needs updating @@ -101,6 +101,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car toggles = TOGGLES_DEFAULT if(current_version < 12) ignoring = list() + if(current_version < 15) + toggles |= SOUND_ANNOUNCEMENTS //should this proc get fairly long (say 3 versions long), //just increase SAVEFILE_VERSION_MIN so it's not as far behind @@ -223,7 +225,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["preferred_map"] >> preferred_map S["ignoring"] >> ignoring S["ghost_hud"] >> ghost_hud - S["adminmusicvolume"] >> adminmusicvolume S["inquisitive_ghost"] >> inquisitive_ghost //try to fix any outdated data if necessary @@ -275,7 +276,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["preferred_map"] << preferred_map S["ignoring"] << ignoring S["ghost_hud"] << ghost_hud - S["adminmusicvolume"] << adminmusicvolume S["inquisitive_ghost"] << inquisitive_ghost return 1 diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index 8e8e856b4ae..bf3071d1dda 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -330,15 +330,6 @@ var/global/list/ghost_orbits = list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS set category = "Preferences" set desc = ".Toggles hearing Central Command, Captain, VOX, and other announcement sounds" prefs.toggles ^= SOUND_ANNOUNCEMENTS - src << "You will now [(prefs.toggles & SOUND_ANNOUNCEMENTS) ? "no longer hear announcements" : "hear announcement sounds"]." - prefs.save_preferences() - feedback_add_details("admin_verb","TAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - - -/client/verb/set_admin_volume() - set name = "Set Admin Music Volume" - set category = "Preferences" - set desc = "Set the volume you hear admin music at." - var/musinput = input("Range of 0 to 100.","Admin Music Volume", prefs.adminmusicvolume) as num - prefs.adminmusicvolume = max(0,min(musinput,100)) + src << "You will now [(prefs.toggles & SOUND_ANNOUNCEMENTS) ? "hear announcement sounds" : "no longer hear announcements"]." prefs.save_preferences() + feedback_add_details("admin_verb","TAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! \ No newline at end of file diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index bec0742032f..a3856b0ee1c 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -341,7 +341,6 @@ BLIND // can't see anything var/can_adjust = 1 var/adjusted = 0 var/alt_covers_chest = 0 // for adjusted/rolled-down jumpsuits, 0 = exposes chest and arms, 1 = exposes arms only - var/suit_color = null var/obj/item/clothing/tie/hastie = null /obj/item/clothing/under/worn_overlays(var/isinhands = FALSE) @@ -363,7 +362,6 @@ BLIND // can't see anything //make the sensor mode favor higher levels, except coords. sensor_mode = pick(0, 1, 1, 2, 2, 2, 3, 3) adjusted = 0 - suit_color = item_color ..() /obj/item/clothing/under/attackby(obj/item/I, mob/user, params) @@ -482,25 +480,25 @@ BLIND // can't see anything if(!can_adjust) usr << "You cannot wear this suit any differently!" return - if(src.adjusted == 1) - src.fitted = initial(fitted) - src.item_color = initial(item_color) - src.item_color = src.suit_color //colored jumpsuits are shit and break without this - src.body_parts_covered = CHEST|GROIN|LEGS|ARMS - usr << "You adjust the suit back to normal." - src.adjusted = 0 - else - if(src.fitted != FEMALE_UNIFORM_TOP) - src.fitted = NO_FEMALE_UNIFORM - src.item_color += "_d" - if (alt_covers_chest) // for the special snowflake suits that don't expose the chest when adjusted - src.body_parts_covered = CHEST|GROIN|LEGS - else - src.body_parts_covered = GROIN|LEGS + if(toggle_jumpsuit_adjust()) usr << "You adjust the suit to wear it more casually." - src.adjusted = 1 + else + usr << "You adjust the suit back to normal." usr.update_inv_w_uniform() - ..() + +/obj/item/clothing/under/proc/toggle_jumpsuit_adjust() + adjusted = !adjusted + if(adjusted) + if(fitted != FEMALE_UNIFORM_TOP) + fitted = NO_FEMALE_UNIFORM + if (alt_covers_chest) // for the special snowflake suits that don't expose the chest when adjusted + body_parts_covered = CHEST|GROIN|LEGS + else + body_parts_covered = GROIN|LEGS + else + fitted = initial(fitted) + body_parts_covered = CHEST|GROIN|LEGS|ARMS + return adjusted /obj/item/clothing/under/examine(mob/user) ..() diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index e96dd88e631..24a18a98808 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -261,3 +261,36 @@ desc = "A paper sack with crude holes cut out for eyes and a sketchy smile drawn on the front. Not creepy at all." icon_state = "papersack_smile" flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS + +/* +-!WARNING!- +-POTENTIAL TRIGGER-INDUCING ITEMS AHEAD- +-TREAD WITH CAUTION- +*/ + +/obj/item/clothing/head/helmet/stahlhelm + name = "stahlhelm" + desc = "A hard military helmet, seems dusty." + icon_state = "stalhelm" + item_state = "stalhelm" + armor = list(melee = 15, bullet = 10, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + strip_delay = 30 + +/obj/item/clothing/head/helmet/panzer + name = "Panzer Cap" + desc = "A fancy-looking military cap." + icon_state = "panzercap" + item_state = "panzercap" + +/obj/item/clothing/head/helmet/naziofficer + name = "Officer Cap" + desc = "A cap fit for a commanding officer." + icon_state = "officercap" + item_state = "officercap" + armor = list(melee = 20, bullet = 15, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + strip_delay = 60 + +/* +-YOU HAVE SAFETLY PASSED THE POTENTIALLY-TRIGGERING CONTENT- +-PLEASE RESUME NORMAL, POLITICALLY CORRECT ACTIVITY- +*/ \ No newline at end of file diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 154cf6a5d71..dd1875aaead 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -48,6 +48,7 @@ icon_state = "hardhat0_cakehat" item_state = "hardhat0_cakehat" item_color = "cakehat" + hitsound = 'sound/weapons/tap.ogg' flags_inv = HIDEEARS|HIDEHAIR armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) brightness_on = 2 //luminosity when on @@ -69,6 +70,7 @@ force = 15 throwforce = 15 damtype = BURN + hitsound = 'sound/items/Welder.ogg' SSobj.processing |= src /obj/item/clothing/head/hardhat/cakehat/turn_off() @@ -76,6 +78,7 @@ force = 0 throwforce = 0 damtype = BRUTE + hitsound = 'sound/weapons/tap.ogg' SSobj.processing -= src /obj/item/clothing/head/hardhat/cakehat/is_hot() diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm index 040ef0bab42..819d8ac9975 100644 --- a/code/modules/clothing/masks/hailer.dm +++ b/code/modules/clothing/masks/hailer.dm @@ -23,7 +23,7 @@ actions_types = list(/datum/action/item_action/halt) icon_state = "swat" aggressiveness = 3 - flags_inv = HIDEFACIALHAIR|HIDEFACE|HIDEEYES|HIDEEARS + flags_inv = HIDEFACIALHAIR|HIDEFACE|HIDEEYES|HIDEEARS|HIDEHAIR visor_flags_inv = 0 /obj/item/clothing/mask/gas/sechailer/cyborg diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm index 1cce1cd3374..e4019814bce 100644 --- a/code/modules/clothing/shoes/colour.dm +++ b/code/modules/clothing/shoes/colour.dm @@ -11,8 +11,8 @@ heat_protection = FEET max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT - redcoat - item_color = "redcoat" //Exists for washing machines. Is not different from black shoes in any way. +/obj/item/clothing/shoes/sneakers/black/redcoat + item_color = "redcoat" //Exists for washing machines. Is not different from black shoes in any way. /obj/item/clothing/shoes/sneakers/brown name = "brown shoes" @@ -20,18 +20,23 @@ icon_state = "brown" item_color = "brown" - captain - item_color = "captain" //Exists for washing machines. Is not different from brown shoes in any way. - hop - item_color = "hop" //Exists for washing machines. Is not different from brown shoes in any way. - ce - item_color = "chief" //Exists for washing machines. Is not different from brown shoes in any way. - rd - item_color = "director" //Exists for washing machines. Is not different from brown shoes in any way. - cmo - item_color = "medical" //Exists for washing machines. Is not different from brown shoes in any way. - cmo - item_color = "cargo" //Exists for washing machines. Is not different from brown shoes in any way. +/obj/item/clothing/shoes/sneakers/brown/captain + item_color = "captain" //Exists for washing machines. Is not different from brown shoes in any way. + +/obj/item/clothing/shoes/sneakers/brown/hop + item_color = "hop" //Exists for washing machines. Is not different from brown shoes in any way. + +/obj/item/clothing/shoes/sneakers/brown/ce + item_color = "chief" //Exists for washing machines. Is not different from brown shoes in any way. + +/obj/item/clothing/shoes/sneakers/brown/rd + item_color = "director" //Exists for washing machines. Is not different from brown shoes in any way. + +/obj/item/clothing/shoes/sneakers/brown/cmo + item_color = "medical" //Exists for washing machines. Is not different from brown shoes in any way. + +/obj/item/clothing/shoes/sneakers/brown/qm + item_color = "cargo" //Exists for washing machines. Is not different from brown shoes in any way. /obj/item/clothing/shoes/sneakers/blue name = "blue shoes" diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index fb0339fa62d..9a39b5e07aa 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -115,6 +115,12 @@ put_on_delay = 40 can_hold_items = 1 +/obj/item/clothing/shoes/workboots/mining + name = "mining boots" + desc = "Steel-toed mining boots for mining in hazardous environments. Very good at keeping toes uncrushed." + icon_state = "explorer" + burn_state = FIRE_PROOF + /obj/item/clothing/shoes/cult name = "nar-sian invoker boots" desc = "A pair of boots worn by the followers of Nar-Sie." diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index 799b78c276f..16d994bde9c 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -8,7 +8,6 @@ icon_state = initial(C.icon_state) item_state = initial(C.item_state) item_color = initial(C.item_color) - suit_color = initial(C.item_color) /obj/item/clothing/under/color/black name = "black jumpsuit" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index da4ce9a3e0c..a63fd72439e 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -574,3 +574,32 @@ item_state = "hostanclothes" item_color = "hostanclothes" +/* +-!WARNING!- +-POTENTIAL TRIGGER-INDUCING ITEMS AHEAD- +-TREAD WITH CAUTION- +*/ + +/obj/item/clothing/under/wwii + name = "dusty uniform" + desc = "A dusty old uniform, a relic from a time before." + icon_state = "soldieruniform" + item_state = "soldieruniform" + item_color = "soldieruniform" + armor = list(melee = 10, bullet = 5, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + strip_delay = 50 + + +/obj/item/clothing/under/wwii/officer + name = "dusty uniform" + desc = "A dusty old uniform, a relic from a time before. This one looks more official." + icon_state = "officeruniform" + item_state = "officeruniform" + item_color = "officeruniform" + armor = list(melee = 15, bullet = 10, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + strip_delay = 60 + +/* +-YOU HAVE SAFETLY PASSED THE POTENTIALLY-TRIGGERING CONTENT- +-PLEASE RESUME NORMAL, POLITICALLY CORRECT ACTIVITY- +*/ diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm index dc4b405d5e6..63b3290aa06 100644 --- a/code/modules/crafting/craft.dm +++ b/code/modules/crafting/craft.dm @@ -50,12 +50,17 @@ for(var/A in L) var/turf/T = A if(T.Adjacent(user)) - . += T.contents - + for(var/B in T) + var/atom/movable/AM = B + if(AM.flags & HOLOGRAM) + continue + . += AM /datum/personal_crafting/proc/get_surroundings(mob/user) . = list() for(var/obj/item/I in get_environment(user)) + if(I.flags & HOLOGRAM) + continue if(istype(I, /obj/item/stack)) var/obj/item/stack/S = I .[I.type] += S.amount diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 50f9bb46455..5206d16e6ee 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -372,4 +372,35 @@ 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 + category = CAT_PRIMAL + +/datum/crafting_recipe/gold_horn + name = "Golden bike horn" + result = /obj/item/weapon/bikehorn/golden + time = 20 + reqs = list(/obj/item/stack/sheet/mineral/bananium = 5, + /obj/item/weapon/bikehorn) + category = CAT_MISC + +/datum/crafting_recipe/bonedagger + name = "Bone Dagger" + result = /obj/item/weapon/kitchen/knife/combat/bone + time = 20 + reqs = list(/obj/item/stack/sheet/bone = 2) + category = CAT_PRIMAL + +/datum/crafting_recipe/bonespear + name = "Bone Spear" + result = /obj/item/weapon/twohanded/bonespear + time = 30 + reqs = list(/obj/item/stack/sheet/bone = 4, + /obj/item/stack/sheet/sinew = 1) + category = CAT_PRIMAL + +/datum/crafting_recipe/boneaxe + name = "Bone Axe" + result = /obj/item/weapon/twohanded/fireaxe/boneaxe + time = 50 + reqs = list(/obj/item/stack/sheet/bone = 6, + /obj/item/stack/sheet/sinew = 3) + category = CAT_PRIMAL diff --git a/code/modules/events/portal_storm.dm b/code/modules/events/portal_storm.dm index fb4f68e7fba..7d4f144938b 100644 --- a/code/modules/events/portal_storm.dm +++ b/code/modules/events/portal_storm.dm @@ -11,15 +11,15 @@ /mob/living/simple_animal/hostile/syndicate/ranged/space/noloot = 2) /datum/round_event_control/portal_storm_narsie - name = "Portal Storm: Nar-sie" + name = "Portal Storm: Constructs" typepath = /datum/round_event/portal_storm/portal_storm_narsie weight = 0 max_occurrences = 0 /datum/round_event/portal_storm/portal_storm_narsie - boss_types = list(/obj/singularity/narsie/large = 1) - hostile_types = list(/mob/living/simple_animal/hostile/construct/armored/hostile = 10,\ - /mob/living/simple_animal/hostile/construct/wraith/hostile = 10) + boss_types = list(/mob/living/simple_animal/hostile/construct/builder = 6) + hostile_types = list(/mob/living/simple_animal/hostile/construct/armored/hostile = 8,\ + /mob/living/simple_animal/hostile/construct/wraith/hostile = 6) /datum/round_event/portal_storm startWhen = 7 diff --git a/code/modules/food&drinks/food/snacks_egg.dm b/code/modules/food&drinks/food/snacks_egg.dm index 473ad4ebde5..5f481bb2916 100644 --- a/code/modules/food&drinks/food/snacks_egg.dm +++ b/code/modules/food&drinks/food/snacks_egg.dm @@ -27,7 +27,7 @@ /obj/item/weapon/reagent_containers/food/snacks/egg/attackby(obj/item/weapon/W, mob/user, params) if(istype( W, /obj/item/toy/crayon )) var/obj/item/toy/crayon/C = W - var/clr = C.colourName + var/clr = C.item_color if(!(clr in list("blue", "green", "mime", "orange", "purple", "rainbow", "red", "yellow"))) usr << "[src] refuses to take on this colour!" diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index 40f012af0d3..4f120caf00e 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -188,15 +188,15 @@ var/obj/item/seeds/seed = G.seed var/mob/living/carbon/M = target - var/stun_len = seed.potency * rate + var/stun_len = seed.potency * rate * 0.8 if(istype(G) && ispath(G.trash, /obj/item/weapon/grown)) return if(!istype(G, /obj/item/weapon/grown/bananapeel) && (!G.reagents || !G.reagents.has_reagent("lube"))) stun_len /= 3 - var/stun = max(stun_len * 2, 1) - var/weaken = max(stun_len, 0.5) + var/stun = min(stun_len, 7) + var/weaken = min(stun_len, 7) if(M.slip(stun, weaken, G)) for(var/datum/plant_gene/trait/T in seed.genes) @@ -309,4 +309,4 @@ /datum/plant_gene/trait/maxchem/on_new(obj/item/weapon/reagent_containers/food/snacks/grown/G, newloc) ..() - G.reagents.maximum_volume *= rate \ No newline at end of file + G.reagents.maximum_volume *= rate diff --git a/code/modules/jobs/job_types/cargo_service.dm b/code/modules/jobs/job_types/cargo_service.dm index ed87fcae838..3587f6ac6f7 100644 --- a/code/modules/jobs/job_types/cargo_service.dm +++ b/code/modules/jobs/job_types/cargo_service.dm @@ -78,7 +78,7 @@ Shaft Miner belt = /obj/item/device/pda/shaftminer ears = /obj/item/device/radio/headset/headset_cargo - shoes = /obj/item/clothing/shoes/jackboots + shoes = /obj/item/clothing/shoes/workboots/mining gloves = /obj/item/clothing/gloves/color/black uniform = /obj/item/clothing/under/rank/miner/lavaland l_pocket = /obj/item/weapon/reagent_containers/pill/patch/styptic diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 9503ed2808b..47b291d5152 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -296,14 +296,17 @@ new /datum/data/mining_equipment("Shelter Capsule", /obj/item/weapon/survivalcapsule , 400), new /datum/data/mining_equipment("GAR scanners", /obj/item/clothing/glasses/meson/gar, 500), new /datum/data/mining_equipment("Explorer Belt", /obj/item/weapon/storage/belt/mining, 500), + new /datum/data/mining_equipment("Survival Medipen", /obj/item/weapon/reagent_containers/hypospray/medipen/survival, 500), new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/weapon/storage/firstaid/brute, 600), - new /datum/data/mining_equipment("Jaunter", /obj/item/device/wormhole_jaunter, 600), + new /datum/data/mining_equipment("Tracking Implant Kit",/obj/item/weapon/storage/box/minertracker, 600), + new /datum/data/mining_equipment("Jaunter", /obj/item/device/wormhole_jaunter, 750), new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator, 750), new /datum/data/mining_equipment("Resonator", /obj/item/weapon/resonator, 800), new /datum/data/mining_equipment("Lazarus Injector", /obj/item/weapon/lazarus_injector, 1000), new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/weapon/pickaxe/silver, 1000), - new /datum/data/mining_equipment("Jetpack Upgrade", /obj/item/hardsuit_jetpack , 2000), + new /datum/data/mining_equipment("Jetpack Upgrade", /obj/item/hardsuit_jetpack, 2000), new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000), + new /datum/data/mining_equipment("Mining Hardsuit", /obj/item/clothing/suit/space/hardsuit/mining, 2000), new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/weapon/pickaxe/diamond, 2000), new /datum/data/mining_equipment("Super Resonator", /obj/item/weapon/resonator/upgraded, 2500), new /datum/data/mining_equipment("Super Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator/super, 3000), @@ -512,15 +515,31 @@ return FALSE return TRUE +/obj/item/device/wormhole_jaunter/proc/get_destinations(mob/user) + var/list/destinations = list() + + if(isgolem(user)) + for(var/obj/item/device/radio/beacon/B in world) + var/turf/T = get_turf(B) + if(istype(T.loc, /area/ruin/powered/golem_ship)) + destinations += B + + // In the event golem beacon is destroyed, send to station instead + if(destinations.len) + return destinations + + for(var/obj/item/device/radio/beacon/B in world) + var/turf/T = get_turf(B) + if(T.z == ZLEVEL_STATION) + destinations += B + + return destinations + /obj/item/device/wormhole_jaunter/proc/activate(mob/user) if(!turf_check(user)) return - var/list/L = list() - for(var/obj/item/device/radio/beacon/B in world) - var/turf/T = get_turf(B) - if(T.z == ZLEVEL_STATION) - L += B + var/list/L = get_destinations(user) if(!L.len) user << "The [src.name] found no beacons in the world to anchor a wormhole to." return @@ -1124,44 +1143,32 @@ /obj/machinery/mineral/equipment_vendor/golem name = "golem ship equipment vendor" - desc = "A modified mining equipment vendor. It seems a few selections were replaced." - prize_list = list( - new /datum/data/mining_equipment("Stimpack", /obj/item/weapon/reagent_containers/hypospray/medipen/stimpack, 50), - new /datum/data/mining_equipment("Stimpack Bundle", /obj/item/weapon/storage/box/medipens/utility, 200), - new /datum/data/mining_equipment("Whiskey", /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey, 100), - new /datum/data/mining_equipment("Absinthe", /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe/premium,100), - new /datum/data/mining_equipment("Soap", /obj/item/weapon/soap/nanotrasen, 200), - new /datum/data/mining_equipment("Science Goggles", /obj/item/clothing/glasses/science, 250), - new /datum/data/mining_equipment("Laser Pointer", /obj/item/device/laser_pointer, 300), - new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300), - new /datum/data/mining_equipment("Monkey Cube", /obj/item/weapon/reagent_containers/food/snacks/monkeycube, 300), - new /datum/data/mining_equipment("Toolbelt", /obj/item/weapon/storage/belt/utility, 350), - new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/weapon/hivelordstabilizer, 400), - new /datum/data/mining_equipment("Shelter Capsule", /obj/item/weapon/survivalcapsule, 400), - new /datum/data/mining_equipment("GAR scanners", /obj/item/clothing/glasses/meson/gar, 500), - new /datum/data/mining_equipment("Sulphuric Acid", /obj/item/weapon/reagent_containers/glass/beaker/sulphuric, 500), - new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/weapon/storage/firstaid/brute, 600), - new /datum/data/mining_equipment("Advanced Scanner", /obj/item/device/t_scanner/adv_mining_scanner, 800), - new /datum/data/mining_equipment("Resonator", /obj/item/weapon/resonator, 800), - new /datum/data/mining_equipment("Lazarus Injector", /obj/item/weapon/lazarus_injector, 1000), - new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/weapon/pickaxe/silver, 1000), - new /datum/data/mining_equipment("Grey Slime Extract", /obj/item/slime_extract/grey, 1000), - new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/weapon/pickaxe/diamond, 2000), - new /datum/data/mining_equipment("Super Resonator", /obj/item/weapon/resonator/upgraded, 2500), - new /datum/data/mining_equipment("Point Transfer Card", /obj/item/weapon/card/mining_point_card, 500), - new /datum/data/mining_equipment("Mining Drone", /mob/living/simple_animal/hostile/mining_drone, 800), - new /datum/data/mining_equipment("Drone Melee Upgrade", /obj/item/device/mine_bot_ugprade, 400), - new /datum/data/mining_equipment("Drone Health Upgrade", /obj/item/device/mine_bot_ugprade/health, 400), - new /datum/data/mining_equipment("Drone Ranged Upgrade", /obj/item/device/mine_bot_ugprade/cooldown, 600), - new /datum/data/mining_equipment("Drone AI Upgrade", /obj/item/slimepotion/sentience/mining, 1000), - new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/weapon/storage/box/rndboards, 2000), - ) /obj/machinery/mineral/equipment_vendor/golem/New() ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/mining_equipment_vendor/golem(null) - B.apply_default_parts(src) + desc += "\nIt seems a few selections have been added." + prize_list += list( + new /datum/data/mining_equipment("Science Goggles", /obj/item/clothing/glasses/science, 250), + new /datum/data/mining_equipment("Monkey Cube", /obj/item/weapon/reagent_containers/food/snacks/monkeycube, 300), + new /datum/data/mining_equipment("Toolbelt", /obj/item/weapon/storage/belt/utility, 350), + new /datum/data/mining_equipment("Sulphuric Acid", /obj/item/weapon/reagent_containers/glass/beaker/sulphuric, 500), + new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/weapon/storage/firstaid/brute, 600), + new /datum/data/mining_equipment("Grey Slime Extract", /obj/item/slime_extract/grey, 1000), + new /datum/data/mining_equipment("Modification Kit", /obj/item/modkit, 1700), + new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/weapon/storage/box/rndboards, 2000), + + ) + + + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/machine/mining_equipment_vendor/golem(null) + component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) + component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) + component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) + component_parts += new /obj/item/weapon/stock_parts/console_screen(null) + RefreshParts() /obj/item/weapon/circuitboard/machine/mining_equipment_vendor/golem name = "circuit board (Golem Ship Equipment Vendor)" build_path = /obj/machinery/mineral/equipment_vendor/golem + diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index c577ca74bee..457554c2300 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -458,6 +458,13 @@ max_n_of_items = 10 pixel_y = -4 +/obj/machinery/smartfridge/survival_pod/empty + name = "dusty survival pod storage" + desc = "A heated storage unit. This ones seen better days." + +/obj/machinery/smartfridge/survival_pod/empty/New() + return() + /obj/machinery/smartfridge/survival_pod/accept_check(obj/item/O) if(istype(O, /obj/item)) return 1 diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index f90b1caa4e1..f9f5ed6caf1 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -4,6 +4,7 @@ name = "rock" icon = 'icons/turf/mining.dmi' icon_state = "rock" + var/smooth_icon = 'icons/turf/smoothrocks.dmi' smooth = SMOOTH_MORE|SMOOTH_BORDER canSmoothWith = list (/turf/closed/mineral, /turf/closed/wall) baseturf = /turf/open/floor/plating/asteroid/airless @@ -14,7 +15,7 @@ layer = MOB_LAYER + 0.05 temperature = TCMB var/environment_type = "asteroid" - var/turf/open/floor/plating/asteroid/turf_type = /turf/open/floor/plating/asteroid/airless + var/turf/open/floor/plating/turf_type = /turf/open/floor/plating/asteroid/airless var/mineralType = null var/mineralAmt = 3 var/spread = 0 //will the seam spread? @@ -26,7 +27,7 @@ /turf/closed/mineral/New() pixel_y = -4 pixel_x = -4 - icon = 'icons/turf/smoothrocks.dmi' + icon = smooth_icon ..() if (mineralType && mineralAmt && spread && spreadChance) for(var/dir in cardinal) @@ -707,3 +708,52 @@ baseturf = /turf/open/floor/plating/asteroid/basalt/lava_land_surface initial_gas_mix = "o2=14;n2=23;TEMP=300" defer_change = 1 + + +//BECAUSE ONE PLANET WASNT ENOUGH + +/turf/closed/mineral/ash_rock //wall piece + name = "rock" + icon = 'icons/turf/mining.dmi' + smooth_icon = 'icons/turf/walls/rock_wall.dmi' + icon_state = "rock" + smooth = SMOOTH_MORE|SMOOTH_BORDER + canSmoothWith = list (/turf/closed/mineral, /turf/closed/wall) + baseturf = /turf/open/floor/plating/ash + initial_gas_mix = "o2=14;n2=23;TEMP=300" + environment_type = "waste" + turf_type = /turf/open/floor/plating/ash + defer_change = 1 + +/turf/open/floor/plating/ash + icon = 'icons/turf/mining.dmi' + name = "ash" + icon_state = "ash" + smooth = SMOOTH_MORE|SMOOTH_BORDER + canSmoothWith = list (/turf/open/floor/plating/ash, /turf/closed) + var/smooth_icon = 'icons/turf/floors/ash.dmi' + desc = "The ground is covered in volcanic ash." + baseturf = /turf/open/floor/plating/ash //I assume this will be a chasm eventually, once this becomes an actual surface + slowdown = 1 + initial_gas_mix = "o2=14;n2=23;TEMP=300" + +/turf/open/floor/plating/ash/New() + pixel_y = -4 + pixel_x = -4 + icon = smooth_icon + ..() + +/turf/open/floor/plating/ash/break_tile() + return + +/turf/open/floor/plating/ash/burn_tile() + return + +/turf/open/floor/plating/ash/rocky + name = "rocky ground" + icon_state = "rockyash" + icon = 'icons/turf/mining.dmi' + smooth_icon = 'icons/turf/floors/rocky_ash.dmi' + slowdown = 0 + smooth = SMOOTH_MORE|SMOOTH_BORDER + canSmoothWith = list (/turf/open/floor/plating/ash/rocky, /turf/closed) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 761355fd6e6..334125e45cd 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -119,11 +119,11 @@ if(health >= 0) if(lying) - M.visible_message("[M] shakes [src] trying to get \him up!", \ - "You shake [src] trying to get \him up!") + M.visible_message("[M] shakes [src] trying to get them up!", \ + "You shake [src] trying to get them up!") else - M.visible_message("[M] hugs [src] to make \him feel better!", \ - "You hug [src] to make \him feel better!") + M.visible_message("[M] hugs [src] to make them feel better!", \ + "You hug [src] to make them feel better!") AdjustSleeping(-5) AdjustParalysis(-3) AdjustStunned(-3) @@ -208,41 +208,37 @@ throw_mode_off() if(!target || !isturf(loc)) return - if(istype(target, /obj/screen)) return + if(istype(target, /obj/screen)) + return - var/atom/movable/item = src.get_active_hand() + var/atom/movable/thrown_thing + var/obj/item/I = src.get_active_hand() - if(!item || (item.flags & NODROP)) return + if(!I || (I.flags & NODROP)) + return - if(istype(item, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = item - item = G.get_mob_if_throwable() //throw the person instead of the grab - qdel(G) //We delete the grab, as it needs to stay around until it's returned. - if(ismob(item)) + if(istype(I, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = I + var/mob/throwable_mob = G.get_mob_if_throwable() //throw the person instead of the grab + qdel(G) //We delete the grab. + if(throwable_mob) + thrown_thing = throwable_mob var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors var/turf/end_T = get_turf(target) if(start_T && end_T) - var/mob/M = item var/start_T_descriptor = "tile at [start_T.x], [start_T.y], [start_T.z] in area [get_area(start_T)]" var/end_T_descriptor = "tile at [end_T.x], [end_T.y], [end_T.z] in area [get_area(end_T)]" - add_logs(src, M, "thrown", addition="from [start_T_descriptor] with the target [end_T_descriptor]") + add_logs(src, throwable_mob, "thrown", addition="from [start_T_descriptor] with the target [end_T_descriptor]") - if(!item) return //Grab processing has a chance of returning null - - if(!ismob(item)) //Honk mobs don't have a dropped() proc honk - unEquip(item) - if(src.client) - src.client.screen -= item - - //actually throw it! - if(item) - item.layer = initial(item.layer) - src.visible_message("[src] has thrown [item].") + else if(!(I.flags & ABSTRACT)) //can't throw abstract items + thrown_thing = I + unEquip(I) + if(thrown_thing) + visible_message("[src] has thrown [thrown_thing].") newtonian_move(get_dir(target, src)) - - item.throw_at(target, item.throw_range, item.throw_speed, src) + thrown_thing.throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src) /mob/living/carbon/restrained() if (handcuffed) diff --git a/code/modules/mob/living/carbon/human/blood.dm b/code/modules/mob/living/carbon/human/blood.dm index f67b3a4008f..4b18297b92c 100644 --- a/code/modules/mob/living/carbon/human/blood.dm +++ b/code/modules/mob/living/carbon/human/blood.dm @@ -227,7 +227,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 if (!injected || !our || !dna) return - if(blood_incompatible(injected.data["blood_type"], dna.blood_type,injected.data["species"], dna.species.id) ) + if (!(injected.data["blood_type"] in get_safe_blood(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() @@ -246,28 +246,28 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 return D return res -/proc/blood_incompatible(donor,receiver,donor_species,receiver_species) - if(!donor || !receiver) return 0 - - if(donor_species && receiver_species) - if(donor_species != receiver_species) - return 1 - - var/donor_antigen = copytext(donor,1,lentext(donor)) - var/receiver_antigen = copytext(receiver,1,lentext(receiver)) - var/donor_rh = (findtext(donor,"+")>0) - var/receiver_rh = (findtext(receiver,"+")>0) - - if(donor_rh && !receiver_rh) return 1 - switch(receiver_antigen) - if("A") - if(donor_antigen != "A" && donor_antigen != "O") return 1 - if("B") - if(donor_antigen != "B" && donor_antigen != "O") return 1 - if("O") - if(donor_antigen != "O") return 1 - //AB is a universal receiver. - return 0 +// This is has more potential uses, and is probably faster than the old proc. +/proc/get_safe_blood(bloodtype) + . = list() + if(!bloodtype) + return + switch(bloodtype) + if("A-") + return list("A-", "O-") + if("A+") + return list("A", "A+", "O-", "O+") + if("B-") + return list("B-", "O-") + if("B+") + return list("B-", "B+", "O-", "O+") + if("AB-") + return list("A-", "B-", "O-", "AB-") + if("AB+") + return list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+") + if("O-") + return list("O-") + if("O+") + return list("O-", "O+") /proc/blood_splatter(target,datum/reagent/blood/source,large) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b8c454bdc41..54b4c3b39ba 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -155,7 +155,7 @@ take_overall_damage(b_loss,f_loss) //attempt to dismember bodyparts - if(severity >= 2 || !bomb_armor) + if(severity <= 2 || !bomb_armor) var/max_limb_loss = round(4/severity) //so you don't lose four limbs at severity 3. for(var/X in bodyparts) var/obj/item/bodypart/BP = X diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 10b12f5425b..99d99f6b6d6 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -214,7 +214,7 @@ if(dna.check_mutation(COLDRES)) return 1 //Fully protected from the cold. - if(dna && (RESISTCOLD in dna.species.specflags)) + if(dna && (RESISTTEMP in dna.species.specflags)) return 1 temperature = max(temperature, 2.7) //There is an occasional bug where the temperature is miscalculated in ares with a small amount of gas on them, so this is necessary to ensure that that bug does not affect this calculation. Space's temperature is 2.7K and most suits that are intended to protect against any cold, protect down to 2.0K. diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 9a6f79ea6da..076a254f975 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -84,8 +84,6 @@ var/tox_breath_dam_min = MIN_PLASMA_DAMAGE var/tox_breath_dam_max = MAX_PLASMA_DAMAGE - var/has_dismemberment = 1 //Whether or not this species uses dismemberment for its limbs - /////////// // PROCS // /////////// @@ -128,7 +126,7 @@ var/obj/item/thing = C.get_item_by_slot(slot_id) if(thing) C.unEquip(thing) - if(!has_dismemberment) + if(NODISMEMBER in specflags) C.regenerate_limbs() //if we don't handle dismemberment, we grow our missing limbs back if(exotic_blood) C.reagents.add_reagent(exotic_blood, 80) @@ -153,7 +151,7 @@ return "[id]" /datum/species/proc/update_color(mob/living/carbon/human/H, forced_colour) - if(has_dismemberment) //only species without dismemberment still use base icon states. + if(!(NODISMEMBER in specflags)) //only species without dismemberment still use base icon states. return H.remove_overlay(SPECIES_LAYER) @@ -277,7 +275,7 @@ var/list/standing = list() - if(!has_dismemberment) //Legacy support + if(NODISMEMBER in specflags) //Legacy support H.update_base_icon_state() if(!(H.disabilities & HUSK)) update_color(H) @@ -1036,20 +1034,10 @@ return 0 //item force is zero //dismemberment - if(affecting.get_damage() >= (affecting.max_damage - I.armour_penetration/2)) - if(I.can_dismember() && prob(I.force*(I.w_class-1))) - if(affecting.dismember(I.damtype)) - I.add_blood(H) - switch(I.damtype) - if(BURN) - playsound(get_turf(H), 'sound/weapons/sear.ogg', 80, 1) - else - playsound(get_turf(H), pick('sound/misc/desceration-01.ogg', 'sound/misc/desceration-02.ogg', 'sound/misc/desceration-03.ogg'), 80, 1) - affecting.add_blood(H) - var/turf/location = H.loc - if(istype(location)) - location.add_blood(H) - return + if(prob(I.get_dismemberment_chance(affecting))) + if(affecting.dismember(I.damtype)) + I.add_blood(H) + playsound(get_turf(H), I.get_dismember_sound(), 80, 1) var/bloody = 0 if(((I.damtype == BRUTE) && I.force && prob(25 + (I.force * 2)))) @@ -1361,7 +1349,7 @@ if(200 to 260) H.apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head") - if(!(RESISTHEAT in specflags)) // HEAT DAMAGE + if(!(RESISTTEMP in specflags)) // HEAT DAMAGE switch(breath.temperature) if(360 to 400) H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head") @@ -1396,7 +1384,7 @@ H.bodytemperature += min((1-thermal_protection) * ((loc_temp - H.bodytemperature) / BODYTEMP_HEAT_DIVISOR), BODYTEMP_HEATING_MAX) // +/- 50 degrees from 310.15K is the 'safe' zone, where no damage is dealt. - if(H.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !(RESISTHEAT in specflags)) + if(H.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !(RESISTTEMP in specflags)) //Body temperature is too hot. switch(H.bodytemperature) if(360 to 400) @@ -1435,7 +1423,7 @@ var/adjusted_pressure = H.calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob. switch(adjusted_pressure) if(HAZARD_HIGH_PRESSURE to INFINITY) - if(!(RESISTHEAT in specflags)) + if(!(RESISTTEMP in specflags)) H.adjustBruteLoss( min( ( (adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) ) H.throw_alert("pressure", /obj/screen/alert/highpressure, 2) else @@ -1447,7 +1435,7 @@ if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE) H.throw_alert("pressure", /obj/screen/alert/lowpressure, 1) else - if(H.dna.check_mutation(COLDRES) || (RESISTCOLD in specflags)) + if(H.dna.check_mutation(COLDRES) || (RESISTTEMP in specflags)) H.clear_alert("pressure") else H.adjustBruteLoss( LOW_PRESSURE_DAMAGE ) @@ -1458,11 +1446,11 @@ ////////// /datum/species/proc/handle_fire(mob/living/carbon/human/H) - if((RESISTHEAT in specflags) || (NOFIRE in specflags)) + if((RESISTTEMP in specflags) || (NOFIRE in specflags)) return 1 /datum/species/proc/IgniteMob(mob/living/carbon/human/H) - if((RESISTHEAT in specflags) || (NOFIRE in specflags)) + if((RESISTTEMP in specflags) || (NOFIRE in specflags)) return 1 /datum/species/proc/ExtinguishMob(mob/living/carbon/human/H) diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index 9b0f635152f..396437b58fc 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -179,10 +179,9 @@ default_color = "00FF90" say_mod = "chirps" eyes = "jelleyes" - specflags = list(MUTCOLORS,EYECOLOR,NOBLOOD,VIRUSIMMUNE) + specflags = list(MUTCOLORS,EYECOLOR,NOBLOOD,VIRUSIMMUNE,NODISMEMBER) meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/slime exotic_blood = "slimejelly" - has_dismemberment = 0 /datum/species/jelly/spec_life(mob/living/carbon/human/H) if(H.stat == DEAD) //can't farm slime jelly from a dead slime/jelly person indefinitely @@ -320,7 +319,7 @@ // Animated beings of stone. They have increased defenses, and do not need to breathe. They're also slow as fuuuck. name = "Golem" id = "golem" - specflags = list(NOBREATH,RESISTHEAT,RESISTCOLD,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE) + specflags = list(NOBREATH,RESISTTEMP,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER) speedmod = 2 armor = 55 siemens_coeff = 0 @@ -331,7 +330,6 @@ nojumpsuit = 1 sexes = 0 meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/golem - has_dismemberment = 0 /datum/species/golem/adamantine name = "Adamantine Golem" @@ -412,8 +410,8 @@ blacklisted = 1 sexes = 0 meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton + specflags = list(NOBREATH,RESISTTEMP,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE) mutant_organs = list(/obj/item/organ/tongue/bone) - specflags = list(NOBREATH,RESISTHEAT,RESISTCOLD,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE) /* ZOMBIES @@ -427,7 +425,7 @@ sexes = 0 blacklisted = 1 meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie - specflags = list(NOBREATH,RESISTHEAT,RESISTCOLD,NOBLOOD,RADIMMUNE) + specflags = list(NOBREATH,RESISTTEMP,NOBLOOD,RADIMMUNE) mutant_organs = list(/obj/item/organ/tongue/zombie) /datum/species/cosmetic_zombie @@ -443,7 +441,7 @@ darksight = 3 say_mod = "gibbers" sexes = 0 - specflags = list(NOBLOOD,NOBREATH,VIRUSIMMUNE) + specflags = list(NOBLOOD,NOBREATH,VIRUSIMMUNE,NOGUNS) mutant_organs = list(/obj/item/organ/tongue/abductor) var/scientist = 0 // vars to not pollute spieces list with castes var/agent = 0 @@ -511,7 +509,7 @@ var/global/list/synth_flesh_disguises = list() id = "synth" say_mod = "beep boops" //inherited from a user's real species sexes = 0 - specflags = list(NOTRANSSTING,NOBREATH,VIRUSIMMUNE) //all of these + whatever we inherit from the real species + specflags = list(NOTRANSSTING,NOBREATH,VIRUSIMMUNE,NODISMEMBER) //all of these + whatever we inherit from the real species safe_oxygen_min = 0 safe_toxins_min = 0 safe_toxins_max = 0 @@ -526,7 +524,6 @@ var/global/list/synth_flesh_disguises = list() var/disguise_fail_health = 75 //When their health gets to this level their synthflesh partially falls off var/image/damaged_synth_flesh = null //an image to display when we're below disguise_fail_health var/datum/species/fake_species = null //a species to do most of our work for us, unless we're damaged - has_dismemberment = 0 /datum/species/synth/military name = "Military Synth" @@ -645,7 +642,7 @@ var/global/list/synth_flesh_disguises = list() H.updatehealth() if(H.health > disguise_fail_health) if(fake_species) - if(fake_species.has_dismemberment) + if(!(NODISMEMBER in fake_species.specflags)) return fake_species.handle_body(H) else return fake_species.update_base_icon_state(H) @@ -657,7 +654,7 @@ var/global/list/synth_flesh_disguises = list() /datum/species/synth/update_color(mob/living/carbon/human/H, forced_colour) H.updatehealth() if(H.health > disguise_fail_health) - if(fake_species && fake_species.has_dismemberment) + if(fake_species && !(NODISMEMBER in fake_species.specflags)) fake_species.update_color(H, forced_colour) @@ -722,6 +719,5 @@ SYNDICATE BLACK OPS attack_sound = "sound/weapons/resonator_blast.ogg" blacklisted = 1 use_skintones = 0 - specflags = list(RADIMMUNE,VIRUSIMMUNE,NOBLOOD,PIERCEIMMUNE,EYECOLOR) + specflags = list(RADIMMUNE,VIRUSIMMUNE,NOBLOOD,PIERCEIMMUNE,EYECOLOR,NODISMEMBER) sexes = 0 - has_dismemberment = 0 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 6cb5cda6feb..d0650f6ae05 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -94,7 +94,7 @@ Please contact me on #coderbus IRC. ~Carnie x ..("Standing") /mob/living/carbon/human/proc/update_body_parts() - if(!dna.species.has_dismemberment) //Species don't have no dismemberment going for 'em! + if(NODISMEMBER in dna.species.specflags) //Species don't have no dismemberment going for 'em! remove_overlay(BODYPARTS_LAYER) return @@ -175,16 +175,18 @@ Please contact me on #coderbus IRC. ~Carnie x var/obj/item/clothing/under/U = w_uniform if(client && hud_used && hud_used.hud_shown) if(hud_used.inventory_shown) //if the inventory is open ... - w_uniform.screen_loc = ui_iclothing //...draw the item in the inventory screen + U.screen_loc = ui_iclothing //...draw the item in the inventory screen client.screen += w_uniform //Either way, add the item to the HUD if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT)) return - var/t_color = w_uniform.item_color + var/t_color = U.item_color if(!t_color) - t_color = w_uniform.icon_state + t_color = U.icon_state + if(U.adjusted) + t_color = "[t_color]_d" var/image/standing diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index d2016caaf76..e9854777e3e 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -157,7 +157,7 @@ var/const/VOX_DELAY = 600 if(!only_listener) // Play voice for all mobs in the z level for(var/mob/M in player_list) - if(M.client && !M.ear_deaf && !(M.client.prefs.toggles & SOUND_ANNOUNCEMENTS)) + if(M.client && !M.ear_deaf && (M.client.prefs.toggles & SOUND_ANNOUNCEMENTS)) var/turf/T = get_turf(M) if(T.z == z_level) M << voice diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index a21e2bd2bf5..b94d3db30a2 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -371,18 +371,37 @@ The proc would return a human next to the bot to be set to the patient var. Pass the desired type path itself, declaring a temporary var beforehand is not required. */ /mob/living/simple_animal/bot/proc/scan(scan_type, old_target, scan_range = DEFAULT_SCAN_RANGE) - var/final_result - for (var/scan in shuffle(view(scan_range, src))) //Search for something in range! - if(!istype(scan, scan_type)) //Check that the thing we found is the type we want! - continue //If not, keep searching! - if( (scan in ignore_list) || (scan == old_target) ) //Filter for blacklisted elements, usually unreachable or previously processed oness - continue - var/scan_result = process_scan(scan) //Some bots may require additional processing when a result is selected. - if(scan_result) - final_result = scan_result - else - continue //The current element failed assessment, move on to the next. - return final_result + var/turf/T = get_turf(src) + if(!T) + return + var/list/adjacent = T.GetAtmosAdjacentTurfs(1) + for(var/scan in adjacent)//Let's see if there's something right next to us first! + var/final_result = checkscan(scan,scan_type,old_target) + if(final_result) + return final_result + + for (var/scan in shuffle(view(scan_range, src))-adjacent) //Search for something in range! + var/final_result = checkscan(scan,scan_type,old_target) + if(final_result) + return final_result + +/mob/living/simple_animal/bot/proc/checkscan(scan, scan_type, old_target) + if(!istype(scan, scan_type)) //Check that the thing we found is the type we want! + return 0 //If not, keep searching! + if( (scan in ignore_list) || (scan == old_target) ) //Filter for blacklisted elements, usually unreachable or previously processed oness + return 0 + var/turf/T = get_turf(scan) + if(T) + for(var/C in T.contents) + if(istype(C,src.type) && (C != src)) //Is there another bot there already? If so, let's skip it so we dont all atack on top of eachother. + return 0 + var/scan_result = process_scan(scan) //Some bots may require additional processing when a result is selected. + if(scan_result) + return scan_result + else + return 0 //The current element failed assessment, move on to the next. + return + //When the scan finds a target, run bot specific processing to select it for the next step. Empty by default. /mob/living/simple_animal/bot/proc/process_scan(scan_target) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index c7ed281b154..f1d0ececa64 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -24,6 +24,8 @@ pressure_resistance = 200 unique_name = 1 AIStatus = AI_OFF //normal constructs don't have AI + loot = list(/obj/item/weapon/ectoplasm) + del_on_death = 1 var/list/construct_spells = list() var/playstyle_string = "You are a generic construct! Your job is to not exist, and you should probably adminhelp this." @@ -34,12 +36,8 @@ AddSpell(new spell(null)) /mob/living/simple_animal/hostile/construct/death() - ..(1) - new /obj/item/weapon/ectoplasm (src.loc) - visible_message("[src] collapses in a shattered heap.") - ghostize() - qdel(src) - return + deathmessage = "[src] collapses in a shattered heap." + ..() /mob/living/simple_animal/hostile/construct/examine(mob/user) var/msg = "*---------*\nThis is \icon[src] \a [src]!\n" @@ -183,12 +181,12 @@ /obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser, /obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser) playstyle_string = "You are an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, \ - use magic missile, repair allied constructs (by clicking on them), \ + use magic missile, repair allied constructs, shades, and yourself (by clicking on them), \ and, most important of all, create new constructs by producing soulstones to capture souls, \ and shells to place those soulstones into." /mob/living/simple_animal/hostile/construct/builder/Found(atom/A) //what have we found here? - if(istype(A, /mob/living/simple_animal/hostile/construct)) //is it a construct? + if(isconstruct(A)) //is it a construct? var/mob/living/simple_animal/hostile/construct/C = A if(C.health < C.maxHealth) //is it hurt? let's go heal it if it is return 1 @@ -207,7 +205,7 @@ ..() if(isliving(target)) var/mob/living/L = target - if(istype(L, /mob/living/simple_animal/hostile/construct) && L.health >= L.maxHealth) //is this target an unhurt construct? stop trying to heal it + if(isconstruct(L) && L.health >= L.maxHealth) //is this target an unhurt construct? stop trying to heal it LoseTarget() return 0 if(L.health <= melee_damage_lower+melee_damage_upper) //ey bucko you're hurt as fuck let's go hit you @@ -216,7 +214,7 @@ /mob/living/simple_animal/hostile/construct/builder/Aggro() ..() - if(istype(target, /mob/living/simple_animal/hostile/construct)) //oh the target is a construct no need to flee + if(isconstruct(target)) //oh the target is a construct no need to flee retreat_distance = null minimum_distance = 1 @@ -229,11 +227,6 @@ AIStatus = AI_ON environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP - - - - - /////////////////////////////Non-cult Artificer///////////////////////// /mob/living/simple_animal/hostile/construct/builder/noncult construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/wall, 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 951868c61ca..08b8c31d199 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -43,6 +43,7 @@ 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) + unique_name = TRUE var/staticChoice = "static" var/list/staticChoices = list("static", "blank", "letter", "animal") var/picked = FALSE //Have we picked our visual appearence (+ colour if applicable) @@ -64,10 +65,7 @@ var/datum/personal_crafting/handcrafting /mob/living/simple_animal/drone/New() - ..() - if(name != initial(name)) - name = name + " ([rand(100,999)])" - real_name = name + . = ..() access_card = new /obj/item/weapon/card/id(src) var/datum/job/captain/C = new /datum/job/captain diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm index f37da30e127..c93310b4d22 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm @@ -54,6 +54,17 @@ ..() desc += " This drone appears to have a complex holoprojector built on its 'head'." +/mob/living/simple_animal/drone/snowflake/bardrone + name = "Bardrone" + desc = "A barkeeping drone, an indestructible robot built to tend bars." + seeStatic = FALSE + laws = "1. Serve drinks.\n\ + 2. Talk to patrons.\n\ + 3. Don't get messed up in their affairs." + languages = ALL + status_flags = GODMODE // Please don't punch the barkeeper + unique_name = FALSE // disables the (123) number suffix + /obj/item/drone_shell/syndrone name = "syndrone shell" desc = "A shell of a syndrone, a modified maintenance drone designed to infiltrate and annihilate." diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm index cc9b4cb9f84..c6b108c951a 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm @@ -61,7 +61,7 @@ if(ishuman(user)) - if(stat == DEAD) + if(stat == DEAD || status_flags & GODMODE) ..() return if(user.get_active_hand()) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 546e4b3a4e2..f7c69dbf8f5 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -381,7 +381,7 @@ var/global/list/parasites = list() //all currently existing/living guardians var/list/possible_guardians = list("Chaos", "Standard", "Ranged", "Support", "Explosive", "Lightning", "Protector", "Charger", "Assassin") var/random = TRUE var/allowmultiple = 0 - var/allowling = 0 + var/allowling = 1 /obj/item/weapon/guardiancreator/attack_self(mob/living/user) var/list/guardians = user.hasparasites() 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 0267d112d90..652bea72c7c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm @@ -12,6 +12,7 @@ icon = 'icons/mob/lavaland/dragon.dmi' faction = list("mining") speak_emote = list("roars") + luminosity = 3 armour_penetration = 40 melee_damage_lower = 40 melee_damage_upper = 40 @@ -28,6 +29,7 @@ var/anger_modifier = 0 var/obj/item/device/gps/internal var/swooping = 0 + var/swoop_cooldown = 0 deathmessage = "collapes into a pile of bones, it's flesh sloughing away." death_sound = 'sound/magic/demon_dies.ogg' damage_coeff = list(BRUTE = 1, BURN = 0.5, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) @@ -41,6 +43,13 @@ return else ..() + if(isliving(target)) + var/mob/living/L = target + if(L.stat == DEAD) + L.gib() + visible_message("[src] devours [L]!") + src << "You feast on [L], restoring your health!" + adjustBruteLoss(-L.maxHealth) /mob/living/simple_animal/hostile/megafauna/dragon/Process_Spacemove(movement_dir = 0) return 1 @@ -51,16 +60,27 @@ name = "fireball" desc = "Get out of the way!" layer = 6 - dir = SOUTH + randomdir = 0 + duration = 10 pixel_z = 500 - anchored = 1 /obj/effect/overlay/temp/target icon = 'icons/mob/actions.dmi' icon_state = "sniper_zoom" layer = MOB_LAYER - 0.1 - anchored = 1 luminosity = 2 + duration = 10 + +/obj/effect/overlay/temp/dragon_swoop + name = "certain death" + desc = "Don't just stand there, move!" + icon = 'icons/effects/96x96.dmi' + icon_state = "rune_large" + layer = MOB_LAYER - 0.1 + pixel_x = -32 + pixel_y = -32 + color = "#FF0000" + duration = 10 /obj/effect/overlay/temp/target/ex_act() return @@ -81,8 +101,8 @@ anger_modifier = Clamp(((maxHealth - health)/50),0,20) ranged_cooldown = world.time + ranged_cooldown_time - if(prob(15 + anger_modifier)) - if(health < maxHealth/2 && !client) + if(prob(15 + anger_modifier) && !client) + if(health < maxHealth/2) swoop_attack(1) else fire_rain() @@ -103,33 +123,36 @@ if(prob(10)) new /obj/effect/overlay/temp/target(turf) - /mob/living/simple_animal/hostile/megafauna/dragon/proc/fire_walls() var/list/attack_dirs = list(NORTH,EAST,SOUTH,WEST) if(prob(50)) attack_dirs = list(NORTH,WEST,SOUTH,EAST) playsound(get_turf(src),'sound/magic/Fireball.ogg', 200, 1) - spawn(0) - for(var/d in attack_dirs) + for(var/d in attack_dirs) + spawn(0) var/turf/E = get_edge_target_turf(src, d) var/range = 10 for(var/turf/open/J in getline(src,E)) if(!range) break range-- - 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!" + sleep(1) -/mob/living/simple_animal/hostile/megafauna/dragon/proc/swoop_attack(fire_rain = 0) +/mob/living/simple_animal/hostile/megafauna/dragon/proc/swoop_attack(fire_rain = 0, atom/movable/manual_target) if(stat) return - var/mob/living/swoop_target = target + var/swoop_target + if(manual_target) + swoop_target = manual_target + else + swoop_target = target stop_automated_movement = TRUE swooping = 1 icon_state = "swoop" @@ -150,9 +173,10 @@ else tturf = get_turf(src) src.loc = tturf + new/obj/effect/overlay/temp/dragon_swoop(tturf) animate(src, pixel_x = 0, pixel_z = 0, time = 10) sleep(10) - playsound(src, 'sound/effects/meteorimpact.ogg', 200, 1) + playsound(src.loc, 'sound/effects/meteorimpact.ogg', 200, 1) for(var/mob/living/L in range(1,tturf)) if(L == src) continue @@ -170,6 +194,19 @@ stop_automated_movement = FALSE swooping = 0 density = 1 + swoop_cooldown = world.time + 200 + + + + +/mob/living/simple_animal/hostile/megafauna/dragon/AltClickOn(atom/movable/A) + if(!istype(A)) + return + if(swoop_cooldown >= world.time) + src << "You need to wait 20 seconds between swoop attacks!" + return + swoop_attack(1, A) + /obj/item/device/gps/internal/dragon icon_state = null @@ -228,8 +265,8 @@ /mob/living/simple_animal/hostile/megafauna/dragon/lesser name = "lesser ash drake" - maxHealth = 500 - health = 500 + maxHealth = 750 + health = 750 melee_damage_upper = 30 melee_damage_lower = 30 damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) @@ -248,21 +285,15 @@ return var/mob/living/carbon/human/H = user - var/random = rand(1,5) + var/random = rand(1,3) switch(random) if(1) - user << "The blood sears your insides! What the hell were you thinking?" - user.reagents.add_reagent("hellwater", 50) - if(2) user << "Other than tasting terrible, nothing really happens." - if(3) + if(2) user << "Your flesh begins to melt! Miraculously, you seem fine otherwise." H.set_species(/datum/species/skeleton) - if(4) - user << "The blood mixes with your own, filling your veins with a pulsing fire." - H.dna.species.coldmod = 0 - if(5) + if(3) user << "You don't feel so good..." H.ForceContractDisease(new /datum/disease/transformation/dragon(0)) playsound(user.loc,'sound/items/drink.ogg', rand(10,50), 1) @@ -318,15 +349,11 @@ /obj/structure/closet/crate/necropolis/dragon/New() ..() - var/loot = rand(1,4) + var/loot = rand(1,3) switch(loot) if(1) - for(var/i in 1 to 10) - new /obj/item/weapon/ore/diamond(src) - new /obj/item/weapon/ore/gold(src) - if(2) new /obj/item/weapon/melee/ghost_sword(src) - if(3) + if(2) new /obj/item/weapon/dragons_blood(src) - if(4) + if(3) new /obj/item/weapon/lava_staff(src) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index 6a273d83b3e..8a846d02623 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -3,6 +3,7 @@ desc = "Attack the weak point for massive damage." health = 1000 maxHealth = 1000 + a_intent = "harm" sentience_type = SENTIENCE_BOSS environment_smash = 4 robust_searching = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/reenactors.dm b/code/modules/mob/living/simple_animal/hostile/reenactors.dm new file mode 100644 index 00000000000..b6382dc4302 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/reenactors.dm @@ -0,0 +1,103 @@ +/* +-!WARNING!- +-POTENTIAL TRIGGER-INDUCING ITEMS AHEAD- +-TREAD WITH CAUTION- +*/ + +/mob/living/simple_animal/hostile/wwii + name = "World War II Reenactor" + desc = "A VERY enthusiastic WWII reenactor." + icon_state = "nsoldier" + icon_living = "nsoldier" + speak_chance = 0 + turns_per_move = 5 + response_help = "pokes" + response_disarm = "shoves" + response_harm = "hits" + speed = 0 + stat_attack = 1 + robust_searching = 1 + maxHealth = 100 + health = 100 + harm_intent_damage = 10 + melee_damage_lower = 10 + melee_damage_upper = 15 + attacktext = "punches" + attack_sound = 'sound/weapons/punch1.ogg' + a_intent = "harm" + loot = list(/obj/effect/mob_spawn/human/wwii) + atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) + unsuitable_atmos_damage = 15 + faction = list("german") + check_friendly_fire = 1 + status_flags = CANPUSH + del_on_death = 1 + +/mob/living/simple_animal/hostile/wwii/ranged + ranged = 1 + rapid = 1 + retreat_distance = 5 + minimum_distance = 5 + icon_state = "nsoldierranged" + icon_living = "nsoldierranged" + casingtype = /obj/item/ammo_casing/c45nostamina + projectilesound = 'sound/weapons/Gunshot_smg.ogg' + +/mob/living/simple_animal/hostile/wwii/melee + name = "Hulking World War II Reenactor" + icon_state = "nsoldierbuff" + icon_living = "nsoldierbuff" + stat_attack = 0 + speed = 4 + maxHealth = 200 + health = 200 + force_threshold = 10 + harm_intent_damage = 25 + melee_damage_lower = 25 + melee_damage_upper = 30 + environment_smash = 2 + attacktext = "slams" + deathmessage = "The Reenactor's body collapses in on itself from the strain!" + loot = list(/obj/effect/gibspawner/human) + +/mob/living/simple_animal/hostile/wwii/melee/AttackingTarget() + ..() + if(iscarbon(target)) + var/mob/living/carbon/C = target + if(prob(40)) + C.Weaken(3) + C.adjustBruteLoss(10) + C.visible_message("\The [src] smashes \the [C] into the ground!", \ + "\The [src] smashes you into the ground!") + src.say(pick("RAAAAAGGHHHH!!!","AAAARRRGGHHHH!!!","RRRAAUUUGGHH!!!")) + + +/mob/living/simple_animal/hostile/wwii/bomber + name = "Mini-Führer" + desc = "A small, robotic recreation of the Führer himself; it seems like he wants to tell you something." + icon_state = "miniheil" + icon_living = "miniheil" + speed = 1 + maxHealth = 25 + health = 25 + harm_intent_damage = 5 + melee_damage_lower = 5 + melee_damage_upper = 7 + attacktext = "heils" + deathmessage = "The Mini-Führer explodes!" + loot = list(/obj/effect/gibspawner/robot) + +/mob/living/simple_animal/hostile/wwii/bomber/AttackingTarget() + ..() + if(iscarbon(target)) + var/mob/living/carbon/C = target + if(prob(90)) + C.Weaken(2) + src.say("HEIL HITLER!") + explosion(src, 0, 0, 2, 3, 2) + src.gib() + +/* +-YOU HAVE SAFETLY PASSED THE POTENTIALLY-TRIGGERING CONTENT- +-PLEASE RESUME NORMAL, POLITICALLY CORRECT ACTIVITY- +*/ diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index 955ccacb23d..f2164eec7b9 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -26,16 +26,28 @@ faction = list("cult") status_flags = CANPUSH flying = 1 + loot = list(/obj/item/weapon/ectoplasm) + del_on_death = 1 /mob/living/simple_animal/shade/death() - ..(1) - new /obj/item/weapon/ectoplasm (src.loc) - visible_message("[src] lets out a contented sigh as their form unwinds.") - ghostize() - qdel(src) - return + deathmessage = "[src] lets out a contented sigh as their form unwinds." + ..() +/mob/living/simple_animal/shade/Process_Spacemove(movement_dir = 0) + return TRUE //this doesn't make much sense; you'd thing TRUE would mean it'd process spacemove but it means it doesn't + +/mob/living/simple_animal/shade/attack_animal(mob/living/simple_animal/M) + if(istype(M, /mob/living/simple_animal/hostile/construct/builder)) + if(health < maxHealth) + adjustHealth(-25) + Beam(M,icon_state="sendbeam",icon='icons/effects/effects.dmi',time=4) + M.visible_message("[M] heals \the [src].", \ + "You heal [src], leaving [src] at [health]/[maxHealth] health.") + else + M << "You cannot heal [src], as it is unharmed!" + else if(src != M) + ..() /mob/living/simple_animal/shade/attackby(obj/item/O, mob/user, params) //Marker -Agouri if(istype(O, /obj/item/device/soulstone)) @@ -43,4 +55,3 @@ SS.transfer_soul("SHADE", src, user) else ..() - return diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index 448a7514a11..8c62ddcfa83 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -133,13 +133,13 @@ Tempstun = 0 if(stat != DEAD) - var/co2_percentage =0 - if("co2" in environment.gases) - co2_percentage = environment.gases["co2"][MOLES] / environment.total_moles() - var/stasis = (co2_percentage >= 0.05 && bodytemperature < (T0C + 100)) || force_stasis + var/bz_percentage =0 + if("bz" in environment.gases) + bz_percentage = environment.gases["bz"][MOLES] / environment.total_moles() + var/stasis = (bz_percentage >= 0.05 && bodytemperature < (T0C + 100)) || force_stasis if(stat == CONSCIOUS && stasis) - src << "High levels of CO2 put you in stasis!" + src << "Nerve gas in the air has put you in stasis!" stat = UNCONSCIOUS powerlevel = 0 rabid = 0 diff --git a/code/modules/paperwork/contract.dm b/code/modules/paperwork/contract.dm index 7f67ef9e3d3..43a8e5fce22 100644 --- a/code/modules/paperwork/contract.dm +++ b/code/modules/paperwork/contract.dm @@ -23,7 +23,7 @@ qdel(src) return -1 target = nOwner.mind - update_text(nOwner) + update_text() /obj/item/weapon/paper/contract/employment/update_text() diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 1280fdb3d8c..53096240c8f 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -67,7 +67,7 @@ var/copy_as_paper = 1 if(istype(copy, /obj/item/weapon/paper/contract/employment)) var/obj/item/weapon/paper/contract/employment/E = copy - var/obj/item/weapon/paper/contract/employment/C = new /obj/item/weapon/paper/contract/employment (loc, E.target) + var/obj/item/weapon/paper/contract/employment/C = new /obj/item/weapon/paper/contract/employment (loc, E.target.current) if(C) copy_as_paper = 0 if(copy_as_paper) diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 656bc0c7d8e..f86c1772ad1 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -86,12 +86,9 @@ stamp_names += initial(stamp_type.name) stamp_names = sortList(stamp_names) - // the list that will be shown to the user to pick from - world << jointext(stamp_names, ",") var/input_stamp = input(user, "Choose a stamp to disguise as.", "Choose a stamp.") as null|anything in stamp_names - world << input_stamp if(user && (src in user.contents) && input_stamp) var/obj/item/weapon/stamp/stamp_type @@ -99,7 +96,6 @@ stamp_type = i if(initial(stamp_type.name) == input_stamp) break - world << stamp_type name = initial(stamp_type.name) icon_state = initial(stamp_type.icon_state) diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index 6ee2f2308b2..9d1f29ce38b 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -289,24 +289,41 @@ if (modified) icon_state = "foamdart_empty" desc = "Its nerf or nothing! ... Although, this one doesn't look too safe." + if(BB) + BB.icon_state = "foamdart_empty" + else + icon_state = "foamdart" + desc = "Its nerf or nothing! Ages 8 and up." + if(BB) + BB.icon_state = "foamdart_empty" + /obj/item/ammo_casing/caseless/foam_dart/attackby(obj/item/A, mob/user, params) ..() + var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB if (istype(A, /obj/item/weapon/screwdriver) && !modified) modified = 1 - BB.damage_type = BRUTE - icon_state = "foamdart_empty" - desc = "Its nerf or nothing! ... Although, this one doesn't look too safe." - user << "You pop the safety cap off of [src]." - else if ((istype(A, /obj/item/weapon/pen)) && modified && !BB.contents.len) + FD.damage_type = BRUTE + update_icon() + else if ((istype(A, /obj/item/weapon/pen)) && modified && !FD.pen) if(!user.unEquip(A)) return - A.loc = BB - BB.damage = 5 - BB.nodamage = 0 + A.loc = FD + FD.pen = A + FD.damage = 5 + FD.nodamage = 0 user << "You insert [A] into [src]." return +/obj/item/ammo_casing/caseless/foam_dart/attack_self(mob/living/user) + var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB + if(FD.pen) + FD.damage = initial(FD.damage) + FD.nodamage = initial(FD.nodamage) + user.put_in_hands(FD.pen) + user << "You remove [FD.pen] from [src]." + FD.pen = null + /obj/item/ammo_casing/caseless/foam_dart/riot name = "riot foam dart" desc = "Whose smart idea was it to use toys as crowd control? Ages 18 and up." diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index caec75bfd22..808bfb7f59c 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -65,12 +65,6 @@ caliber = "38" max_ammo = 6 -/obj/item/ammo_box/magazine/internal/cylinder/rev38/can_load(mob/user) - user << "You start reloading..." - if(!do_after(user, 30, target = user)) - return 0 - return 1 - /obj/item/ammo_box/magazine/internal/cylinder/grenademulti name = "grenade launcher internal magazine" ammo_type = /obj/item/ammo_casing/a40mm diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/firing.dm index cf008e00ec1..7465de12b04 100644 --- a/code/modules/projectiles/firing.dm +++ b/code/modules/projectiles/firing.dm @@ -37,6 +37,7 @@ var/turf/curloc = user.loc if (!istype(targloc) || !istype(curloc) || !BB) return 0 + BB.ammo_casing = src if(targloc == curloc) if(target) //if the target is right on our location we go straight to bullet_act() target.bullet_act(BB, BB.def_zone) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 25a8fa2a00b..69d6b980422 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -1,11 +1,3 @@ - #define SAWN_INTACT 0 - #define SAWN_OFF 1 - #define SAWN_SAWING -1 - - #define WEAPON_LIGHT 0 - #define WEAPON_MEDIUM 1 - #define WEAPON_HEAVY 2 - /obj/item/weapon/gun name = "gun" desc = "It's a gun. It's pretty terrible, though." diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index 128b4eac077..e6bcc070ea9 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -87,6 +87,9 @@ /obj/item/weapon/gun/magic/wand/resurrection/zap_self(mob/living/user) user.revive(full_heal = 1) + if(iscarbon(user)) + var/mob/living/carbon/C = user + C.regenerate_limbs() user << "You feel great!" charges-- ..() @@ -162,4 +165,4 @@ /obj/item/weapon/gun/magic/wand/fireball/zap_self(mob/living/user) explosion(user.loc, -1, 0, 2, 3, 0, flame_range = 2) charges-- - ..() \ No newline at end of file + ..() diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/medbeam.dm index 419e9fdcb25..612206fe4ae 100644 --- a/code/modules/projectiles/guns/medbeam.dm +++ b/code/modules/projectiles/guns/medbeam.dm @@ -103,6 +103,8 @@ return /obj/item/weapon/gun/medbeam/proc/on_beam_tick(var/mob/living/target) + if(target.health != target.maxHealth) + PoolOrNew(/obj/effect/overlay/temp/heal, list(get_turf(target), "#80F5FF")) target.adjustBruteLoss(-4) target.adjustFireLoss(-4) return diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index beb3c06dab7..9b8e75bb6ef 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -211,8 +211,7 @@ suit_requirement = /obj/item/clothing/suit/bluetag tagcolor = "blue" - /obj/item/device/firing_pin/Destroy() if(gun) gun.pin = null - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 4f9408f1f06..feb1a8d04ca 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -10,6 +10,7 @@ pressure_resistance = INFINITY var/def_zone = "" //Aiming at var/mob/firer = null//Who shot it + var/obj/item/ammo_casing/ammo_casing = null var/suppressed = 0 //Attack message var/yo = null var/xo = null @@ -139,3 +140,7 @@ ..() if(isliving(AM) && AM.density && !checkpass(PASSMOB)) Bump(AM, 1) + +/obj/item/projectile/Destroy() + ammo_casing = null + return ..() diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 345ddad0d85..cbe4524c9f9 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -57,6 +57,9 @@ if(target.hellbound) return if(ismob(target)) + if(iscarbon(target)) + var/mob/living/carbon/C = target + C.regenerate_limbs() if(target.revive(full_heal = 1)) if(!target.ckey) for(var/mob/dead/observer/ghost in player_list) diff --git a/code/modules/projectiles/projectile/reusable.dm b/code/modules/projectiles/projectile/reusable.dm index 321ae1c6b42..216b24e570a 100644 --- a/code/modules/projectiles/projectile/reusable.dm +++ b/code/modules/projectiles/projectile/reusable.dm @@ -1,26 +1,22 @@ /obj/item/projectile/bullet/reusable name = "reusable bullet" desc = "How do you even reuse a bullet?" - var/obj/item/ammo_casing/caseless/ammo_type = /obj/item/ammo_casing/caseless/ + var/ammo_type = /obj/item/ammo_casing/caseless/ + var/dropped = 0 /obj/item/projectile/bullet/reusable/on_hit(atom/target, blocked = 0) . = ..() - if (src.contents.len) - var/obj/content - for(content in src.contents) - content.loc = src.loc - else - new ammo_type(src.loc) + handle_drop() /obj/item/projectile/bullet/reusable/on_range() - if (src.contents.len) - var/obj/content - for(content in src.contents) - content.loc = src.loc - else - new ammo_type(src.loc) + handle_drop() ..() +/obj/item/projectile/bullet/reusable/proc/handle_drop() + if(!dropped) + new ammo_type(src.loc) + dropped = 1 + /obj/item/projectile/bullet/reusable/magspear name = "magnetic spear" desc = "WHITE WHALE, HOLY GRAIL" @@ -38,9 +34,32 @@ icon_state = "foamdart" ammo_type = /obj/item/ammo_casing/caseless/foam_dart range = 10 + var/obj/item/weapon/pen/pen = null + +/obj/item/projectile/bullet/reusable/foam_dart/handle_drop() + if(dropped) + return + dropped = 1 + var/obj/item/ammo_casing/caseless/foam_dart/newdart = new ammo_type(src.loc) + var/obj/item/ammo_casing/caseless/foam_dart/old_dart = ammo_casing + newdart.modified = old_dart.modified + if(pen) + var/obj/item/projectile/bullet/reusable/foam_dart/newdart_FD = newdart.BB + newdart_FD.pen = pen + pen.loc = newdart_FD + pen = null + newdart.BB.damage = damage + newdart.BB.nodamage = nodamage + newdart.BB.damage_type = damage_type + newdart.update_icon() + +/obj/item/projectile/bullet/reusable/foam_dart/Destroy() + if(pen) + qdel(pen) + return ..() /obj/item/projectile/bullet/reusable/foam_dart/riot name = "riot foam dart" icon_state = "foamdart_riot" ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot - stamina = 25 \ No newline at end of file + stamina = 25 diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 090942bf0e6..e8d1aebe14a 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -120,3 +120,11 @@ volume = 60 amount_per_transfer_from_this = 30 list_reagents = list("atropine" = 10, "epinephrine" = 10, "salbutamol" = 20, "spaceacillin" = 20) + +/obj/item/weapon/reagent_containers/hypospray/medipen/survival + name = "survival medipen" + desc = "A medipen for surviving in the harshest of environments, heals and protects from environmental hazards. " + icon_state = "stimpen" + volume = 80 + amount_per_transfer_from_this = 80 + list_reagents = list("salbutamol" = 10, "coffee" = 20, "leporazine" = 20, "tricordrazine" = 15, "epinephrine" = 10, "omnizine" = 5) diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index 2cdc11189e1..7183b72080f 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -93,6 +93,10 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). G.amount = round(diamond_amount / MINERAL_MATERIAL_AMOUNT) ..() +/obj/machinery/r_n_d/circuit_imprinter/disconnect_console() + linked_console.linked_imprinter = null + ..() + /obj/machinery/r_n_d/circuit_imprinter/Insert_Item(obj/item/O, mob/user) if (istype(O, /obj/item/stack/sheet/glass) || istype(O, /obj/item/stack/sheet/mineral/gold) || istype(O, /obj/item/stack/sheet/mineral/diamond)) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 02b9a48b25a..60869979e71 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -177,6 +177,16 @@ other types of metals and chemistry for reagents). build_path = /obj/item/weapon/pickaxe/drill/jackhammer category = list("Mining Designs") +/datum/design/modkit + name = "Modification Kit" + desc = "A device which allows kinetic accelerators to be wielded with one hand, and by any organism." + id = "modkit" + req_tech = list("materials" = 5, "powerstorage" = 4, "engineering" = 4, "magnets" = 4, "combat" = 3) + build_type = PROTOLATHE + materials = list(MAT_METAL = 8000, MAT_GLASS = 1500, MAT_GOLD = 1500, MAT_URANIUM = 1000) + build_path = /obj/item/modkit + category = list("Mining Designs") + /datum/design/superaccelerator name = "Super-Kinetic Accelerator" desc = "An upgraded version of the proto-kinetic accelerator, with superior damage, speed and range." diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index a3b856b5f0f..d48ed0b2974 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -40,6 +40,10 @@ Note: Must be placed within 3 tiles of the R&D Console temp_list[O] = text2num(temp_list[O]) return temp_list +/obj/machinery/r_n_d/destructive_analyzer/disconnect_console() + linked_console.linked_destroy = null + ..() + /obj/machinery/r_n_d/destructive_analyzer/Insert_Item(obj/item/O, mob/user) if(user.a_intent != "harm") . = 1 diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index 70c6c1c0451..7099699fb5a 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -81,6 +81,11 @@ Note: Must be placed west/left of and R&D console to function. materials.retrieve_all() ..() + +/obj/machinery/r_n_d/protolathe/disconnect_console() + linked_console.linked_lathe = null + ..() + /obj/machinery/r_n_d/protolathe/Insert_Item(obj/item/O, mob/user) if(istype(O,/obj/item/stack/sheet)) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 5da672ae25d..7a191dcab46 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -150,9 +150,22 @@ proc/CallMaterialName(ID) D.loc = src user << "You add the disk to the machine!" else if(!(linked_destroy && linked_destroy.busy) && !(linked_lathe && linked_lathe.busy) && !(linked_imprinter && linked_imprinter.busy)) - ..() - src.updateUsrDialog() - return + . = ..() + updateUsrDialog() + + +/obj/machinery/computer/rdconsole/deconstruction() + if(linked_destroy) + linked_destroy.linked_console = null + linked_destroy = null + if(linked_lathe) + linked_lathe.linked_console = null + linked_lathe = null + if(linked_imprinter) + linked_imprinter.linked_console = null + linked_imprinter = null + ..() + /obj/machinery/computer/rdconsole/emag_act(mob/user) if(!emagged) diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index 847df5d329d..3778e2c1c73 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -53,8 +53,7 @@ return 1 if (default_deconstruction_screwdriver(user, "[initial(icon_state)]_t", initial(icon_state), O)) if(linked_console) - linked_console.linked_lathe = null - linked_console = null + disconnect_console() return if(exchange_parts(user, O)) return @@ -67,6 +66,10 @@ else return ..() +//to disconnect the machine from the r&d console it's linked to +/obj/machinery/r_n_d/proc/disconnect_console() + linked_console = null + //proc used to handle inserting items or reagents into r_n_d machines /obj/machinery/r_n_d/proc/Insert_Item(obj/item/I, mob/user) return diff --git a/code/modules/ruins/ruin_areas.dm b/code/modules/ruins/ruin_areas.dm index ad9688b1625..c6953575bb2 100644 --- a/code/modules/ruins/ruin_areas.dm +++ b/code/modules/ruins/ruin_areas.dm @@ -17,16 +17,17 @@ + //Areas /area/ruin/unpowered/no_grav/way_home name = "\improper Salvation" icon_state = "away" - - /area/ruin/powered/snow_biodome +/area/ruin/powered/golem_ship + name = "Free Golem Ship" // Ruins of "onehalf" ship /area/ruin/onehalf/hallway diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 2439ef13ce6..b0c3f08652d 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -1,5 +1,5 @@ //use this define to highlight docking port bounding boxes (ONLY FOR DEBUG USE) -//#define DOCKING_PORT_HIGHLIGHT +// #define DOCKING_PORT_HIGHLIGHT //NORTH default dir /obj/docking_port diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index 8bb62fdc933..0316b3899ff 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -1,9 +1,11 @@ +/obj/item/bodypart/proc/can_dismember(obj/item/I) + . = (get_damage() >= (max_damage - I.armour_penetration/2)) //Dismember a limb /obj/item/bodypart/proc/dismember(dam_type = BRUTE) var/mob/living/carbon/human/H = owner - if(!istype(H) || !H.dna.species.has_dismemberment) // species don't allow dismemberment + if(!istype(H) || (NODISMEMBER in H.dna.species.specflags)) // species don't allow dismemberment return 0 var/obj/item/bodypart/affecting = H.get_bodypart("chest") @@ -15,6 +17,10 @@ if(dam_type == BURN) burn() return 1 + add_blood(H) + var/turf/location = H.loc + if(istype(location)) + location.add_blood(H) var/direction = pick(cardinal) var/t_range = rand(2,max(throw_range/2, 2)) var/turf/target_turf = get_turf(src) @@ -29,7 +35,7 @@ /obj/item/bodypart/chest/dismember() var/mob/living/carbon/human/H = owner - if(!istype(H) || !H.dna.species.has_dismemberment) //human's species don't allow dismemberment + if(!istype(H) || (NODISMEMBER in H.dna.species.specflags)) //human's species don't allow dismemberment return 0 var/organ_spilled = 0 diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index 1dd5b807a62..c1980400a45 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -70,7 +70,7 @@ .++ /mob/living/proc/get_missing_limbs() - return + return list() /mob/living/carbon/human/get_missing_limbs() var/list/full = list("head", "chest", "r_arm", "l_arm", "r_leg", "l_leg") @@ -153,4 +153,4 @@ if("african2") . = "471c18" if("albino") - . = "fff4e6" \ No newline at end of file + . = "fff4e6" diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index af104113c34..1b47c0172f6 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -314,7 +314,7 @@ /obj/item/organ/tongue/abductor/TongueSpeech(var/message) //Hacks var/mob/living/carbon/human/user = usr - var/rendered = "[user.name]: [message]" + var/rendered = "[user.name]: [message]" for(var/mob/living/carbon/human/H in living_mob_list) var/obj/item/organ/tongue/T = H.getorganslot("tongue") if(!T || T.type != type) @@ -370,7 +370,7 @@ say_mod = "rattles" attack_verb = list("bitten", "chattered", "chomped", "enamelled", "boned") - var/chatter = FALSE + var/chattering = FALSE var/phomeme_type = "sans" var/list/phomeme_types = list("sans", "papyrus") @@ -381,9 +381,9 @@ /obj/item/organ/tongue/bone/TongueSpeech(var/message) . = message - if(chatter) + if(chattering) //Annoy everyone nearby with your chattering. - return + chatter(message, phomeme_type, usr) /obj/item/organ/tongue/bone/get_spans() . = ..() @@ -396,7 +396,7 @@ /obj/item/organ/tongue/bone/chatter name = "chattering bone \"tongue\"" - chatter = TRUE + chattering = TRUE /obj/item/organ/appendix name = "appendix" diff --git a/code/modules/telesci/gps.dm b/code/modules/telesci/gps.dm index 139a8530357..a05819054e7 100644 --- a/code/modules/telesci/gps.dm +++ b/code/modules/telesci/gps.dm @@ -104,4 +104,9 @@ var/list/GPS_list = list() flags = ABSTRACT gpstag = "Eerie Signal" desc = "Report to a coder immediately." - invisibility = INVISIBILITY_MAXIMUM \ No newline at end of file + invisibility = INVISIBILITY_MAXIMUM + +/obj/item/device/gps/mining/internal + icon_state = "gps-m" + gpstag = "MINER" + desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life." \ No newline at end of file diff --git a/code/orphaned procs/priority_announce.dm b/code/orphaned procs/priority_announce.dm index 2d490bea2af..38e1a24d5d3 100644 --- a/code/orphaned procs/priority_announce.dm +++ b/code/orphaned procs/priority_announce.dm @@ -28,8 +28,7 @@ if(!istype(M,/mob/new_player) && !M.ear_deaf) M << announcement if(M.client.prefs.toggles & SOUND_ANNOUNCEMENTS) - continue - M << sound(sound) + M << sound(sound) /proc/print_command_report(text = "", title = "Central Command Update") for (var/obj/machinery/computer/communications/C in machines) @@ -49,8 +48,7 @@ if(!istype(M,/mob/new_player) && !M.ear_deaf) M << "[title]
[message]

" if(M.client.prefs.toggles & SOUND_ANNOUNCEMENTS) - continue - if(alert) - M << sound('sound/misc/notice1.ogg') - else - M << sound('sound/misc/notice2.ogg') \ No newline at end of file + if(alert) + M << sound('sound/misc/notice1.ogg') + else + M << sound('sound/misc/notice2.ogg') diff --git a/config/lavaRuinBlacklist.txt b/config/lavaRuinBlacklist.txt index 515a68be6b1..8e94e37600e 100644 --- a/config/lavaRuinBlacklist.txt +++ b/config/lavaRuinBlacklist.txt @@ -29,4 +29,7 @@ #_maps/RandomRuins/LavaRuins/lavaland_surface_automated_trade_outpost.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm -#_maps/RandomRuins/LavaRuins/lavaland_gym.dmm \ No newline at end of file +#_maps/RandomRuins/LavaRuins/lavaland_gym.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_wwiioutpost.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_tomb.dmm diff --git a/html/changelog.html b/html/changelog.html index 0927b728d82..380533e46cc 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,92 @@ -->
+

15 May 2016

+

Iamgoofball updated:

+
    +
  • Nanotrasen is short on cash, and are now borrowing escape shuttles from other stations, and Space Apartments.
  • +
+

Mercenaryblue updated:

+
    +
  • Turns out a bike horn made with Bananium is flipping awesome! Honk!
  • +
+ +

14 May 2016

+

Cruix updated:

+
    +
  • Fixed foam darts with the safety cap removed being reset when fired.
  • +
  • Added the ability to remove pens from foam darts.
  • +
  • Foam darts with pens inside them are no longer destroyed when fired.
  • +
  • Foam darts no longer drop two darts when fired at a person on a janicart.
  • +
+

Joan updated:

+
    +
  • The Raise Dead rune no longer accepts dead cultists as a sacrifice to raise the dead.
  • +
+

Metacide updated:

+
    +
  • A small update for MetaStation, changes include:
  • +
  • Added extra grounding rods to the engine area to stop camera destruction.
  • +
  • Added canvases and extra crayons to art storage and some easels to maint.
  • +
  • Added formal security uniform crate for parades to the warden's gear area.
  • +
  • The armory securitron now starts active.
  • +
  • The genetics APC now starts unlocked.
  • +
  • Other minor changes and fixes as detailed on the wiki page.
  • +
+

coiax, Nienhaus updated:

+
    +
  • Unfortunately, the Belowyarn toys have been withdrawn from distribution due to Assistants choking on the batteries. Centcom has sent their condolences to the battery manufacturing plant.
  • +
  • We are introducing Oh-cee the original content skeleton figurines. Pull its string, and hear it say a variety of phrases. Not suitable for infants or assistants under 36 months.
  • +
  • Note that pulling the string of all talking toys is now visible to others.
  • +
  • Talking toys produce a lot more chatter than they did before. So do some skeleton "tongues".
  • +
+

pudl updated:

+
    +
  • Adds normal security headsets to security lockers
  • +
+

xxalpha updated:

+
    +
  • Fixed drone dispenser multiplying glass or metal.
  • +
+ +

13 May 2016

+

Joan updated:

+
    +
  • Cultists can now unanchor and reanchor cult structures by hitting them with a tome. Unanchored cult structures don't do anything.
  • +
+

KorPhaeron updated:

+
    +
  • Drake attacks are now much easier to avoid.
  • +
  • Player controlled drakes can now consume bodies to heal, and alt+click targets to divebomb them.
  • +
+

TechnoAlchemisto updated:

+
    +
  • More items have been added to the mining vendor, check them out!
  • +
+ +

12 May 2016

+

Shadowlight and coiax updated:

+
    +
  • Due to numerous reports of teams using human weapons instead of stealth when carrying out their assignments, future teams have been genetically modified to only be able to use their assigned blaster and are unable to use human weapons.
  • +
+ +

11 May 2016

+

Joan updated:

+
    +
  • Shades can move in space.
  • +
  • Artificers can now heal shades.
  • +
+

coiax updated:

+
    +
  • Added action button to chameleon stamp
  • +
  • Added APPROVED and DENIED stamps to Bureaucracy Crate
  • +
  • Added the cream pie closet to various maps. Added contraband Cream Pie Crate to Cargo.
  • +
+

pudl updated:

+
    +
  • The armory has been redesigned.
  • +
+

09 May 2016

Joan updated:

    @@ -539,90 +625,6 @@
    • Fixes air canisters being silent when bashed.
    - -

    16 April 2016

    -

    Bawhoppen updated:

    -
      -
    • Cryo is no longer god-awful.
    • -
    -

    CoreOverload updated:

    -
      -
    • A lot of items are now exportable in cargo.
    • -
    • Use Export Scanner to check any item's export value.
    • -
    -

    Erwgd updated:

    -
      -
    • Forks, bowls, drinking glasses, shot glasses and shakers can now be made and recycled in the autolathe! Access the designs in the new 'Dinnerware' category.
    • -
    • Kitchen knives have been moved to the Dinnerware category of the autolathe.
    • -
    • Butcher's cleavers can now be made in a hacked autolathe.
    • -
    -

    Fox McCloud updated:

    -
      -
    • Slime batteries now self-recharge.
    • -
    • Adds transference potion. A potion that allows the user to transfer their consciousness to a simple mob.
    • -
    • Adds rainbow slime core reaction that generates a consciousness transference potion when injected with blood.
    • -
    -

    Iamgoofball, Lati, Geo_Jerkal, Tanquetsunami25 updated:

    -
      -
    • Lati requested that the Slime Processor will now automatically scoop up any dead slimes into itself for processing.
    • -
    • Geo_Jerkal requested that you be able to mix Arnold Palmers with Tea and Lemon Juice.
    • -
    • Tanquetsunami25 requested that cyborg be able to boop.
    • -
    -

    Incoming5643 updated:

    -
      -
    • Removed the horrible meme skeletons, please don't sue us.
    • -
    -

    Kor updated:

    -
      -
    • Adrenals, no slips, surplus crates and SUHTANDOS now have minimum population requirements before they can be purchased.
    • -
    -

    KorPhaeron updated:

    -
      -
    • You now need to butcher goliaths and watchers on lavaland to receive their loot. Use the combat knives to do so.
    • -
    -

    Lati updated:

    -
      -
    • Custom floor tiles can now be added to floorbots. They will start replacing other tiles with these tiles if the option is toggled on.
    • -
    -

    coiax updated:

    -
      -
    • Boxstation, not to be outdone by all the other competing station designs, has installed a drone shell dispenser in the Testing Lab, which makes automated drones to help fix the station.
    • -
    • Toy fans, rejoyce! The famous skeleton brothers from the beloved game Belowyarn now have toys that you can win from the arcade machines!
    • -
    • Airlock painters can be printed at your local autolathe
    • -
    • Please do not attempt suicide with the airlock painter or the medical wrench.
    • -
    • Metastation now has a plant DNA manipulator in Botany.
    • -
    • Using the fire extinguisher on yourself or others while in HELP intent will spray you or them, rather than beat their probably flaming body with a metal object.
    • -
    • Alt-clicking extinguishers to empty them now wets the floor underneath them.
    • -
    -

    lordpidey updated:

    -
      -
    • Meth labs can now blow up if you don't purify the ingredients or over-heat the end product.
    • -
    -

    nullbear updated:

    -
      -
    • Added attack verbs for heart and tongue organs
    • -
    • Maximum output of air pumps has been raised.
    • -
    - -

    12 April 2016

    -

    Incoming5643 updated:

    -
      -
    • Leading scientists have finally proven that humans (and xenos) in fact have tongues in their mouths.
    • -
    • Swapping out tongues allows the various races to change their speech impediments. Putting a xeno tongue in someone allows them to make the hissing sound like a xeno whenever they speak.
    • -
    • There are no erp mechanics tied to this feature.
    • -
    • Remember that tongues are stored in the MOUTH, selecting the head isn't good enough.
    • -
    -

    Kor updated:

    -
      -
    • Ash walker starting gear has been rebalanced.
    • -
    • Ash walkers can no longer use guns.
    • -
    -

    TrustyGun updated:

    -
      -
    • After carefully investing in the market, the Captain had enough money to replace his silver flask with a golden one!
    • -
    • The Detective is now bringing his personalized flask to work, due to the grim work he has to do.
    • -
    • The Booze-O-Mat now stocks 3 flasks.
    • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 1ce8f776f27..497a2941d90 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -4985,3 +4985,66 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. only things in your hands will be considered for crafting coiax: - tweak: Skeletons now have bone "tongues" +2016-05-11: + Joan: + - rscadd: Shades can move in space. + - rscadd: Artificers can now heal shades. + coiax: + - tweak: Added action button to chameleon stamp + - rscadd: Added APPROVED and DENIED stamps to Bureaucracy Crate + - rscadd: Added the cream pie closet to various maps. Added contraband Cream Pie + Crate to Cargo. + pudl: + - rscadd: The armory has been redesigned. +2016-05-12: + Shadowlight and coiax: + - rscdel: Due to numerous reports of teams using human weapons instead of stealth + when carrying out their assignments, future teams have been genetically modified + to only be able to use their assigned blaster and are unable to use human weapons. +2016-05-13: + Joan: + - rscadd: Cultists can now unanchor and reanchor cult structures by hitting them + with a tome. Unanchored cult structures don't do anything. + KorPhaeron: + - rscadd: Drake attacks are now much easier to avoid. + - rscadd: Player controlled drakes can now consume bodies to heal, and alt+click + targets to divebomb them. + TechnoAlchemisto: + - rscadd: More items have been added to the mining vendor, check them out! +2016-05-14: + Cruix: + - bugfix: Fixed foam darts with the safety cap removed being reset when fired. + - rscadd: Added the ability to remove pens from foam darts. + - bugfix: Foam darts with pens inside them are no longer destroyed when fired. + - bugfix: Foam darts no longer drop two darts when fired at a person on a janicart. + Joan: + - rscdel: The Raise Dead rune no longer accepts dead cultists as a sacrifice to + raise the dead. + Metacide: + - rscadd: 'A small update for MetaStation, changes include:' + - rscadd: Added extra grounding rods to the engine area to stop camera destruction. + - rscadd: Added canvases and extra crayons to art storage and some easels to maint. + - rscadd: Added formal security uniform crate for parades to the warden's gear area. + - rscadd: The armory securitron now starts active. + - rscadd: The genetics APC now starts unlocked. + - rscadd: Other minor changes and fixes as detailed on the wiki page. + coiax, Nienhaus: + - rscdel: Unfortunately, the Belowyarn toys have been withdrawn from distribution + due to Assistants choking on the batteries. Centcom has sent their condolences + to the battery manufacturing plant. + - rscadd: We are introducing Oh-cee the original content skeleton figurines. Pull + its string, and hear it say a variety of phrases. Not suitable for infants or + assistants under 36 months. + - tweak: Note that pulling the string of all talking toys is now visible to others. + - rscadd: Talking toys produce a lot more chatter than they did before. So do some + skeleton "tongues". + pudl: + - rscadd: Adds normal security headsets to security lockers + xxalpha: + - bugfix: Fixed drone dispenser multiplying glass or metal. +2016-05-15: + Iamgoofball: + - rscadd: Nanotrasen is short on cash, and are now borrowing escape shuttles from + other stations, and Space Apartments. + Mercenaryblue: + - rscadd: Turns out a bike horn made with Bananium is flipping awesome! Honk! diff --git a/html/changelogs/AutoChangeLog-pr-17492.yml b/html/changelogs/AutoChangeLog-pr-17492.yml deleted file mode 100644 index 5195350a609..00000000000 --- a/html/changelogs/AutoChangeLog-pr-17492.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: coiax -delete-after: True -changes: - - tweak: "Added action button to chameleon stamp" - - rscadd: "Added APPROVED and DENIED stamps to Bureaucracy Crate" diff --git a/html/changelogs/AutoChangeLog-pr-17496.yml b/html/changelogs/AutoChangeLog-pr-17496.yml deleted file mode 100644 index ad7ebbbce9a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-17496.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: coiax -delete-after: True -changes: - - rscadd: "Added the cream pie closet to various maps. Added contraband Cream Pie Crate to Cargo." diff --git a/html/changelogs/AutoChangeLog-pr-17507.yml b/html/changelogs/AutoChangeLog-pr-17507.yml deleted file mode 100644 index bd08ba3d724..00000000000 --- a/html/changelogs/AutoChangeLog-pr-17507.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: pudl -delete-after: True -changes: - - rscadd: "The armory has been redesigned." diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index 06905f87d76..868c2204346 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi index a1ede7661c1..42a0cd47622 100644 Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 7ff3d653fec..0b021fb071a 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 97092a8970d..46e18544a9d 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index 5489dbcec68..1dd0831f42d 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 949f864eb7f..51b53ab2149 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 c46ff7b511f..3944d02a67f 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index d3ffb548b3e..9a1f8fc08e1 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index f029613ca91..5a1180d6cc2 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 7280b7ccd60..cc683256480 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/cult.dmi b/icons/obj/cult.dmi index 4b28d871c3e..137773d15b6 100644 Binary files a/icons/obj/cult.dmi and b/icons/obj/cult.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index df670128881..64825e13edd 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index ea31d95cc23..26085e397e9 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index 372ea30f755..616437a4bce 100644 Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ diff --git a/icons/obj/machines/heavy_lathe.dmi b/icons/obj/machines/heavy_lathe.dmi index 68557159eb4..924606d9847 100644 Binary files a/icons/obj/machines/heavy_lathe.dmi and b/icons/obj/machines/heavy_lathe.dmi differ diff --git a/icons/obj/machines/washing_machine.dmi b/icons/obj/machines/washing_machine.dmi index 0213078f3a5..b41571477e2 100644 Binary files a/icons/obj/machines/washing_machine.dmi and b/icons/obj/machines/washing_machine.dmi differ diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index 9a3e8194f4b..76f5bfe7ebe 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ diff --git a/icons/obj/rune.dmi b/icons/obj/rune.dmi index 1fb79b1a770..a6a03098b05 100644 Binary files a/icons/obj/rune.dmi and b/icons/obj/rune.dmi differ diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index 5d3b690b1b8..29fa57fe523 100644 Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index 291db24a4e3..6d63afe9d43 100644 Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ diff --git a/icons/turf/floors/ash.dmi b/icons/turf/floors/ash.dmi new file mode 100644 index 00000000000..718cd120194 Binary files /dev/null and b/icons/turf/floors/ash.dmi differ diff --git a/icons/turf/floors/rocky_ash.dmi b/icons/turf/floors/rocky_ash.dmi new file mode 100644 index 00000000000..2a57edfc53a Binary files /dev/null and b/icons/turf/floors/rocky_ash.dmi differ diff --git a/icons/turf/mining.dmi b/icons/turf/mining.dmi index e7fff73a657..ff3a228f028 100644 Binary files a/icons/turf/mining.dmi and b/icons/turf/mining.dmi differ diff --git a/icons/turf/walls/rock_wall.dmi b/icons/turf/walls/rock_wall.dmi new file mode 100644 index 00000000000..c07657149ac Binary files /dev/null and b/icons/turf/walls/rock_wall.dmi differ diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index ddb480fddcf..b2cde1ea35b 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -104,5 +104,6 @@ BIG IMG.icon {width: 32px; height: 32px;} .memo {color: #638500; text-align: center;} .memoedit {text-align: center; font-size: 2;} +.abductor {color: #800080; font-style: italic;} "} diff --git a/sound/chatter/griffin_1.ogg b/sound/chatter/griffin_1.ogg new file mode 100644 index 00000000000..32e1333588d Binary files /dev/null and b/sound/chatter/griffin_1.ogg differ diff --git a/sound/chatter/griffin_10.ogg b/sound/chatter/griffin_10.ogg new file mode 100644 index 00000000000..0d161ee5edb Binary files /dev/null and b/sound/chatter/griffin_10.ogg differ diff --git a/sound/chatter/griffin_2.ogg b/sound/chatter/griffin_2.ogg new file mode 100644 index 00000000000..4ae4de2595f Binary files /dev/null and b/sound/chatter/griffin_2.ogg differ diff --git a/sound/chatter/griffin_3.ogg b/sound/chatter/griffin_3.ogg new file mode 100644 index 00000000000..28b65b852a6 Binary files /dev/null and b/sound/chatter/griffin_3.ogg differ diff --git a/sound/chatter/griffin_4.ogg b/sound/chatter/griffin_4.ogg new file mode 100644 index 00000000000..2d6612c7c00 Binary files /dev/null and b/sound/chatter/griffin_4.ogg differ diff --git a/sound/chatter/griffin_5.ogg b/sound/chatter/griffin_5.ogg new file mode 100644 index 00000000000..61258463922 Binary files /dev/null and b/sound/chatter/griffin_5.ogg differ diff --git a/sound/chatter/griffin_6.ogg b/sound/chatter/griffin_6.ogg new file mode 100644 index 00000000000..43520cddf2a Binary files /dev/null and b/sound/chatter/griffin_6.ogg differ diff --git a/sound/chatter/griffin_7.ogg b/sound/chatter/griffin_7.ogg new file mode 100644 index 00000000000..b3ce436e4e5 Binary files /dev/null and b/sound/chatter/griffin_7.ogg differ diff --git a/sound/chatter/griffin_8.ogg b/sound/chatter/griffin_8.ogg new file mode 100644 index 00000000000..bbf51f98774 Binary files /dev/null and b/sound/chatter/griffin_8.ogg differ diff --git a/sound/chatter/griffin_9.ogg b/sound/chatter/griffin_9.ogg new file mode 100644 index 00000000000..806c67de2f4 Binary files /dev/null and b/sound/chatter/griffin_9.ogg differ diff --git a/sound/chatter/owl_1.ogg b/sound/chatter/owl_1.ogg new file mode 100644 index 00000000000..3d41497d44b Binary files /dev/null and b/sound/chatter/owl_1.ogg differ diff --git a/sound/chatter/owl_10.ogg b/sound/chatter/owl_10.ogg new file mode 100644 index 00000000000..97f45d43378 Binary files /dev/null and b/sound/chatter/owl_10.ogg differ diff --git a/sound/chatter/owl_2.ogg b/sound/chatter/owl_2.ogg new file mode 100644 index 00000000000..4937ee09fe3 Binary files /dev/null and b/sound/chatter/owl_2.ogg differ diff --git a/sound/chatter/owl_3.ogg b/sound/chatter/owl_3.ogg new file mode 100644 index 00000000000..7c8524e933d Binary files /dev/null and b/sound/chatter/owl_3.ogg differ diff --git a/sound/chatter/owl_4.ogg b/sound/chatter/owl_4.ogg new file mode 100644 index 00000000000..c1e8ee7635b Binary files /dev/null and b/sound/chatter/owl_4.ogg differ diff --git a/sound/chatter/owl_5.ogg b/sound/chatter/owl_5.ogg new file mode 100644 index 00000000000..1210b05ac39 Binary files /dev/null and b/sound/chatter/owl_5.ogg differ diff --git a/sound/chatter/owl_6.ogg b/sound/chatter/owl_6.ogg new file mode 100644 index 00000000000..b965678688d Binary files /dev/null and b/sound/chatter/owl_6.ogg differ diff --git a/sound/chatter/owl_7.ogg b/sound/chatter/owl_7.ogg new file mode 100644 index 00000000000..fc330687a11 Binary files /dev/null and b/sound/chatter/owl_7.ogg differ diff --git a/sound/chatter/owl_8.ogg b/sound/chatter/owl_8.ogg new file mode 100644 index 00000000000..e350b5be811 Binary files /dev/null and b/sound/chatter/owl_8.ogg differ diff --git a/sound/chatter/owl_9.ogg b/sound/chatter/owl_9.ogg new file mode 100644 index 00000000000..ec195a222f8 Binary files /dev/null and b/sound/chatter/owl_9.ogg differ diff --git a/sound/chatter/papyrus_1.ogg b/sound/chatter/papyrus_1.ogg new file mode 100644 index 00000000000..ee595949684 Binary files /dev/null and b/sound/chatter/papyrus_1.ogg differ diff --git a/sound/chatter/papyrus_10.ogg b/sound/chatter/papyrus_10.ogg new file mode 100644 index 00000000000..8e1599ff905 Binary files /dev/null and b/sound/chatter/papyrus_10.ogg differ diff --git a/sound/chatter/papyrus_2.ogg b/sound/chatter/papyrus_2.ogg new file mode 100644 index 00000000000..6c22cb17847 Binary files /dev/null and b/sound/chatter/papyrus_2.ogg differ diff --git a/sound/chatter/papyrus_3.ogg b/sound/chatter/papyrus_3.ogg new file mode 100644 index 00000000000..799f78adc6b Binary files /dev/null and b/sound/chatter/papyrus_3.ogg differ diff --git a/sound/chatter/papyrus_4.ogg b/sound/chatter/papyrus_4.ogg new file mode 100644 index 00000000000..8c401d3ec9d Binary files /dev/null and b/sound/chatter/papyrus_4.ogg differ diff --git a/sound/chatter/papyrus_5.ogg b/sound/chatter/papyrus_5.ogg new file mode 100644 index 00000000000..a6070313f91 Binary files /dev/null and b/sound/chatter/papyrus_5.ogg differ diff --git a/sound/chatter/papyrus_6.ogg b/sound/chatter/papyrus_6.ogg new file mode 100644 index 00000000000..dade77ce1ab Binary files /dev/null and b/sound/chatter/papyrus_6.ogg differ diff --git a/sound/chatter/papyrus_7.ogg b/sound/chatter/papyrus_7.ogg new file mode 100644 index 00000000000..6fb3d9c943c Binary files /dev/null and b/sound/chatter/papyrus_7.ogg differ diff --git a/sound/chatter/papyrus_8.ogg b/sound/chatter/papyrus_8.ogg new file mode 100644 index 00000000000..11f602756cc Binary files /dev/null and b/sound/chatter/papyrus_8.ogg differ diff --git a/sound/chatter/papyrus_9.ogg b/sound/chatter/papyrus_9.ogg new file mode 100644 index 00000000000..cd0c03525ea Binary files /dev/null and b/sound/chatter/papyrus_9.ogg differ diff --git a/sound/chatter/sans_1.ogg b/sound/chatter/sans_1.ogg new file mode 100644 index 00000000000..795ee2aab2c Binary files /dev/null and b/sound/chatter/sans_1.ogg differ diff --git a/sound/chatter/sans_10.ogg b/sound/chatter/sans_10.ogg new file mode 100644 index 00000000000..916dfc05ca4 Binary files /dev/null and b/sound/chatter/sans_10.ogg differ diff --git a/sound/chatter/sans_2.ogg b/sound/chatter/sans_2.ogg new file mode 100644 index 00000000000..6a1ba578176 Binary files /dev/null and b/sound/chatter/sans_2.ogg differ diff --git a/sound/chatter/sans_3.ogg b/sound/chatter/sans_3.ogg new file mode 100644 index 00000000000..98d6016cda9 Binary files /dev/null and b/sound/chatter/sans_3.ogg differ diff --git a/sound/chatter/sans_4.ogg b/sound/chatter/sans_4.ogg new file mode 100644 index 00000000000..878bee1f667 Binary files /dev/null and b/sound/chatter/sans_4.ogg differ diff --git a/sound/chatter/sans_5.ogg b/sound/chatter/sans_5.ogg new file mode 100644 index 00000000000..a59781f6364 Binary files /dev/null and b/sound/chatter/sans_5.ogg differ diff --git a/sound/chatter/sans_6.ogg b/sound/chatter/sans_6.ogg new file mode 100644 index 00000000000..9bad5fc6d52 Binary files /dev/null and b/sound/chatter/sans_6.ogg differ diff --git a/sound/chatter/sans_7.ogg b/sound/chatter/sans_7.ogg new file mode 100644 index 00000000000..172d253ab61 Binary files /dev/null and b/sound/chatter/sans_7.ogg differ diff --git a/sound/chatter/sans_8.ogg b/sound/chatter/sans_8.ogg new file mode 100644 index 00000000000..e786f597caf Binary files /dev/null and b/sound/chatter/sans_8.ogg differ diff --git a/sound/chatter/sans_9.ogg b/sound/chatter/sans_9.ogg new file mode 100644 index 00000000000..3901a032185 Binary files /dev/null and b/sound/chatter/sans_9.ogg differ diff --git a/tgstation.dme b/tgstation.dme index c33fc2d2edd..3c35fe67785 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -578,6 +578,7 @@ #include "code\game\objects\items\devices\laserpointer.dm" #include "code\game\objects\items\devices\lightreplacer.dm" #include "code\game\objects\items\devices\megaphone.dm" +#include "code\game\objects\items\devices\modificationkit.dm" #include "code\game\objects\items\devices\multitool.dm" #include "code\game\objects\items\devices\paicard.dm" #include "code\game\objects\items\devices\pipe_painter.dm" @@ -953,6 +954,7 @@ #include "code\modules\cargo\exports\sheets.dm" #include "code\modules\cargo\exports\tools.dm" #include "code\modules\cargo\exports\weapons.dm" +#include "code\modules\chatter\chatter.dm" #include "code\modules\client\asset_cache.dm" #include "code\modules\client\client defines.dm" #include "code\modules\client\client procs.dm" @@ -1433,6 +1435,7 @@ #include "code\modules\mob\living\simple_animal\hostile\mushroom.dm" #include "code\modules\mob\living\simple_animal\hostile\nanotrasen.dm" #include "code\modules\mob\living\simple_animal\hostile\pirate.dm" +#include "code\modules\mob\living\simple_animal\hostile\reenactors.dm" #include "code\modules\mob\living\simple_animal\hostile\russian.dm" #include "code\modules\mob\living\simple_animal\hostile\skeleton.dm" #include "code\modules\mob\living\simple_animal\hostile\statue.dm" diff --git a/tools/github_webhook_processor.php b/tools/github_webhook_processor.php index d471f57f9e6..766f0310302 100644 --- a/tools/github_webhook_processor.php +++ b/tools/github_webhook_processor.php @@ -250,7 +250,7 @@ function checkchangelog($payload, $merge = false) { if (!count($changelogbody)) return; - $file = 'author: '.$username."\n"; + $file = 'author: '.trim(str_replace(array("\\", '"'), array("\\\\", "\\\""), $username))."\n"; $file .= "delete-after: True\n"; $file .= "changes: \n"; foreach ($changelogbody as $changelogitem) {