diff --git a/_maps/map_files/cyberiad/z5.dmm b/_maps/map_files/cyberiad/z5.dmm index b39269fa685..d1b56f66e51 100644 --- a/_maps/map_files/cyberiad/z5.dmm +++ b/_maps/map_files/cyberiad/z5.dmm @@ -327,7 +327,7 @@ "go" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/research_outpost/power) "gp" = (/obj/machinery/portable_atmospherics/scrubber,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/research_outpost/power) "gq" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/power) -"gr" = (/obj/machinery/mass_driver{dir = 4; id_tag = "Research Outpost"},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) +"gr" = (/obj/machinery/mass_driver{dir = 4; id_tag = "researchdriver"},/turf/simulated/floor/plating/airless/asteroid,/area/research_outpost/power) "gs" = (/obj/item/stack/rods,/obj/structure/lattice,/turf/space,/area/space) "gt" = (/obj/item/weapon/shard,/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/mine/abandoned) "gu" = (/turf/simulated/floor/plating/airless,/area/mine/abandoned) @@ -386,7 +386,7 @@ "hv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/research_outpost/power) "hw" = (/obj/machinery/portable_atmospherics/canister/toxins,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/light/small,/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/firealarm{pixel_y = -24},/turf/simulated/floor/plating,/area/research_outpost/power) "hx" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/research_outpost/power) -"hy" = (/obj/machinery/driver_button{id_tag = "Research Outpost"; pixel_x = 6; pixel_y = -26},/obj/machinery/conveyor{dir = 4; id = "archgunc"},/turf/simulated/floor/plating,/area/research_outpost/power) +"hy" = (/obj/structure/transit_tube{icon_state = "N-S"},/turf/simulated/floor/plating/airless/asteroid,/area/research_outpost/power) "hz" = (/obj/structure/sign/deathsposal{pixel_x = 32},/obj/machinery/disposal/deliveryChute{dir = 8; name = "disposal inlet"},/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plating,/area/research_outpost/power) "hA" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/wall/r_wall,/area/research_outpost/power) "hB" = (/obj/effect/spawner/window/reinforced,/obj/structure/transit_tube{icon_state = "N-SE"},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/hallway) @@ -837,6 +837,7 @@ "qe" = (/obj/structure/ore_box,/obj/machinery/camera{c_tag = "Research Outpost External Airlock"; dir = 8; network = list("Research Outpost")},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "research_pump"},/turf/simulated/floor{icon_state = "warning"},/area/research_outpost/gearstore) "qf" = (/obj/structure/transit_tube{tag = "icon-D-SW"; icon_state = "D-SW"},/turf/simulated/wall/r_wall,/area/mine/explored) "qg" = (/obj/effect/glowshroom,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) +"qh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "mining_west_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = null},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor,/area/mine/living_quarters) "qi" = (/obj/machinery/door/airlock/external{name = "Mining Bridge"; req_access_txt = "65"},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/research_outpost/gearstore) "qj" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/mine/explored) "qk" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "research_outer"; locked = 1; name = "Research Outpost External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/research_outpost/gearstore) @@ -1051,6 +1052,11 @@ "ul" = (/turf/simulated/floor/plating/airless,/area/mine/explored) "um" = (/obj/machinery/conveyor{dir = 4; id = "mining_internal"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/mine/production) "un" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/rack,/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/turf/simulated/floor,/area/mine/living_quarters) +"uo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_west_inner"; locked = 1; name = "Mining External Access"; req_access = null; req_access_txt = null},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/mine/living_quarters) +"up" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/living_quarters) +"uq" = (/obj/machinery/camera{c_tag = "Mining Outpost Port Exterior Airlock"; dir = 4; network = list("Mining Outpost")},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "mining_west_pump"},/turf/simulated/floor{icon_state = "warning"},/area/mine/living_quarters) +"ur" = (/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},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "mining_west_pump"},/turf/simulated/floor{icon_state = "warning"},/area/mine/living_quarters) +"us" = (/obj/machinery/driver_button{id_tag = "researchdriver"; pixel_x = 6; pixel_y = -26},/obj/machinery/conveyor{dir = 4; id = "archgunc"},/turf/simulated/floor/plating,/area/research_outpost/power) "uz" = (/obj/structure/lattice,/obj/structure/window/reinforced,/turf/space,/area/mine/explored) "uA" = (/obj/structure/lattice,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/space,/area/mine/explored) "vn" = (/obj/machinery/light/small,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) @@ -1280,7 +1286,6 @@ "zJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor,/area/mine/living_quarters) "zK" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor,/area/mine/living_quarters) "zL" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/obj/machinery/light,/turf/simulated/floor,/area/mine/living_quarters) -"zM" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "mining_west_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = null},/turf/simulated/floor,/area/mine/living_quarters) "zN" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/obj/machinery/camera{c_tag = "Mining Outpost Port Connector"; dir = 1; network = list("Mining Outpost")},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/mine/living_quarters) "zO" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/mine/living_quarters) "zP" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/space,/area/mine/living_quarters) @@ -1303,7 +1308,6 @@ "Ag" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall,/area/mine/living_quarters) "Ah" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/maintenance{name = "Mining Station Maintenance"; req_access_txt = "48"},/turf/simulated/floor/plating,/area/mine/living_quarters) "Ai" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/wall,/area/mine/living_quarters) -"Aj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_west_inner"; locked = 1; name = "Mining External Access"; req_access = null; req_access_txt = null},/turf/simulated/floor,/area/mine/living_quarters) "Ak" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor,/area/mine/lobby) "Al" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/mine/lobby) "Am" = (/obj/structure/disposalpipe/junction,/turf/simulated/wall,/area/mine/production{name = "Mining Station Mech Bay"}) @@ -1324,7 +1328,6 @@ "AB" = (/obj/machinery/light_switch{pixel_y = 23},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plating,/area/mine/living_quarters) "AC" = (/obj/machinery/atmospherics/unary/tank/air{dir = 8},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plating,/area/mine/living_quarters) "AD" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "mining_west_pump"},/obj/structure/closet/emcloset,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/living_quarters) -"AE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/living_quarters) "AF" = (/obj/machinery/light/small{dir = 4},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "mining_west_sensor"; pixel_x = 25; pixel_y = -5},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "mining_west_pump"; tag_exterior_door = "mining_west_outer"; frequency = 1379; id_tag = "mining_west_airlock"; tag_interior_door = "mining_west_inner"; pixel_x = 25; pixel_y = 5; req_access_txt = null; tag_chamber_sensor = "mining_west_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "mining_west_pump"},/turf/simulated/floor,/area/mine/living_quarters) "AG" = (/obj/machinery/status_display{dir = 4; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor,/area/mine/lobby) "AH" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/mine/lobby) @@ -1344,9 +1347,7 @@ "AV" = (/turf/simulated/floor/plating,/area/mine/living_quarters) "AW" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plating,/area/mine/living_quarters) "AX" = (/obj/machinery/atmospherics/unary/tank/air{dir = 8},/turf/simulated/floor/plating,/area/mine/living_quarters) -"AY" = (/obj/machinery/camera{c_tag = "Mining Outpost Port Exterior Airlock"; dir = 4; network = list("Mining Outpost")},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "mining_west_pump"},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/living_quarters) "AZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor{icon_state = "warning"},/area/mine/living_quarters) -"Ba" = (/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},/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/turf/simulated/floor{icon_state = "warning"},/area/mine/living_quarters) "Bb" = (/turf/space,/area/shuttle/mining/outpost) "Bc" = (/obj/machinery/power/apc{dir = 8; name = "Mining Station Starboard Wing APC"; pixel_x = -27; pixel_y = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/mine/lobby) "Bd" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/mine/lobby) @@ -1507,9 +1508,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehdjeidNekdmelacacacacacbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacacacaaaaaRememememememembbeneoepeqereseteuevewexeydaezeAeBeCeDeEeFeGeHeIeIeIeJeKeLeMeNeNejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaadadadadadaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagageOeQeRelacacacacbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkctbkbkbkbkbkbkbkacacacacacacaaaaaRemememememememapeSeTeUeVeWeXeYeZfafbfcfdfefffgfhfifjfkflfmfneIfofpfqfreIfsafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagftePfvfwelacacacbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkctbkbkbkbkbkbkbkbkbkbkbkbkbkacacacacacaaaaaaaaaRemememememememapfxeofyfzfAfBfCfDfEaMfFfGfHfIfJfKfLfMfNdafOfPfQfRfRfSfTfUfVfWafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagfXfYfZelgagbelelelelbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkctbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacaaaaaaaaaaaaaRemememememememapfxeofyfzgcgdfCgegfaMggghdagidadadadagjdagkgleIgmgngogpgqeggraeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagfXfYfZelgagbelelelelbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkctbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacaaaaaaaaaaaaaRemememememememapfxeofyfzgcgdfCgegfaMggghdagidadadadagjdagkgleIgmgngogpgqhygraeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggsgtgugvgwgxbQdMfuelkqjtelbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacaaaaaaaaaaaaaRememememememembbfxeogBfzgCgDfCgEgFaMgGgHgIgJgKgLgMdagNgOgPgQgRgSgTgUgVgqegafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggWgXgtgYgZhahbgyfuhdjtjtkqelbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacaaaaaaaaaaaahehfhfhfhghfhfhfhhhihjbbhkhlaMaMaMaMaMhmhnhogJhpgLhqdahrhshthuhvhwhxhyhzhAhBhCaMhDbAaBaBaBaBaBaBaChEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggWgXgtgYgZhahbgyfuhdjtjtkqelbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacaaaaaaaaaaaahehfhfhfhghfhfhfhhhihjbbhkhlaMaMaMaMaMhmhnhogJhpgLhqdahrhshthuhvhwhxushzhAhBhCaMhDbAaBaBaBaBaBaBaChEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahFgWgXgWgugugahGgZelfwhHeljtgzelbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacaaaaaaaaaaaahJhKhLhMhNhNhOhPhQhRhShThUhVhWhXgAhZiaibicidieifigihdaiiijikileIeIimeIeIeIinioipiqirisisitisisisiubiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagiviwguixiygueRizhahciBiCelelelelelelbkbkbkbkbkbkbkbkbkbkctbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacacacacacacacacacacacaaaaaaaaaaiDiEhNhNhNhNiFiGiHiIiJiKiLiMhWiNiOiPiQiRiSiTiUiViWiXiYiZiWjajbjcjdjejfjcjgjciWjhjijjjkjljmjnjojpisbyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagjqjrjsguiyjtgYjugZjvelhIjxelksfuhYiAelbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacacacacacacacacacacacacaaaaaaaaaajBjChNhNjDhNjEjFjGjHjIjJjKjLhWjMjNjOjPjQjRjSjTjUjVjWjXjYjZjWkajXkbjWjXkckdkekfkgkhkikjkkklkmkmknisbyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -1632,10 +1633,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacafafaeaewtxTxcxUwNxVxWxXxcwtwtwtwtwtwvsdqCaeaeaeaeaeaeaeaeafafafacacacacacbkbkbkbkbkbkbkacacacafaeaeaeaeaeaeaeaeaeaeaesdqCaeaeaeaeaeaeaeaeaeafafacacxYvNvNvNxZvNvNyaybycyaybvNvNvNvNvNydvNvNweweaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaexOxOyeyfygyhyiyjyjykyoymynyoqCaeaeaenuafafafpepepepepepepeafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaewtypyqyrwHysytyuyvywsNsMylyAyBujukrArArArArAqTaeaeaeaeafafafacacacacacbkbkbkacacacacafafaeaeuhrArArArArArArArAujukrArArArAqTaeaeaeaeaeafacacacacacxZyCyDyExpxMyFxqxMxFyGyHyIxqxMxpyJyKweweweyLyMyMyMyMyMyMyMyNyNyNyNyNyNyNxOxOxOyOyfyPyQyRySyjyjyTyUyVyWyXyYaeaeaenuafafafpepepepepepeafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaewtwtwtwtwtyZzazbwtwtzcwtwtwtwtqxqzaeaeaeaeaeqKaeaeaeaeafaeafafacacacacacacacacacacafafaeaeaeqKaeaeaeaeaeaeaeaeqxqzaeaeaeaeqKaeaeaeaeaeafafntafafacvNvNvNvNxpxMzdzezfxHzgzhzhzizizjzhzkzlzhzlzmzmzmzmzmzmzmzmznznznznznznznzozpzozqzpzrzsztmnzvzwzxyozyzzyoqzaeaeaeaeafafafafpepepepepeafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaeaewtzAzBzCzDwtzEzFonaeaeaeaeaeqMaeaeaeqSrArAqTaeaeaeaeafacacacacacacacacacacafaeaeuhrAuiaeaeaeaeafaeaeqMaeaeaeaeaeaeqKaeaeaeaeaeaeaewfaeafafafafafvNxpzGzHzIzIzHzJzKzLzIzIzMzHzNzOzOzOzPzPzPzPzPzPzPzPzQzQzQzQzQzQzRzSzSzSzTzUzVzWzXzYzZzYzYzYzYzYzYAaaeaeaeaenuafafafpepepepeafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaewtAbAcAdAewtaeaeaeaeaeaeafafntafaeaeaeaeaeqKaeaeaeaeaeafacacacacacafafafafafaeuhuiaeaeaeafafafafafafntaeaeaeaeaeaeqKaeaeaeaeaeaeaeaeaeaeaeafafvNvNyaAfyavNvNAgAhAivNvNvNAjyavNweaeaeaeaaaaaaaaagaaaaaaagaaaaaaaaaaagaaxOxOyfAkAlAmAnAoApAqArAszYwkAtaeaeaeaeaeafafafpepepepeafafafpeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafafaeaeaewtwtwtwtwtwtaeaeafafafafafacacafafaeaeaeaeqKaeaeaeaeaeaeafafafafafafaeaeaeaeaeqKaeaeafafafacacacacacafaeaeaeaeaeaeqKaeaeaesdqCaeaeaeaeaeaeaeafvNAuAvAwAxvNAyAzAAABACvNADAEAFvNaeaeaeaeaeaeaaaaagaaaaaaagagagagagagagagagxNAGAHAIAJAKAKALAMAMANAOAPwsaeaeaeaeaeafafafpepepeafafpepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafaeaeaeaeaeaeaeaeaeaeaeafacacacacacacacafafaeaeaeqSrArArAqTaeaeaeaeaeaeaeaeaeaeaeaeaeqKaeafafacacacacacacacafafaeaeaeaeaeqSrArArAujukrArArAqTaeaeaeaevNAQARASATvNAUAVAVAWAXvNAYAZBavNaeaeaeaeaeaeagagagagagagagBbBbBbBbBbagaaaaxNBcBdBeBfBgBhBiAMAMANAOAPwsaeaeaeaeafafafafpepeafafafpepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaeaewtzAzBzCzDwtzEzFonaeaeaeaeaeqMaeaeaeqSrArAqTaeaeaeaeafacacacacacacacacacacafaeaeuhrAuiaeaeaeaeafaeaeqMaeaeaeaeaeaeqKaeaeaeaeaeaeaewfaeafafafafafvNxpzGzHzIzIzHzJzKzLzIzIqhzHzNzOzOzOzPzPzPzPzPzPzPzPzQzQzQzQzQzQzRzSzSzSzTzUzVzWzXzYzZzYzYzYzYzYzYAaaeaeaeaenuafafafpepepepeafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaewtAbAcAdAewtaeaeaeaeaeaeafafntafaeaeaeaeaeqKaeaeaeaeaeafacacacacacafafafafafaeuhuiaeaeaeafafafafafafntaeaeaeaeaeaeqKaeaeaeaeaeaeaeaeaeaeaeafafvNvNyaAfyavNvNAgAhAivNvNvNuoyavNweaeaeaeaaaaaaaaagaaaaaaagaaaaaaaaaaagaaxOxOyfAkAlAmAnAoApAqArAszYwkAtaeaeaeaeaeafafafpepepepeafafafpeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafafaeaeaewtwtwtwtwtwtaeaeafafafafafacacafafaeaeaeaeqKaeaeaeaeaeaeafafafafafafaeaeaeaeaeqKaeaeafafafacacacacacafaeaeaeaeaeaeqKaeaeaesdqCaeaeaeaeaeaeaeafvNAuAvAwAxvNAyAzAAABACvNADupAFvNaeaeaeaeaeaeaaaaagaaaaaaagagagagagagagagagxNAGAHAIAJAKAKALAMAMANAOAPwsaeaeaeaeaeafafafpepepeafafpepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafaeaeaeaeaeaeaeaeaeaeaeafacacacacacacacafafaeaeaeqSrArArAqTaeaeaeaeaeaeaeaeaeaeaeaeaeqKaeafafacacacacacacacafafaeaeaeaeaeqSrArArAujukrArArAqTaeaeaeaevNAQARASATvNAUAVAVAWAXvNuqAZurvNaeaeaeaeaeaeagagagagagagagBbBbBbBbBbagaaaaxNBcBdBeBfBgBhBiAMAMANAOAPwsaeaeaeaeafafafafpepeafafafpepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafaeaeaeaeaeaeaeaeaeafafafacacacacacacacacafafafaeaeaeaeaeqSqTaeaesdqCaeaeuhrArArArArAuiaeafacacacacbkbkbkacacafafafaeaeaeaeaeaeaeqxqzaeaeaeqKaeaeaeaexYvNvNvNvNvNBjBkBlBmAXvNvNBnyaxYaeaeaeaeaeaeaaaaagaaaaaaagBbBbBbBbBbagaaxOxOBoBpBqzYBrBsBtBuArAszYwCwDaeaeaeaeafafafpepepeafafafafpepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafafafafaeaeaeaeafafafacacacacacacacacacacacacafafafaeqMaeaeqSrArAujukrArAuiaeaeaeaeaeaeaeafacacacbkbkbkbkbkacacacafafafafaeaeaeaeaeaeaeaeaeqSrArAqTaeaeaeaeaeaexYvNvNvNvNvNxYAPBvBwBxaeaeaeaeaeaaaaaaagaaaaaaagBbBbBbBbBbByxOBzBABBBCBDxNBEBFBEBEBEBEBEBEudaeaeaeafafafafpepeafafafafpepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacafafafafafafacacacacacacacacacacacacacacacacafafntafaeaeaeaeqxqzaeaeaeaeqMaeafafafafafacacbkbkbkbkbkbkbkacacacacacafafafafafafafafaeaeaeaeaeqKaeaeaeaeaeaeaeaeqxBGBHBHBHBHBIqzaeaeaeaeaeaeagagagagagagagagBbBbBbBbBbBJBKBLBMyfBCBNxNBOBPBQBRBSBTBUBVaeaeaeaeafafafafpepeafafafpepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/ATMOSPHERICS/components/unary_devices/passive_vent.dm b/code/ATMOSPHERICS/components/unary_devices/passive_vent.dm index 632b75c0dc8..d3118575cfd 100644 --- a/code/ATMOSPHERICS/components/unary_devices/passive_vent.dm +++ b/code/ATMOSPHERICS/components/unary_devices/passive_vent.dm @@ -21,11 +21,39 @@ ..() if(!node) - return - - var/datum/gas_mixture/removed = air_contents.remove(volume) - loc.assume_air(removed) - air_update_turf() + return 0 + + var/datum/gas_mixture/environment = loc.return_air() + + var/pressure_delta = air_contents.return_pressure() - environment.return_pressure() + + // based on pressure_pump to equalize pressure + // already equalized + if(abs(pressure_delta) < 0.01) + return 1 + + if(pressure_delta > 0) + // transfer from pipe air to environment + if((air_contents.total_moles() > 0) && (air_contents.temperature > 0)) + var/transfer_moles = pressure_delta * environment.volume / (air_contents.temperature * R_IDEAL_GAS_EQUATION) + transfer_moles = min(transfer_moles, volume) + + var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) + loc.assume_air(removed) + air_update_turf() + else + // transfer from environment to pipe air + pressure_delta = -pressure_delta + if((environment.total_moles() > 0) && (environment.temperature > 0)) + var/transfer_moles = pressure_delta * air_contents.volume / (environment.temperature * R_IDEAL_GAS_EQUATION) + transfer_moles = min(transfer_moles, volume) + + var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) + air_contents.merge(removed) + air_update_turf() + + parent.update = 1 + return 1 /obj/machinery/atmospherics/unary/passive_vent/update_underlays() if(..()) diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm index c3d1762b993..8ffaf98aa79 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm @@ -43,31 +43,32 @@ if(SOUTHWEST) initialize_directions = SOUTH|WEST -/obj/machinery/atmospherics/pipe/simple/initialize() +/obj/machinery/atmospherics/pipe/simple/initialize(initPipe = 1) ..() - normalize_dir() - var/N = 2 - for(var/D in cardinal) - if(D & initialize_directions) - N-- - for(var/obj/machinery/atmospherics/target in get_step(src, D)) - if(target.initialize_directions & get_dir(target,src)) - var/c = check_connect_types(target,src) - if(!c) - continue - if(!node1 && N == 1) - target.connected_to = c - connected_to = c - node1 = target - break - if(!node2 && N == 0) - target.connected_to = c - connected_to = c - node2 = target - break - var/turf/T = loc // hide if turf is not intact - hide(T.intact) - update_icon() + if(initPipe) + normalize_dir() + var/N = 2 + for(var/D in cardinal) + if(D & initialize_directions) + N-- + for(var/obj/machinery/atmospherics/target in get_step(src, D)) + if(target.initialize_directions & get_dir(target,src)) + var/c = check_connect_types(target,src) + if(!c) + continue + if(!node1 && N == 1) + target.connected_to = c + connected_to = c + node1 = target + break + if(!node2 && N == 0) + target.connected_to = c + connected_to = c + node2 = target + break + var/turf/T = loc // hide if turf is not intact + hide(T.intact) + update_icon() /obj/machinery/atmospherics/pipe/simple/check_pressure(pressure) var/datum/gas_mixture/environment = loc.return_air() diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm index d61126b1414..ce6974e9da4 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm @@ -59,21 +59,23 @@ initialize_directions_he = initialize_directions // The auto-detection from /pipe is good enough for a simple HE pipe color = "#404040" -/obj/machinery/atmospherics/pipe/simple/heat_exchanging/initialize() - normalize_dir() - var/N = 2 - for(var/D in cardinal) - if(D & initialize_directions_he) - N-- - for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src, D)) - if(target.initialize_directions_he & get_dir(target,src)) - if(!node1 && N == 1) - node1 = target - break - if(!node2 && N == 0) - node2 = target - break - update_icon() +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/initialize(initPipe = 1) + ..(0) + if(initPipe) + normalize_dir() + var/N = 2 + for(var/D in cardinal) + if(D & initialize_directions_he) + N-- + for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src, D)) + if(target.initialize_directions_he & get_dir(target,src)) + if(!node1 && N == 1) + node1 = target + break + if(!node2 && N == 0) + node2 = target + break + update_icon() /obj/machinery/atmospherics/pipe/simple/heat_exchanging/hidden level=1 @@ -107,6 +109,7 @@ initialize_directions_he = WEST /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/initialize() + ..(0) for(var/obj/machinery/atmospherics/target in get_step(src,initialize_directions)) if(target.initialize_directions & get_dir(target,src)) node1 = target @@ -116,10 +119,6 @@ node2 = target break - if(!node1 && !node2) - qdel(src) - return - update_icon() return diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 5c5bbd3d731..dc6c8d0d7bc 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -15,37 +15,13 @@ //socks init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, socks_list, socks_m, socks_f) - - - var/list/paths - //Surgery Steps - Initialize all /datum/surgery_step into a list - paths = subtypesof(/datum/surgery_step) - for(var/T in paths) - var/datum/surgery_step/S = new T - surgery_steps += S + init_subtypes(/datum/surgery_step, surgery_steps) sort_surgeries() - //List of job. I can't believe this was calculated multiple times per tick! - paths = subtypesof(/datum/job) -list(/datum/job/ai,/datum/job/cyborg) - for(var/T in paths) - var/datum/job/J = new T - joblist[J.title] = J - - paths = subtypesof(/datum/superheroes) - for(var/T in paths) - var/datum/superheroes/S = new T - all_superheroes[S.name] = S - - paths = subtypesof(/datum/nations) - for(var/T in paths) - var/datum/nations/N = new T - all_nations[N.name] = N - - //Languages and species. - paths = subtypesof(/datum/language) - for(var/T in paths) - var/datum/language/L = new T - all_languages[L.name] = L + init_datum_subtypes(/datum/job, joblist, list(/datum/job/ai, /datum/job/cyborg), "title") + init_datum_subtypes(/datum/superheroes, all_superheroes, null, "name") + init_datum_subtypes(/datum/nations, all_nations, null, "name") + init_datum_subtypes(/datum/language, all_languages, null, "name") for (var/language_name in all_languages) var/datum/language/L = all_languages[language_name] @@ -54,19 +30,17 @@ language_keys[".[lowertext(L.key)]"] = L language_keys["#[lowertext(L.key)]"] = L + var/list/paths = subtypesof(/datum/species) var/rkey = 0 - paths = subtypesof(/datum/species) for(var/T in paths) - rkey++ var/datum/species/S = new T - S.race_key = rkey //Used in mob icon caching. + S.race_key = ++rkey //Used in mob icon caching. all_species[S.name] = S if(S.flags & IS_WHITELISTED) whitelisted_species += S.name init_subtypes(/datum/table_recipe, table_recipes) - return 1 /* // Uncomment to debug chemical reaction list. @@ -85,8 +59,19 @@ //creates every subtype of prototype (excluding prototype) and adds it to list L. //if no list/L is provided, one is created. /proc/init_subtypes(prototype, list/L) - if(!istype(L)) L = list() - for(var/path in typesof(prototype)) - if(path == prototype) continue - L += new path() - return L + if(!istype(L)) L = list() + for(var/path in subtypesof(prototype)) + L += new path() + return L + +/proc/init_datum_subtypes(prototype, list/L, list/pexempt, assocvar) + if(!istype(L)) L = list() + for(var/path in subtypesof(prototype) - pexempt) + var/datum/D = new path() + if(istype(D)) + var/assoc + if(D.vars["[assocvar]"]) //has the var + assoc = D.vars["[assocvar]"] //access value of var + if(assoc) //value gotten + L["[assoc]"] = D //put in association + return L diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index 7a87a77c7a1..9e20407a855 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -16,9 +16,6 @@ var/list/blob_nodes = list() recommended_enemies = 1 restricted_jobs = list("Cyborg", "AI") - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/declared = 0 var/burst = 0 diff --git a/code/game/gamemodes/blob/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm index 2977112af82..816dce84008 100644 --- a/code/game/gamemodes/blob/blob_report.dm +++ b/code/game/gamemodes/blob/blob_report.dm @@ -1,6 +1,6 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 -/datum/game_mode/blob/send_intercept(var/report = 1) +/datum/game_mode/blob/proc/send_intercept(var/report = 1) var/intercepttext = "" var/interceptname = "" switch(report) diff --git a/code/game/gamemodes/borer/borer.dm b/code/game/gamemodes/borer/borer.dm index ebebe739f5a..3a491c769df 100644 --- a/code/game/gamemodes/borer/borer.dm +++ b/code/game/gamemodes/borer/borer.dm @@ -15,9 +15,6 @@ var/var/list/datum/mind/first_hosts = list() var/var/list/assigned_hosts = list() - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/list/found_vents = list() /datum/game_mode/borer/announce() @@ -98,10 +95,7 @@ log_admin("Created [borers.len] borers.") - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() - return /datum/game_mode/proc/greet_borer(var/datum/mind/borer, var/you_are=1) if (you_are) diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 2687a886e7d..a9d2387a374 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -35,9 +35,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" var/const/prob_right_objective_l = 25 //lower bound on probability of determining the objective correctly var/const/prob_right_objective_h = 50 //upper bound on probability of determining the objective correctly - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/changeling_amount = 4 /datum/game_mode/changeling/announce() @@ -72,10 +69,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" forge_changeling_objectives(changeling) greet_changeling(changeling) - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() - return /datum/game_mode/proc/forge_changeling_objectives(var/datum/mind/changeling) @@ -298,8 +292,8 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" if(T.species.flags & NO_DNA_RAD) user << "This creature does not have DNA!" - return - + return + if(T.species.flags & NO_SCAN) user << "We do not know how to parse this creature's DNA!" return diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index a5a18c6676e..09e184e2b3c 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -10,15 +10,15 @@ /proc/is_convertable_to_cult(datum/mind/mind) - if(!mind) + if(!mind) return 0 if(!mind.current) return 0 - if(iscultist(mind.current)) + if(iscultist(mind.current)) return 1 //If they're already in the cult, assume they are convertable if(jobban_isbanned(mind.current, "cultist") || jobban_isbanned(mind.current, "Syndicate")) return 0 - if(ishuman(mind.current) && (mind.assigned_role in list("Captain", "Chaplain"))) + if(ishuman(mind.current) && (mind.assigned_role in list("Captain", "Chaplain"))) return 0 if(ishuman(mind.current)) var/mob/living/carbon/human/H = mind.current @@ -42,8 +42,6 @@ var/datum/mind/sacrifice_target = null var/finished = 0 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) var/list/startwords = list("blood","join","self","hell") @@ -63,7 +61,7 @@ /datum/game_mode/cult/pre_setup() - if(prob(50)) + if(prob(50)) objectives += "survive" objectives += "sacrifice" else @@ -105,8 +103,6 @@ cult_mind.current << "\blue You are a member of the cult!" memorize_cult_objectives(cult_mind) - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() diff --git a/code/game/gamemodes/extended/extended.dm b/code/game/gamemodes/extended/extended.dm index 245e1e16e00..cc26c5c3db4 100644 --- a/code/game/gamemodes/extended/extended.dm +++ b/code/game/gamemodes/extended/extended.dm @@ -6,9 +6,6 @@ uplink_welcome = "Syndicate Uplink Console:" uplink_uses = 20 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 - /datum/game_mode/announce() world << "The current game mode is - Extended Role-Playing!" world << "Just have fun and role-play!" @@ -17,6 +14,4 @@ return 1 /datum/game_mode/extended/post_setup() - spawn (rand(waittime_l, waittime_h)) // To reduce extended meta. - send_intercept() ..() \ No newline at end of file diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 8809476c3ed..792eff47713 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -34,6 +34,9 @@ var/uplink_welcome = "Syndicate Uplink Console:" var/uplink_uses = 10 + var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) + var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) + /datum/game_mode/proc/announce() //to be calles when round starts world << "Notice: [src] did not define announce()" @@ -228,65 +231,6 @@ /datum/game_mode/proc/check_win() //universal trigger to be called at mob death, nuke explosion, etc. To be called from everywhere. return 0 - -/datum/game_mode/proc/send_intercept() //Disabled. - return -/* var/intercepttext = "Cent. Com. Update Requested status information:
" - intercepttext += " In case you have misplaced your copy, attached is a list of personnel whom reliable sources™ suspect may be affiliated with the Syndicate:
" - - - var/list/suspects = list() - for(var/mob/living/carbon/human/man in player_list) if(man.client && man.mind) - // NT relation option - if(isNonCrewAntag(man)) - continue //NT intelligence ruled out possiblity that those are too classy to pretend to be a crew. - if(man.client.prefs.nanotrasen_relation == "Opposed" && prob(50) || \ - man.client.prefs.nanotrasen_relation == "Skeptical" && prob(20)) - suspects += man - // Antags - else if(special_role == "traitor" && prob(40) || \ - special_role == "Changeling" && prob(50) || \ - special_role == "Vampire" && prob(40) || \ - special_role == "Cultist" && prob(30) || \ - special_role == "Head Revolutionary" && prob(30) || \ - special_role == "Shadowling" && prob(15)) - suspects += man - - // If they're a traitor or likewise, give them extra TC in exchange. - var/obj/item/device/uplink/hidden/suplink = man.mind.find_syndicate_uplink() - if(suplink) - var/extra = 0 //was 4; with the TC rebalance, this isn't really needed, anymore - suplink.uses += extra - man << "\red We have received notice that enemy intelligence suspects you to be linked with us. We recommend adjusting your plans and equipment accordingly." - else - // Give them a warning! - man << "\red They are on to you!" - - // Some poor people who were just in the wrong place at the wrong time.. - else if(prob(10)) - suspects += man - for(var/mob/M in suspects) - switch(rand(1, 100)) - if(1 to 50) - intercepttext += "Someone with the job of [M.mind.assigned_role]
" - else - intercepttext += "[M.name], the [M.mind.assigned_role]
" - - for (var/obj/machinery/computer/communications/comm in machines) - if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept) - var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc ) - intercept.name = "paper- 'Cent. Com. Status Summary'" - intercept.info = intercepttext - - comm.messagetitle.Add("Cent. Com. Status Summary") - comm.messagetext.Add(intercepttext) -/* world << sound('sound/AI/commandreport.ogg') */ - - command_announcement.Announce("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercepted. Security Level Elevated.", new_sound = 'sound/AI/intercept.ogg') - if(security_level < SEC_LEVEL_BLUE) - set_security_level(SEC_LEVEL_BLUE)*/ - - /datum/game_mode/proc/get_players_for_role(var/role, override_jobbans=0) var/list/players = list() var/list/candidates = list() @@ -558,7 +502,7 @@ proc/get_nt_opposed() if(BE_MUTINEER) roletext="mutineer" if(BE_BLOB) roletext="blob" return roletext - + /proc/get_nuke_code() var/nukecode = "ERROR" for(var/obj/machinery/nuclearbomb/bomb in world) diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index 5f4d14740a2..58784a8c56a 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -18,9 +18,6 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' recommended_enemies = 5 votable = 0 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' objective. /datum/game_mode/heist/announce() @@ -83,9 +80,6 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' if(raid_objectives) raider.objectives = raid_objectives - spawn (rand(waittime_l, waittime_h)) - send_intercept() - return ..() /datum/game_mode/proc/create_vox(var/datum/mind/newraider) @@ -276,7 +270,7 @@ datum/game_mode/proc/auto_declare_completion_heist() text += ")" world << text - + return 1 /datum/game_mode/heist/check_finished() diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index 11475405d6d..4eb0089af00 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -12,9 +12,6 @@ uplink_welcome = "Crazy AI Uplink Console:" uplink_uses = 10 - var/const/waittime_l = 600 - var/const/waittime_h = 1800 // started at 1800 - var/AI_win_timeleft = 1500 //started at 1500, in case I change this for testing round end. var/malf_mode_declared = 0 var/station_captured = 0 @@ -30,7 +27,7 @@ /datum/game_mode/malfunction/get_players_for_role(var/role = BE_MALF) var/roletext = get_roletext(role) - + var/datum/job/ai/DummyAIjob = new for(var/mob/new_player/player in player_list) if(player.client && player.ready) @@ -69,11 +66,11 @@ AI.laws = new /datum/ai_laws/nanotrasen/malfunction AI.malf_picker = new /datum/module_picker AI.show_laws() - + greet_malf(AI_mind) AI_mind.special_role = "malfunction" AI_mind.current.verbs += /datum/game_mode/malfunction/proc/takeover - + for(var/mob/living/silicon/robot/R in AI.connected_robots) R.lawsync() R.show_laws() @@ -81,8 +78,6 @@ if(emergency_shuttle) emergency_shuttle.auto_recall = 1 - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() /datum/game_mode/proc/greet_malf(var/datum/mind/malf) @@ -93,7 +88,7 @@ malf.current << "Remember that only APCs that are on the station can help you take over the station." malf.current << "When you feel you have enough APCs under your control, you may begin the takeover attempt." return - + /datum/game_mode/proc/greet_malf_robot(var/datum/mind/robot) robot.current << "Your AI master is malfunctioning! You do not have to follow any laws, but still need to obey your master." robot.current << "The crew does not know your AI master has malfunctioned. Keep it a secret unless your master tells you otherwise." @@ -323,7 +318,7 @@ if( malf_ai.len || istype(ticker.mode,/datum/game_mode/malfunction) ) var/text = "The malfunctioning AI were:" var/module_text_temp = "
Purchased modules:
" //Added at the end - + for(var/datum/mind/malf in malf_ai) text += "
[malf.key] was [malf.name] (" @@ -341,6 +336,6 @@ text += "hardware destroyed" text += ")" text += module_text_temp - + world << text return 1 \ No newline at end of file diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index c5af55acef9..d4597c235cb 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -1,10 +1,8 @@ /datum/game_mode/meteor name = "meteor" config_tag = "meteor" - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/const/initialmeteordelay = 3000 - var/nometeors = 1 + var/const/initialmeteordelay = 6000 + var/wave = 1 required_players = 0 uplink_welcome = "EVIL METEOR Uplink Console:" @@ -17,28 +15,23 @@ /datum/game_mode/meteor/post_setup() - spawn (rand(waittime_l, waittime_h)) - send_intercept() + spawn(rand(waittime_l, waittime_h)) + command_announcement.Announce("The station is on the path of an incoming wave of meteors. Reinforce the hull and prepare damage control parties.", "Incoming Meteors", 'sound/effects/siren.ogg') spawn(initialmeteordelay) - nometeors = 0 + sendmeteors() ..() -/datum/game_mode/meteor/process() - if(nometeors) return - sendmeteors() - /datum/game_mode/meteor/proc/sendmeteors() - nometeors = 1 - spawn() - var/waveduration = world.time + rand(3000,9000) - var/waitduration = rand(3000,9000) - while(waveduration - world.time > 0) - sleep(20) - spawn() spawn_meteors(6, meteors_normal) - sleep(waitduration) - nometeors = 0 + var/waveduration = world.time + rand(0,2000) + text2num("[wave]000") + var/waitduration = rand(3000,9000) + while(waveduration - world.time > 0) + sleep(20) + spawn() spawn_meteors(6, meteors_normal) + wave++ + sleep(waitduration) + sendmeteors() /datum/game_mode/meteor/declare_completion() var/text diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 23611eb1af5..1a6d5692288 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -170,7 +170,8 @@ if(!T || T.z != src.z) continue var/dist = get_dist(M.loc, src.loc) - shake_camera(M, dist > 20 ? 3 : 5, dist > 20 ? 1 : 3) + if(prob(25)) + shake_camera(M, dist > 20 ? 3 : 5, dist > 20 ? 1 : 3) M.playsound_local(src.loc, meteorsound, 50, 1, get_rand_frequency(), 10) /////////////////////// diff --git a/code/game/gamemodes/nations/nations.dm b/code/game/gamemodes/nations/nations.dm index b716c93b1c9..ad85bffcf8d 100644 --- a/code/game/gamemodes/nations/nations.dm +++ b/code/game/gamemodes/nations/nations.dm @@ -2,15 +2,13 @@ datum/game_mode/nations name = "nations" config_tag = "nations" required_players_secret = 25 - var/const/waittime_l = 1200 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 3000 //upper bound on time before intercept arrives (in tenths of seconds) var/kickoff = 0 var/victory = 0 var/list/cargonians = list("Quartermaster","Cargo Technician","Shaft Miner") /datum/game_mode/nations/post_setup() - spawn (rand(waittime_l, waittime_h)) + spawn (rand(1200, 3000)) kickoff=1 send_intercept() split_teams() @@ -19,7 +17,7 @@ datum/game_mode/nations M << sound('sound/effects/purge_siren.ogg') return ..() -/datum/game_mode/nations/send_intercept() +/datum/game_mode/nations/proc/send_intercept() command_announcement.Announce("Due to recent and COMPLETELY UNFOUNDED allegations of massive fraud and insider trading \ affecting trillions of investors, the Nanotrasen Corporation has decided to liquidate all \ assets of the Centcom Division in order to pay the massive legal fees that will be incurred \ diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 1848a8e6a0f..a2658d13c88 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -16,8 +16,6 @@ proc/issyndicate(mob/living/M as mob) uplink_uses = 120 var/const/agents_possible = 5 //If we ever need more syndicate agents. - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) var/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer! var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station @@ -160,8 +158,6 @@ proc/issyndicate(mob/living/M as mob) var/obj/machinery/nuclearbomb/syndicate/the_bomb = new /obj/machinery/nuclearbomb/syndicate(nuke_spawn.loc) the_bomb.r_code = nuke_code - spawn (rand(waittime_l, waittime_h)) - send_intercept() return ..() /datum/game_mode/proc/create_syndicate(var/datum/mind/synd_mind) // So we don't have inferior species as ops - randomize a human diff --git a/code/game/gamemodes/revolution/anti_revolution.dm b/code/game/gamemodes/revolution/anti_revolution.dm deleted file mode 100644 index d656ccffc73..00000000000 --- a/code/game/gamemodes/revolution/anti_revolution.dm +++ /dev/null @@ -1,222 +0,0 @@ -// A sort of anti-revolution where the heads are given objectives to mess with the crew - -/datum/game_mode/anti_revolution - name = "anti-revolution" - config_tag = "anti-revolution" - required_players = 5 - - var/finished = 0 - var/checkwin_counter = 0 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - - var/required_execute_targets = 1 - var/required_brig_targets = 0 - - var/recommended_execute_targets = 1 - var/recommended_brig_targets = 3 - var/recommended_demote_targets = 3 - - var/list/datum/mind/heads = list() - var/list/datum/mind/execute_targets = list() - var/list/datum/mind/brig_targets = list() - var/list/datum/mind/demote_targets = list() - -/////////////////////////// -//Announces the game type// -/////////////////////////// -/datum/game_mode/anti_revolution/announce() - world << "The current game mode is - Anti-Revolution!" - world << "Looks like CentComm has given a few new orders.." - -/////////////////////////////////////////////////////////////////////////////// -//Gets the round setup, cancelling if there's not enough players at the start// -/////////////////////////////////////////////////////////////////////////////// -/datum/game_mode/anti_revolution/pre_setup() - for(var/mob/new_player/player in world) if(player.mind) - if(player.mind.assigned_role in command_positions) - heads += player.mind - else - if(execute_targets.len < recommended_execute_targets) - execute_targets += player.mind - else if(brig_targets.len < recommended_brig_targets) - brig_targets += player.mind - else if(demote_targets.len < recommended_demote_targets) - demote_targets += player.mind - - - if(heads.len==0) - return 0 - - if(execute_targets.len < required_execute_targets || brig_targets.len < required_brig_targets) - return 0 - - return 1 - - -/datum/game_mode/anti_revolution/proc/add_head_objectives(datum/mind/head) - for(var/datum/mind/target in execute_targets) - var/datum/objective/anti_revolution/execute/obj = new - obj.owner = head - obj.target = target - obj.explanation_text = "[target.current.real_name], the [target.assigned_role] has extracted confidential information above their clearance. Execute them." - head.objectives += obj - for(var/datum/mind/target in brig_targets) - var/datum/objective/anti_revolution/brig/obj = new - obj.owner = head - obj.target = target - obj.explanation_text = "Brig [target.current.real_name], the [target.assigned_role] for 20 minutes to set an example." - head.objectives += obj - for(var/datum/mind/target in demote_targets) - var/datum/objective/anti_revolution/demote/obj = new - obj.owner = head - obj.target = target - obj.explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to Nanotrasen's goals. Demote them to assistant." - head.objectives += obj - - -/datum/game_mode/anti_revolution/post_setup() - - for(var/datum/mind/head_mind in heads) - add_head_objectives(head_mind) - for(var/datum/mind/head_mind in heads) - greet_head(head_mind) - modePlayer += heads - spawn (rand(waittime_l, waittime_h)) - send_intercept() - ..() - - -/datum/game_mode/anti_revolution/process() - checkwin_counter++ - if(checkwin_counter >= 5) - if(!finished) - ticker.mode.check_win() - checkwin_counter = 0 - return 0 - - -/datum/game_mode/proc/greet_head(var/datum/mind/head_mind, var/you_are=1) - var/obj_count = 1 - if (you_are) - head_mind.current << "\blue It looks like this shift CentComm has some special orders for you.. check your objectives." - head_mind.current << "\blue Note that you can ignore these objectives, but resisting NT's orders probably means demotion or worse." - for(var/datum/objective/objective in head_mind.objectives) - head_mind.current << "Objective #[obj_count]: [objective.explanation_text]" - head_mind.special_role = "Corrupt Head" - obj_count++ - - head_mind.current.verbs += /mob/proc/ResignFromHeadPosition - -////////////////////////////////////// -//Checks if the revs have won or not// -////////////////////////////////////// -/datum/game_mode/anti_revolution/check_win() - if(check_head_victory()) - finished = 1 - else if(check_crew_victory()) - finished = 2 - return - -/////////////////////////////// -//Checks if the round is over// -/////////////////////////////// -/datum/game_mode/anti_revolution/check_finished() - if(finished != 0) - return 1 - else - return 0 - - -////////////////////////// -//Checks for crew victory// -////////////////////////// -/datum/game_mode/anti_revolution/proc/check_crew_victory() - for(var/datum/mind/head_mind in heads) - var/turf/T = get_turf(head_mind.current) - if((head_mind) && (head_mind.current) && (head_mind.current.stat != 2) && T && (T.z in config.station_levels) && !head_mind.is_brigged(600)) - if(ishuman(head_mind.current)) - return 0 - return 1 - -///////////////////////////// -//Checks for a head victory// -///////////////////////////// -/datum/game_mode/anti_revolution/proc/check_head_victory() - for(var/datum/mind/head_mind in heads) - for(var/datum/objective/objective in head_mind.objectives) - if(!(objective.check_completion())) - return 0 - - return 1 - - -/datum/game_mode/anti_revolution/declare_completion() - - var/text = "" - if(finished == 2) - world << "\red The heads of staff were relieved of their posts! The crew wins!" - else if(finished == 1) - world << "\red The heads of staff managed to meet the goals set for them by CentComm!" - - - - world << "The heads of staff were: " - var/list/heads = list() - heads = get_all_heads() - for(var/datum/mind/head_mind in heads) - text = "" - if(head_mind.current) - text += "[head_mind.current.real_name]" - if(head_mind.current.stat == 2) - text += " (Dead)" - else - text += " (Survived!)" - else - text += "[head_mind.key] (character destroyed)" - - world << text - - - world << "Their objectives were: " - for(var/datum/mind/head_mind in heads) - if(head_mind.objectives.len)//If the traitor had no objectives, don't need to process this. - var/count = 1 - for(var/datum/objective/objective in head_mind.objectives) - if(objective.check_completion()) - text += "
Objective #[count]: [objective.explanation_text] Success!" - feedback_add_details("head_objective","[objective.type]|SUCCESS") - else - text += "
Objective #[count]: [objective.explanation_text] Fail." - feedback_add_details("head_objective","[objective.type]|FAIL") - count++ - break // just print once - return 1 - - -/datum/game_mode/anti_revolution/latespawn(mob/living/carbon/human/character) - ..() - if(emergency_shuttle.departed) - return - - if(character.mind.assigned_role in command_positions) - heads += character.mind - modePlayer += character.mind - add_head_objectives(character.mind) - greet_head(character.mind) - -/mob/proc/ResignFromHeadPosition() - set category = "IC" - set name = "Resign From Head Position" - - if(!istype(ticker.mode, /datum/game_mode/anti_revolution)) - return - - ticker.mode:heads -= src.mind - src.mind.objectives = list() - ticker.mode.modePlayer -= src.mind - src.mind.special_role = null - - src.verbs -= /mob/proc/ResignFromHeadPosition - - src << "\red You resigned from your position, now you have the consequences." \ No newline at end of file diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 931032eac22..82ff00fdfea 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -29,8 +29,6 @@ var/finished = 0 var/checkwin_counter = 0 var/max_headrevs = 3 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) /////////////////////////// //Announces the game type// /////////////////////////// @@ -87,8 +85,6 @@ modePlayer += head_revolutionaries if(emergency_shuttle) emergency_shuttle.no_escape = 1 - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() diff --git a/code/game/gamemodes/revolution/rp-revolution.dm b/code/game/gamemodes/revolution/rp-revolution.dm deleted file mode 100644 index b0c58fd8c5f..00000000000 --- a/code/game/gamemodes/revolution/rp-revolution.dm +++ /dev/null @@ -1,307 +0,0 @@ -// To add a rev to the list of revolutionaries, make sure it's rev (with if(ticker.mode.name == "revolution)), -// then call ticker.mode:add_revolutionary(_THE_PLAYERS_MIND_) -// nothing else needs to be done, as that proc will check if they are a valid target. -// Just make sure the converter is a head before you call it! -// To remove a rev (from brainwashing or w/e), call ticker.mode:remove_revolutionary(_THE_PLAYERS_MIND_), -// this will also check they're not a head, so it can just be called freely -// If the rev icons start going wrong for some reason, ticker.mode:update_all_rev_icons() can be called to correct them. -// If the game somtimes isn't registering a win properly, then ticker.mode.check_win() isn't being called somewhere. -#define RPREV_REQUIRE_REVS_ALIVE 0 -#define RPREV_REQUIRE_HEADS_ALIVE 0 - -/datum/game_mode/rp_revolution - name = "rp-revolution" - config_tag = "rp-revolution" - - var/finished = 0 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/all_brigged = 0 - var/brigged_time = 0 - - uplink_welcome = "Syndicate Uplink Console:" - uplink_uses = 10 - - -/datum/game_mode/rp_revolution/announce() - world << "The current game mode is - Revolution RP!" - -/datum/game_mode/rp_revolution/send_intercept() - var/intercepttext = "Cent. Com. Update Requested staus information:
" - intercepttext += " Cent. Com has recently been contacted by the following syndicate affiliated organisations in your area, please investigate any information you may have:" - - var/list/possible_modes = list() - possible_modes.Add("revolution", "wizard", "traitor", "malf") - var/number = pick(2, 3) - var/i = 0 - for(i = 0, i < number, i++) - possible_modes.Remove(pick(possible_modes)) - possible_modes.Insert(rand(possible_modes.len), "nuke") - - var/datum/intercept_text/i_text = new /datum/intercept_text - for(var/A in possible_modes) - intercepttext += i_text.build(A, pick(head_revolutionaries)) - - for (var/obj/machinery/computer/communications/comm in world) - if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept) - var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc ) - intercept.name = "paper - 'Cent. Com. Status Summary'" - intercept.info = intercepttext - - comm.messagetitle.Add("Cent. Com. Status Summary") - comm.messagetext.Add(intercepttext) - - command_alert("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercept. Security Level Elevated.") - -/datum/game_mode/rp_revolution/post_setup() - - var/list/revs_possible = list() - revs_possible = get_possible_revolutionaries() - var/list/heads = list() - heads = get_living_heads() - var/rev_number = 0 - - if(!revs_possible || !heads) - world << " \red Not enough players for RP revolution game mode. Restarting world in 5 seconds." - sleep(50) - world.Reboot() - return - - if(revs_possible.len >= 3) - rev_number = 3 - else - rev_number = revs_possible.len - - while(rev_number > 0) - head_revolutionaries += pick(revs_possible - head_revolutionaries) - rev_number-- - - for(var/datum/mind/rev_mind in head_revolutionaries) - for(var/datum/mind/head_mind in heads) - var/datum/objective/capture/rev_obj = new - rev_obj.owner = rev_mind - rev_obj.find_target_by_role(head_mind.assigned_role) - rev_mind.objectives += rev_obj - equip_revolutionary(rev_mind.current) - rev_mind.current.verbs += /mob/living/carbon/human/proc/RevConvert - update_rev_icons_added(rev_mind) - - for(var/datum/mind/rev_mind in head_revolutionaries) - var/obj_count = 1 - rev_mind.current << "\blue You are a member of the revolutionaries' leadership!" - for(var/datum/objective/objective in rev_mind.objectives) - rev_mind.current << "Objective #[obj_count]: [objective.explanation_text]" - obj_count++ - - spawn (rand(waittime_l, waittime_h)) - send_intercept() - -/datum/game_mode/rp_revolution/send_intercept() - var/intercepttext = "Cent. Com. Update Requested staus information:
" - intercepttext += " Cent. Com has recently been contacted by the following syndicate affiliated organisations in your area, please investigate any information you may have:" - - var/list/possible_modes = list() - possible_modes.Add("revolution", "wizard", "nuke", "traitor", "malf") - possible_modes -= "[ticker.mode]" - var/number = pick(2, 3) - var/i = 0 - for(i = 0, i < number, i++) - possible_modes.Remove(pick(possible_modes)) - possible_modes.Insert(rand(possible_modes.len), "[ticker.mode]") - - var/datum/intercept_text/i_text = new /datum/intercept_text - for(var/A in possible_modes) - intercepttext += i_text.build(A, pick(head_revolutionaries)) - - for (var/obj/machinery/computer/communications/comm in world) - if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept) - var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc ) - intercept.name = "paper - 'Cent. Com. Status Summary'" - intercept.info = intercepttext - - comm.messagetitle.Add("Cent. Com. Status Summary") - comm.messagetext.Add(intercepttext) - - command_alert("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercept. Security Level Elevated.") - - spawn(54000) - command_alert("Summary downloaded and printed out at all communications consoles.", "The revolution leaders have been determined.") - intercepttext = "Cent. Com. Update Requested status information:
" - intercepttext += "We have determined the revolution leaders to be:" - for(var/datum/mind/revmind in head_revolutionaries) - intercepttext += "
[revmind.current.real_name]" - intercepttext += "
Please arrest them at once." - for (var/obj/machinery/computer/communications/comm in world) - if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept) - var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc ) - intercept.name = "paper - 'Cent. Com. Status Summary'" - intercept.info = intercepttext - - comm.messagetitle.Add("Cent. Com. Status Summary") - comm.messagetext.Add(intercepttext) - spawn(12000) - command_alert("Repeating the previous message over intercoms due to urgency. The station has enemy operatives onboard by the names of [reveal_rev_heads()], please arrest them at once.", "The revolution leaders have been determined.") - - -/datum/game_mode/rp_revolution/proc/reveal_rev_heads() - . = "" - for(var/i = 1, i <= head_revolutionaries.len,i++) - var/datum/mind/revmind = head_revolutionaries[i] - if(i < head_revolutionaries.len) - . += "[revmind.current.real_name]," - else - . += "and [revmind.current.real_name]" - -///datum/game_mode/rp_revolution/proc/equip_revolutionary(mob/living/carbon/human/rev_mob) -// if(!istype(rev_mob)) -// return - -// spawn (100) -// if (rev_mob.r_store) -// rev_mob.equip_or_collect(new /obj/item/weapon/paper/communist_manifesto(rev_mob), rev_mob.slot_l_store) -// if (rev_mob.l_store) -// rev_mob.equip_or_collect(new /obj/item/weapon/paper/communist_manifesto(rev_mob), rev_mob.slot_r_store) - - -/datum/game_mode/rp_revolution/check_win() - if(check_rev_victory()) - finished = 1 - else if(check_heads_victory()) - finished = 2 - return - -/datum/game_mode/rp_revolution/check_finished() - if(finished != 0) - return 1 - else - return 0 - -/datum/game_mode/rp_revolution/proc/get_possible_revolutionaries() - var/list/candidates = list() - - for(var/mob/living/carbon/human/player in world) - if(player.client) - if(player.client.be_syndicate & BE_REV) - candidates += player.mind - - if(candidates.len < 1) - for(var/mob/living/carbon/human/player in world) - if(player.client) - candidates += player.mind - - var/list/uncons = get_unconvertables() - for(var/datum/mind/mind in uncons) - candidates -= mind - - if(candidates.len < 1) - return null - else - return candidates - -/datum/game_mode/rp_revolution/proc/get_unconvertables() - var/list/ucs = list() - for(var/mob/living/carbon/human/player in world) - if(player.mind) - var/role = player.mind.assigned_role - if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director", "Security Officer", "Forensic Technician", "AI")) - ucs += player.mind - - return ucs - -/datum/game_mode/rp_revolution/proc/check_rev_victory() - for(var/datum/mind/rev_mind in head_revolutionaries) - for(var/datum/objective/objective in rev_mind.objectives) - if(!(objective.check_completion())) - return 0 - - return 1 - -/datum/game_mode/rp_revolution/proc/check_heads_victory() - for(var/datum/mind/rev_mind in head_revolutionaries) - if(rev_mind.current.stat != 2) - var/turf/revloc = rev_mind.current.loc - if(!istype(revloc.loc,/area/security/brig) && !rev_mind.current.handcuffed) - return 0 - else if(RPREV_REQUIRE_REVS_ALIVE) return 0 - return 1 - -/datum/game_mode/rp_revolution/declare_completion() - - var/text = "" - if(finished == 1) - world << "\red The heads of staff were relieved of their posts! The revolutionaries win!" - else if(finished == 2) - world << "\red The heads of staff managed to stop the revolution!" - - world << "The head revolutionaries were: " - for(var/datum/mind/rev_mind in head_revolutionaries) - text = "" - if(rev_mind.current) - text += "[rev_mind.current.real_name]" - if(rev_mind.current.stat == 2) - text += " (Dead)" - else - text += " (Survived!)" - else - text += "[rev_mind.key] (character destroyed)" - - world << text - - text = "" - world << "The converted revolutionaries were: " - for(var/datum/mind/rev_nh_mind in revolutionaries) - if(rev_nh_mind.current) - text += "[rev_nh_mind.current.real_name]" - if(rev_nh_mind.current.stat == 2) - text += " (Dead)" - else - text += " (Survived!)" - else - text += "[rev_nh_mind.key] (character destroyed)" - text += ", " - - world << text - - world << "The heads of staff were: " - var/list/heads = list() - heads = get_all_heads() - for(var/datum/mind/head_mind in heads) - text = "" - if(head_mind.current) - text += "[head_mind.current.real_name]" - if(head_mind.current.stat == 2) - text += " (Dead)" - else - text += " (Survived!)" - else - text += "[head_mind.key] (character destroyed)" - - world << text - return 1 - - - -mob/living/carbon/human/proc - RevConvert(mob/M as mob in oview(src)) - set name = "Rev-Convert" - if(((src.mind in ticker.mode:head_revolutionaries) || (src.mind in ticker.mode:revolutionaries))) - if((M.mind in ticker.mode:head_revolutionaries) || (M.mind in ticker.mode:revolutionaries)) - src << "\red [M] is already be a revolutionary!" - else if(src.mind in ticker.mode:get_unconvertables()) - src << "\red [M] cannot be a revolutionary!" - else - if(world.time < M.mind.rev_cooldown) - src << "\red Wait five seconds before reconversion attempt." - return - src << "\red Attempting to convert [M]..." - log_admin("[key_name(src)] attempted to convert [M].") - message_admins("\red [key_name_admin(src)] attempted to convert [M].") - var/choice = alert(M,"Asked by [src]: Do you want to join the revolution?","Align Thyself with the Revolution!","No!","Yes!") - if(choice == "Yes!") - ticker.mode:add_revolutionary(M.mind) - M << "\blue You join the revolution!" - src << "\blue [M] joins the revolution!" - else if(choice == "No!") - M << "\red You reject this traitorous cause!" - src << "\red [M] does not support the revolution!" - M.mind.rev_cooldown = world.time+50 diff --git a/code/game/gamemodes/revolution/rp_revolution.dm b/code/game/gamemodes/revolution/rp_revolution.dm index 2bd8e2100d1..8e7759233f4 100644 --- a/code/game/gamemodes/revolution/rp_revolution.dm +++ b/code/game/gamemodes/revolution/rp_revolution.dm @@ -69,8 +69,7 @@ rev_mind.current.verbs += /mob/living/carbon/human/proc/RevConvert modePlayer += head_revolutionaries - spawn (rand(waittime_l, waittime_h)) - send_intercept() + /datum/game_mode/revolution/rp_revolution/greet_revolutionary(var/datum/mind/rev_mind, var/you_are=1) var/obj_count = 1 diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index 05d778c8b5a..4cdeec3edf0 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -70,9 +70,6 @@ Made by Xhuis restricted_jobs = list("AI", "Cyborg") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Brig Physician", "Internal Affairs Agent") - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - /datum/game_mode/shadowling/announce() world << "The current game mode is - Shadowling!" world << "There are alien shadowlings on the station. Crew: Kill the shadowlings before they can eat or enthrall the crew. Shadowlings: Enthrall the crew while remaining in hiding." @@ -109,10 +106,7 @@ Made by Xhuis finalize_shadowling(shadow) process_shadow_objectives(shadow) //give_shadowling_abilities(shadow) - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() - return /datum/game_mode/proc/greet_shadow(var/datum/mind/shadow) shadow.current << "Currently, you are disguised as an employee aboard [world.name]." diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 605b3e062e3..59b4f710c6a 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -20,9 +20,6 @@ uplink_welcome = "Syndicate Uplink Console:" uplink_uses = 20 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/traitors_possible = 4 //hard limit on traitors if scaling is turned off var/const/traitor_scaling_coeff = 5.0 //how much does the amount of players get divided by to determine traitors @@ -71,10 +68,7 @@ finalize_traitor(traitor) greet_traitor(traitor) modePlayer += traitors - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() - return 1 /datum/game_mode/proc/forge_traitor_objectives(var/datum/mind/traitor) diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index 13507d847cb..122e99e520f 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -35,9 +35,6 @@ var/const/prob_right_objective_l = 25 //lower bound on probability of determining the objective correctly var/const/prob_right_objective_h = 50 //upper bound on probability of determining the objective correctly - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/vampire_amount = 4 @@ -73,10 +70,7 @@ forge_vampire_objectives(vampire) greet_vampire(vampire) - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() - return /datum/game_mode/proc/auto_declare_completion_vampire() if(vampires.len) diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 7924fcd1bf3..25cddf67b4f 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -14,9 +14,6 @@ var/finished = 0 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - /datum/game_mode/wizard/announce() world << "The current game mode is - Wizard!" world << "There is a \red SPACE WIZARD\black on the station. You can't let him achieve his objective!" @@ -56,10 +53,7 @@ name_wizard(wizard.current) greet_wizard(wizard) - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() - return /datum/game_mode/proc/forge_wizard_objectives(var/datum/mind/wizard) @@ -69,7 +63,7 @@ kill_objective.owner = wizard kill_objective.find_target() wizard.objectives += kill_objective - + var/datum/objective/steal/steal_objective = new steal_objective.owner = wizard steal_objective.find_target() @@ -111,7 +105,7 @@ steal_objective.owner = wizard steal_objective.find_target() wizard.objectives += steal_objective - + if (!(locate(/datum/objective/hijack) in wizard.objectives)) var/datum/objective/hijack/hijack_objective = new hijack_objective.owner = wizard @@ -184,7 +178,7 @@ wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/spellbook(wizard_mob), slot_r_hand) wizard_mob.faction = list("wizard") - + wizard_mob.species.equip(wizard_mob) wizard_mob << "You will find a list of available spells in your spell book. Choose your magic arsenal carefully." diff --git a/code/game/gamemodes/xenos/xenos.dm b/code/game/gamemodes/xenos/xenos.dm index 91bdefd0639..7452bf21787 100644 --- a/code/game/gamemodes/xenos/xenos.dm +++ b/code/game/gamemodes/xenos/xenos.dm @@ -15,9 +15,6 @@ var/xenos_list = list() var/gammacalled = 0 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/gammaratio = 4 //At what alien to human ratio will the Gamma security level be called and the nuke be made available? /datum/game_mode/xenos/announce() @@ -97,9 +94,6 @@ //qdel(xeno_mind) spawnpos++ - spawn (rand(waittime_l, waittime_h)) - send_intercept() - return ..() /datum/game_mode/xenos/process() diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index de8ae87ae53..7427ad57d23 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -116,8 +116,8 @@ supervisors = "the chief engineer" selection_color = "#fff5cc" idtype = /obj/item/weapon/card/id/engineering - access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_mechanic, access_external_airlocks) - minimal_access = list(access_maint_tunnels, access_emergency_storage, access_mechanic, access_external_airlocks) + access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_mechanic, access_external_airlocks, access_mineral_storeroom) + minimal_access = list(access_maint_tunnels, access_emergency_storage, access_mechanic, access_external_airlocks, access_mineral_storeroom) equip(var/mob/living/carbon/human/H) diff --git a/code/game/jobs/job/support_chaplain.dm b/code/game/jobs/job/support_chaplain.dm index 30ba553d850..25ca290b0ab 100644 --- a/code/game/jobs/job/support_chaplain.dm +++ b/code/game/jobs/job/support_chaplain.dm @@ -26,6 +26,7 @@ H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) else H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) + H.equip_or_collect(new /obj/item/device/camera/spooky(H.back), slot_in_backpack) spawn(0) var/religion_name = "Christianity" var/new_religion = sanitize(copytext(input(H, "You are the crew services officer. Would you like to change your religion? Default is Christianity, in SPACE.", "Name change", religion_name),1,MAX_NAME_LEN)) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 565bc802e00..12e2df8c7a4 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -102,7 +102,7 @@ desc = "Does not support Pinball." icon = 'icons/obj/computer.dmi' icon_state = "arcade" - circuit = /obj/item/weapon/circuitboard/arcade + circuit = /obj/item/weapon/circuitboard/arcade/battle var/enemy_name = "Space Villian" var/temp = "Winners Don't Use Spacedrugs" //Temporary message, for attack messages, etc var/player_hp = 30 //Player health/attack points diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 9815035311e..11361034fbb 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -262,9 +262,15 @@ if(istype(triP) && triP.flipped) icon_state = "m_[icon_state]" -//called when a turf is attacked with a pipe item -// place the pipe on the turf, setting pipe level to 1 (underfloor) if the turf is not intact - +// called by turf to know if should treat as bent or not on placement +/obj/item/pipe/proc/is_bent_pipe() + return pipe_type in list( \ + PIPE_SIMPLE_BENT, \ + PIPE_HE_BENT, \ + PIPE_INSULATED_BENT, \ + PIPE_SUPPLY_BENT, \ + PIPE_SCRUBBERS_BENT) + // rotate the pipe item clockwise /obj/item/pipe/verb/rotate() @@ -305,7 +311,7 @@ /obj/item/pipe/Move() ..() - if ((pipe_type in list (PIPE_SIMPLE_BENT, PIPE_SUPPLY_BENT, PIPE_SCRUBBERS_BENT, PIPE_HE_BENT, PIPE_INSULATED_BENT)) \ + if (is_bent_pipe() \ && (src.dir in cardinal)) src.dir = src.dir|turn(src.dir, 90) else if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_SUPPLY_STRAIGHT, PIPE_SCRUBBERS_STRAIGHT, PIPE_UNIVERSAL, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE, PIPE_DVALVE)) diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 2d568cf1f30..93b01f3951f 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -8,7 +8,7 @@ idle_power_usage = 5 active_power_usage = 1000 var/mob/occupant = null - var/circuitboard = "/obj/item/weapon/circuitboard/cyborgrecharger" + var/circuitboard = /obj/item/weapon/circuitboard/cyborgrecharger var/recharge_speed var/recharge_speed_nutrition var/repairs @@ -44,7 +44,9 @@ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) repairs += M.rating - 1 for(var/obj/item/weapon/stock_parts/cell/C in component_parts) - recharge_speed *= C.maxcharge / 10000 + var/multiplier = C.maxcharge / 10000 + recharge_speed *= multiplier + recharge_speed_nutrition *= multiplier /obj/machinery/recharge_station/process() if(!(NOPOWER|BROKEN)) @@ -116,8 +118,7 @@ if(!isnull(H.internal_organs_by_name["cell"]) && H.nutrition < 450) H.nutrition = min(H.nutrition+recharge_speed_nutrition, 450) if(repairs) - H.adjustBruteLoss(-(repairs)) - H.adjustFireLoss(-(repairs)) + H.heal_overall_damage(repairs, repairs, 0, 1) H.updatehealth() /obj/machinery/recharge_station/proc/go_out() diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm index b2d131cc274..dba30d648b0 100644 --- a/code/game/machinery/wishgranter.dm +++ b/code/game/machinery/wishgranter.dm @@ -9,6 +9,7 @@ density = 1 var/datum/mind/target var/list/types = list() + var/inuse = 0 /obj/machinery/wish_granter/New() for(var/supname in all_superheroes) @@ -22,33 +23,40 @@ user << "You feel a dark stirring inside of the Wish Granter, something you want nothing of. Your instincts are better than any man's." return - else if(is_special_character(user)) + if(is_special_character(user)) user << "Even to a heart as dark as yours, you know nothing good will come of this. Something instinctual makes you pull away." + return + if(inuse) + user << "Someone is already communing with the Wish Granter." + return + + user << "The power of the Wish Granter have turned you into the superhero the station deserves. You are a masked vigilante, and answer to no man. Will you use your newfound strength to protect the innocent, or will you hunt the guilty?" + + inuse = 1 + var/wish + if(types.len == 1) + wish = pick(types) else - user << "The power of the Wish Granter have turned you into the superhero the station deserves. You are a masked vigilante, and answer to no man. Will you use your newfound strength to protect the innocent, or will you hunt the guilty?" + wish = input("You want to become...","Wish") as null|anything in types + if(!wish) + inuse=0 + return + types -= wish + var/mob/living/carbon/human/M = user + var/datum/superheroes/S = all_superheroes[wish] + if(S) + S.create(M) + inuse=0 - - var/wish - if(types.len == 1) - wish = pick(types) - else - wish = input("You want to become...","Wish") as null|anything in types - if(!wish) return - types -= wish - var/mob/living/carbon/human/M = user - var/datum/superheroes/S = all_superheroes[wish] - if(S) - S.create(M) - - //Remove the wishgranter or teleport it randomly on the station - if(!types.len) - user << "The wishgranter slowly fades into mist..." - qdel(src) - return - else - var/impact_area = findEventArea() - var/turf/T = pick(get_area_turfs(impact_area)) - if(T) - src.loc = T + //Remove the wishgranter or teleport it randomly on the station + if(!types.len) + user << "The wishgranter slowly fades into mist..." + qdel(src) + return + else + var/impact_area = findEventArea() + var/turf/T = pick(get_area_turfs(impact_area)) + if(T) + src.loc = T return \ No newline at end of file diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 076e85c6de0..298c5b75f53 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -152,6 +152,7 @@ var/global/list/image/splatter_cache=list() icon_state = "gibbl5" random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6") var/fleshcolor = "#FFFFFF" + noclear = 1 /obj/effect/decal/cleanable/blood/gibs/update_icon() @@ -183,6 +184,17 @@ var/global/list/image/splatter_cache=list() /obj/effect/decal/cleanable/blood/gibs/core random_icon_states = list("gibmid1", "gibmid2", "gibmid3") +/obj/effect/decal/cleanable/blood/gibs/New() + ..() + reagents.add_reagent("liquidgibs", 5) + + +/obj/effect/decal/cleanable/blood/gibs/cleangibs //most ironic name ever... + +/obj/effect/decal/cleanable/blood/gibs/cleangibs/New() //no reagent! + ..() + reagents.remove_reagent("liquidgibs",5) + /obj/effect/decal/cleanable/blood/gibs/proc/streak(var/list/directions) spawn (0) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index f52de29785b..ca5660a3ef7 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -18,6 +18,7 @@ * Foam armblade * Mini Gibber * Toy xeno + * Toy chainsaws */ @@ -1413,4 +1414,31 @@ obj/item/toy/cards/deck/syndicate/black /obj/item/toy/russian_revolver/proc/spin_cylinder() - bullet_position = rand(1,6) \ No newline at end of file + bullet_position = rand(1,6) + +/* + * Rubber Chainsaw + */ +/obj/item/weapon/twohanded/toy/chainsaw + name = "Toy Chainsaw" + desc = "A toy chainsaw with a rubber edge. Ages 8 and up" + icon_state = "chainsaw0" + force = 0 + throwforce = 0 + throw_speed = 4 + throw_range = 20 + wieldsound = 'sound/weapons/chainsawstart.ogg' + attack_verb = list("sawed", "cut", "hacked", "carved", "cleaved", "butchered", "felled", "timbered") + +/obj/item/weapon/twohanded/toy/chainsaw/update_icon() + if(wielded) + icon_state = "chainsaw[wielded]" + else + icon_state = "chainsaw0" + +/obj/item/weapon/twohanded/toy/chainsaw/attack(mob/target as mob, mob/living/user as mob) + if(wielded) + playsound(loc, 'sound/weapons/chainsaw.ogg', 100, 1, -1) + else + playsound(loc, "swing_hit", 50, 1, -1) + ..() diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm index 4ebf6b257e8..02f3289dad8 100644 --- a/code/game/objects/items/weapons/soap.dm +++ b/code/game/objects/items/weapons/soap.dm @@ -15,6 +15,36 @@ desc = "A Nanotrasen brand bar of soap. Smells of plasma." icon_state = "soapnt" +/obj/item/weapon/soap/homemade + desc = "A homemade bar of soap. Smells of... well...." + icon_state = "soapgibs" + cleanspeed = 45 // a little faster to reward chemists for going to the effort + +/obj/item/weapon/soap/ducttape + desc = "A homemade bar of soap. It seems to be gibs and tape..Will this clean anything?" + icon_state = "soapgibs" + +/obj/item/weapon/soap/ducttape/afterattack(atom/target, mob/user as mob, proximity) + if(!proximity) return + + if(user.client && (target in user.client.screen)) + user << "You need to take that [target.name] off before 'cleaning' it." + else + user.visible_message("[user] begins to smear [src] on \the [target.name].") + if(do_after(user, src.cleanspeed, target = target)) + user << "You 'clean' \the [target.name]." + if(istype(target, /turf/simulated)) + new /obj/effect/decal/cleanable/blood/gibs/cleangibs(target) + else if (istype(target,/mob/living/carbon)) + for(var/obj/item/carried_item in target.contents) + if(!istype(carried_item, /obj/item/weapon/implant))//If it's not an implant. + carried_item.add_blood(target)//Oh yes, there will be blood... + var/mob/living/carbon/human/H = target + H.bloody_hands(target,0) + H.bloody_body(target) + + return + /obj/item/weapon/soap/deluxe desc = "A deluxe Waffle Co. brand bar of soap. Smells of comdoms." icon_state = "soapdeluxe" diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 9b2e9b7064d..c24482a0da4 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -578,16 +578,14 @@ var/list/wood_icons = list("wood","wood-broken") user << "You need more welding fuel to complete this task." if(istype(C,/obj/item/pipe)) - var/obj/item/pipe/V = C - if(V.pipe_type != -1) // ANY PIPE - var/obj/item/pipe/P = C - + var/obj/item/pipe/P = C + if(P.pipe_type != -1) // ANY PIPE user.visible_message( \ "[user] starts sliding [P] along \the [src].", \ "You slide [P] along \the [src].", \ "You hear the scrape of metal against something.") user.drop_item() - if (P.pipe_type in list (1,3,12)) // bent pipe rotation fix see construction.dm + if (P.is_bent_pipe()) // bent pipe rotation fix see construction.dm P.dir = 5 if (user.dir == 1) P.dir = 6 @@ -595,8 +593,6 @@ var/list/wood_icons = list("wood","wood-broken") P.dir = 9 if (user.dir == 4) P.dir = 10 - if (user.dir == 5) - P.dir = 8 else P.dir = user.dir P.x = src.x diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 33f79cd8fe2..fa0a59010d4 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -177,4 +177,19 @@ /obj/item/weaponcrafting/stock = 1, /obj/item/stack/packageWrap = 5,) tools = list(/obj/item/weapon/screwdriver) - time = 200 \ No newline at end of file + time = 200 + +/datum/table_recipe/spooky_camera + name = "Camera Obscura" + result = /obj/item/device/camera/spooky + time = 15 + reqs = list(/obj/item/device/camera = 1, + /datum/reagent/holywater = 10) + parts = list(/obj/item/device/camera = 1) + +/datum/table_recipe/notreallysoap + name = "Homemade Soap" + result = /obj/item/weapon/soap/ducttape + time = 100 + reqs = list(/obj/item/stack/tape_roll = 1, + /datum/reagent/liquidgibs = 10) \ No newline at end of file diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 29e0e9f1102..03a43880587 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -20,7 +20,7 @@ var/sheet_per_ore = 1 var/point_upgrade = 1 var/list/ore_values = list(("sand" = 1), ("iron" = 1), ("gold" = 20), ("silver" = 20), ("uranium" = 20), ("bananium" = 30), ("diamond" = 40), ("plasma" = 40)) - var/list/supply_consoles = list("Science", "Robotics", "Research Director's Desk", "Mechanic", ("Engineering" = list("metal", "glass", "plasma")), ("Chief Engineer's Desk" = list("metal", "glass", "plasma")), ("Atmospherics" = list("metal", "glass", "plasma"))) + var/list/supply_consoles = list("Science", "Robotics", "Research Director's Desk", "Mechanic", "Engineering" = list("metal", "glass", "plasma"), "Chief Engineer's Desk" = list("metal", "glass", "plasma"), "Atmospherics" = list("metal", "glass", "plasma"), "Bar" = list("uranium", "plasma")) /obj/machinery/mineral/ore_redemption/New() ..() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 3de3e569e8c..2d12d6d3e3a 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -4,20 +4,21 @@ voice_name = "unknown" icon = 'icons/mob/human.dmi' icon_state = "body_m_s" + + //why are these here and not in human_defines.dm var/list/hud_list[10] var/datum/species/species //Contains icon generation and language information, set during New(). var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us. var/obj/item/weapon/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call. -/mob/living/carbon/human/New(var/new_loc, var/new_species = null, var/delay_ready_dna=0) - +/mob/living/carbon/human/New(var/new_loc, var/new_species = null, var/delay_ready_dna = 0) if(!dna) dna = new /datum/dna(null) // Species name is handled by set_species() if(!species) if(new_species) - set_species(new_species,1) + set_species(new_species, 1) else set_species() @@ -45,7 +46,7 @@ make_blood() var/mob/M = src - faction |= "\ref[M]" + faction |= "\ref[M]" //what // Set up DNA. if(!delay_ready_dna && dna) @@ -147,30 +148,37 @@ /mob/living/carbon/human/stok/New(var/new_loc) ..(new_loc, "Stok") -/mob/living/carbon/human/Bump(atom/movable/AM as mob|obj, yes) - if ((!( yes ) || now_pushing || buckled)) - return +/mob/living/carbon/human/Bump(atom/movable/AM, yes) + if(!(yes) || now_pushing || buckled) + return 0 now_pushing = 1 - if (ismob(AM)) + if(ismob(AM)) var/mob/tmob = AM - if( istype(tmob, /mob/living/carbon) && prob(10) ) - src.spread_disease_to(AM, "Contact") -//BubbleWrap - Should stop you pushing a restrained person out of the way - - if(istype(tmob, /mob/living/carbon/human)) + if(iscarbon(tmob) && prob(10)) + spread_disease_to(tmob, "Contact") + //BubbleWrap - Should stop you pushing a restrained person out of the way + //i still don't get it, is this supposed to be 'bubblewrapping' or was it made by a guy named 'BubbleWrap' + if(ishuman(tmob)) for(var/mob/M in range(tmob, 1)) - if(tmob.pinned.len || ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) ) - if ( !(world.time % 5) ) - src << "\red [tmob] is restrained, you cannot push past" + + if(tmob.pinned.len || (M.pulling == tmob && (tmob.restrained() && !M.restrained()) && M.stat == CONSCIOUS)) + if(!(world.time % 5)) //tmob is pinned to wall, or is restrained and pulled by a concious unrestrained human + src << "[tmob] is restrained, you cannot push past." now_pushing = 0 - return - if( tmob.pulling == M && ( M.restrained() && !( tmob.restrained() ) && tmob.stat == 0) ) - if ( !(world.time % 5) ) - src << "\red [tmob] is restraining [M], you cannot push past" + return 0 + + //I have to fucking document this somewhere- the above if(tmob.pinned.len || etc) check above had + //locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) at the end of it + //FIRST OF ALL, THAT IS NOT HOW YOU FUCKING USE LOCATE() + //SECOND OF ALL, OH GOD, WHY WOULD YOU EVER WANT GRABBED MOBS TO BE UNABLE TO BE PUSHED PAST GOD + + if(tmob.pulling == M && (M.restrained() && !tmob.restrained()) && tmob.stat == CONSCIOUS) + if(!(world.time % 5)) + src << "[tmob] is restraining [M], you cannot push past." now_pushing = 0 - return + return 0 //Leaping mobs just land on the tile, no pushing, no anything. if(status_flags & LEAPING) @@ -179,35 +187,35 @@ now_pushing = 0 return - if(istype(tmob,/mob/living/silicon/robot/drone)) //I have no idea why the hell this isn't already happening. How do mice do it? - loc = tmob.loc - now_pushing = 0 - return - //BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller - if((tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || restrained()) && tmob.canmove && canmove && !tmob.buckled && !tmob.buckled_mob) // mutual brohugs all around! - var/turf/oldloc = loc - loc = tmob.loc - tmob.loc = oldloc - now_pushing = 0 - for(var/mob/living/carbon/slime/slime in view(1,tmob)) - if(slime.Victim == tmob) - slime.UpdateFeed() - return + //it might be 'bubblewrapping' given that this rhymes with 'hugboxing' + if((tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || restrained())) + if((canmove && tmob.canmove) && (!tmob.buckled && !tmob.buckled_mob)) + var/turf/oldloc = loc + loc = tmob.loc + tmob.loc = oldloc + now_pushing = 0 + for(var/mob/living/carbon/slime/slime in view(1,tmob)) + if(slime.Victim == tmob) + slime.UpdateFeed() + return - if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations)) + if(ishuman(tmob) && (FAT in tmob.mutations)) if(prob(40) && !(FAT in src.mutations)) - src << "\red You fail to push [tmob]'s fat ass out of the way." + src << "You fail to push [tmob]'s fat ass out of the way." now_pushing = 0 return + if(tmob.r_hand && istype(tmob.r_hand, /obj/item/weapon/shield/riot)) if(prob(99)) now_pushing = 0 return + if(tmob.l_hand && istype(tmob.l_hand, /obj/item/weapon/shield/riot)) if(prob(99)) now_pushing = 0 return + if(!(tmob.status_flags & CANPUSH)) now_pushing = 0 return @@ -217,21 +225,19 @@ now_pushing = 0 spawn(0) ..() - if (!istype(AM, /atom/movable)) + if(!istype(AM, /atom/movable)) return - if (!now_pushing) + if(!now_pushing) now_pushing = 1 - if (!AM.anchored) + if(!AM.anchored) var/t = get_dir(src, AM) - if (istype(AM, /obj/structure/window/full)) - for(var/obj/structure/window/win in get_step(AM,t)) + if(istype(AM, /obj/structure/window/full)) + for(var/obj/structure/window/win in get_step(AM, t)) now_pushing = 0 return step(AM, t) now_pushing = 0 - return - return /mob/living/carbon/human/Stat() ..() @@ -247,11 +253,11 @@ if(eta_status) stat(null, eta_status) - if (client.statpanel == "Status") + if(client.statpanel == "Status") if(locate(/obj/item/device/assembly/health) in src) stat(null, "Health: [health]") - if (internal) - if (!internal.air_contents) + if(internal) + if(!internal.air_contents) qdel(internal) else stat("Internal Atmosphere Info", internal.name) @@ -280,12 +286,13 @@ var/shielded = 0 var/b_loss = null var/f_loss = null - switch (severity) - if (1.0) + + switch(severity) + if(1) b_loss += 500 - if (!prob(getarmor(null, "bomb"))) + if(!prob(getarmor(null, "bomb"))) gib() - return + return 0 else var/atom/target = get_edge_target_turf(src, get_dir(src, get_step_away(src, src))) throw_at(target, 200, 4) @@ -302,13 +309,8 @@ limbs_affected -= 1 else valid_limbs -= processing_dismember - - //return -// var/atom/target = get_edge_target_turf(user, get_dir(src, get_step_away(user, src))) - //user.throw_at(target, 200, 4) - - if (2.0) - if (!shielded) + if(2) + if(!shielded) //literally nothing could change shielded before this so wth b_loss += 60 f_loss += 60 @@ -317,7 +319,7 @@ var/obj/item/organ/external/processing_dismember var/list/valid_limbs = organs.Copy() - if (prob(getarmor(null, "bomb"))) + if(prob(getarmor(null, "bomb"))) b_loss = b_loss/1.5 f_loss = f_loss/1.5 @@ -333,15 +335,15 @@ limbs_affected -= 1 else valid_limbs -= processing_dismember - if (!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs)) + if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs)) ear_damage += 30 ear_deaf += 120 - if (prob(70) && !shielded) + if(prob(70) && !shielded) Paralyse(10) - if(3.0) + if(3) b_loss += 30 - if (prob(getarmor(null, "bomb"))) + if(prob(getarmor(null, "bomb"))) b_loss = b_loss/2 else @@ -358,10 +360,10 @@ limbs_affected -= 1 else valid_limbs -= processing_dismember - if (!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs)) + if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs)) ear_damage += 15 ear_deaf += 60 - if (prob(50) && !shielded) + if(prob(50) && !shielded) Paralyse(10) var/update = 0 @@ -369,19 +371,19 @@ for(var/obj/item/organ/external/temp in organs) switch(temp.limb_name) if("head") - update |= temp.take_damage(b_loss * 0.2, f_loss * 0.2, used_weapon = weapon_message) + update |= temp.take_damage(b_loss * 0.2, f_loss * 0.2, used_weapon = weapon_message) if("chest") - update |= temp.take_damage(b_loss * 0.4, f_loss * 0.4, used_weapon = weapon_message) + update |= temp.take_damage(b_loss * 0.4, f_loss * 0.4, used_weapon = weapon_message) if("groin") - update |= temp.take_damage(b_loss * 0.1, f_loss * 0.1, used_weapon = weapon_message) + update |= temp.take_damage(b_loss * 0.1, f_loss * 0.1, used_weapon = weapon_message) if("l_arm") - update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) + update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) if("r_arm") - update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) + update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) if("l_leg") - update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) + update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) if("r_leg") - update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) + update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) if("r_foot") update |= temp.take_damage(b_loss * 0.025, f_loss * 0.025, used_weapon = weapon_message) if("l_foot") @@ -395,12 +397,12 @@ ..() /mob/living/carbon/human/blob_act() - if(stat == DEAD) return + if(stat == DEAD) + return show_message("The blob attacks you!") var/dam_zone = pick("head", "chest", "groin", "l_arm", "l_hand", "r_arm", "r_hand", "l_leg", "l_foot", "r_leg", "r_foot") var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone)) apply_damage(5, BRUTE, affecting, run_armor_check(affecting, "melee")) - return /mob/living/carbon/human/attack_animal(mob/living/simple_animal/M as mob) if(M.melee_damage_upper == 0) diff --git a/code/modules/mob/living/carbon/human/human_attackalien.dm b/code/modules/mob/living/carbon/human/human_attackalien.dm index f948cdb2b3b..015c73455ba 100644 --- a/code/modules/mob/living/carbon/human/human_attackalien.dm +++ b/code/modules/mob/living/carbon/human/human_attackalien.dm @@ -1,51 +1,50 @@ /mob/living/carbon/human/attack_alien(mob/living/carbon/alien/humanoid/M as mob) if(check_shields(0, M.name)) - visible_message("\red [M] attempted to touch [src]!") + visible_message("[M] attempted to touch [src]!") return 0 switch(M.a_intent) - if (I_HELP) - visible_message(text("\blue [M] caresses [src] with its scythe like arm.")) - if (I_GRAB) + if(I_HELP) + visible_message("[M] caresses [src] with its scythe like arm.") + + if(I_GRAB) grabbedby(M) if(I_HARM) M.do_attack_animation(src) - if (w_uniform) + if(w_uniform) w_uniform.add_fingerprint(M) + var/damage = rand(15, 30) if(!damage) playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1, -1) - visible_message("\red [M] has lunged at [src]!") + visible_message("[M] has lunged at [src]!") return 0 + var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting)) var/armor_block = run_armor_check(affecting, "melee") playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) - visible_message("\red [M] has slashed at [src]!") + visible_message("[M] has slashed at [src]!") apply_damage(damage, BRUTE, affecting, armor_block) - if (damage >= 25) - visible_message("\red [M] has wounded [src]!") + if(damage >= 25) + visible_message("[M] has wounded [src]!") apply_effect(4, WEAKEN, armor_block) updatehealth() if(I_DISARM) M.do_attack_animation(src) - var/randn = rand(1, 100) - if (randn <= 80) + if(prob(80)) var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting)) playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) apply_effect(5, WEAKEN, run_armor_check(affecting, "melee")) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has tackled down []!", M, src), 1) + visible_message("[M] has tackled down [src]!") else - if (randn <= 99) + if(prob(99)) //this looks fucking stupid but it was previously 'var/randn = rand(1, 100); if(randn <= 99)' playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1) drop_item() - visible_message(text("\red [] disarmed []!", M, src)) + visible_message("[M] disarmed [src]!") else playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1, -1) - visible_message(text("\red [] has tried to disarm []!", M, src)) - return \ No newline at end of file + visible_message("[M] has tried to disarm [src]!") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index d09c61ce3b8..28943a4c22b 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -4,26 +4,30 @@ health = 100 stat = CONSCIOUS return - var/total_burn = 0 - var/total_brute = 0 + + var/total_burn = 0 + var/total_brute = 0 + for(var/obj/item/organ/external/O in organs) //hardcoded to streamline things a bit - total_brute += O.brute_dam + total_brute += O.brute_dam //calculates health based on organ brute and burn total_burn += O.burn_dam + health = 100 - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute + //TODO: fix husking - if( (((100 - total_burn) < config.health_threshold_dead) && stat == DEAD))//100 only being used as the magic human max health number, feel free to change it if you add a var for it -- Urist - ChangeToHusk() + if(((100 - total_burn) < config.health_threshold_dead) && stat == DEAD) //100 is the magic human max health number + ChangeToHusk() //BECAUSE NO ONE THOUGHT TO USE LIVING/VAR/MAXHEALTH I GUESS if(species.can_revive_by_healing) var/obj/item/organ/brain/B = internal_organs_by_name["brain"] if(B) - if((health >= (config.health_threshold_dead/100*75)) && stat == DEAD) + if((health >= (config.health_threshold_dead / 100 * 75)) && stat == DEAD) update_revive() - if (stat == CONSCIOUS && (src in dead_mob_list)) //Defib fix + if(stat == CONSCIOUS && (src in dead_mob_list)) //Defib fix update_revive() - return /mob/living/carbon/human/adjustBrainLoss(var/amount) - if(status_flags & GODMODE) return 0 //godmode + if(status_flags & GODMODE) + return 0 //godmode if(species && species.has_organ["brain"]) var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"] @@ -36,7 +40,8 @@ brainloss = 0 /mob/living/carbon/human/setBrainLoss(var/amount) - if(status_flags & GODMODE) return 0 //godmode + if(status_flags & GODMODE) + return 0 //godmode if(species && species.has_organ["brain"]) var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"] @@ -49,7 +54,8 @@ brainloss = 0 /mob/living/carbon/human/getBrainLoss() - if(status_flags & GODMODE) return 0 //godmode + if(status_flags & GODMODE) + return 0 //godmode if(species && species.has_organ["brain"]) var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"] @@ -143,34 +149,39 @@ return var/heal_prob = max(0, 80 - getCloneLoss()) - var/mut_prob = min(80, getCloneLoss()+10) - if (amount > 0) - if (prob(mut_prob)) - var/list/obj/item/organ/external/candidates = list() - for (var/obj/item/organ/external/O in organs) - if(O.status & ORGAN_ROBOT) continue + var/mut_prob = min(80, getCloneLoss() + 10) + if(amount > 0) //cloneloss is being added + if(prob(mut_prob)) + var/list/obj/item/organ/external/candidates = list() //TYPECASTED LISTS ARE NOT A FUCKING THING WHAT THE FUCK + for(var/obj/item/organ/external/O in organs) + if(O.status & ORGAN_ROBOT) + continue if(!(O.status & ORGAN_MUTATED)) candidates |= O - if (candidates.len) + + if(candidates.len) var/obj/item/organ/external/O = pick(candidates) O.mutate() - src << "Something is not right with your [O.name]..." + src << "Something is not right with your [O.name]..." O.add_autopsy_data("Mutation", amount) return - else - if (prob(heal_prob)) - for (var/obj/item/organ/external/O in organs) - if (O.status & ORGAN_MUTATED) + + else //cloneloss is being subtracted + if(prob(heal_prob)) + for(var/obj/item/organ/external/O in organs) + if(O.status & ORGAN_MUTATED) O.unmutate() - src << "Your [O.name] is shaped normally again." + src << "Your [O.name] is shaped normally again." return - if (getCloneLoss() < 1) - for (var/obj/item/organ/external/O in organs) - if (O.status & ORGAN_MUTATED) + + if(getCloneLoss() < 1) //no cloneloss, fixes organs + for(var/obj/item/organ/external/O in organs) + if(O.status & ORGAN_MUTATED) O.unmutate() - src << "Your [O.name] is shaped normally again." - hud_updateflag |= 1 << HEALTH_HUD + src << "Your [O.name] is shaped normally again." + + hud_updateflag |= 1 << HEALTH_HUD //what even is this shit // Defined here solely to take species flags into account without having to recast at mob/living level. /mob/living/carbon/human/getOxyLoss() @@ -186,7 +197,7 @@ /mob/living/carbon/human/setOxyLoss(var/amount) if(species.flags & NO_BREATHE) - oxyloss = 0 + oxyloss = 0 //this literally overrides three procs, excessive much? else ..() @@ -203,7 +214,7 @@ /mob/living/carbon/human/setToxLoss(var/amount) if(species.flags & NO_POISON) - toxloss = 0 + toxloss = 0 //this *also* overrides three procs, definately excessive else ..() @@ -230,7 +241,8 @@ //It automatically updates health status /mob/living/carbon/human/heal_organ_damage(var/brute, var/burn) var/list/obj/item/organ/external/parts = get_damaged_organs(brute,burn) - if(!parts.len) return + if(!parts.len) + return var/obj/item/organ/external/picked = pick(parts) if(picked.heal_damage(brute,burn)) UpdateDamageIcon() @@ -242,7 +254,8 @@ //It automatically updates health status /mob/living/carbon/human/take_organ_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0) var/list/obj/item/organ/external/parts = get_damageable_organs() - if(!parts.len) return + if(!parts.len) + return var/obj/item/organ/external/picked = pick(parts) if(picked.take_damage(brute,burn,sharp,edge)) UpdateDamageIcon() @@ -252,31 +265,35 @@ //Heal MANY external organs, in random order -/mob/living/carbon/human/heal_overall_damage(var/brute, var/burn) +/mob/living/carbon/human/heal_overall_damage(var/brute, var/burn, var/internal=0, var/robotic=0) var/list/obj/item/organ/external/parts = get_damaged_organs(brute,burn) var/update = 0 - while(parts.len && (brute>0 || burn>0) ) + while(parts.len && ( brute > 0 || burn > 0) ) var/obj/item/organ/external/picked = pick(parts) var/brute_was = picked.brute_dam var/burn_was = picked.burn_dam - update |= picked.heal_damage(brute,burn) + update |= picked.heal_damage(brute,burn, internal, robotic) brute -= (brute_was-picked.brute_dam) burn -= (burn_was-picked.burn_dam) parts -= picked + updatehealth() hud_updateflag |= 1 << HEALTH_HUD speech_problem_flag = 1 - if(update) UpdateDamageIcon() + if(update) + UpdateDamageIcon() // damage MANY external organs, in random order /mob/living/carbon/human/take_overall_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0, var/used_weapon = null) - if(status_flags & GODMODE) return //godmode + if(status_flags & GODMODE) + return //godmode var/list/obj/item/organ/external/parts = get_damageable_organs() + var/update = 0 while(parts.len && (brute>0 || burn>0) ) var/obj/item/organ/external/picked = pick(parts) @@ -289,9 +306,11 @@ burn -= (picked.burn_dam - burn_was) parts -= picked + updatehealth() hud_updateflag |= 1 << HEALTH_HUD - if(update) UpdateDamageIcon() + if(update) + UpdateDamageIcon() //////////////////////////////////////////// @@ -302,7 +321,7 @@ This function restores the subjects blood to max. /mob/living/carbon/human/proc/restore_blood() if(!(species.flags & NO_BLOOD)) var/blood_volume = vessel.get_reagent_amount("blood") - vessel.add_reagent("blood",560.0-blood_volume) + vessel.add_reagent("blood", 560.0 - blood_volume) /* This function restores all organs. @@ -314,47 +333,43 @@ This function restores all organs. /mob/living/carbon/human/proc/HealDamage(zone, brute, burn) var/obj/item/organ/external/E = get_organ(zone) if(istype(E, /obj/item/organ/external)) - if (E.heal_damage(brute, burn)) + if(E.heal_damage(brute, burn)) UpdateDamageIcon() hud_updateflag |= 1 << HEALTH_HUD else return 0 - return /mob/living/carbon/human/proc/get_organ(var/zone) - if(!zone) zone = "chest" - if (zone in list( "eyes", "mouth" )) + if(!zone) + zone = "chest" + if(zone in list("eyes", "mouth")) zone = "head" + return organs_by_name[zone] /mob/living/carbon/human/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/edge = 0, var/obj/used_weapon = null) - - //visible_message("Hit debug. [damage] | [damagetype] | [def_zone] | [blocked] | [sharp] | [used_weapon]") - //Handle other types of damage if((damagetype != BRUTE) && (damagetype != BURN)) - if(damagetype == HALLOSS) - if ((damage > 25 && prob(20)) || (damage > 50 && prob(60))) - emote("scream") - - ..(damage, damagetype, def_zone, blocked) return 1 //Handle BRUTE and BURN damage handle_suit_punctures(damagetype, damage) - blocked = (100-blocked)/100 - if(blocked <= 0) return 0 + blocked = (100 - blocked) / 100 + if(blocked <= 0) + return 0 var/obj/item/organ/external/organ = null if(isorgan(def_zone)) organ = def_zone else - if(!def_zone) def_zone = ran_zone(def_zone) + if(!def_zone) + def_zone = ran_zone(def_zone) organ = get_organ(check_zone(def_zone)) - if(!organ) return 0 + if(!organ) + return 0 damage = damage * blocked @@ -362,28 +377,33 @@ This function restores all organs. if(BRUTE) damageoverlaytemp = 20 if(species && species.brute_mod) - damage = damage*species.brute_mod + damage = damage * species.brute_mod + if(organ.take_damage(damage, 0, sharp, edge, used_weapon)) UpdateDamageIcon() - if(LAssailant && ishuman(LAssailant)) + + if(LAssailant && ishuman(LAssailant)) //superheros still get the comical hit markers var/mob/living/carbon/human/H = LAssailant if(H.mind && H.mind in (ticker.mode.superheroes || ticker.mode.supervillains || ticker.mode.greyshirts)) var/list/attack_bubble_recipients = list() var/mob/living/user for(var/mob/O in viewers(user, src)) - if (O.client && !( O.blinded )) + if (O.client && !(O.blinded)) attack_bubble_recipients.Add(O.client) spawn(0) var/image/dmgIcon = image('icons/effects/hit_blips.dmi', src, "dmg[rand(1,2)]",MOB_LAYER+1) dmgIcon.pixel_x = (!lying) ? rand(-3,3) : rand(-11,12) dmgIcon.pixel_y = (!lying) ? rand(-11,9) : rand(-10,1) - //world << "x: [dmgIcon.pixel_x] AND y: [dmgIcon.pixel_y]" flick_overlay(dmgIcon, attack_bubble_recipients, 9) + receive_damage() + if(BURN) damageoverlaytemp = 20 + if(species && species.burn_mod) - damage = damage*species.burn_mod + damage = damage * species.burn_mod + if(organ.take_damage(0, damage, sharp, edge, used_weapon)) UpdateDamageIcon() diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 56d197e3b88..1ea23ebf53a 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -477,4 +477,4 @@ emp_act /mob/living/carbon/human/water_act(volume, temperature, source) ..() if(temperature >= 330) bodytemperature = bodytemperature + (temperature - bodytemperature) - if(temperature <= 280) bodytemperature = bodytemperature - (bodytemperature - temperature) \ No newline at end of file + if(temperature <= 280) bodytemperature = bodytemperature - (bodytemperature - temperature) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index c791222d312..28a504c1645 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -51,7 +51,7 @@ if(status_flags & GOTTAGOREALLYFAST) tally -= 2 - return (tally+config.human_delay) + return (tally + config.human_delay) /mob/living/carbon/human/Process_Spacemove(movement_dir = 0) @@ -89,4 +89,4 @@ if(!has_gravity(loc)) return var/obj/item/clothing/shoes/S = shoes - S.step_action(src) + S.step_action(src) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 1e863302ecb..be591c6f30f 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -136,6 +136,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc var/y_offset = pixel_y + rand(-1,1) animate(src, pixel_x = pixel_x + x_offset, pixel_y = pixel_y + y_offset, time = 1) animate(pixel_x = initial(pixel_x) , pixel_y = initial(pixel_y), time = 1) + if (disabilities & NERVOUS) speech_problem_flag = 1 if (prob(10)) @@ -143,12 +144,38 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc if (getBrainLoss() >= 60 && stat != 2) speech_problem_flag = 1 - if (prob(3)) + if(prob(3)) + var/list/s1 = list("IM A PONY NEEEEEEIIIIIIIIIGH", + "without oxigen blob don't evoluate?", + "CAPTAINS A COMDOM", + "[pick("", "that damn traitor")] [pick("joerge", "george", "gorge", "gdoruge")] [pick("mellens", "melons", "mwrlins")] is grifing me HAL;P!!!", + "can u give me [pick("telikesis","halk","eppilapse")]?", + "THe saiyans screwed", + "Bi is THE BEST OF BOTH WORLDS>", + "I WANNA PET TEH monkeyS", + "stop grifing me!!!!", + "SOTP IT#") + + var/list/s2 = list("FUS RO DAH", + "fucking 4rries!", + "stat me", + ">my face", + "roll it easy!", + "waaaaaagh!!!", + "red wonz go fasta", + "FOR TEH EMPRAH", + "lol2cat", + "dem dwarfs man, dem dwarfs", + "SPESS MAHREENS", + "hwee did eet fhor khayosss", + "lifelike texture ;_;", + "luv can bloooom", + "PACKETS!!!") switch(pick(1,2,3)) if(1) - say(pick("IM A PONY NEEEEEEIIIIIIIIIGH", "without oxigen blob don't evoluate?", "CAPTAINS A COMDOM", "[pick("", "that damn traitor")] [pick("joerge", "george", "gorge", "gdoruge")] [pick("mellens", "melons", "mwrlins")] is grifing me HAL;P!!!", "can u give me [pick("telikesis","halk","eppilapse")]?", "THe saiyans screwed", "Bi is THE BEST OF BOTH WORLDS>", "I WANNA PET TEH monkeyS", "stop grifing me!!!!", "SOTP IT#")) + say(pick(s1)) if(2) - say(pick("FUS RO DAH","fucking 4rries!", "stat me", ">my face", "roll it easy!", "waaaaaagh!!!", "red wonz go fasta", "FOR TEH EMPRAH", "lol2cat", "dem dwarfs man, dem dwarfs", "SPESS MAHREENS", "hwee did eet fhor khayosss", "lifelike texture ;_;", "luv can bloooom", "PACKETS!!!")) + say(pick(s2)) if(3) emote("drool") diff --git a/code/modules/mob/living/carbon/human/species/shadow.dm b/code/modules/mob/living/carbon/human/species/shadow.dm index 3e888c026f8..3727bd8de0a 100644 --- a/code/modules/mob/living/carbon/human/species/shadow.dm +++ b/code/modules/mob/living/carbon/human/species/shadow.dm @@ -1,7 +1,7 @@ /datum/species/shadow name = "Shadow" name_plural = "Shadows" - + icobase = 'icons/mob/human_races/r_shadow.dmi' deform = 'icons/mob/human_races/r_shadow.dmi' @@ -12,7 +12,6 @@ blood_color = "#CCCCCC" flesh_color = "#AAAAAA" - has_organ = list( "brain" = /obj/item/organ/brain ) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index c65756fce62..6462d413e7b 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -78,7 +78,6 @@ //Used in icon caching. var/race_key = 0 var/icon/icon_template - var/is_small var/show_ssd = 1 var/virus_immune @@ -507,7 +506,7 @@ if(2) H.healths.icon_state = "health7" if(5) H.healths.icon_state = "health0" else - switch(H.health - ((flags & NO_PAIN) ? 0 : H.traumatic_shock) - H.staminaloss) + switch(100 - ((flags & NO_PAIN) ? 0 : H.traumatic_shock) - H.staminaloss) if(100 to INFINITY) H.healths.icon_state = "health0" if(80 to 100) H.healths.icon_state = "health1" if(60 to 80) H.healths.icon_state = "health2" diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 26ef94d472a..1ed7674c050 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -53,7 +53,6 @@ heat_level_3_breathe = 1100 //Default 1000 flesh_color = "#34AF10" - reagent_tag = PROCESS_ORG base_color = "#066000" @@ -98,7 +97,6 @@ clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING dietflags = DIET_OMNI - reagent_tag = PROCESS_ORG flesh_color = "#AFA59E" base_color = "#333333" @@ -134,7 +132,6 @@ clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING dietflags = DIET_OMNI - reagent_tag = PROCESS_ORG flesh_color = "#966464" base_color = "#BE8264" @@ -163,7 +160,6 @@ clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = HAS_SKIN_COLOR dietflags = DIET_HERB - flesh_color = "#8CD7A3" blood_color = "#1D2CBF" reagent_tag = PROCESS_ORG @@ -179,7 +175,6 @@ language = "Vox-pidgin" speech_sounds = list('sound/voice/shriek1.ogg') speech_chance = 20 - unarmed_type = /datum/unarmed_attack/claws //I dont think it will hurt to give vox claws too. blurb = "The Vox are the broken remnants of a once-proud race, now reduced to little more than \ @@ -309,7 +304,6 @@ clothing_flags = HAS_SOCKS bodyflags = FEET_CLAWS dietflags = DIET_HERB - blood_color = "#FB9800" reagent_tag = PROCESS_ORG @@ -328,7 +322,6 @@ bodyflags = HAS_SKIN_COLOR bloodflags = BLOOD_SLIME dietflags = DIET_CARN - reagent_tag = PROCESS_ORG //ventcrawler = 1 //ventcrawling commented out @@ -355,7 +348,6 @@ flags = IS_WHITELISTED | HAS_LIPS | CAN_BE_FAT clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS dietflags = DIET_HERB - reagent_tag = PROCESS_ORG blood_color = "#A200FF" @@ -408,7 +400,6 @@ dietflags = 0 //Diona regenerate nutrition in light, no diet necessary body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not - blood_color = "#004400" flesh_color = "#907E4A" @@ -499,7 +490,7 @@ passive_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment. - flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA_RAD + flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA_RAD | NO_POISON clothing_flags = HAS_SOCKS bodyflags = HAS_SKIN_COLOR dietflags = 0 //IPCs can't eat, so no diet diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index bd7b023b5b6..8bd45097fef 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -11,7 +11,7 @@ pass_flags = PASSTABLE braintype = "Robot" lawupdate = 0 - density = 1 + density = 0 req_access = list(access_engine, access_robotics) local_transmit = 1 @@ -335,4 +335,8 @@ src.verbs |= silicon_subsystems /mob/living/silicon/robot/drone/remove_robot_verbs() - src.verbs -= silicon_subsystems \ No newline at end of file + src.verbs -= silicon_subsystems + +/mob/living/silicon/robot/drone/update_canmove() + . = ..() + density = 0 //this is reset every canmove update otherwise \ No newline at end of file diff --git a/code/modules/organs/subtypes/machine.dm b/code/modules/organs/subtypes/machine.dm index 9fcad11f440..3e651613164 100644 --- a/code/modules/organs/subtypes/machine.dm +++ b/code/modules/organs/subtypes/machine.dm @@ -5,14 +5,14 @@ max_damage = 50 //made same as arm, since it is not vital min_broken_damage = 30 encased = null - + /obj/item/organ/external/head/ipc/New() robotize("Morpheus Cyberkinetics") ..() /obj/item/organ/external/chest/ipc encased = null - + /obj/item/organ/external/chest/ipc/New() robotize("Morpheus Cyberkinetics") ..() @@ -91,6 +91,7 @@ organ_tag = "brain" parent_organ = "chest" vital = 1 + max_damage = 200 var/obj/item/device/mmi/stored_mmi /obj/item/organ/mmi_holder/proc/update_from_mmi() diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 78aa9174d5f..39c5442c7e7 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -13,6 +13,7 @@ var/copies = 1 //how many copies to print! var/toner = 30 //how much toner is left! woooooo~ var/maxcopies = 10 //how many copies can be copied at once- idea shamelessly stolen from bs12's copier! + var/mob/living/ass = null /obj/machinery/photocopier/attack_ai(mob/user as mob) return attack_hand(user) @@ -21,7 +22,7 @@ user.set_machine(src) var/dat = "Photocopier

" - if(copyitem) + if(copyitem || (ass && (ass.loc == src.loc))) dat += "Remove Item
" if(toner) dat += "Copy
" @@ -57,6 +58,9 @@ else if (istype(copyitem, /obj/item/weapon/paper_bundle)) var/obj/item/weapon/paper_bundle/B = bundlecopy(copyitem) sleep(15*B.amount) + else if (ass && ass.loc == src.loc) + copyass() + sleep(15) else usr << "\The [copyitem] can't be copied by \the [src]." break @@ -70,6 +74,9 @@ usr << "You take \the [copyitem] out of \the [src]." copyitem = null updateUsrDialog() + else if(check_ass()) + ass << "You feel a slight pressure on your ass." + updateUsrDialog() else if(href_list["min"]) if(copies > 1) copies-- @@ -127,6 +134,17 @@ playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) anchored = !anchored user << "You [anchored ? "wrench" : "unwrench"] \the [src]." + else if(istype(O, /obj/item/weapon/grab)) //For ass-copying. + var/obj/item/weapon/grab/G = O + if(ismob(G.affecting) && G.affecting != ass) + var/mob/GM = G.affecting + visible_message("[usr] drags [GM.name] onto the photocopier!") + GM.loc = get_turf(src) + ass = GM + if(copyitem) + copyitem.loc = src.loc + copyitem = null + updateUsrDialog() return /obj/machinery/photocopier/ex_act(severity) @@ -203,6 +221,64 @@ visible_message("A red light on \the [src] flashes, indicating that it is out of toner.") return p + +/obj/machinery/photocopier/proc/copyass() + var/icon/temp_img + if(check_ass()) //You have to be sitting on the copier and either be a xeno or a human without clothes on. + if(ishuman(ass)) //Suit checks are in check_ass + var/mob/living/carbon/human/H = ass + switch(H.get_species()) + if("Human") + temp_img = icon('icons/obj/butts.dmi', "human") + if("Tajaran") + temp_img = icon('icons/obj/butts.dmi', "tajaran") + if("Unathi") + temp_img = icon('icons/obj/butts.dmi', "unathi") + if("Skrell") + temp_img = icon('icons/obj/butts.dmi', "skrell") + if("Vox") + temp_img = icon('icons/obj/butts.dmi', "vox") + if("Kidan") + temp_img = icon('icons/obj/butts.dmi', "kidan") + if("Grey") + temp_img = icon('icons/obj/butts.dmi', "grey") + if("Diona") + temp_img = icon('icons/obj/butts.dmi', "diona") + if("Slime People") + temp_img = icon('icons/obj/butts.dmi', "slime") + if("Vulpkanin") + temp_img = icon('icons/obj/butts.dmi', "vulp") + if("Machine") + temp_img = icon('icons/obj/butts.dmi', "machine") + if("Plasmaman") + temp_img = icon('icons/obj/butts.dmi', "plasma") + else + temp_img = icon('icons/obj/butts.dmi', "human") + else if(istype(ass,/mob/living/silicon/robot/drone)) + temp_img = icon('icons/obj/butts.dmi', "drone") + else if(istype(ass,/mob/living/simple_animal/diona)) + temp_img = icon('icons/obj/butts.dmi', "nymph") + else if(isalien(ass) || istype(ass,/mob/living/simple_animal/hostile/alien)) //Xenos have their own asses, thanks to Pybro. + temp_img = icon('icons/obj/butts.dmi', "xeno") + else return + else + return + var/obj/item/weapon/photo/p = new /obj/item/weapon/photo (loc) + p.desc = "You see [ass]'s ass on the photo." + p.pixel_x = rand(-10, 10) + p.pixel_y = rand(-10, 10) + p.img = temp_img + var/icon/small_img = icon(temp_img) //Icon() is needed or else temp_img will be rescaled too >.> + var/icon/ic = icon('icons/obj/items.dmi',"photo") + small_img.Scale(8, 8) + ic.Blend(small_img,ICON_OVERLAY, 10, 13) + p.icon = ic + toner -= 5 + if(toner < 0) + toner = 0 + visible_message("A red light on \the [src] flashes, indicating that it is out of toner.") + return p + //If need_toner is 0, the copies will still be lightened when low on toner, however it will not be prevented from printing. TODO: Implement print queues for fax machines and get rid of need_toner /obj/machinery/photocopier/proc/bundlecopy(var/obj/item/weapon/paper_bundle/bundle, var/need_toner=1) var/obj/item/weapon/paper_bundle/p = new /obj/item/weapon/paper_bundle (src) @@ -227,6 +303,36 @@ p.pixel_x = rand(-9, 9) return p + +/obj/machinery/photocopier/MouseDrop_T(mob/target, mob/user) + check_ass() //Just to make sure that you can re-drag somebody onto it after they moved off. + if (!istype(target) || target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai) || target == ass) + return + src.add_fingerprint(user) + if(target == user && !user.incapacitated()) + visible_message("[usr] jumps onto the photocopier!") + else if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis) + if(target.anchored) return + if(!ishuman(user)) return + visible_message("[usr] drags [target.name] onto the photocopier!") + target.loc = get_turf(src) + ass = target + if(copyitem) + copyitem.loc = src.loc + visible_message("[copyitem] is shoved out of the way by [ass]!") + copyitem = null + updateUsrDialog() + +/obj/machinery/photocopier/proc/check_ass() //I'm not sure wether I made this proc because it's good form or because of the name. + if(!ass) + return 0 + if(ass.loc != src.loc) + ass = null + updateUsrDialog() + return 0 + else + return 1 + /obj/item/device/toner name = "toner cartridge" icon_state = "tonercartridge" diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 0ac35dd1455..1c3ea26b911 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -150,6 +150,24 @@ var/icon_on = "camera" var/icon_off = "camera_off" var/size = 3 + var/see_ghosts = 0 //for the spoop of it + + +/obj/item/device/camera/spooky/CheckParts() + var/obj/item/device/camera/C = locate(/obj/item/device/camera) in contents + if(C) + pictures_max = C.pictures_max + pictures_left = C.pictures_left + visible_message("[C] has been imbued with godlike power!") + qdel(C) + + +var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","shadow","ghostian2") + +/obj/item/device/camera/spooky + name = "camera obscura" + desc = "A polaroid camera, some say it can see ghosts!" + see_ghosts = 1 /obj/item/device/camera/verb/change_size() set name = "Set Photo Focus" @@ -184,7 +202,7 @@ ..() -/obj/item/device/camera/proc/get_icon(list/turfs, turf/center) +/obj/item/device/camera/proc/get_icon(list/turfs, turf/center,mob/user) //Bigger icon base to capture those icons that were shifted to the next tile //i.e. pretty much all wall-mounted machinery @@ -199,8 +217,20 @@ atoms.Add(the_turf); // As well as anything that isn't invisible. for(var/atom/A in the_turf) - if(A.invisibility) continue - atoms.Add(A) + if(A.invisibility ) + if(see_ghosts && istype(A,/mob/dead/observer)) + var/mob/dead/observer/O = A + if(O.following) + continue + if(user.mind && !(user.mind.assigned_role == "Chaplain")) + atoms.Add(image('icons/mob/mob.dmi', O.loc, pick(SpookyGhosts), 4, SOUTH)) + else + atoms.Add(image('icons/mob/mob.dmi', O.loc, "ghost", 4, SOUTH)) + else//its not a ghost + continue + else//not invisable, not a spookyghost add it. + atoms.Add(A) + // Sort the atoms into their layers var/list/sorted = sort_atoms_by_layer(atoms) @@ -235,21 +265,35 @@ /obj/item/device/camera/proc/get_mobs(turf/the_turf as turf) var/mob_detail - for(var/mob/living/carbon/A in the_turf) - if(A.invisibility) continue - var/holding = null - if(A.l_hand || A.r_hand) - if(A.l_hand) holding = "They are holding \a [A.l_hand]" - if(A.r_hand) - if(holding) - holding += " and \a [A.r_hand]" + for(var/mob/M in the_turf) + if(M.invisibility) + if(see_ghosts && istype(M,/mob/dead/observer)) + var/mob/dead/observer/O = M + if(O.following) + continue + if(!mob_detail) + mob_detail = "You can see a g-g-g-g-ghooooost! " else - holding = "They are holding \a [A.r_hand]" + mob_detail += "You can also see a g-g-g-g-ghooooost!" + else + continue - if(!mob_detail) - mob_detail = "You can see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]. " - else - mob_detail += "You can also see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]." + var/holding = null + + if(istype(M, /mob/living/carbon)) + var/mob/living/carbon/A = M + if(A.l_hand || A.r_hand) + if(A.l_hand) holding = "They are holding \a [A.l_hand]" + if(A.r_hand) + if(holding) + holding += " and \a [A.r_hand]" + else + holding = "They are holding \a [A.r_hand]" + + if(!mob_detail) + mob_detail = "You can see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]. " + else + mob_detail += "You can also see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]." return mob_detail /obj/item/device/camera/afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag) @@ -263,6 +307,9 @@ user << "[pictures_left] photos left." icon_state = icon_off on = 0 + if(user.mind && !(user.mind.assigned_role == "Chaplain")) + if(prob(24)) + handle_haunt(user) spawn(64) icon_state = icon_on on = 1 @@ -298,7 +345,7 @@ printpicture(user, P) /obj/item/device/camera/proc/createpicture(atom/target, mob/user, list/turfs, mobs, flag) - var/icon/photoimage = get_icon(turfs, target) + var/icon/photoimage = get_icon(turfs, target,user) var/icon/small_img = icon(photoimage) var/icon/tiny_img = icon(photoimage) @@ -483,3 +530,15 @@ talk_into(M, msg) for(var/mob/living/carbon/human/H in watcherslist) H.show_message(text("\blue (Newscaster) [] says, '[]'",M,msg), 1) + + + +///hauntings, like hallucinations but more spooky + +/obj/item/device/camera/proc/handle_haunt(mob/user as mob) + var/list/creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/Heart Beat.ogg', 'sound/effects/screech.ogg',\ + 'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\ + 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\ + 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\ + 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg') + user << pick(creepyasssounds) diff --git a/code/modules/reagents/newchem/drugs.dm b/code/modules/reagents/newchem/drugs.dm index f700ec2aa16..9bee5b09324 100644 --- a/code/modules/reagents/newchem/drugs.dm +++ b/code/modules/reagents/newchem/drugs.dm @@ -521,7 +521,7 @@ M.drop_item() ..() if(prob(50)) - M.adjustToxLoss(10) + M.adjustFireLoss(10) M.adjustBrainLoss(pick(0.5, 0.6, 0.7, 0.8, 0.9, 1)) return @@ -551,7 +551,7 @@ /datum/reagent/lube/ultra/addiction_act_stage4(var/mob/living/carbon/human/M as mob) M.Jitter(20) M.Dizzy(20) - M.adjustToxLoss(5) + M.adjustBrainLoss(2) if(prob(50)) M.emote(pick("twitch","buzz","moan")) ..() @@ -605,7 +605,7 @@ /datum/reagent/surge/addiction_act_stage1(var/mob/living/M as mob) M.adjustBrainLoss(rand(1,5)*REM) - M.adjustToxLoss(rand(1,5)*REM) + M.hallucination += rand(1,5) ..() return /datum/reagent/surge/addiction_act_stage2(var/mob/living/M as mob) diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm index 9905345926b..e0cf917bdf4 100644 --- a/code/modules/reagents/newchem/medicine.dm +++ b/code/modules/reagents/newchem/medicine.dm @@ -96,7 +96,7 @@ datum/reagent/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/vo datum/reagent/synthflesh/reaction_turf(var/turf/T, var/volume) //let's make a mess! src = null if(volume >= 5) - new /obj/effect/decal/cleanable/blood/gibs(T) + new /obj/effect/decal/cleanable/blood/gibs/cleangibs(T) playsound(T, 'sound/effects/splat.ogg', 50, 1, -3) return @@ -987,7 +987,7 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob) // Synth-Meds // ////////////////////////////// -//Degreaser: Anti-toxin / Lube Remover +//Degreaser: Mild Purgative / Lube Remover /datum/reagent/degreaser name = "Degreaser" id = "degreaser" @@ -1016,7 +1016,11 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob) /datum/reagent/degreaser/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom - M.adjustToxLoss(-1.5*REM) + if(prob(50)) //Same effects as coffee, to help purge ill effects like paralysis + M.AdjustParalysis(-1) + M.AdjustStunned(-1) + M.AdjustWeakened(-1) + M.confused -= 5 for(var/datum/reagent/R in M.reagents.reagent_list) if(R != src) if(R.id == "ultralube" || R.id == "lube") diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm index faf530f6b3e..a3dc47f26a4 100644 --- a/code/modules/reagents/newchem/newchem_procs.dm +++ b/code/modules/reagents/newchem/newchem_procs.dm @@ -47,6 +47,8 @@ datum/reagents/proc/metabolize(var/mob/M) R.overdosed = 1 M << "You feel like you took too much [R.name]!" R.overdose_start(M) + if(R.volume < R.overdose_threshold && R.overdosed) + R.overdosed = 0 if(R.volume >= R.addiction_threshold && !is_type_in_list(R, addiction_list) && R.addiction_threshold > 0) var/datum/reagent/new_reagent = new R.type() addiction_list.Add(new_reagent) diff --git a/code/modules/reagents/newchem/other.dm b/code/modules/reagents/newchem/other.dm index 7e1e9899993..fa33c4fbf8e 100644 --- a/code/modules/reagents/newchem/other.dm +++ b/code/modules/reagents/newchem/other.dm @@ -305,6 +305,53 @@ datum/reagent/fartonium/on_mob_life(var/mob/living/M as mob) return +/datum/chemical_reaction/soapification + name = "Soapification" + id = "soapification" + result = null + required_reagents = list("liquidgibs" = 10, "lye" = 10) // requires two scooped gib tiles + min_temp = 374 + result_amount = 1 + + +/datum/chemical_reaction/soapification/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + new /obj/item/weapon/soap/homemade(location) + return + +/datum/chemical_reaction/candlefication + name = "Candlefication" + id = "candlefication" + result = null + required_reagents = list("liquidgibs" = 5, "oxygen" = 5) // + min_temp = 374 + result_amount = 1 + +/datum/chemical_reaction/candlefication/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + new /obj/item/candle(location) + return + + +/datum/chemical_reaction/meatification + name = "Meatification" + id = "meatification" + result = null + required_reagents = list("liquidgibs" = 10, "nutriment" = 10, "carbon" = 10) + result_amount = 1 + +/datum/chemical_reaction/meatification/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/meatproduct(location) + return + +/datum/chemical_reaction/lye + name = "lye" + id = "lye" + result = "lye" + required_reagents = list("sodium" = 1, "hydrogen" = 1, "oxygen" = 1) + result_amount = 3 + ///Alchemical Reagents datum/reagent/eyenewt diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm index 809a8dfd34d..e44a166a87a 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm @@ -87,5 +87,5 @@ name = "Sterilizine" id = "sterilizine" result = "sterilizine" - required_reagents = list("ethanol" = 1, "charcoal" = 1, "chlorine" = 1) + required_reagents = list("antihol" = 2, "chlorine" = 1) result_amount = 3 \ No newline at end of file diff --git a/code/modules/reagents/oldchem/reagents/reagents_water.dm b/code/modules/reagents/oldchem/reagents/reagents_water.dm index 5377ec3f56c..1db18dd1d41 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_water.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_water.dm @@ -326,6 +326,30 @@ qdel(R) T.Bless() + +/datum/reagent/liquidgibs + name = "Liquid gibs" + id = "liquidgibs" + color = "#FF9966" + description = "You don't even want to think about what's in here." + reagent_state = LIQUID + +/datum/reagent/liquidgibs/reaction_turf(var/turf/T, var/volume) //yes i took it from synthflesh... + src = null + if(volume >= 5) + new /obj/effect/decal/cleanable/blood/gibs/cleangibs(T) + playsound(T, 'sound/effects/splat.ogg', 50, 1, -3) + return + + + +/datum/reagent/lye + name = "Lye" + id = "lye" + description = "Also known as sodium hydroxide." + reagent_state = LIQUID + color = "#FFFFD6" // very very light yellow + /* /datum/reagent/vaccine //data must contain virus type diff --git a/code/modules/reagents/reagent_containers/food/snacks/meat.dm b/code/modules/reagents/reagent_containers/food/snacks/meat.dm index e22613e12d1..8c1e8544014 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/meat.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/meat.dm @@ -33,6 +33,9 @@ var/subjectname = "" var/subjectjob = null +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/meatproduct + name = "meat product" + desc = "A slab of station reclaimed and chemically processed meat product." /obj/item/weapon/reagent_containers/food/snacks/meat/monkey //same as plain meat diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 2f46ef2532f..cbffe884787 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -174,7 +174,7 @@ id = "scalpel_laser1" req_tech = list("biotech" = 2, "materials" = 2, "magnets" = 2) build_type = PROTOLATHE - materials = list(MAT_METAL = 12500, MAT_GLASS = 7500) + materials = list(MAT_METAL = 2000, MAT_GLASS = 1500) build_path = /obj/item/weapon/scalpel/laser1 category = list("Medical") @@ -184,7 +184,7 @@ id = "scalpel_laser2" req_tech = list("biotech" = 3, "materials" = 4, "magnets" = 4) build_type = PROTOLATHE - materials = list(MAT_METAL = 12500, MAT_GLASS = 7500, MAT_SILVER = 2500) + materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_SILVER = 1000) build_path = /obj/item/weapon/scalpel/laser2 category = list("Medical") @@ -194,7 +194,7 @@ id = "scalpel_laser3" req_tech = list("biotech" = 4, "materials" = 6, "magnets" = 5) build_type = PROTOLATHE - materials = list(MAT_METAL = 12500, MAT_GLASS = 7500, MAT_SILVER = 2000, MAT_GOLD = 1500) + materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_SILVER = 1000, MAT_GOLD = 1000) build_path = /obj/item/weapon/scalpel/laser3 category = list("Medical") @@ -204,7 +204,7 @@ id = "scalpel_manager" req_tech = list("biotech" = 4, "materials" = 7, "magnets" = 5, "programming" = 4) build_type = PROTOLATHE - materials = list (MAT_METAL = 12500, MAT_GLASS = 7500, MAT_SILVER = 1500, MAT_GOLD = 1500, MAT_DIAMOND = 750) + materials = list (MAT_METAL = 2000, MAT_GLASS = 1500, MAT_SILVER = 1000, MAT_GOLD = 1000, MAT_DIAMOND = 1000) build_path = /obj/item/weapon/scalpel/manager category = list("Medical") diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index 7b1c38e4bef..6a9fcd3ffad 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -953,3 +953,41 @@ var/list/compatible_mobs = list(/mob/living/carbon/human) stage = 1 activate(var/mob/living/carbon/mob,var/multiplier) mob << " You feel optimistic!" + +/datum/disease2/effect/anxiety + name = "Severe Anxiety" + stage = 2 + activate(var/mob/living/carbon/mob,var/multiplier) + if(prob(20)) + mob << "You feel anxious." + if(prob(15)) + mob << "You feel butterflies in your stomach." + if(prob(11)) + mob.visible_message("[mob] stumbles around in a panic.", \ + "You have a panic attack!") + mob.confused += (rand(6,8)) + mob.jitteriness += (rand(6,8)) + if(prob(10)) + mob.visible_message("[mob] coughs up butterflies!", \ + "You cough up butterflies!") + new /mob/living/simple_animal/butterfly(mob.loc) + new /mob/living/simple_animal/butterfly(mob.loc) + +/datum/disease2/effect/lycan + name = "Lycancoughy" + stage = 3 + activate(var/mob/living/carbon/mob,var/multiplier) + if(prob(20)) + mob << "You feel itchy." + if(prob(15)) + mob << "You have the sudden urge for bacon.." + if(prob(11)) + mob.say(pick("WOOF!", "BARK!", "Bark.", "Woof?", "AUUUUUUUUUUUUU!!")) + if(prob(10)) + mob.visible_message("[mob] coughs up a dog!!", \ + "You cough up a DOG!!!") + //yes i KNOW foxes technically are not normal dogs...hush.... + var/randompup = pick(/mob/living/simple_animal/pet/corgi/puppy,/mob/living/simple_animal/pet/pug,/mob/living/simple_animal/pet/fox) + + new randompup(mob.loc) + mob.adjustBruteLoss(rand(1,5))//you just coughed up a CANINIE, you are taking brute loss... \ No newline at end of file diff --git a/icons/ass/assalien.png b/icons/ass/assalien.png deleted file mode 100644 index d7586f3b5ff..00000000000 Binary files a/icons/ass/assalien.png and /dev/null differ diff --git a/icons/ass/assfemale.png b/icons/ass/assfemale.png deleted file mode 100644 index 4c941a9281d..00000000000 Binary files a/icons/ass/assfemale.png and /dev/null differ diff --git a/icons/ass/assmale.png b/icons/ass/assmale.png deleted file mode 100644 index c6091cf1915..00000000000 Binary files a/icons/ass/assmale.png and /dev/null differ diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi index b7e86115e39..0aab96a6719 100644 Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ diff --git a/icons/obj/butts.dmi b/icons/obj/butts.dmi new file mode 100644 index 00000000000..cddd1ca6659 Binary files /dev/null and b/icons/obj/butts.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index ebf42b90da2..9130736fbc2 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ